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 index 4daca6209..33f6fc1bd 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,111 +1,111 @@ - -# 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。 -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. + +# 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。 +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/workflows/format-translation.yml b/.github/workflows/format-translation.yml index 9878d35b0..fa2e658ea 100644 --- a/.github/workflows/format-translation.yml +++ b/.github/workflows/format-translation.yml @@ -1,37 +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 - - 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 +name: Format Translation + +permissions: + contents: write + +on: + workflow_dispatch: + push: + branches: + - newartwork + paths: + - 'Screens/MiniGame/KinkyDungeon/*' + +jobs: + format-translation: + runs-on: ubuntu-latest + + 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/Data/Defs.ts b/Data/Defs.ts index 9d8a52ba4..d315adcc9 100644 --- a/Data/Defs.ts +++ b/Data/Defs.ts @@ -1517,6 +1517,8 @@ let LayerGroups = { // This slot is for things like breastplates and things that go over "WrappingChest", + "UpperArmStraps", + "Jacket", "ChestDeco", "Chestplate", diff --git a/Data/Filters.ts b/Data/Filters.ts index 79e7ab9e8..3b469d703 100644 --- a/Data/Filters.ts +++ b/Data/Filters.ts @@ -57,6 +57,66 @@ void main(void) +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 -= 0.5; + map.xy = scale * inputSize.zw * (rotation * map.xy); + + gl_FragColor = texture2D(uSampler, + clamp(vec2(vTextureCoord.x + map.x, vTextureCoord.y + map.y), + 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; @@ -91,7 +151,10 @@ class EraseFilter extends PIXI.Filter * @param clearMode - clearMode. */ public apply( - filterManager: PIXIFilterSystem, input: PIXIRenderTexture, output: PIXIRenderTexture, clearMode: PIXICLEAR_MODES + filterManager: PIXIFilterSystem, + input: PIXIRenderTexture, + output: PIXIRenderTexture, + clearMode: PIXICLEAR_MODES ): void { // fill maskMatrix with _normalized sprite texture coords_ @@ -120,6 +183,93 @@ class EraseFilter extends PIXI.Filter 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 + { + // 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; diff --git a/Data/ModelDresses.ts b/Data/ModelDresses.ts index 875c0d74e..03f21f00e 100644 --- a/Data/ModelDresses.ts +++ b/Data/ModelDresses.ts @@ -49,6 +49,8 @@ let KDModelDresses: {[_: string]: KinkyDungeonDress} = { {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}, diff --git a/Data/ModelList.ts b/Data/ModelList.ts index 12bdf51ae..5fbc67aa8 100644 --- a/Data/ModelList.ts +++ b/Data/ModelList.ts @@ -549,10 +549,11 @@ AddModel({ Categories: ["Shoes"], Layers: ToLayerMap([ { Name: "BootLeft", Layer: "ShoeLeft", Pri: 25, - Poses: ToMapSubtract([...LEGPOSES], ["Hogtie"]), - GlobalDefaultOverride: ToMap(["KneelClosed"]), + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), HideWhenOverridden: true, NoDisplace: true, + DisplacementPosesExclude: ["Hogtie"], DisplacementSprite: "Boots", DisplaceAmount: 10, DisplaceLayers: ToMap(["Boots"]), @@ -567,6 +568,7 @@ AddModel({ NoDisplace: true, DisplacementSprite: "BalletCuffs", + DisplaceZBonus: 10000, DisplaceAmount: 20, DisplaceLayers: ToMap(["BalletHeelsCuffs"]), HidePoseConditional: [ @@ -583,7 +585,7 @@ AddModel({ ["DynamicArmor", "BootsArmor", "SuppressDynamic"], ], }, - { Name: "BootLeftHogtie", Layer: "ShoeLeftHogtie", Pri: 25, + { Name: "FootBootLeftHogtie", Layer: "ShoeLeftHogtie", Pri: 25, Poses: ToMap(["Hogtie"]), HideWhenOverridden: true, InheritColor: "BootLeft", @@ -1456,8 +1458,8 @@ AddModel({ Categories: ["Shoes"], Layers: ToLayerMap([ { Name: "ShoeLeft", Layer: "ShoeLeft", Pri: 1, - Poses: ToMapSubtract([...LEGPOSES], ["Hogtie"]), - GlobalDefaultOverride: ToMap(["KneelClosed"]), + Poses: ToMap([...LEGPOSES]), + GlobalDefaultOverride: ToMap(["KneelClosed", "Hogtie"]), HideWhenOverridden: true, HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], AppendPose: ToMapDupe(["RopesAnkle"]), @@ -1475,7 +1477,7 @@ AddModel({ HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], HideWhenOverridden: true, }, - { Name: "ShoeLeftHogtie", Layer: "ShoeLeftHogtie", Pri: 1, + { Name: "FootShoeLeftHogtie", Layer: "ShoeLeftHogtie", Pri: 1, Poses: ToMap(["Hogtie"]), Invariant: true, InheritColor: "ShoeLeft", @@ -2017,13 +2019,13 @@ AddModel({ DisplacementInvariant: true, HideWhenOverridden: true, }, - { Name: "RibbonBack", Layer: "BeltBack", Pri: 30, + { 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, + { Name: "RibbonFarBack", Layer: "BeltFarBack", Pri: -30, Sprite: "RibbonBack", Poses: ToMapSubtract([...ARMPOSES], ["Wristtie", "Boxtie"]), Invariant: true, diff --git a/Data/ModelListHair.ts b/Data/ModelListHair.ts index 91a20e019..f73e7549e 100644 --- a/Data/ModelListHair.ts +++ b/Data/ModelListHair.ts @@ -81,6 +81,28 @@ AddModel({ ]) }); +AddModel({ + Name: "LightMaidKnightHairband", + Parent: "LightMaidKnight", + Folder: "MaidKnightLight", + TopLevel: true, + 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: "Hairband", + InheritColor: "Frill", + }, + { Name: "HeadbandRibbon", Layer: "HairFront", Pri: 15.1, + NoOverride: true, TieToLayer: "Hairband", + InheritColor: "Ribbon", + }, + ]) +}); + AddModel({ Name: "Braid", Folder: "Hair", diff --git a/Data/ModelList_Armbinders.ts b/Data/ModelList_Armbinders.ts index 5612ecaa7..90c4c645b 100644 --- a/Data/ModelList_Armbinders.ts +++ b/Data/ModelList_Armbinders.ts @@ -14,7 +14,7 @@ AddModel({ TopLevel: false, Parent: "Armbinder", AddPose: ["HideHands"], - Categories: ["Restraints", "Latex", "Armbinders"], + Categories: ["Restraints", "Latex", "Binders"], Layers: ToLayerMap([ { Name: "BinderLeft", Layer: "BindArmLeft", Pri: 30, HideWhenOverridden: true, @@ -42,7 +42,7 @@ AddModel({ Folder: "Armbinder", TopLevel: true, Restraint: true, - Categories: ["Restraints", "Leather", "Armbinders"], + Categories: ["Restraints", "Leather", "Binders"], AddPose: ["HideHands"], Layers: ToLayerMap([ ...GetModelLayers("SmoothArmbinder"), @@ -70,7 +70,7 @@ AddModel({ TopLevel: false, Parent: "Armbinder", AddPose: ["HideHands"], - Categories: ["Restraints", "Leather", "Armbinders"], + Categories: ["Restraints", "Leather", "Binders"], Layers: ToLayerMap([ ...GetModelLayers("Armbinder"), { Name: "Cross", Layer: "BindArms", Pri: 30, @@ -88,7 +88,7 @@ AddModel({ TopLevel: false, Parent: "Armbinder", AddPose: ["HideHands"], - Categories: ["Restraints", "Latex", "Armbinders"], + Categories: ["Restraints", "Latex", "Binders"], Layers: ToLayerMap([ ...GetModelLayers("SmoothArmbinder"), { Name: "Cross", Layer: "BindArms", Pri: 30, @@ -106,7 +106,7 @@ AddModel({ TopLevel: false, Parent: "Armbinder", AddPose: ["HideHands"], - Categories: ["Restraints", "Leather", "Armbinders"], + Categories: ["Restraints", "Leather", "Binders"], Layers: ToLayerMap([ ...GetModelLayers("Armbinder"), { Name: "Secure", Layer: "BindArms", Pri: 30, @@ -124,7 +124,7 @@ AddModel({ TopLevel: false, Parent: "Armbinder", AddPose: ["HideHands"], - Categories: ["Restraints", "Latex", "Armbinders"], + Categories: ["Restraints", "Latex", "Binders"], Layers: ToLayerMap([ ...GetModelLayers("SmoothArmbinder"), { Name: "Secure", Layer: "BindArms", Pri: 30, @@ -142,7 +142,7 @@ AddModel({ TopLevel: false, Parent: "Armbinder", AddPose: ["HideHands"], - Categories: ["Restraints", "Leather", "Armbinders"], + Categories: ["Restraints", "Leather", "Binders"], Layers: ToLayerMap([ ...GetModelLayers("Armbinder"), { Name: "Gwen", Layer: "BindArms", Pri: 30, @@ -161,7 +161,7 @@ AddModel({ TopLevel: false, Parent: "Armbinder", AddPose: ["HideHands"], - Categories: ["Restraints", "Latex", "Armbinders"], + Categories: ["Restraints", "Latex", "Binders"], Layers: ToLayerMap([ ...GetModelLayers("SmoothArmbinder"), { Name: "Gwen", Layer: "BindArms", Pri: 30, @@ -182,7 +182,7 @@ AddModel({ TopLevel: false, Parent: "Armbinder", AddPose: ["HideHands"], - Categories: ["Restraints", "Leather", "Armbinders"], + Categories: ["Restraints", "Leather", "Binders"], Layers: ToLayerMap([ ...GetModelLayers("Armbinder"), { Name: "WolfHarness", Layer: "BindArms", Pri: 30, diff --git a/Data/ModelList_CyberHeels.ts b/Data/ModelList_CyberHeels.ts index b9ff907e9..288c9bddf 100644 --- a/Data/ModelList_CyberHeels.ts +++ b/Data/ModelList_CyberHeels.ts @@ -13,6 +13,7 @@ AddModel({ Parent: "BalletHeels", Categories: ["Shoes", "Heels"], AddPose: ["Ballet"], + RemovePoses: ["TapeBoots"], Layers: ToLayerMap([ { Name: "ShinyBalletLeft", Layer: "ShoeLeftOver", Pri: 52, // Bondage overrides plate mail HideWhenOverridden: true, @@ -53,6 +54,7 @@ AddModel({ TieToLayer: "ShinyBalletLeft", DisplacementSprite: "BalletCuffs", + DisplaceZBonus: 10000, DisplaceAmount: 70, DisplaceLayers: ToMap(["BalletHeelsCuffs"]), }, @@ -69,5 +71,7 @@ AddModel({ }); -AddModel(GetModelRestraintVersion("CyberBalletHeels", true)); +AddModel(GetModelRestraintVersion("CyberBalletHeels", true, + ["RestrainingShoes"], + ["TapeBoots"])); diff --git a/Data/ModelList_Furniture.ts b/Data/ModelList_Furniture.ts index b53fa5124..fa759e0c6 100644 --- a/Data/ModelList_Furniture.ts +++ b/Data/ModelList_Furniture.ts @@ -96,6 +96,7 @@ AddModel({ }, ]) }); + AddModel({ Name: "Bed", Folder: "Furniture", @@ -113,6 +114,36 @@ AddModel({ }); +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", diff --git a/Data/ModelList_Gags.ts b/Data/ModelList_Gags.ts index a31af2551..e5a2e6447 100644 --- a/Data/ModelList_Gags.ts +++ b/Data/ModelList_Gags.ts @@ -1596,3 +1596,28 @@ 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)); \ No newline at end of file diff --git a/Data/ModelList_Heels.ts b/Data/ModelList_Heels.ts index 4d5fd5c5f..e9ab6a108 100644 --- a/Data/ModelList_Heels.ts +++ b/Data/ModelList_Heels.ts @@ -13,6 +13,7 @@ AddModel({ Restraint: false, Categories: ["Shoes", "Heels"], AddPose: ["Ballet"], + RemovePoses: ["TapeBoots"], Layers: ToLayerMap([ { Name: "BalletLeft", Layer: "ShoeLeftOver", Pri: 50, // Bondage overrides plate mail HideWhenOverridden: true, @@ -52,6 +53,7 @@ AddModel({ TieToLayer: "BalletLeft", DisplacementSprite: "BalletCuffs", + DisplaceZBonus: 10000, DisplaceAmount: 70, DisplaceLayers: ToMap(["BalletHeelsCuffs"]), }, @@ -92,6 +94,7 @@ AddModel({ Restraint: false, Categories: ["Shoes", "Heels"], AddPose: ["Ballet"], + RemovePoses: ["TapeBoots"], Layers: ToLayerMap([ { Name: "FlatBalletLeft", Layer: "ShoeLeftOver", Pri: 51, // Bondage overrides plate mail HideWhenOverridden: true, @@ -129,6 +132,7 @@ AddModel({ NoOverride: true, TieToLayer: "FlatBalletLeft", DisplacementSprite: "BalletCuffs", + DisplaceZBonus: 10000, DisplaceAmount: 70, DisplaceLayers: ToMap(["BalletHeelsCuffs"]), }, @@ -150,6 +154,7 @@ AddModel({ Restraint: false, Categories: ["Shoes", "Heels"], AddPose: ["Ballet"], + RemovePoses: ["TapeBoots"], Layers: ToLayerMap([ { Name: "ShinyBalletLeft", Layer: "ShoeLeftOver", Pri: 52, // Bondage overrides plate mail HideWhenOverridden: true, @@ -188,6 +193,7 @@ AddModel({ NoOverride: true, TieToLayer: "ShinyBalletLeft", DisplacementSprite: "BalletCuffs", + DisplaceZBonus: 10000, DisplaceAmount: 70, DisplaceLayers: ToMap(["BalletHeelsCuffs"]), }, @@ -205,9 +211,15 @@ AddModel({ -AddModel(GetModelRestraintVersion("BalletHeels", true)); -AddModel(GetModelRestraintVersion("FlatBalletHeels", true)); -AddModel(GetModelRestraintVersion("ShinyBalletHeels", true)); +AddModel(GetModelRestraintVersion("BalletHeels", true, + ["RestrainingShoes"], ["TapeBoots"] +)); +AddModel(GetModelRestraintVersion("FlatBalletHeels", true, + ["RestrainingShoes"], ["TapeBoots"] +)); +AddModel(GetModelRestraintVersion("ShinyBalletHeels", true, + ["RestrainingShoes"], ["TapeBoots"] +)); AddModel({ @@ -226,7 +238,7 @@ AddModel({ DisplacementSprite: "Heels", DisplaceAmount: 50, DisplaceLayers: ToMap(["Heels"]), - DisplaceZBonus: 100, + DisplaceZBonus: 10000, EraseInvariant: true, EraseMorph: {Spread: "Spread"}, EraseSprite: "HeelsErase", @@ -275,7 +287,7 @@ AddModel({ DisplacementSprite: "Heels", DisplaceAmount: 50, DisplaceLayers: ToMap(["Heels"]), - DisplaceZBonus: 100, + DisplaceZBonus: 10000, EraseInvariant: true, EraseMorph: {Spread: "Spread"}, EraseSprite: "HeelsErase", @@ -325,7 +337,7 @@ AddModel({ DisplacementSprite: "Heels", DisplaceAmount: 50, DisplaceLayers: ToMap(["Heels"]), - DisplaceZBonus: 100, + DisplaceZBonus: 10000, EraseInvariant: true, EraseMorph: {Spread: "Spread"}, EraseSprite: "HeelsErase", @@ -388,7 +400,7 @@ AddModel({ DisplacementSprite: "Heels2", DisplaceAmount: 80, DisplaceLayers: ToMap(["Heels"]), - DisplaceZBonus: 100, + DisplaceZBonus: 10000, EraseInvariant: true, EraseMorph: {Spread: "Spread", Closed: "Closed"}, EraseSprite: "HeelsErase", @@ -440,6 +452,7 @@ AddModel({ Restraint: false, Categories: ["Shoes"], AddPose: ["Heels", "FeetCovered"], + RemovePoses: ["TapeBoots"], Layers: ToLayerMap([ { Name: "TallLeft", Layer: "ShoeLeft", Pri: 26, InheritColor: "Shoe", @@ -490,7 +503,7 @@ AddModel({ TopLevel: true, Restraint: true, Categories: ["Shoes"], - AddPose: ["Heels"], + AddPose: ["Heels", "RestrainingShoes"], Layers: ToLayerMap([ ...GetModelLayers("TallHeels"), ]) diff --git a/Data/ModelList_Hood.ts b/Data/ModelList_Hood.ts index 4311ab267..0fb3b4d1e 100644 --- a/Data/ModelList_Hood.ts +++ b/Data/ModelList_Hood.ts @@ -12,11 +12,8 @@ AddModel({ Group: "Mouth", Restraint: true, Categories: ["Restraints","Hoods"], - AddPose: ["HideEars", "FaceCoverGag", "Hooded"], + AddPose: ["HideEars", "FaceCoverGag", "Hooded", "HoodMask"], HideLayers: ["Brows"], - AddPoseConditional: { - Xray: ["HoodMask",], - }, Layers: ToLayerMap([ { Name: "Hood", Layer: "Hood", Pri: 50, Invariant: true, diff --git a/Data/ModelList_MaidKnightLight.ts b/Data/ModelList_MaidKnightLight.ts index 6a6148015..1775868b8 100644 --- a/Data/ModelList_MaidKnightLight.ts +++ b/Data/ModelList_MaidKnightLight.ts @@ -54,11 +54,75 @@ AddModel({ +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: "BeltDeco", Pri: 15, + Poses: ToMap([...LEGPOSES]), + MorphPoses: {Kneel: "Kneel", KneelClosed: "Kneel", 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: "BeltDeco", Pri: 25, + Invariant: true, + NoOverride: 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: "LightMaidKnight_Bra", Folder: "MaidKnightLight", - Parent: "LightMaidKnight_Dress", + Parent: "LightMaidKnight", TopLevel: true, Categories: ["Bras"], RemovePoses: ["EncaseTorsoUpper"], @@ -76,17 +140,18 @@ AddModel({ AddModel({ Name: "LightMaidKnight_Top", Folder: "MaidKnightLight", - Parent: "LightMaidKnight_Dress", + Parent: "LightMaidKnight", TopLevel: true, Categories: ["Tops"], RemovePoses: ["EncaseTorsoUpper"], Layers: ToLayerMap([ { Name: "DressChest", Layer: "ShirtChest", Pri: 25, - InheritColor: "Top", Poses: ToMap([...ARMPOSES]), + HideWhenOverridden: true, HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Chest"], - Invariant: true, - NoOverride: true, + HidePoses: ToMap(["EncaseTorsoUpper"]), + InheritColor: "Dress", + MorphPoses: {Front: "Boxtie", Crossed: "Boxtie"}, }, ]) }); @@ -95,7 +160,7 @@ AddModel({ AddModel({ Name: "LightMaidKnight_SleeveLeft", Folder: "MaidKnightLight", - Parent: "LightMaidKnight_Dress", + Parent: "LightMaidKnight", TopLevel: false, Categories: ["Sleeves"], RemovePoses: ["EncaseTorsoUpper"], @@ -122,7 +187,7 @@ AddModel({ AddModel({ Name: "LightMaidKnight_SleeveRight", Folder: "MaidKnightLight", - Parent: "LightMaidKnight_Dress", + Parent: "LightMaidKnight", TopLevel: false, Categories: ["Sleeves"], RemovePoses: ["EncaseTorsoUpper"], @@ -159,11 +224,278 @@ AddModel({ AddModel({ Name: "LightMaidKnight_Sleeves", Folder: "MaidKnightLight", - Parent: "LightMaidKnight_Dress", + 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"]), + + }, + { 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"]), + + }, + { 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, + }, + ]) +}); + +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: "ForeBindWristRight"}, + NoOverride: 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"], + AppendPose: ToMapDupe(["RopesAnkle"]), + + 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"]), + }, + { Name: "BootRight", Layer: "ShoeRight", Pri: 8, + Poses: ToMapSubtract([...LEGPOSES], ["Hogtie", "Kneel", "KneelClosed"]), + HideWhenOverridden: true, + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + AppendPose: ToMapDupe(["RopesAnkle"]), + + EraseInvariant: true, + EraseMorph: {Closed: "Closed"}, + EraseSprite: "HeelsRightErase2", + EraseAmount: 100, + EraseLayers: ToMap(["HeelRight"]), + EraseZBonus: 100, + }, + { Name: "BootRightKneel", Layer: "ShoeRightKneel", Pri: 8, + Poses: ToMap(["Kneel"]), + Invariant: true, + InheritColor: "ShoeRight", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + HideWhenOverridden: true, + }, + { Name: "FootBootLeftHogtie", Layer: "ShoeLeftHogtie", Pri: 8, + Poses: ToMap(["Hogtie"]), + Invariant: true, + InheritColor: "ShoeLeft", + HidePrefixPose: ["Encase"], HidePrefixPoseSuffix: ["Feet"], + HideWhenOverridden: true, + }, + ]) +}); + + + + +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_Rubber.ts b/Data/ModelList_Rubber.ts index 36c6b2966..3b9fd9ef6 100644 --- a/Data/ModelList_Rubber.ts +++ b/Data/ModelList_Rubber.ts @@ -85,6 +85,10 @@ AddModel({ AddPriWithPose: { ItemBootsRubberOver: 45, }, + DisplaceLayers: ToMap(["Heels"]), + DisplaceAmount: 100, + DisplacementSprite: "SlimeLeft", + DisplacementPoses: ["Closed"], }, { Name: "FootRight", Layer: "WrappingLegsRight", Pri: 50, //SwapLayerPose: {Kneel: "WrappingLegsRight", KneelClosed: "WrappingLegsRight"}, @@ -95,6 +99,10 @@ AddModel({ AddPriWithPose: { ItemBootsRubberOver: 45, }, + DisplaceLayers: ToMap(["HeelRight"]), + DisplaceAmount: 100, + DisplacementSprite: "SlimeRight", + DisplacementPoses: ["Closed"], }, ]) }); diff --git a/Data/ModelList_Slime.ts b/Data/ModelList_Slime.ts index 8ab384341..7740df147 100644 --- a/Data/ModelList_Slime.ts +++ b/Data/ModelList_Slime.ts @@ -102,6 +102,10 @@ AddModel({ AddPriWithPose: { ItemBootsRubberOver: 45, }, + DisplaceLayers: ToMap(["Heels"]), + DisplaceAmount: 100, + DisplacementSprite: "SlimeLeft", + DisplacementPoses: ["Closed"], }, { Name: "FootRight", Layer: "WrappingLegsRight", Pri: -150, //SwapLayerPose: {Kneel: "WrappingLegsRight", KneelClosed: "WrappingLegsRight"}, @@ -113,6 +117,10 @@ AddModel({ AddPriWithPose: { ItemBootsRubberOver: 45, }, + DisplaceLayers: ToMap(["HeelRight"]), + DisplaceAmount: 100, + DisplacementSprite: "SlimeRight", + DisplacementPoses: ["Closed"], }, ]) }); diff --git a/Data/ModelList_TapeHeavy.ts b/Data/ModelList_TapeHeavy.ts index 761d14f14..fceb888bb 100644 --- a/Data/ModelList_TapeHeavy.ts +++ b/Data/ModelList_TapeHeavy.ts @@ -15,6 +15,10 @@ AddModel({ 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"]), diff --git a/Data/ModelList_TapeLight.ts b/Data/ModelList_TapeLight.ts index 42137ad52..530a26f13 100644 --- a/Data/ModelList_TapeLight.ts +++ b/Data/ModelList_TapeLight.ts @@ -12,6 +12,10 @@ AddModel({ TopLevel: false, Restraint: true, Categories: ["Restraints", "Tape"], + AddPoseConditional: { + RestrainingShoes: ["TapeBoots"], + }, + RemovePoses: ["RestrainingShoes"], Layers: ToLayerMap([ { Name: "Feet", Layer: "WrappingLegs", Pri: 10, Poses: ToMap(["Closed", "KneelClosed"]), diff --git a/Data/ModelList_TapeMed.ts b/Data/ModelList_TapeMed.ts index c18d8a25e..130d0c560 100644 --- a/Data/ModelList_TapeMed.ts +++ b/Data/ModelList_TapeMed.ts @@ -13,6 +13,10 @@ AddModel({ Restraint: true, Categories: ["Restraints", "Tape"], AddPose: ["EncaseFeet"], + AddPoseConditional: { + RestrainingShoes: ["TapeBoots"], + }, + RemovePoses: ["RestrainingShoes"], Layers: ToLayerMap([ { Name: "Feet", Layer: "WrappingLegs", Pri: 10, Poses: ToMap(["Closed", "KneelClosed"]), diff --git a/Data/ModelStylesFace.ts b/Data/ModelStylesFace.ts index b9736e895..ca8bc43b7 100644 --- a/Data/ModelStylesFace.ts +++ b/Data/ModelStylesFace.ts @@ -20,6 +20,7 @@ let KDModelFace: {[_: string]: KinkyDungeonDress} = { Myrtrice: [{"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":"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":"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":"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}}}], "WolfgirlBlue" : [ diff --git a/Data/ModelStylesHair.ts b/Data/ModelStylesHair.ts index d96b8af1f..f563e909b 100644 --- a/Data/ModelStylesHair.ts +++ b/Data/ModelStylesHair.ts @@ -63,6 +63,7 @@ let KDModelHair: {[_: string]: KinkyDungeonDress} = { 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}}}], diff --git a/Data/ModelStylesList.ts b/Data/ModelStylesList.ts index 03c7d0337..500e776cd 100644 --- a/Data/ModelStylesList.ts +++ b/Data/ModelStylesList.ts @@ -271,6 +271,38 @@ let KDModelStyles: Record> = { "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", diff --git a/Data/ModelTypes.ts b/Data/ModelTypes.ts index 1c969e6f7..8d0d81116 100644 --- a/Data/ModelTypes.ts +++ b/Data/ModelTypes.ts @@ -115,6 +115,11 @@ interface ModelLayer extends Namable { 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 */ @@ -235,6 +240,7 @@ type LayerProperties = { Rotation?: number, XScale?: number, YScale?: number, + Protected?: number, SuppressDynamic?: number, HideOverridden?: number, NoOverride?: number, diff --git a/Data/Models.ts b/Data/Models.ts index 290256a01..e40b45e0d 100644 --- a/Data/Models.ts +++ b/Data/Models.ts @@ -4,6 +4,12 @@ let StruggleAnimation = false; let RenderCharacterQueue = new Map(); let RenderCharacterLock = new Map(); +let KDFilterCacheToDestroy: PIXIFilter[] = []; +let KDRenderTexToDestroy: PIXITexture[] = []; +let KDSpritesToCull: PIXISprite[] = []; + +let KDCulling = true; + /** * Returns a table with the priorities for each layer based on order of the array */ @@ -178,7 +184,9 @@ function GetModelWithExtraLayers(NewModel: string, BaseModel: string, Layers: Mo return null; } -function GetModelRestraintVersion(BaseModel: string, Parent: boolean): Model { +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"; @@ -188,6 +196,15 @@ function GetModelRestraintVersion(BaseModel: string, Parent: boolean): Model { 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; @@ -384,7 +401,7 @@ function DrawCharacter(C: Character, X: number, Y: number, Zoom: number, IsHeigh DrawCanvas.removeChild(MC.Containers.get(containerID).Mesh); MC.Containers.get(containerID).Container.destroy(); MC.Containers.get(containerID).Mesh.destroy(); - MC.Containers.get(containerID).RenderTexture.destroy(true); + KDRenderTexToDestroy.push(MC.Containers.get(containerID).RenderTexture); MC.Containers.delete(containerID); MC.ContainersDrawn.delete(containerID); refreshfilters = true; @@ -392,7 +409,7 @@ function DrawCharacter(C: Character, X: number, Y: number, Zoom: number, IsHeigh KDGlobalFilterCacheRefresh = false; for (let fc of KDAdjustmentFilterCache.values()) { for (let f of fc) { - f.destroy(); + KDFilterCacheToDestroy.push(f); } } KDAdjustmentFilterCache.clear(); @@ -425,7 +442,7 @@ function DrawCharacter(C: Character, X: number, Y: number, Zoom: number, IsHeigh Container.Container.sortableChildren = true; //Container.Container.cacheAsBitmap = true; if (zIndex) Container.Mesh.zIndex = zIndex; - Container.Container.filterArea = new PIXI.Rectangle(0,0,MODELWIDTH*MODEL_SCALE,MODELHEIGHT*MODEL_SCALE); + //Container.Container.filterArea = new PIXI.Rectangle(0,0,MODELWIDTH*MODEL_SCALE,MODELHEIGHT*MODEL_SCALE); } // Actual loop for drawing the models on the character @@ -702,7 +719,12 @@ function DrawCharacterModels(containerID: string, MC: ModelContainer, X, Y, Zoom let lyr = KDLayerPropName(l, MC.Poses); // Apply displacement - if (l.DisplaceLayers && (!l.DisplacementPoses || l.DisplacementPoses.some((pose) => {return MC.Poses[pose];}))) { + 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, mods); @@ -795,6 +817,7 @@ function DrawCharacterModels(containerID: string, MC: ModelContainer, X, Y, Zoom scalex: sx != 1 ? sx : undefined, scaley: sy != 1 ? sy : undefined, alpha: 0.0, + cullable: KDCulling, }, false, ContainerContainer.SpritesDrawn, Zoom @@ -806,7 +829,12 @@ function DrawCharacterModels(containerID: string, MC: ModelContainer, X, Y, Zoom } } // Apply erase - if (l.EraseLayers && (!l.ErasePoses || l.ErasePoses.some((pose) => {return MC.Poses[pose];}))) { + 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, mods); @@ -899,6 +927,7 @@ function DrawCharacterModels(containerID: string, MC: ModelContainer, X, Y, Zoom scalex: sx != 1 ? sx : undefined, scaley: sy != 1 ? sy : undefined, alpha: 0.0, + cullable: KDCulling, }, false, ContainerContainer.SpritesDrawn, Zoom @@ -933,6 +962,7 @@ function DrawCharacterModels(containerID: string, MC: ModelContainer, X, Y, Zoom 0, { zIndex: 1000000, alpha: 0.0, + cullable: KDCulling, }, false, ContainerContainer.SpritesDrawn, Zoom @@ -1010,14 +1040,7 @@ function DrawCharacterModels(containerID: string, MC: ModelContainer, X, Y, Zoom let rot = transform.rot; let fh = containerID + (m.Filters ? (m.Filters[l.InheritColor || l.Name] ? FilterHash(m.Filters[l.InheritColor || l.Name]) : "") : ""); - /*if (refreshfilters) { - if (KDAdjustmentFilterCache.get(fh)) { - for (let f of KDAdjustmentFilterCache.get(fh)) { - f.destroy(); - } - } - KDAdjustmentFilterCache.delete(fh); - }*/ + let filter = m.Filters ? (m.Filters[l.InheritColor || l.Name] ? (KDAdjustmentFilterCache.get(fh) || [adjustFilter(m.Filters[l.InheritColor || l.Name])]) : undefined) : undefined; @@ -1076,7 +1099,7 @@ function DrawCharacterModels(containerID: string, MC: ModelContainer, X, Y, Zoom KDAdjustmentFilterCache.delete(efh); } KDTex(dsprite.name, false); // try to preload it - f = new PIXI.DisplacementFilter( + f = new DisplaceFilter( dsprite, ef.amount, ); @@ -1110,6 +1133,7 @@ function DrawCharacterModels(containerID: string, MC: ModelContainer, X, Y, Zoom scalex: sx != 1 ? sx : undefined, scaley: sy != 1 ? sy : undefined, filters: filters, + cullable: KDCulling, }, false, ContainerContainer.SpritesDrawn, Zoom @@ -1382,6 +1406,11 @@ function GetTrimmedAppearance(C: Character) { 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) { @@ -1457,6 +1486,11 @@ function UpdateModels(C: Character, Xray?: string[]) { 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) { @@ -1507,6 +1541,11 @@ function UpdateModels(C: Character, Xray?: string[]) { MC.Poses[pose] = true; } } + if (m.Categories) { + for (let pose of m.Categories) { + MC.Poses[pose] = true; + } + } } KDRefreshPoseOptionsMC(MC); @@ -1731,6 +1770,11 @@ function DrawModelProcessPoses(MC: ModelContainer, extraPoses: string[]) { MC.Poses[pose] = true; } } + if (m.Categories) { + for (let pose of m.Categories) { + MC.Poses[pose] = true; + } + } } if (MC.XRayFilters) { @@ -1765,27 +1809,28 @@ function DrawModelProcessPoses(MC: ModelContainer, extraPoses: string[]) { } function RenderModelContainer(MC: ModelContainer, C: Character, containerID: string) { - // Sanitize the files in case something was disposed - - if (KDToggles.AsyncRendering && KinkyDungeonDrawState == "Game" && KinkyDungeonState == "Game") { + // 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, - }); - 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) { @@ -1802,7 +1847,7 @@ function KDCullModelContainerContainer(MC: ModelContainer, containerID: string) sprite[1].parent.removeChild(sprite[1]); Container.SpriteList.delete(sprite[0]); modified = true; - sprite[1].destroy(); + KDSpritesToCull.push(sprite[1]); } else sprite[1].visible = false; } } @@ -1886,4 +1931,31 @@ class Transform { 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; } \ No newline at end of file diff --git a/Data/Poses.ts b/Data/Poses.ts index d53c576d7..0ece8ec18 100644 --- a/Data/Poses.ts +++ b/Data/Poses.ts @@ -544,11 +544,11 @@ function RefreshTempPoses(Character: Character, Restraints: boolean, Buffs: bool if (Restraints) { for (let inv of KDGetRestraintsForID(KDGetCharacterID(Character))) { - if (KDRestraint(inv).addPose) + 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) + 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; } diff --git a/Data/Preload.ts b/Data/Preload.ts index 145b70985..1102c1405 100644 --- a/Data/Preload.ts +++ b/Data/Preload.ts @@ -133,7 +133,10 @@ let KDButtonFontListIndex = 0; let KDButtonFontList = Array.from(KDFonts.keys()); let DisplacementMaps = [ +'SlimeLeftClosed.png', +'SlimeRightClosed.png', 'HideBoxtieHand.png', +'BedStrapsHogtie.png', 'FutureBox.png', 'TapeTopRight.png', 'TapeTopRightBoxtie.png', @@ -286,6 +289,8 @@ let DisplacementMaps = [ 'Heels2Spread.png', 'HeelsRightErase.png', 'HeelsRightEraseClosed.png', +'HeelsRightErase2.png', +'HeelsRightErase2Closed.png', 'JacketArmsBoxtie.png', 'JacketArmsCrossed.png', 'JacketArmsWristtie.png', diff --git a/DisplacementMaps/BedStrapsHogtie.png b/DisplacementMaps/BedStrapsHogtie.png new file mode 100644 index 000000000..30d83e958 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/Calf1SquishClosed.png b/DisplacementMaps/Calf1SquishClosed.png index 931f2af4d..40d2512fd 100644 Binary files a/DisplacementMaps/Calf1SquishClosed.png and b/DisplacementMaps/Calf1SquishClosed.png differ diff --git a/DisplacementMaps/Heels2Spread.png b/DisplacementMaps/Heels2Spread.png index 1b5106ca9..02a897d7f 100644 Binary files a/DisplacementMaps/Heels2Spread.png and b/DisplacementMaps/Heels2Spread.png differ diff --git a/DisplacementMaps/HeelsEraseClosed.png b/DisplacementMaps/HeelsEraseClosed.png index 696e4ecf7..12ae04887 100644 Binary files a/DisplacementMaps/HeelsEraseClosed.png and b/DisplacementMaps/HeelsEraseClosed.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/SlimeLeftClosed.png b/DisplacementMaps/SlimeLeftClosed.png new file mode 100644 index 000000000..e3d9f8358 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..33db5ae0d Binary files /dev/null and b/DisplacementMaps/SlimeRightClosed.png differ diff --git a/DisplacementMaps/TapeAnklesSquishClosed.png b/DisplacementMaps/TapeAnklesSquishClosed.png index ac654488a..9a6c598a4 100644 Binary files a/DisplacementMaps/TapeAnklesSquishClosed.png and b/DisplacementMaps/TapeAnklesSquishClosed.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/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/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/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/Changelog.txt b/Game/Changelog.txt index 5b9135e60..d3972ffc1 100644 --- a/Game/Changelog.txt +++ b/Game/Changelog.txt @@ -30,6 +30,99 @@ TODO: TODO remove hogtie when released +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 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/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/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/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/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_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..cde7ec2d2 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..938da497d 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..30f8f3038 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..2d8cdc65d 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_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/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/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_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/WallR.png b/Game/Floors/Floor_jng/WallR.png new file mode 100644 index 000000000..68825b2aa 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/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_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_shoppe/WallOld.png b/Game/Floors/Floor_shoppe/WallOld.png deleted file mode 100644 index fd32c72dd..000000000 Binary files a/Game/Floors/Floor_shoppe/WallOld.png and /dev/null 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_shrine/Wall.png b/Game/Floors/Floor_shrine/Wall.png index 78a9acd18..eb1f2411b 100644 Binary files a/Game/Floors/Floor_shrine/Wall.png 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 index 3dc623438..651c96c93 100644 Binary files a/Game/Floors/Floor_shrine/WallVert.png 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/WallR.png b/Game/Floors/Floor_vault/WallR.png new file mode 100644 index 000000000..490075cce 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/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/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/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/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/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/src/base/KDModUtils.js b/Game/src/base/KDModUtils.ts similarity index 55% rename from Game/src/base/KDModUtils.js rename to Game/src/base/KDModUtils.ts index 00119d210..727dba7b7 100644 --- a/Game/src/base/KDModUtils.js +++ b/Game/src/base/KDModUtils.ts @@ -1,25 +1,14 @@ 'use strict'; -/** - * @enum {PosNeutNeg} - */ -let KDPosNeutNeg = { - positive:1, - neutral:0, - negative:-1, +/* Ensure this aligns with ModifierEnum. */ +enum KDModifierEnum { + restraint = 0, + looserestraint = 0, + weapon, + consumable, }; -/** - * @enum {ModifierEnum} - */ -let KDModifierEnum = { - restraint:0, - looserestraint:0, - weapon:1, - consumable:2, -}; - -function addTextKey(Name, Text) { +function addTextKey(Name: string, Text: string) { let ct = 0; for (let screen of TextAllScreenCache.entries()) { if (screen[0].includes("KinkyDungeon")) { @@ -28,7 +17,7 @@ function addTextKey(Name, Text) { } if (ct == 0) KDLoadingTextKeys[Name] = Text; } -function deleteTextKey(Name) { +function deleteTextKey(Name: string) { let ct = 0; for (let screen of TextAllScreenCache.entries()) { if (screen[0].includes("KinkyDungeon")) { @@ -38,10 +27,12 @@ function deleteTextKey(Name) { if (ct == 0) delete KDLoadingTextKeys[Name]; } -const cloneDeep = (obj) => +const cloneDeep = (obj: any) => JSON.parse(JSON.stringify(obj)); -const defaultRestraint = { +const defaultRestraint: restraint = { + name: undefined, + Group: undefined, inventory: true, power: 0, weight: 0, @@ -55,28 +46,28 @@ const defaultRestraint = { }, events: [], - enemyTags: [], - playerTags: [], + enemyTags: {}, + playerTags: {}, shrine: [], }; /** * Creates a restraint using a set of reasonable defaults and adds it to the list of restraints. * - * @param {KDRestraintProps} props + * @param props * A list of restraint props to be applied. At minimum, the "name", "Group" and "Asset" props should be provided. * - * @param {string} [displayName] + * @param [displayName] * The name displayed to the user for the restraint. * - * @param {string} [flavorText] + * @param [flavorText] * Text that describes the "look and feel" of the restraint. * - * @param {string} [functionText] + * @param [functionText] * Text that describes how the restraint operates. * @returns The created restraint. */ -function KinkyDungeonCreateRestraint(props, displayName, flavorText, functionText) { +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.'); } @@ -93,18 +84,14 @@ function KinkyDungeonCreateRestraint(props, displayName, flavorText, functionTex return restraint; } -/** - * @type {Record>} - */ -let KDCursedVariantsCreated = { -}; +let KDCursedVariantsCreated: Record> = {}; /** * 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 + * @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, Variants) { +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)); @@ -116,13 +103,12 @@ function KinkyDungeonAddCursedVariants(Restraint, Variants) { /** * 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[]} + * @param Restraint + * @param [includeOrig] - includes thje original item + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity */ -function KinkyDungeonGetCurses(Restraint, includeOrig, minLevel, maxLevel) { +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) @@ -136,23 +122,22 @@ function KinkyDungeonGetCurses(Restraint, includeOrig, minLevel, maxLevel) { /** * Gets a list of curses applied to the item - * @param {string | string[]} List - * @param {ModifierEnum} Type - * @param {number} [minLevel] - for gating curse severity - * @param {number} [maxLevel] - for gating curse severity - * @returns {string[]} + * @param List + * @param Type + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity */ -function KinkyDungeonGetVariantEffectByList(List, Type, minLevel, maxLevel) { +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) => { + let keys = KDModifierEffectVariantList[l].filter((key: string) => { return (!minLevel || KDModifierEffects[key].types[Type]?.level >= minLevel) && (!maxLevel || KDModifierEffects[key].types[Type]?.level < maxLevel); - }).map((element) => {return element;}); + }).map((element: any) => {return element;}); temp.push(...keys); } } @@ -161,19 +146,26 @@ function KinkyDungeonGetVariantEffectByList(List, Type, minLevel, maxLevel) { /** * Gets a list of curses applied to the item - * @param {string | string[]} List - * @param {string} item - * @param {ModifierEnum} Type - * @param {KDModifierConditionData} data - data - * @param {number} [minLevel] - for gating curse severity - * @param {number} [maxLevel] - for gating curse severity - * @param {PosNeutNeg} [positive] - for gating severity - * @returns {Record} + * @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, Type, item, data, minLevel, maxLevel, positive) { +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); - /** @type {Record} */ - let ret = {}; + 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); @@ -185,23 +177,22 @@ function KinkyDungeonGetVariantEffectByListWeighted(List, Type, item, data, minL /** * Gets a list of curses applied to the item - * @param {string | string[]} List - * @param {ModifierEnum} Type - * @param {number} [minLevel] - for gating curse severity - * @param {number} [maxLevel] - for gating curse severity - * @returns {string[]} + * @param List + * @param Type + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity */ -function KinkyDungeonGetVariantConditionByList(List, Type, minLevel, maxLevel) { +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) => { + let keys = KDModifierConditionVariantList[l].filter((key: string) => { return (!minLevel || KDModifierConditions[key].types[Type]?.level >= minLevel) && (!maxLevel || KDModifierConditions[key].types[Type]?.level < maxLevel); - }).map((element) => {return element;}); + }).map((element: any) => {return element;}); temp.push(...keys); } } @@ -210,21 +201,31 @@ function KinkyDungeonGetVariantConditionByList(List, Type, minLevel, maxLevel) { /** * Gets a list of curses applied to the item - * @param {string | string[]} List - * @param {string} item - * @param {ModifierEnum} Type - * @param {KDModifierConditionData} data - data - * @param {number} [minLevel] - for gating curse severity - * @param {number} [maxLevel] - for gating curse severity - * @param {KDModifierEffect[]} [effect_positive] - for gating severity - * @param {KDModifierEffect[]} [effect_neutral] - for gating severity - * @param {KDModifierEffect[]} [effect_negative] - for gating severity + * @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, Type, item, data, minLevel, maxLevel, effect_positive, effect_neutral, effect_negative) { +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); - /** @type {Record} */ - let ret = {}; + 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); @@ -233,25 +234,34 @@ function KinkyDungeonGetVariantConditionByListWeighted(List, Type, item, data, m } /** - * - * @param {string | string[]} ListEffect - * @param {string | string[]} ListCondition - * @param {string} item - * @param {ModifierEnum} Type - * @param {number} minLevel - * @param {number} maxLevel - * @param {PosNeutNeg} pos - * @param {KDModifierConditionData} data - data + * @param ListEffect + * @param ListCondition + * @param Type + * @param item + * @param minLevel + * @param maxLevel + * @param pos + * @param data - data */ -function KDGenerateEffectConditionPair(ListEffect, ListCondition, Type, item, minLevel, maxLevel, pos, 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 == KDPosNeutNeg.positive) epo.push(KDModifierEffects[effect]); - if (pos == KDPosNeutNeg.neutral) enu.push(KDModifierEffects[effect]); - if (pos == KDPosNeutNeg.negative) eng.push(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)); @@ -265,23 +275,22 @@ function KDGenerateEffectConditionPair(ListEffect, ListCondition, Type, item, mi /** * Gets a list of curses applied to the item - * @param {string | string[]} List - * @param {boolean} [includeOrig] - includes thje original item - * @param {number} [minLevel] - for gating curse severity - * @param {number} [maxLevel] - for gating curse severity - * @returns {string[]} + * @param List + * @param [includeOrig] - includes thje original item + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity */ -function KinkyDungeonGetHexByList(List, includeOrig, minLevel, maxLevel) { +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) => { + let keys = KDHexVariantList[l].filter((key: string) => { return (!minLevel || KDEventHexModular[key].level >= minLevel) && (!maxLevel || KDEventHexModular[key].level < maxLevel); - }).map((element) => {return element;}); + }).map((element: any) => {return element;}); temp.push(...keys); } } @@ -291,18 +300,16 @@ function KinkyDungeonGetHexByList(List, includeOrig, minLevel, maxLevel) { /** * 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 - * @param {string[]} [allHex] - for gating curse severity - * @returns {Record} + * @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, item, includeOrig, minLevel, maxLevel, allHex) { +function KinkyDungeonGetHexByListWeighted(List: string | string[], item: string, includeOrig?: boolean, minLevel?: number, maxLevel?: number, allHex?: string[]): Record { let list = KinkyDungeonGetHexByList(List, includeOrig, minLevel, maxLevel); - /** @type {Record} */ - let ret = {}; + let ret: Record = {}; for (let obj of list) { ret[obj] = KDEventHexModular[obj].weight(item, allHex, {item: item}); } @@ -311,24 +318,23 @@ function KinkyDungeonGetHexByListWeighted(List, item, includeOrig, minLevel, max /** * Gets a list of curses applied to the item - * @param {string | string[]} List - * @param {ModifierEnum} Type - * @param {boolean} [includeOrig] - includes thje original item - * @param {number} [minLevel] - for gating curse severity - * @param {number} [maxLevel] - for gating curse severity - * @returns {string[]} + * @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, Type, includeOrig, minLevel, maxLevel) { +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) => { + let keys = KDEnchantVariantList[l].filter((key: string) => { return (!minLevel || KDEventEnchantmentModular[key].types[Type].level >= minLevel) && (!maxLevel || KDEventEnchantmentModular[key].types[Type].level < maxLevel); - }).map((element) => {return element;}); + }).map((element: any) => {return element;}); temp.push(...keys); } } @@ -338,19 +344,17 @@ function KinkyDungeonGetEnchantmentsByList(List, Type, includeOrig, minLevel, ma /** * Gets a list of curses applied to the item - * @param {string | string[]} List - * @param {string} item - * @param {ModifierEnum} Type - * @param {boolean} [includeOrig] - includes thje original item - * @param {number} [minLevel] - for gating curse severity - * @param {number} [maxLevel] - for gating curse severity - * @param {string[]} [allEnchant] - for gating curse severity - * @returns {Record} + * @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, Type, item, includeOrig, minLevel, maxLevel, allEnchant) { +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); - /** @type {Record} */ - let ret = {}; + 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}); @@ -361,13 +365,13 @@ function KinkyDungeonGetEnchantmentsByListWeighted(List, Type, item, includeOrig /** * Gets a list of curses applied to the item - * @param {string | string[]} List - * @param {boolean} [includeOrig] - includes thje original item - * @param {number} [minRarity] - for gating curse severity - * @param {number} [maxRarity] - for gating curse severity + * @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, includeOrig, minRarity, maxRarity) { +function KinkyDungeonGetWeaponsByList(List: string | string[], includeOrig?: boolean, minRarity?: number, maxRarity?: number): string[] { let temp = []; if (typeof List === "string") { List = [List]; @@ -387,16 +391,15 @@ function KinkyDungeonGetWeaponsByList(List, includeOrig, minRarity, maxRarity) { /** * Gets a list of curses applied to the item - * @param {string} WeaponList - * @param {boolean} [includeOrig] - includes thje original item - * @param {number} [minRarity] - for gating curse severity - * @param {number} [maxRarity] - for gating curse severity + * @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, includeOrig, minRarity, maxRarity) { +function KinkyDungeonGetWeaponsByListWeighted(WeaponList: string, includeOrig?: boolean, minRarity?: number, maxRarity?: number): Record { let list = KinkyDungeonGetWeaponsByList(WeaponList, includeOrig, minRarity, maxRarity); - /** @type {Record} */ - let ret = {}; + let ret: Record = {}; for (let obj of list) { if (obj) ret[obj] = KDWeaponLootList[WeaponList][obj]; @@ -408,23 +411,22 @@ function KinkyDungeonGetWeaponsByListWeighted(WeaponList, includeOrig, minRarity /** * Gets a list of curses applied to the item - * @param {string | string[]} List - * @param {boolean} [includeOrig] - includes thje original item - * @param {number} [minLevel] - for gating curse severity - * @param {number} [maxLevel] - for gating curse severity - * @returns {string[]} + * @param List + * @param [includeOrig] - includes thje original item + * @param [minLevel] - for gating curse severity + * @param [maxLevel] - for gating curse severity */ -function KinkyDungeonGetCurseByList(List, includeOrig, minLevel, maxLevel) { +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) => { + let keys = KDCurseUnlockList[l].filter((key: string) => { return (!minLevel || KDCurses[key].level >= minLevel) && (!maxLevel || KDCurses[key].level < maxLevel); - }).map((element) => {return element;}); + }).map((element: any) => {return element;}); temp.push(...keys); } } @@ -441,10 +443,9 @@ function KinkyDungeonGetCurseByList(List, includeOrig, minLevel, maxLevel) { * @param {number} [maxLevel] - for gating curse severity * @returns {Record} */ -function KinkyDungeonGetCurseByListWeighted(List, item, includeOrig, minLevel, maxLevel) { +function KinkyDungeonGetCurseByListWeighted(List: string | string[], item: string, includeOrig?: boolean, minLevel?: number, maxLevel?: number): Record { let list = KinkyDungeonGetCurseByList(List, includeOrig, minLevel, maxLevel); - /** @type {Record} */ - let ret = {}; + let ret: Record = {}; for (let obj of list) { ret[obj] = KDCurses[obj].weight(item); } @@ -455,18 +456,18 @@ function KinkyDungeonGetCurseByListWeighted(List, item, includeOrig, minLevel, m /** * Creates a restraint using an existing restraint as a base and adds it to the list of restraints. * - * @param {string} clonedName + * @param clonedName * The name of the restraint to be cloned. * - * @param {string} newName + * @param newName * The name of the newly created restraint. * - * @param {object} props + * @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, newName, props) { +function KinkyDungeonCloneRestraint(clonedName: string, newName: string, props: object): restraint { const existingRestraint = KinkyDungeonRestraints.find(restraint => restraint.name === clonedName); if (!existingRestraint) { @@ -488,19 +489,19 @@ function KinkyDungeonCloneRestraint(clonedName, newName, props) { /** * Registers text for a named restraint. * - * @param {string} name + * @param name * The name of the restraint used by the system. * - * @param {string} displayName + * @param displayName * The name displayed to the user for the restraint. * - * @param {string} flavorText + * @param flavorText * Text that describes the "look and feel" of the restraint. * - * @param {string} functionText + * @param functionText * Text that describes how the restraint operates. */ -function KinkyDungeonAddRestraintText(name, displayName, flavorText, functionText) { +function KinkyDungeonAddRestraintText(name: string, displayName: string, flavorText: string, functionText: string): void { const baseKey = `Restraint${name}`; addTextKey(baseKey, displayName); @@ -511,11 +512,10 @@ function KinkyDungeonAddRestraintText(name, displayName, flavorText, functionTex /** * 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. - * + * @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, newRestraint) { +function KinkyDungeonDupeRestraintText(restraint: string, newRestraint: string): void { const oldKey = `Restraint${restraint}`; const baseKey = `Restraint${newRestraint}`; @@ -527,17 +527,14 @@ function KinkyDungeonDupeRestraintText(restraint, newRestraint) { /** * Returns true if the player has a perk - * @param {string} perk - * @returns {boolean} */ -function HasPerk(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) - * @returns {entity} */ -function KDPlayer() { +function KDPlayer(): entity { return KinkyDungeonPlayerEntity; -} \ No newline at end of file +} diff --git a/Game/src/base/KDParticles.js b/Game/src/base/KDParticles.ts similarity index 89% rename from Game/src/base/KDParticles.js rename to Game/src/base/KDParticles.ts index 1b9c0a92f..31b75fbe8 100644 --- a/Game/src/base/KDParticles.js +++ b/Game/src/base/KDParticles.ts @@ -1,22 +1,19 @@ 'use strict'; -/** @type {Map} */ -let KDParticles = new Map(); +let KDParticles: Map = new Map(); let KDParticleid = 0; -/** @type {Map} */ -let KDParticleEmitters = new Map(); +let KDParticleEmitters: Map = new Map(); let KDParticleEmitterid = 0; /** - * - * @param {number} x - * @param {number} y - * @param {string} img - * @param {string} type - * @param {KDParticleData} data + * @param x + * @param y + * @param img + * @param _type + * @param data */ -function KDAddParticle(x, y, img, type, data) { +function KDAddParticle(x: number, y: number, img: string, _type: string, data: KDParticleData): void { if (KDParticles.size > 1000) return; let tex = KDTex(img); @@ -63,16 +60,15 @@ function KDAddParticle(x, y, img, type, data) { /** - * - * @param {number} x - * @param {number} y - * @param {string} img - * @param {string} imgemitted - * @param {string} type - * @param {KDParticleEmitterData} emitter - * @param {KDParticleData} emitted + * @param x + * @param y + * @param img + * @param imgemitted + * @param type + * @param emitter + * @param emitted */ -function KDAddParticleEmitter(x, y, img, imgemitted, type, emitter, 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); @@ -119,13 +115,12 @@ function KDAddParticleEmitter(x, y, img, imgemitted, type, emitter, emitted) { } -function KDUpdateParticles(delta) { +function KDUpdateParticles(delta: number) { let id = 0; - /** @type {KDParticleData} */ - let info = null; + let info: KDParticleData = null; let sprite = null; for (let particle of KDParticles.entries()) { - id = particle[0]; + id = particle[0].valueOf(); info = particle[1].info; sprite = particle[1].sprite; @@ -167,10 +162,9 @@ function KDUpdateParticles(delta) { } - /** @type {KDParticleEmitterData} */ - let emitter = null; + let emitter: KDParticleEmitterData = null; for (let particle of KDParticleEmitters.entries()) { - id = particle[0]; + id = particle[0].valueOf(); emitter = particle[1].emitter; sprite = particle[1].sprite; @@ -218,7 +212,7 @@ function KDUpdateParticles(delta) { } } -function KDRemoveParticle(id) { +function KDRemoveParticle(id: number) { if (KDParticles.has(id)) { kdparticles.removeChild(KDParticles.get(id).sprite); KDParticles.get(id).sprite.destroy(); @@ -226,7 +220,7 @@ function KDRemoveParticle(id) { } } -function KDRemoveParticleEmitter(id) { +function KDRemoveParticleEmitter(id: number) { if (KDParticleEmitters.has(id)) { kdparticles.removeChild(KDParticleEmitters.get(id).sprite); KDParticleEmitters.get(id).sprite.destroy(); @@ -239,11 +233,11 @@ 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 + * @param pinkChance - 0 to 1 + * @param density - 0 to 1 + * @param purpleChance - 0 to 1 */ -function KDDrawArousalParticles(pinkChance, density, purpleChance) { +function KDDrawArousalParticles(pinkChance: number, density: number, purpleChance: number) { if (density == 0) return; let arousalRate = 100 / density; @@ -255,7 +249,7 @@ function KDDrawArousalParticles(pinkChance, density, purpleChance) { } -function KDDrawVibeParticles(density) { +function KDDrawVibeParticles(density: number) { let arousalRate = 100 / density; if (StandalonePatched) arousalRate *= 2; @@ -266,7 +260,7 @@ function KDDrawVibeParticles(density) { } } -function KDAddShockwave(x, y, size, spr = `Particles/Shockwave.png`, attachToCamera = true) { +function KDAddShockwave(x: number, y: number, size: number, spr: string = `Particles/Shockwave.png`, attachToCamera: boolean = true) { let lifetime = 700 + size; let data = { time: 0, @@ -281,8 +275,8 @@ function KDAddShockwave(x, y, size, spr = `Particles/Shockwave.png`, attachToCam rotation: 0, }; if (attachToCamera) { - data.camX = KinkyDungeonCamX; - data.camY = KinkyDungeonCamY; + data['camX'] = KinkyDungeonCamX; + data['camY'] = KinkyDungeonCamY; } KDAddParticle( x, @@ -291,7 +285,7 @@ function KDAddShockwave(x, y, size, spr = `Particles/Shockwave.png`, attachToCam undefined, data); } -function KDSendGagParticles(entity) { +function KDSendGagParticles(entity: entity): void { if (!KDToggles.GagParticles) return; if (entity?.player) { // Player @@ -453,11 +447,10 @@ function KDCreateVibeParticle() { } /** - * - * @param {number} pinkChance - 0 to 1 - * @param {number} purpleChance - 0 to 1 + * @param pinkChance - 0 to 1 + * @param purpleChance - 0 to 1 */ -function KDCreateArousalParticle(pinkChance, purpleChance) { +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()); @@ -481,4 +474,4 @@ function KDCreateArousalParticle(pinkChance, purpleChance) { phase: 6 * Math.random(), fadeEase: "invcos", }); -} \ No newline at end of file +} diff --git a/Game/src/base/KDTypeDefs.ts b/Game/src/base/KDTypeDefs.ts index 350f143c3..f6d058591 100644 --- a/Game/src/base/KDTypeDefs.ts +++ b/Game/src/base/KDTypeDefs.ts @@ -8,12 +8,18 @@ interface NamedAndTyped extends Named { 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[], @@ -140,6 +146,8 @@ interface KDRestraintProps extends KDRestraintPropsBase { } 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 */ @@ -375,6 +383,7 @@ interface KDRestraintPropsBase { KnifeDrop?: string, KeyDrop?: string, PickDrop?: string, + Blocked?: string, }, sfxFinishEscape?: { Struggle?: string, @@ -433,6 +442,10 @@ interface KDRestraintPropsBase { 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 */ @@ -687,6 +700,7 @@ interface floorParams { max_width : number, min_height : number, max_height : number, + deadend? : number, ShopExclusives? : string[], ShopExclusivesArousal? : string[], @@ -887,6 +901,9 @@ interface enemy extends KDHasTags { 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) */ @@ -1216,6 +1233,7 @@ interface enemy extends KDHasTags { 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, /** */ @@ -1411,6 +1429,7 @@ interface weapon { /** Slows player after attacking */ channelslow?: boolean; novulnerable?: boolean; + nocrit?: boolean; tags?: string[]; special?: { type: string, @@ -1481,6 +1500,7 @@ interface KinkyDungeonEvent { always?: boolean, bindEff?: number, type: string; + requireFlag?: string; trigger: string; threshold?: number, restraint?: string; @@ -1633,7 +1653,7 @@ interface entity { /** Determines if an enemy can be dommed or not */ domVariance?: number, hideTimer?: boolean, - Enemy: enemy, + Enemy?: enemy, /** Amount of sound the entity is currently producing */ sound?: number, @@ -1669,7 +1689,7 @@ interface entity { specialdialogue?: string, aggro?: number, id?: number, - hp: number, + hp?: number, mana?: number, AI?: string, moved?: boolean, @@ -1749,6 +1769,8 @@ interface entity { NextJailLeashTourWaypointX?: number, NextJailLeashTourWaypointY?: number, KinkyDungeonJailTourInfractions?: number, + /** Used by guards. */ + CurrentRestraintSwapGroup?: string, } type KinkyDungeonDress = { @@ -1884,6 +1906,8 @@ interface spell { 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 */ @@ -2208,8 +2232,10 @@ interface spell { noTargetEnemies?: boolean; /** Exception list for NoTargetEnemies */ exceptionFactions?: string[]; - /** noTargetAllies */ + /** */ 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 */ @@ -2236,10 +2262,10 @@ interface KDQuest { npc: string; visible: boolean; nocancel?: boolean, - tick?: (delta) => void; + tick?: (delta: number) => void; worldgenstart?: () => void; accept?: () => void; - weight: (RoomType: any, MapMod: any, data: any, currentQuestList: any) => number; + weight: (RoomType: any, MapMod: any, data: any, currentQuestList?: any) => number; prerequisite: (RoomType: any, MapMod: any, data: any, currentQuestList: any) => boolean; tags?: string[], }; @@ -2252,6 +2278,8 @@ interface KinkyDialogue { 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*/ @@ -2297,6 +2325,9 @@ interface KinkyDialogue { 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 { @@ -2416,6 +2447,8 @@ interface KDStruggleData { extraLim: number, extraLimPenalty: number, extraLimThreshold: number, + + upfrontWill?: boolean, } interface KDFilteredInventoryItem { @@ -2450,6 +2483,7 @@ interface KinkyDungeonSave { appearance: any[], default: string, poses: Record, + Palette: string, outfit: string, @@ -2461,6 +2495,8 @@ interface KinkyDungeonSave { dp: string, } + KinkyDungeonCurrentTick: number, + errorloading: boolean, modsmissing: boolean, @@ -2593,7 +2629,17 @@ interface KDLabel { 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 { + RepopulateQueue: RepopQueueData[], Checkpoint: string, Title: string, PrisonState: string, @@ -2603,7 +2649,9 @@ interface KDMapDataType { Labels: Record, flags?: string[], - data: any, + data: Record, + + Regiments: Record, GroundItems: {x: number, y: number, name: string, amount?: number} []; @@ -3323,7 +3371,7 @@ interface KDPrisonType { default_state: string, /** Each turn this function runs. If a state is returned it sets the state*/ - update: (delta: number) => string, + update: (delta: number) => string | void; } interface KDPresetLoadout { @@ -3379,6 +3427,7 @@ interface KDSFXGroup { KnifeDrop?: string, KeyDrop?: string, PickDrop?: string, + Blocked?: string, }, sfxFinishEscape?: { Struggle?: string, @@ -3400,6 +3449,7 @@ interface KDEnemyAction { /** Enemy will sprint during this action */ sprint?: boolean; end?: (enemy) => void; + filter?: (enemy) => boolean; maintain: (enemy, delta) => boolean; } @@ -3456,7 +3506,7 @@ 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[] + events: (item: string, Loot: any, curse: string, primaryEnchantment: string, enchantments: string[], data?: KDHexEnchantEventsData) => KinkyDungeonEvent[] } interface KDHexEnchantEventsData { @@ -3551,6 +3601,9 @@ interface KDCollectionEntry { escapegrace?: boolean, personality: string, + /** Optional NPC palette */ + Palette?: string, + spawned?: boolean, id: number, @@ -3585,7 +3638,7 @@ interface KDFactionProps { /** 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[], X: number, Y: number) => number, + 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 */ @@ -3702,4 +3755,4 @@ 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 \ No newline at end of file +type PIXIUnresolvedAsset = any; // The dreaded diff --git a/Game/src/base/KinkyDungeon.js b/Game/src/base/KinkyDungeon.ts similarity index 87% rename from Game/src/base/KinkyDungeon.js rename to Game/src/base/KinkyDungeon.ts index 8ef11eb7d..db8e0b304 100644 --- a/Game/src/base/KinkyDungeon.js +++ b/Game/src/base/KinkyDungeon.ts @@ -53,8 +53,7 @@ let KDClipboardDisabled = window.location.host.includes('itch.zone'); (async function() { let queryOpts = { name: 'clipboard-read', allowWithoutGesture: false }; try { - // @ts-ignore - let permissionStatus = await navigator.permissions.query(queryOpts); + let permissionStatus = await navigator.permissions.query(queryOpts as PermissionDescriptor); permissionStatus.onchange = () => { //console.log(permissionStatus.state); if (permissionStatus.state == 'denied') KDClipboardDisabled = true; @@ -103,10 +102,8 @@ let KinkyDungeonSpellsConfig = "1"; let KDUnlockedPerks = []; let KinkyDungeonBackground = "BrickWall"; -/** - * @type {Character} - */ -let KinkyDungeonPlayer = null; + +let KinkyDungeonPlayer: Character = null; let KDSpeakerNPC = null; let KinkyDungeonState = "Logo"; @@ -146,7 +143,7 @@ let KinkyDungeonKeyEnter = ['Enter']; let KinkyDungeonKeySprint = ['ShiftLeft']; let KinkyDungeonKeyWeapon = ['R',]; let KinkyDungeonKeyUpcast = ['ControlLeft', 'AltLeft']; -let KinkyDungeonKeyMenu = ['V', 'I', 'U', 'M', 'L', '*', '-']; // QuikInv, Inventory, Reputation, Magic, Log, Quest, Collection +let KinkyDungeonKeyMenu = ['V', 'I', 'U', 'M', 'L', '*', '-', '_', "Home"]; // QuikInv, Inventory, Reputation, Magic, Log, Quest, Collection, Pause 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 @@ -154,7 +151,7 @@ let KinkyDungeonKeySwitchLoadout = ['[', ']', '\\']; let KinkyDungeonKeyLogFilter = ['{', '}', ':', '"']; let KinkyDungeonKeyMap = ['+', '<', '>']; -let KDLoadingTextKeys = {}; +let KDLoadingTextKeys: Record = {}; let kdSpecialModePerks = [ "arousalMode", @@ -172,7 +169,7 @@ let KDToggleGroups = ["Main", "GFX", "UI", "Clothes", "Keybindings"]; let KDToggles = { SpellBook: false, - ShowRestraintOnHover: true, + ShowRestraintOnHover: false, HiResModel: false, Fullscreen: false, SkipIntro: false, @@ -183,7 +180,6 @@ let KDToggles = { HighResDisplacement: false, Bloom: true, StunFlash: true, - AsyncRendering: false, ParticlesFX: true, ArousalHearts: true, VibeHearts: true, @@ -240,6 +236,15 @@ let KDToggles = { OnlySelfQuickInv: false, OverrideOutfit: false, SaveOutfit: true, + ModCompat: false, + + ApplyPaletteRestraint: true, + //ApplyPaletteOutfit: true, + ApplyPaletteTransform: true, + + IgnoreApplyCharPalette: true, + AlwaysApplyCharPalette: true, + DefaultApplyCharPalette: false, }; let KDToggleCategories = { @@ -256,7 +261,6 @@ let KDToggleCategories = { HighResDisplacement: "GFX", Bloom: "GFX", StunFlash: "UI", - AsyncRendering: "GFX", ParticlesFX: "GFX", ArousalHearts: "Clothes", VibeHearts: "Clothes", @@ -302,6 +306,14 @@ let KDToggleCategories = { GreyscaleBlindness: "GFX", DynamicArmor: "Clothes", OnlySelfQuickInv: "UI", + + ApplyPaletteRestraint: "none", + //ApplyPaletteOutfit: "none", + ApplyPaletteTransform: "none", + + IgnoreApplyCharPalette: "none", + AlwaysApplyCharPalette: "none", + DefaultApplyCharPalette: "none", }; let KDDefaultKB = { @@ -314,6 +326,8 @@ let KDDefaultKB = { UpLeft: KinkyDungeonKey[4], UpRight: KinkyDungeonKey[5], + SpellWeapon: KinkyDungeonKeyWeapon[0], + Spell1: KinkyDungeonKeySpell[0], Spell2: KinkyDungeonKeySpell[1], Spell3: KinkyDungeonKeySpell[2], @@ -324,31 +338,25 @@ let KDDefaultKB = { Spell8: KinkyDungeonKeySpell[7], Spell9: KinkyDungeonKeySpell[8], Spell0: KinkyDungeonKeySpell[9], - SpellWeapon: KinkyDungeonKeyWeapon[0], - SpellConfig1: KinkyDungeonKeySpellConfig[0], - SpellConfig2: KinkyDungeonKeySpellConfig[1], - SpellConfig3: KinkyDungeonKeySpellConfig[2], - Upcast: KinkyDungeonKeyUpcast[0], - UpcastCancel: KinkyDungeonKeyUpcast[1], + Wait: KinkyDungeonKeyWait[0], + WaitInterrupt: KinkyDungeonKeyToggle[6], Skip: KinkyDungeonKeySkip[0], Enter: KinkyDungeonKeyEnter[0], - Map: KinkyDungeonKeyMap[0], - ZoomOut: KinkyDungeonKeyMap[1], - ZoomIn: KinkyDungeonKeyMap[2], - SwitchLoadout1: KinkyDungeonKeySwitchLoadout[0], - SwitchLoadout2: KinkyDungeonKeySwitchLoadout[1], - SwitchLoadout3: KinkyDungeonKeySwitchLoadout[2], + 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], - SwitchWeapon: KinkyDungeonKeySwitchWeapon[0], - SwitchWeaponOffhand: KinkyDungeonKeySwitchWeapon[1], - SwitchWeaponOffhandPrevious: KinkyDungeonKeySwitchWeapon[2], - SwitchWeaponOffhandPrevious2: KinkyDungeonKeySwitchWeapon[3], - Sprint: KinkyDungeonKeySprint[0], QInventory: KinkyDungeonKeyMenu[0], Inventory: KinkyDungeonKeyMenu[1], @@ -357,19 +365,30 @@ let KDDefaultKB = { Log: KinkyDungeonKeyMenu[4], Quest: KinkyDungeonKeyMenu[5], Collection: KinkyDungeonKeyMenu[6], + Facilities: KinkyDungeonKeyMenu[7], + Restart: KinkyDungeonKeyMenu[8], - MsgLog: KinkyDungeonKeyToggle[0], - Pass: KinkyDungeonKeyToggle[1], - Door: KinkyDungeonKeyToggle[2], + 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], - WaitInterrupt: KinkyDungeonKeyToggle[6], - MakeNoise: KinkyDungeonKeyToggle[7], - PlaySelf: KinkyDungeonKeyToggle[8], - Crouch: KinkyDungeonKeyToggle[9], + BulletTransparency: KinkyDungeonKeyToggle[10], + Map: KinkyDungeonKeyMap[0], + MsgLog: KinkyDungeonKeyToggle[0], + ZoomOut: KinkyDungeonKeyMap[1], + ZoomIn: KinkyDungeonKeyMap[2], }; let KDZoomIndex = 4; @@ -378,7 +397,6 @@ let KDZoomLevels = [6, 4, 2, 0, -1, -2, -3]; let KinkyDungeonRootDirectory = "Game/"; //"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; @@ -416,192 +434,197 @@ let KDDefaultMaxParty = 3; let KDDefaultJourney = ["grv", "cat", "jng", "tmp", "bel"]; let KDDefaultAlt = ["tmb", "lib", "cry", "ore", "bel"]; -/** -* @typedef {{ -* 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, -* 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[], -* 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, -* 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: number, -* 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, -* FacilitiesData: FacilitiesData, -* QuickLoadouts: Record}}, - -*}} KDGameDataBase -*/ -let KDGameDataBase = { + +interface KDGameDataBase { + 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, + 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[], + 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: number, + 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, + FacilitiesData: FacilitiesData, + Regiments: Record, + QuickLoadouts: Record, +}; + +let KDGameDataBase: KDGameDataBase = { + PersistentItems: {}, + Regiments: {}, FacilitiesData: null, InteractTargetX: 0, InteractTargetY: 0, @@ -662,6 +685,8 @@ let KDGameDataBase = { ShopRewardProgram: 0, ShopRewardProgramThreshold: 500, + ShopkeepersMurdered: 0, + QuickLoadouts: {}, CurrentLoadout: 0, Training: {}, @@ -803,10 +828,10 @@ let KDGameDataBase = { KDChasingEnemies: [], + RegimentID: 0, ItemID: 0, ShopkeeperFee: 0, otherPlaying: 0, - CategoryIndex: {}, HighestLevel: 1, HighestLevelCurrent: 1, tickAlertTimer: false, @@ -837,10 +862,8 @@ let KDGameDataBase = { WP: 0, }, }; -/** - * @type {KDGameDataBase} - */ -let KDGameData = Object.assign({}, KDGameDataBase); + +let KDGameData: KDGameDataBase = Object.assign({}, KDGameDataBase); function KinkyDungeonLeashingEnemy() { @@ -856,13 +879,10 @@ function KinkyDungeonLeashingEnemy() { } let KDJailGuard = null; -/** - * - * @returns {entity} - */ -function KinkyDungeonJailGuard() { +function KinkyDungeonJailGuard(): entity { return KDLookupID(KDGameData.JailGuard); } + let KDAngel = null; function KinkyDungeonAngel() { if (KDGameData.KinkyDungeonAngel) { @@ -875,7 +895,7 @@ function KinkyDungeonAngel() { return KDAngel; } -function KDUnlockPerk(Perk) { +function KDUnlockPerk (Perk: string = "") { if (Perk && !KDUnlockedPerks.includes(Perk)) { KDSendMusicToast(TextGet("KDPerkUnlockedToast") + TextGet("KinkyDungeonStat" + (KinkyDungeonStatsPresets[Perk]?.id || Perk))); KDUnlockedPerks.push(Perk); @@ -918,12 +938,7 @@ function KDLoadPerks() { let KDBGColor = ""; -/** - * - * @param {any[]} list - * @return {Record} - */ -function KDMapInit(list) { +function KDMapInit(list: any): Record { let map = {}; for (let l of list) { map[l] = true; @@ -931,16 +946,16 @@ function KDMapInit(list) { return map; } -function KDistEuclidean(x, y) { +function KDistEuclidean(x: number, y: number): number { return Math.sqrt(x*x + y*y); } -function KDistChebyshev(x, y) { +function KDistChebyshev(x: number, y: number): number { return Math.max(Math.abs(x), Math.abs(y)); } -function KDistTaxicab(x, y) { +function KDistTaxicab(x: number, y: number): number { return Math.abs(x) + Math.abs(y); } @@ -952,11 +967,6 @@ function KDLoadToggles() { if (loaded[t] != undefined) KDToggles[t] = loaded[t]; } - - - if (Player && !Player.GraphicsSettings) { - Player.GraphicsSettings = {AnimationQuality: 0}; - } } function KDSaveToggles() { localStorage.setItem("KDToggles", JSON.stringify(KDToggles)); @@ -978,9 +988,8 @@ async function KDMigrateSaveToNewSystem() { /** * Loads the kinky dungeon game - * @returns {void} - Nothing */ -function KinkyDungeonLoad() { +function KinkyDungeonLoad(): void { try { //@ts-ignore @@ -1048,12 +1057,9 @@ function KinkyDungeonLoad() { if (!KinkyDungeonPlayer) { // new game KDrandomizeSeed(false); if (KDPatched) { - KinkyDungeonPlayer = suppressCanvasUpdate(() => CharacterLoadNPC("NPC_Avatar")); - } else { - KinkyDungeonPlayer = CharacterLoadNPC("NPC_Avatar"); + // Default player character for legacy reasons + KinkyDungeonPlayer = suppressCanvasUpdate(() => CharacterLoadNPC(0, localStorage.getItem("PlayerName") || "Ada")); } - KinkyDungeonPlayer.Type = "simple"; - KinkyDungeonPlayer.OnlineSharedSettings = {BlockBodyCosplay: true, }; KDLoadToggles(); @@ -1139,27 +1145,6 @@ function KinkyDungeonLoad() { KDMigrateSaveToNewSystem(); } - DrawButtonKDEx("GameContinue", () => { - 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') != '', 1000-350/2, 360, 350, 64, TextGet("GameContinue"), localStorage.getItem('KinkyDungeonSave') ? "#ffffff" : "pink", ""); - DrawButtonKDEx("GameStart", () => { - KinkyDungeonState = "Name"; - if (KDSaveSlot < 1) KDSaveSlot = 1; - for (var i = 1; i < 5; i++) { - let num = (i); - KinkyDungeonDBLoad(num).then((code) => { - loadedsaveslots[num - 1] = code; - }); - } - return true; - }, true, 1000-350/2, 440, 350, 64, TextGet("GameStart"), "#ffffff", ""); - - - KinkyDungeonSexyMode = localStorage.getItem("KinkyDungeonSexyMode") != undefined ? localStorage.getItem("KinkyDungeonSexyMode") == "True" : true; KinkyDungeonClassMode = localStorage.getItem("KinkyDungeonClassMode") != undefined ? localStorage.getItem("KinkyDungeonClassMode") : "Mage"; @@ -1181,16 +1166,16 @@ function KinkyDungeonLoad() { KinkyDungeonNewDress = true; KDCurrentOutfit = parseInt(localStorage.getItem("kdcurrentoutfit") || 0); let appearance = DecompressB64(localStorage.getItem("kinkydungeonappearance" + KDCurrentOutfit)); - if (!appearance || (StandalonePatched && JSON.parse(appearance).length && JSON.parse(appearance)[0]?.Asset)) { + 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"); - else appearance = CharacterAppearanceStringify(KinkyDungeonPlayerCharacter ? KinkyDungeonPlayerCharacter : Player); } CharacterAppearanceRestore(KinkyDungeonPlayer, appearance); - if (KDPatched) suppressCanvasUpdate(() => CharacterReleaseTotal(KinkyDungeonPlayer)); else @@ -1231,8 +1216,8 @@ function KinkyDungeonLoad() { //KinkyDungeonState = "Menu"; KinkyDungeonGameData = null; - CharacterAppearancePreviousEmoticon = WardrobeGetExpression(Player).Emoticon; - ServerSend("ChatRoomCharacterExpressionUpdate", { Name: "Gaming", Group: "Emoticon", Appearance: ServerAppearanceBundle(Player.Appearance) }); + //CharacterAppearancePreviousEmoticon = WardrobeGetExpression(Player).Emoticon; + //ServerSend("ChatRoomCharacterExpressionUpdate", { Name: "Gaming", Group: "Emoticon", Appearance: ServerAppearanceBundle(Player.Appearance) }); } else { KinkyDungeonState = "Game"; if (!KinkyDungeonGameData) { @@ -1241,42 +1226,23 @@ function KinkyDungeonLoad() { } } - 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 + * @returns - If the player is in the arcade */ -function KinkyDungeonDeviousDungeonAvailable() { +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 {boolean} - If the player is the game player + * @returns - If the player is the game player */ -function KinkyDungeonIsPlayer() { - return (!KinkyDungeonPlayerCharacter || KinkyDungeonPlayerCharacter == Player) ; +function KinkyDungeonIsPlayer(): boolean { + return true;//(!KinkyDungeonPlayerCharacter || KinkyDungeonPlayerCharacter == Player) ; } /** @@ -1318,7 +1284,7 @@ let fpscounter = 0; let lastfps = 0; let dispfps = 60; -async function sleep(msec) { +async function sleep(msec: number) { return new Promise(resolve => setTimeout(resolve, msec)); } @@ -1503,8 +1469,7 @@ function KinkyDungeonRun() { } else if (KinkyDungeonState == "Mods") { - // @ts-ignore - DrawButtonKDEx("mods_back", (bdata) => { + DrawButtonKDEx("mods_back", (_bdata) => { KinkyDungeonState = "Menu"; KDExecuteMods(); return true; @@ -1515,8 +1480,7 @@ function KinkyDungeonRun() { hotkeyPress: KinkyDungeonKeySkip[0], }); - // @ts-ignore - DrawButtonKDEx("mods_load", (bdata) => { + DrawButtonKDEx("mods_load", (_bdata) => { getFileInput(); return true; }, true, 975, 250, 350, 64, TextGet("KinkyDungeonLoadMod"), "#ffffff", ""); @@ -1558,8 +1522,7 @@ function KinkyDungeonRun() { DrawButtonVis(1870, 930, 110, 64, TextGet("KinkyDungeonBack"), "#ffffff", ""); - // @ts-ignore - DrawButtonKDEx("patronnext", (bdata) => { + DrawButtonKDEx("patronnext", (_bdata) => { if (KinkyDungeonPatronPos * maxPatron < credits.length - maxPatron * maxPatron) KinkyDungeonPatronPos += 1; else KinkyDungeonPatronPos = 0; return true; @@ -1608,11 +1571,19 @@ function KinkyDungeonRun() { }, localStorage.getItem('KinkyDungeonSave') != '', 1000-350/2, 360, 350, 64, TextGet("GameContinue"), localStorage.getItem('KinkyDungeonSave') ? "#ffffff" : "pink", ""); DrawButtonKDEx("GameStart", () => { KinkyDungeonState = "Name"; - if (KDSaveSlot < 1) KDSaveSlot = 1; + 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; @@ -1680,8 +1651,7 @@ function KinkyDungeonRun() { } - // @ts-ignore - DrawButtonKDEx("GoToWardrobe", (bdata) => { + DrawButtonKDEx("GoToWardrobe", (_bdata) => { if (StandalonePatched) { KDSpeakerNPC = null; @@ -1694,38 +1664,34 @@ function KinkyDungeonRun() { KinkyDungeonInitializeDresses(); KDUpdateModelList(); KDRefreshOutfitInfo(); - let orig = localStorage.getItem("kinkydungeonappearance" + KDCurrentOutfit); - let current = LZString.compressToBase64(CharacterAppearanceStringify(KinkyDungeonPlayer)); + 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); + let parsed = JSON.parse(appearance); + if (parsed.metadata) { + KinkyDungeonPlayer.Palette = parsed.metadata.palette; + } + CharacterRefresh(KinkyDungeonPlayer); } - KinkyDungeonPlayer.OnlineSharedSettings = {AllowFullWardrobeAccess: true}; KinkyDungeonNewDress = true; - if (KDPatched && !StandalonePatched) { - // 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); KinkyDungeonDressPlayer(); - KinkyDungeonPlayer.OnlineSharedSettings = {BlockBodyCosplay: false, AllowFullWardrobeAccess: true}; - if (!StandalonePatched) { - if (!KDPatched) - MainCanvas.textAlign = "center"; - CharacterAppearanceLoadCharacter(KinkyDungeonPlayer); - } KinkyDungeonConfigAppearance = true; if (appearance) { CharacterAppearanceRestore(KinkyDungeonPlayer, appearance); + let parsed = JSON.parse(appearance); + if (parsed.metadata) { + KinkyDungeonPlayer.Palette = parsed.metadata.palette; + } CharacterRefresh(KinkyDungeonPlayer); } return true; @@ -1736,15 +1702,13 @@ function KinkyDungeonRun() { DrawButtonVis(1700, 942, 135, 50, TextGet("KinkyDungeonPatrons"), "#ffffff", ""); if (!StandalonePatched) { - // @ts-ignore - DrawButtonKDEx("Deviantart", (bdata) => { + DrawButtonKDEx("Deviantart", (_bdata) => { let url = 'https://www.deviantart.com/ada18980'; window.open(url, '_blank'); return true; }, true, 1700, 694, 280, 50, TextGet("KinkyDungeonDeviantart"), "#ffffff", ""); - // @ts-ignore - DrawButtonKDEx("Patreon", (bdata) => { + DrawButtonKDEx("Patreon", (_bdata) => { let url = 'https://www.patreon.com/ada18980'; KDSendEvent('patreon'); window.open(url, '_blank'); @@ -1761,15 +1725,13 @@ function KinkyDungeonRun() { if (KDPatched) { - // @ts-ignore - DrawButtonKDEx("mods_button", (bdata) => { + DrawButtonKDEx("mods_button", (_bdata) => { KinkyDungeonState = "Mods"; return true; }, (!KDExecuted), 1700, 814, 280, 50, !KDExecuted ? TextGet("KDMods") : ((KDModFileCount === 1) ? `${KDModFileCount} ${TextGet("KDModsLoaded").replace("s","")}` : `${KDModFileCount} ${TextGet("KDModsLoaded")}`), !KDExecuted ? `#ffffff` : `#888888`, ""); if (Object.keys(KDModConfigs).length > 0) { - // @ts-ignore - DrawButtonKDEx("modconfigs_button", (bdata) => { + DrawButtonKDEx("modconfigs_button", (_bdata) => { KinkyDungeonState = "ModConfig"; return true; }, true, 1700, 755, 280, 50, TextGet("KDModConfigsButton"), "#ffffff", ""); @@ -1887,7 +1849,10 @@ function KinkyDungeonRun() { if (newValue != KDOldSaveCodeValue) { KDOldSaveCodeValue = newValue; - let orig = localStorage.getItem("kinkydungeonappearance" + KDCurrentOutfit); + 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) { @@ -1900,6 +1865,7 @@ function KinkyDungeonRun() { } let appearanceFromSave = JSON.stringify(decodeSave.saveStat.appearance); CharacterAppearanceRestore(KinkyDungeonPlayer, appearanceFromSave, false); + KinkyDungeonPlayer.Palette = decodeSave.saveStat.Palette; CharacterRefresh(KinkyDungeonPlayer); UpdateModels(KinkyDungeonPlayer); //KDInitProtectedGroups(KinkyDungeonPlayer); @@ -1939,8 +1905,7 @@ function KinkyDungeonRun() { }, true, 875, 650, 750, 64, TextGet("KinkyDungeonLoadFromFile") + ": " + KDSaveName, "#ffffff", "" ); - // @ts-ignore - DrawButtonKDEx("loadclothes", (b) => { + DrawButtonKDEx("loadclothes", (_b) => { KDSaveCodeOutfit(Char, true); KinkyDungeonState = "Wardrobe"; KDCanRevertFlag = false; @@ -1957,7 +1922,10 @@ function KinkyDungeonRun() { let newValue = ElementValue("saveInputField"); if (newValue != KDOldValue) { - let orig = localStorage.getItem("kinkydungeonappearance" + KDCurrentOutfit); + 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) { @@ -1984,7 +1952,8 @@ function KinkyDungeonRun() { InventoryWear(Char, g.Name, g.Group, g.Color); } CharacterRefresh(Char); - ElementValue("saveInputField", LZString.compressToBase64(CharacterAppearanceStringify(Char))); + ElementValue("saveInputField", LZString.compressToBase64( + AppearanceItemStringify(Char.Appearance))); } KDOldValue = newValue; KDInitProtectedGroups(Char); @@ -2006,7 +1975,9 @@ function KinkyDungeonRun() { if (ElementValue("saveInputField")) DrawButtonKDEx( "saveToFile", () => { - downloadFile((ElementValue("savename") || KDOutfitInfo[KDCurrentOutfit] || "Outfit") + KDOUTFITEXTENSION, ElementValue("saveInputField")); + downloadFile( + (ElementValue("savename") || KDOutfitInfo[KDCurrentOutfit] || "Outfit") + KDOUTFITEXTENSION, + ElementValue("saveInputField")); return true; }, true, 875, 550, 350, 64, TextGet("KinkyDungeonSaveToFile"), "#ffffff", "" ); @@ -2020,8 +1991,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KDHardMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - // @ts-ignore - DrawButtonKDEx("KinkyDungeonHardMode0", (bdata) => { + DrawButtonKDEx("KinkyDungeonHardMode0", (_bdata) => { KinkyDungeonExtremeMode = false; KinkyDungeonHardMode = false; localStorage.setItem("KinkyDungeonHardMode", KinkyDungeonHardMode ? "True" : "False"); @@ -2032,8 +2002,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonHardModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonHardMode1", (bdata) => { + DrawButtonKDEx("KinkyDungeonHardMode1", (_bdata) => { if (KinkyDungeonHardMode) { KinkyDungeonExtremeMode = true; } @@ -2051,8 +2020,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KDEasyMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - // @ts-ignore - DrawButtonKDEx("KinkyDungeonEasyMode0", (bdata) => { + DrawButtonKDEx("KinkyDungeonEasyMode0", (_bdata) => { KinkyDungeonEasyMode = 0; localStorage.setItem("KinkyDungeonEasyMode", KinkyDungeonEasyMode + ""); return true; @@ -2061,8 +2029,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonEasyModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonEasyMode1", (bdata) => { + DrawButtonKDEx("KinkyDungeonEasyMode1", (_bdata) => { KinkyDungeonEasyMode = 1; localStorage.setItem("KinkyDungeonEasyMode", KinkyDungeonEasyMode + ""); return true; @@ -2071,8 +2038,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonEasyModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonEasyMode2", (bdata) => { + DrawButtonKDEx("KinkyDungeonEasyMode2", (_bdata) => { KinkyDungeonEasyMode = 2; localStorage.setItem("KinkyDungeonEasyMode", KinkyDungeonEasyMode + ""); return true; @@ -2087,8 +2053,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KDSaveMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - // @ts-ignore - DrawButtonKDEx("KinkyDungeonSaveMode0", (bdata) => { + DrawButtonKDEx("KinkyDungeonSaveMode0", (_bdata) => { KinkyDungeonSaveMode = false; localStorage.setItem("KinkyDungeonSaveMode", KinkyDungeonSaveMode ? "True" : "False"); return true; @@ -2097,8 +2062,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonSaveModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonSaveMode1", (bdata) => { + DrawButtonKDEx("KinkyDungeonSaveMode1", (_bdata) => { KinkyDungeonSaveMode = true; localStorage.setItem("KinkyDungeonSaveMode", KinkyDungeonSaveMode ? "True" : "False"); return true; @@ -2111,8 +2075,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KDPerksMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - // @ts-ignore - DrawButtonKDEx("KinkyDungeonPerksMode0", (bdata) => { + DrawButtonKDEx("KinkyDungeonPerksMode0", (_bdata) => { KinkyDungeonPerksMode = 0; localStorage.setItem("KinkyDungeonPerksMode", KinkyDungeonPerksMode + ""); return true; @@ -2121,8 +2084,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonPerksModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonPerksMode1", (bdata) => { + DrawButtonKDEx("KinkyDungeonPerksMode1", (_bdata) => { KinkyDungeonPerksMode = 1; localStorage.setItem("KinkyDungeonPerksMode", KinkyDungeonPerksMode + ""); return true; @@ -2131,8 +2093,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonPerksModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonPerksMode2", (bdata) => { + DrawButtonKDEx("KinkyDungeonPerksMode2", (_bdata) => { KinkyDungeonPerksMode = 2; localStorage.setItem("KinkyDungeonPerksMode", KinkyDungeonPerksMode + ""); return true; @@ -2140,8 +2101,7 @@ function KinkyDungeonRun() { if (MouseInKD("KinkyDungeonPerksMode2")) { DrawTextFitKD(TextGet("KinkyDungeonPerksModeDesc2"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonPerksMode3", (bdata) => { + DrawButtonKDEx("KinkyDungeonPerksMode3", (_bdata) => { KinkyDungeonPerksMode = 3; localStorage.setItem("KinkyDungeonPerksMode", KinkyDungeonPerksMode + ""); return true; @@ -2156,8 +2116,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KDPerkProgressionMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - // @ts-ignore - DrawButtonKDEx("KinkyDungeonPerkProgressionMode0", (bdata) => { + DrawButtonKDEx("KinkyDungeonPerkProgressionMode0", (_bdata) => { KinkyDungeonPerkProgressionMode = 0; localStorage.setItem("KinkyDungeonPerkProgressionMode", KinkyDungeonPerkProgressionMode + ""); return true; @@ -2166,8 +2125,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonPerkProgressionModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonPerkProgressionMode1", (bdata) => { + DrawButtonKDEx("KinkyDungeonPerkProgressionMode1", (_bdata) => { KinkyDungeonPerkProgressionMode = 1; localStorage.setItem("KinkyDungeonPerkProgressionMode", KinkyDungeonPerkProgressionMode + ""); return true; @@ -2176,8 +2134,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonPerkProgressionModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonPerkProgressionMode2", (bdata) => { + DrawButtonKDEx("KinkyDungeonPerkProgressionMode2", (_bdata) => { KinkyDungeonPerkProgressionMode = 2; localStorage.setItem("KinkyDungeonPerkProgressionMode", KinkyDungeonPerkProgressionMode + ""); return true; @@ -2185,8 +2142,7 @@ function KinkyDungeonRun() { if (MouseInKD("KinkyDungeonPerkProgressionMode2")) { DrawTextFitKD(TextGet("KinkyDungeonPerkProgressionModeDesc2"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonPerkProgressionMode3", (bdata) => { + DrawButtonKDEx("KinkyDungeonPerkProgressionMode3", (_bdata) => { KinkyDungeonPerkProgressionMode = 3; localStorage.setItem("KinkyDungeonPerkProgressionMode", KinkyDungeonPerkProgressionMode + ""); return true; @@ -2201,8 +2157,7 @@ function KinkyDungeonRun() { if (KinkyDungeonPerkProgressionMode > 0) { DrawTextFitKD(TextGet("KDPerkBondageMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - // @ts-ignore - DrawButtonKDEx("KinkyDungeonPerkBondageMode0", (bdata) => { + DrawButtonKDEx("KinkyDungeonPerkBondageMode0", (_bdata) => { KinkyDungeonPerkBondageMode = 0; localStorage.setItem("KinkyDungeonPerkBondageMode", KinkyDungeonPerkBondageMode + ""); return true; @@ -2211,8 +2166,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonPerkBondageModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonPerkBondageMode1", (bdata) => { + DrawButtonKDEx("KinkyDungeonPerkBondageMode1", (_bdata) => { KinkyDungeonPerkBondageMode = 1; localStorage.setItem("KinkyDungeonPerkBondageMode", KinkyDungeonPerkBondageMode + ""); return true; @@ -2221,8 +2175,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonPerkBondageModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonPerkBondageMode2", (bdata) => { + DrawButtonKDEx("KinkyDungeonPerkBondageMode2", (_bdata) => { KinkyDungeonPerkBondageMode = 2; localStorage.setItem("KinkyDungeonPerkBondageMode", KinkyDungeonPerkBondageMode + ""); return true; @@ -2238,8 +2191,7 @@ function KinkyDungeonRun() { if (KinkyDungeonPerkBondageMode > 0 && KinkyDungeonPerkProgressionMode > 0) { DrawTextFitKD(TextGet("KDPerkBondageVisMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - // @ts-ignore - DrawButtonKDEx("KinkyDungeonPerkBondageVisMode0", (bdata) => { + DrawButtonKDEx("KinkyDungeonPerkBondageVisMode0", (_bdata) => { KinkyDungeonPerkBondageVisMode = 0; localStorage.setItem("KinkyDungeonPerkBondageVisMode", KinkyDungeonPerkBondageVisMode + ""); return true; @@ -2248,8 +2200,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonPerkBondageVisModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonPerkBondageVisMode1", (bdata) => { + DrawButtonKDEx("KinkyDungeonPerkBondageVisMode1", (_bdata) => { KinkyDungeonPerkBondageVisMode = 1; localStorage.setItem("KinkyDungeonPerkBondageVisMode", KinkyDungeonPerkBondageVisMode + ""); return true; @@ -2258,8 +2209,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonPerkBondageVisModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonPerkBondageVisMode2", (bdata) => { + DrawButtonKDEx("KinkyDungeonPerkBondageVisMode2", (_bdata) => { KinkyDungeonPerkBondageVisMode = 2; localStorage.setItem("KinkyDungeonPerkBondageVisMode", KinkyDungeonPerkBondageVisMode + ""); return true; @@ -2274,8 +2224,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KDItemMode"), 875 - 50, 190 + II*spacing + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - // @ts-ignore - DrawButtonKDEx("KinkyDungeonItemMode0", (bdata) => { + DrawButtonKDEx("KinkyDungeonItemMode0", (_bdata) => { KinkyDungeonItemMode = 0; localStorage.setItem("KinkyDungeonItemMode", KinkyDungeonItemMode + ""); return true; @@ -2284,8 +2233,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonItemModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonItemMode1", (bdata) => { + DrawButtonKDEx("KinkyDungeonItemMode1", (_bdata) => { KinkyDungeonItemMode = 1; localStorage.setItem("KinkyDungeonItemMode", KinkyDungeonItemMode + ""); return true; @@ -2294,8 +2242,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonItemModeDesc1"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonItemMode2", (bdata) => { + DrawButtonKDEx("KinkyDungeonItemMode2", (_bdata) => { KinkyDungeonItemMode = 2; localStorage.setItem("KinkyDungeonItemMode", KinkyDungeonItemMode + ""); return true; @@ -2355,8 +2302,7 @@ function KinkyDungeonRun() { X = i % 4; Y = Math.floor(i / 4); - // @ts-ignore - DrawButtonKDEx("Class" + i, (bdata) => { + DrawButtonKDEx("Class" + i, (_bdata) => { KinkyDungeonClassMode = Object.keys(KDClassStart)[i]; localStorage.setItem("KinkyDungeonClassMode", "" + KinkyDungeonClassMode); return true; @@ -2375,8 +2321,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KDSexyMode"), 875 - 50, 420 + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - // @ts-ignore - DrawButtonKDEx("KinkyDungeonSexyMode0", (bdata) => { + DrawButtonKDEx("KinkyDungeonSexyMode0", (_bdata) => { KinkyDungeonSexyMode = false; KDUpdatePlugSettings(true); localStorage.setItem("KinkyDungeonSexyMode", KinkyDungeonSexyMode ? "True" : "False"); @@ -2386,8 +2331,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonSexyModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonSexyMode1", (bdata) => { + DrawButtonKDEx("KinkyDungeonSexyMode1", (_bdata) => { KinkyDungeonSexyMode = true; KDUpdatePlugSettings(true); localStorage.setItem("KinkyDungeonSexyMode", KinkyDungeonSexyMode ? "True" : "False"); @@ -2400,8 +2344,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KDRandomMode"), 875 - 50, 500 + 22, 300, "#ffffff", KDTextGray1, undefined, "right"); - // @ts-ignore - DrawButtonKDEx("KinkyDungeonRandomMode0", (bdata) => { + DrawButtonKDEx("KinkyDungeonRandomMode0", (_bdata) => { KinkyDungeonRandomMode = false; localStorage.setItem("KinkyDungeonRandomMode", KinkyDungeonRandomMode ? "True" : "False"); return true; @@ -2410,8 +2353,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KinkyDungeonRandomModeDesc0"), 1250, 120, 1000, "#ffffff", KDTextGray0); } - // @ts-ignore - DrawButtonKDEx("KinkyDungeonRandomMode1", (bdata) => { + DrawButtonKDEx("KinkyDungeonRandomMode1", (_bdata) => { KinkyDungeonRandomMode = true; localStorage.setItem("KinkyDungeonRandomMode", KinkyDungeonRandomMode ? "True" : "False"); return true; @@ -2423,14 +2365,12 @@ function KinkyDungeonRun() { if (KinkyDungeonSexyMode) { - // @ts-ignore - DrawCheckboxKDEx("KinkyDungeonSexyPlugsFront", (bdata) => { + DrawCheckboxKDEx("KinkyDungeonSexyPlugsFront", (_bdata) => { KinkyDungeonSexyPlugFront = !KinkyDungeonSexyPlugFront; localStorage.setItem("KinkyDungeonSexyPlugFront", KinkyDungeonSexyPlugFront ? "True" : "False"); return true; }, true, 1500, 420, 64, 64, TextGet("KinkyDungeonSexyPlugsFront"), !KinkyDungeonSexyPlugFront, false, "#ffffff"); - // @ts-ignore - DrawCheckboxKDEx("KinkyDungeonSexyPlugs", (bdata) => { + DrawCheckboxKDEx("KinkyDungeonSexyPlugs", (_bdata) => { KinkyDungeonSexyPlug = !KinkyDungeonSexyPlug; localStorage.setItem("KinkyDungeonSexyPlug", KinkyDungeonSexyPlug ? "True" : "False"); return true; @@ -2505,8 +2445,7 @@ function KinkyDungeonRun() { }, true, 1550, 450, 200, 64, TextGet("KDRandom"), "#ffffff", ""); // Left to decrement - // @ts-ignore - DrawButtonKDEx(`SaveButtonL`, (bdata) => { + DrawButtonKDEx(`SaveButtonL`, (_bdata) => { if (KDSaveSlot > 1) { KDSaveSlot--; } @@ -2517,8 +2456,7 @@ function KinkyDungeonRun() { DrawTextFitKD(TextGet("KDChooseSlot"), 1150, 585, 360, "#ffffff", undefined, 30); DrawTextFitKD(`${KDSaveSlot}`, 1430, 585, 360, "#ffffff", undefined, 30); // Right to increment - // @ts-ignore - DrawButtonKDEx(`SaveButton4`, (bdata) => { + DrawButtonKDEx(`SaveButton4`, (_bdata) => { if (KDSaveSlot < maxSaveSlots) { KDSaveSlot++; } @@ -2530,7 +2468,9 @@ function KinkyDungeonRun() { let danger = false; if (loadedsaveslots[KDSaveSlot-1]) { danger = true; - DrawTextFitKD(TextGet("KDWillOverride"), 1680, 585, 360, "#ff5555", undefined, 36); + DrawTextFitKD(TextGet("KDWillOverride").replace("NME", + loadedsaveNames[KDSaveSlot-1] ? loadedsaveNames[KDSaveSlot-1] : "" + ), 1550, 585, 440, "#ff5555", undefined, 36, "left"); } else { KDConfirmDeleteSave = false; } @@ -2544,6 +2484,7 @@ function KinkyDungeonRun() { localStorage.setItem("PlayerName", ElementValue("PlayerNameField") || "Ada"); localStorage.setItem("KDLastSaveSlot", KDSaveSlot.toString()); KDGameData.PlayerName = ElementValue("PlayerNameField") || "Ada"; + KinkyDungeonPlayer.Name = KDGameData.PlayerName; KinkyDungeonState = "Diff"; KDExecuteMods(); @@ -2555,8 +2496,7 @@ function KinkyDungeonRun() { (Math.random() > 0.5 ? -1 : 1) + 750 : 650, 750, 64, TextGet(KDConfirmDeleteSave ? "KDConfirmREALLY" : "KDConfirm"), KDConfirmDeleteSave ? "#ff5555" : "#ffffff", ""); - // @ts-ignore - DrawButtonKDEx("backButton", (b) => { + DrawButtonKDEx("backButton", (_b) => { KinkyDungeonState = "Menu"; return true; }, true, 1075, 900, 350, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", "", @@ -2582,8 +2522,7 @@ function KinkyDungeonRun() { let minPoints = 0; - // @ts-ignore - DrawButtonKDEx("KDPerksStart", (bdata) => { + DrawButtonKDEx("KDPerksStart", (_bdata) => { if (KinkyDungeonGetStatPoints(KinkyDungeonStatsChoice) >= minPoints) { KDLose = false; KinkyDungeonStartNewGame(); @@ -2595,8 +2534,7 @@ function KinkyDungeonRun() { return true; }, true, 875, 920, 350, 64, TextGet("KinkyDungeonStartGame"), KinkyDungeonGetStatPoints(KinkyDungeonStatsChoice) >= minPoints ? "#ffffff" : "pink", ""); - // @ts-ignore - DrawButtonKDEx("KDPerksBack", (bdata) => { + DrawButtonKDEx("KDPerksBack", (_bdata) => { KinkyDungeonState = "Menu"; return true; }, true, 1275, 920, 350, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", "", undefined, undefined, undefined, undefined, @@ -2605,29 +2543,25 @@ function KinkyDungeonRun() { hotkeyPress: KinkyDungeonKeySkip[0], }); - // @ts-ignore - DrawButtonKDEx("KDPerksClear", (bdata) => { + DrawButtonKDEx("KDPerksClear", (_bdata) => { KinkyDungeonStatsChoice = new Map(); KDUpdatePlugSettings(true); return true; }, true, 40, 920, 190, 64, TextGet("KinkyDungeonClearAll"), "#ffffff", ""); - // @ts-ignore - DrawButtonKDEx("KDPerkConfig1", (bdata) => { + DrawButtonKDEx("KDPerkConfig1", (_bdata) => { KinkyDungeonPerksConfig = "1"; KinkyDungeonLoadStats(); return true; }, true, 270, 930, 100, 54, TextGet("KinkyDungeonConfig") + "1", KinkyDungeonPerksConfig == "1" ? "#ffffff" : "#888888", ""); - // @ts-ignore - DrawButtonKDEx("KDPerkConfig2", (bdata) => { + DrawButtonKDEx("KDPerkConfig2", (_bdata) => { KinkyDungeonPerksConfig = "2"; KinkyDungeonLoadStats(); return true; }, true, 380, 930, 100, 54, TextGet("KinkyDungeonConfig") + "2", KinkyDungeonPerksConfig == "2" ? "#ffffff" : "#888888", ""); - // @ts-ignore - DrawButtonKDEx("KDPerkConfig3", (bdata) => { + DrawButtonKDEx("KDPerkConfig3", (_bdata) => { KinkyDungeonPerksConfig = "3"; KinkyDungeonLoadStats(); return true; @@ -2636,16 +2570,15 @@ function KinkyDungeonRun() { let TF = KDTextField("PerksFilter", 600, 930, 210, 54, "text", "", "45"); if (TF.Created) { - // @ts-ignore - TF.Element.oninput = (event) => { + TF.Element.oninput = (_event: InputEvent) => { KDPerksFilter = ElementValue("PerksFilter"); + KDPerksIndex = 0; }; } DrawTextFitKD(TextGet("KinkyDungeonFilter"), 600 + 210/2, 930 + 54/2, 210, "#aaaaaa"); if (!KDClipboardDisabled) - // @ts-ignore - DrawButtonKDEx("copyperks", (bdata) => { + DrawButtonKDEx("copyperks", (_bdata) => { let txt = ""; for (let k of KinkyDungeonStatsChoice.keys()) { if (!k.startsWith("arousal") && !k.endsWith("Mode")) txt += (txt ? "\n" : "") + k; @@ -2656,8 +2589,7 @@ function KinkyDungeonRun() { else { let CF = KDTextField("KDCopyPerks", 1700, 930, 280, 54, undefined, undefined, "10000"); if (CF.Created) { - // @ts-ignore - CF.Element.oninput = (event) => { + CF.Element.oninput = (_event: InputEvent) => { let text = ElementValue("KDCopyPerks"); try { let list = text.split('|'); @@ -2686,8 +2618,7 @@ function KinkyDungeonRun() { } if (!KDClipboardDisabled) - // @ts-ignore - DrawButtonKDEx("pasteperks", (bdata) => { + DrawButtonKDEx("pasteperks", (_bdata) => { navigator.clipboard.readText() .then(text => { let list = text.split('\n'); @@ -2862,7 +2793,7 @@ function KinkyDungeonRun() { if (KDToggleTab == "Keybindings") { // Draw temp start screen DrawButtonKDEx("KBBack", () => { - KinkyDungeonKeybindings = KinkyDungeonKeybindingsTemp; + KinkyDungeonKeybindings = Object.assign({}, KinkyDungeonKeybindingsTemp); if (KinkyDungeonGameFlag) { KinkyDungeonState = "Game"; if (KinkyDungeonKeybindings) { @@ -2876,7 +2807,7 @@ function KinkyDungeonRun() { // Draw temp start screen DrawButtonKDEx("KBBack2", () => { - KinkyDungeonKeybindingsTemp = Object.assign({}, KinkyDungeonKeybindingsTemp); + KinkyDungeonKeybindingsTemp = Object.assign({}, KinkyDungeonKeybindings); if (KinkyDungeonGameFlag) { KinkyDungeonState = "Game"; } else KinkyDungeonState = "Menu"; @@ -2884,6 +2815,11 @@ function KinkyDungeonRun() { 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 @@ -3002,8 +2938,7 @@ function KinkyDungeonRun() { let CF = KDTextField("KDBGColor", x + scale*(0.5 + w)/2 - 100, y + 24, 200, 30, undefined, KDBGColor + "", "7"); if (CF.Created) { - // @ts-ignore - CF.Element.oninput = (event) => { + CF.Element.oninput = (_event: InputEvent) => { let value = ElementValue("KDBGColor"); try { if (/^#[0-9A-F]{6}$/i.test(value)) { @@ -3021,6 +2956,35 @@ function KinkyDungeonRun() { KDDrawPalettes(x, 250, w, scale, undefined, undefined); + + let options = [ + {name: "ApplyPaletteRestraint"}, + {name: "ApplyPaletteTransform"}, + {}, + ]; + + 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); @@ -3085,9 +3049,13 @@ function KinkyDungeonRun() { if (pixirenderer) { pixirenderer.render(kdcanvas, { clear: false, + antialias: !CommonIsMobile, + useContextAlpha: false, }); pixirenderer.render(kdui, { clear: false, + antialias: !CommonIsMobile, + useContextAlpha: false, }); } } @@ -3095,9 +3063,9 @@ function KinkyDungeonRun() { if (!(KinkyDungeonState == "Toggles" && KDToggleTab == "Keybindings")) { if (KinkyDungeonKeybindingCurrentKey && KinkyDungeonGameKeyDown()) { - for (let b of Object.entries(KDButtonsCache)) { - if (b[1].hotkeyPress == KinkyDungeonKeybindingCurrentKey) { - KDClickButton(b[0]); + for (let [k, v] of Object.entries(KDButtonsCache)) { + if (v.hotkeyPress == KinkyDungeonKeybindingCurrentKey) { + KDClickButton(k); return true; } } @@ -3122,6 +3090,8 @@ function KinkyDungeonRun() { ElementRemove("DebugEnemy"); ElementRemove("DebugItem"); } + + KDDoGraphicsSanitize(); } let KDDrawDelta = 0; @@ -3132,7 +3102,7 @@ let kdTrackGameParticles = false; let KDlastCull = new Map(); -function KDCullSprites() { +function KDCullSprites(): void { if (!KDlastCull.get(kdpixisprites)) KDlastCull.set(kdpixisprites, 0); let cull = CommonTime() > (KDlastCull.get(kdpixisprites) || 0) + KDCULLTIME; for (let sprite of kdpixisprites.entries()) { @@ -3149,7 +3119,7 @@ function KDCullSprites() { } } } -function KDCullSpritesList(list) { +function KDCullSpritesList(list: Map): void { if (!KDlastCull.get(list)) KDlastCull.set(list, 0); let cull = CommonTime() > (KDlastCull.get(list) || 0) + KDCULLTIME; for (let sprite of list.entries()) { @@ -3164,37 +3134,43 @@ function KDCullSpritesList(list) { } } -/** - * @type {Record boolean, priority: number, scrollfunc?: (amount: number) => boolean, hotkeyPress?: string}>} - */ -let KDButtonsCache = { - +let KDButtonsCache: Record boolean, priority: number, scrollfunc?: (amount: number) => void, hotkeyPress?: string}> = { }; -/** - * @type {Record boolean, priority: number}>} - */ -let KDLastButtonsCache = { +let KDLastButtonsCache: Record boolean, priority: number}> = { }; - /** * 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 + * @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, enabled, Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder) { +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, @@ -3209,35 +3185,55 @@ function DrawButtonKD(name, enabled, Left, Top, Width, Height, Label, Color, Ima /** * 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 - * @param {boolean} [options.scaleImage] - zIndex - * @param {boolean} [options.centered] - centered - * @param {boolean} [options.centerText] - centered - * @param {string} [options.tint] - tint - * @param {string} [options.hotkey] - hotkey - * @param {string} [options.hotkeyPress] - hotkey - * @returns {boolean} - Whether or not the mouse is in the button + * @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, func, enabled, Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder, FillColor, FontSize, ShiftText, options) { +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, @@ -3256,35 +3252,55 @@ function DrawButtonKDEx(name, func, enabled, Left, Top, Width, Height, Label, Co /** * 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 - * @param {boolean} [options.scaleImage] - zIndex - * @param {boolean} [options.centered] - centered - * @param {boolean} [options.centerText] - centered - * @param {string} [options.tint] - tint - * @param {string} [options.hotkey] - hotkey - * @param {string} [options.hotkeyPress] - hotkey - * @returns {boolean} - Whether or not the mouse is in the button + * @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, scrollfunc, func, enabled, Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder, FillColor, FontSize, ShiftText, options) { +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, @@ -3302,33 +3318,53 @@ function DrawButtonKDExScroll(name, scrollfunc, func, enabled, Left, Top, Width, /** * Draws a button component - * @param {any} Container - Container to draw to - * @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 - * @param {string} [options.hotkey] - hotkey - * @param {string} [options.hotkeyPress] - hotkey - * @param {boolean} [options.unique] - This button is unique, so X and Y are not differentiators - * @returns {boolean} - Whether or not the mouse is in the button + * @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, name, func, enabled, Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder, FillColor, FontSize, ShiftText, options) { +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, @@ -3343,7 +3379,7 @@ function DrawButtonKDExTo(Container, name, func, enabled, Left, Top, Width, Heig return MouseIn(Left,Top,Width,Height); } -function KDMouseWheel(event) { +function KDMouseWheel (event: WheelEvent): void { if (!KDProcessButtonScroll(event.deltaY)) { // If we fail we dilate the buttons vertically if (KDProcessButtonScroll(event.deltaY, 15)) return; @@ -3363,7 +3399,7 @@ function KDMouseWheel(event) { if (KDFunctionSpellPageScroll(event.deltaY || event.deltaX)) return; } -function KDFunctionOptionsScroll(amount) { +function KDFunctionOptionsScroll(amount: number): boolean { if (KinkyDungeonState == "Toggles") { let index = KDToggleGroups.indexOf(KDToggleTab); if (amount > 0) { @@ -3379,7 +3415,7 @@ function KDFunctionOptionsScroll(amount) { } return false; } -function KDFunctionPerksScroll(amount) { +function KDFunctionPerksScroll(amount: number): boolean { if (KinkyDungeonState == "Stats" || KinkyDungeonDrawState == "Perks2" ) { if (amount > 0) { KDClickButton("perks>"); @@ -3390,7 +3426,7 @@ function KDFunctionPerksScroll(amount) { } return false; } -function KDFunctionQuestScroll(amount) { +function KDFunctionQuestScroll(amount: number): boolean { if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Quest") { if (amount > 0) { KDClickButton("questDown"); @@ -3401,7 +3437,7 @@ function KDFunctionQuestScroll(amount) { } return false; } -function KDFunctionCollectionScroll(amount) { +function KDFunctionCollectionScroll(amount: number): boolean { if (KinkyDungeonState == "Game" && (KinkyDungeonDrawState == "Collection" || KinkyDungeonDrawState == "Bondage")) { if (amount > 0) { KDClickButton("collDOWN"); @@ -3412,7 +3448,7 @@ function KDFunctionCollectionScroll(amount) { } return false; } -function KDFunctionFacilitiesScroll(amount) { +function KDFunctionFacilitiesScroll(amount: number): boolean { if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Facilities") { if (amount > 0) { KDClickButton("facDown"); @@ -3423,7 +3459,7 @@ function KDFunctionFacilitiesScroll(amount) { } return false; } -function KDFunctionSpellPageScroll(amount) { +function KDFunctionSpellPageScroll(amount: number): boolean { if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" ) { if (amount > 0) { KDCycleSpellPage(false, true); @@ -3434,7 +3470,7 @@ function KDFunctionSpellPageScroll(amount) { } return false; } -function KDFunctionMagicPageScroll(amount) { +function KDFunctionMagicPageScroll(amount: number): boolean { if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Magic" ) { if (amount > 0) { KDClickButton("magicnextpage"); @@ -3445,7 +3481,7 @@ function KDFunctionMagicPageScroll(amount) { } return false; } -function KDFunctionMagicSpellPageScroll(amount) { +function KDFunctionMagicSpellPageScroll(amount: number): boolean { if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "MagicSpells") { if (MouseY < 225) { if (amount > 0) { @@ -3461,7 +3497,7 @@ function KDFunctionMagicSpellPageScroll(amount) { } return false; } -function KDFunctionInventoryScroll(amount) { +function KDFunctionInventoryScroll(amount: number): boolean { if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Inventory" ) { if (amount > 0) { KDClickButton("invnextpage"); @@ -3472,7 +3508,7 @@ function KDFunctionInventoryScroll(amount) { } return false; } -function KDFunctionMsgScroll(amount) { +function KDFunctionMsgScroll(amount: number): boolean { if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KinkyDungeonMessageToggle) { if (amount > 0) { KDClickButton("logscrolldown"); @@ -3483,7 +3519,7 @@ function KDFunctionMsgScroll(amount) { } return false; } -function KDFunctionRestraintIndexScroll(amount) { +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; @@ -3494,7 +3530,7 @@ function KDFunctionRestraintIndexScroll(amount) { } return false; } -function KDFunctionDialogueScroll(amount) { +function KDFunctionDialogueScroll(amount: number): boolean { if (KinkyDungeonState == "Game" && KinkyDungeonDrawState == "Game" && KDGameData.CurrentDialog) { if (amount > 0) { KDClickButton("dialogueDOWN"); @@ -3505,7 +3541,7 @@ function KDFunctionDialogueScroll(amount) { } return false; } -function KDFunctionShopScroll(amount) { +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; @@ -3522,13 +3558,7 @@ function KDFunctionShopScroll(amount) { } -/** - * - * @param {number} amount - * @param {number} padV - * @returns {boolean} - */ -function KDProcessButtonScroll(amount, padV = 0) { +function KDProcessButtonScroll(amount: number, padV: number = 0): boolean { let buttons = []; for (let button of Object.entries(KDButtonsCache)) { if (button[1].enabled && button[1].scrollfunc) { @@ -3567,10 +3597,8 @@ function KDProcessButtons() { /** * 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) { +function KDClickButton(name: string): boolean { let button = KDButtonsCache[name] || KDLastButtonsCache[name]; if (button && button.enabled) { return button.func(); @@ -3578,7 +3606,7 @@ function KDClickButton(name) { return false; } -function MouseInKD(name, padX = 0, padV = 0) { +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); @@ -3590,27 +3618,27 @@ function KinkyDungeonGetTraitsCount() { return Array.from(KinkyDungeonStatsChoice.keys()).filter((element) => {return !element.includes('arousalMode');}).length; } -function KDSendTrait(trait) { +function KDSendTrait(_trait) { // Banish Google } -function KDSendSpell(spell) { +function KDSendSpell(_spell) { // Banish Google } -function KDSendSpellCast(spell) { +function KDSendSpellCast(_spell) { // Banish Google } -function KDSendWeapon(weapon) { +function KDSendWeapon(_weapon) { // Banish Google } // @ts-ignore -function KDSendStatus(type, data, data2) { +function KDSendStatus(_type, _data?, _data2?) { // Banish Google from existence } // @ts-ignore -function KDSendEvent(type) { +function KDSendEvent(_type) { // Banish Google from existence } @@ -3633,13 +3661,10 @@ function KinkyDungeonLoadStats() { let KinkyDungeonGameFlag = false; -function KDInitializeJourney(Journey, Level) { +function KDInitializeJourney(Journey: string, Level: number = 0) { KDCurrentWorldSlot = {x: 0, y: Level || 0}; KDWorldMap = {}; - /** - * @type {string[]} - */ - let newIndex = []; + let newIndex: string[] = []; if (Journey) KDGameData.Journey = Journey; @@ -3852,21 +3877,21 @@ function KDCommitKeybindings() { let afterLoaded = false; -let KDGameSaveDB; 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() { +/** + * 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! - // @ts-ignore - return new Promise((res, rej) => { + 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; + let db: IDBDatabase; // Whenever an update is made, increment the version number. - request.onupgradeneeded = event => { + request.onupgradeneeded = (event: IDBVersionChangeEvent) => { // @ts-ignore db = event.target.result; if (!db.objectStoreNames.contains(KDGameSaveDBStoreName)) { @@ -3875,16 +3900,15 @@ function KinkyDungeonDBOpen() { }; // Return the event results when it's successful - request.onsuccess = event => { - // @ts-ignore - db = event.target.result; + 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 => { + request.onerror = (event: Event) => { console.error("IndexedDB error"); console.log(event); res(db); @@ -3892,12 +3916,10 @@ function KinkyDungeonDBOpen() { }); } -// Save a game to the database /** - * @param {number} saveslot - * @param {string} [gamecode] + * Save a game to the database. */ -function KinkyDungeonDBSave(saveslot, gamecode) { +function KinkyDungeonDBSave(saveslot: number, gamecode?: string) { let save; if (saveslot == undefined) { console.error("Save slot is not defined"); @@ -3926,20 +3948,18 @@ function KinkyDungeonDBSave(saveslot, gamecode) { request.onerror = () => { console.error("Could not add data to the store"); }; - request.complete = () => { - transaction.close(); + transaction.oncomplete = () => { + db.close(); return true; }; }); } -// Load a game from the database - Returns a thenable with the gamedata string, false if nothing loaded. /** - * @param {number} saveslot + * Load a game from the database - Returns a thenable with the gamedata string, false if nothing loaded. */ -function KinkyDungeonDBLoad(saveslot) { - // @ts-ignore - return new Promise((res, rej) => { +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. @@ -3971,13 +3991,11 @@ function KinkyDungeonDBLoad(saveslot) { }); } -// Delete a saved game in a slot. /** - * @param {number} saveslot + * Delete a saved game in a slot. */ -function KinkyDungeonDBDelete(saveslot) { - // @ts-ignore - return new Promise((res, rej) => { +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. @@ -4002,16 +4020,16 @@ function KinkyDungeonDBDelete(saveslot) { }); } -let LoadMenuCurrentSave; -let LoadMenuCurrentSlot; -let loadedsaveslots = []; +let LoadMenuCurrentSave: string; +let LoadMenuCurrentSlot: number; +let loadedsaveslots: string[] = []; +let loadedsaveNames: string[] = []; for (let i = 0; i < maxSaveSlots; i++) { loadedsaveslots.push(null); + loadedsaveNames.push(""); } -/** - * @type {KinkyDungeonSave} - */ -let loadedSaveforPreview = null; + +let loadedSaveforPreview: KinkyDungeonSave = null; let KDPreviewModel = null; let KDSaveSlot = 1; @@ -4061,8 +4079,7 @@ function KDDrawLoadMenu() { } // Delete button only if the slot has data if (loadedsaveslots[num - 1]) { - // @ts-ignore - DrawButtonKDEx("KDDeleteSlotButton" + i, (b) => { + DrawButtonKDEx("KDDeleteSlotButton" + i, (_b) => { if (!KDConfirmDeleteSave || KDDeleteSaveIndex != num) { KDConfirmDeleteSave = true; KDDeleteSaveIndex = num; @@ -4092,8 +4109,7 @@ function KDDrawLoadMenu() { } else if (LoadMenuCurrentSlot == -1 && loadedSaveforPreview && !loadedSaveforPreview?.invalid) { // Import button if ( - // @ts-ignore - DrawButtonKDEx("KDImportSlotButton" + i, (b) => { + DrawButtonKDEx("KDImportSlotButton" + i, (_b) => { if (!loadedsaveslots[num - 1]) { loadedsaveslots[num - 1] = ElementValue("saveInputField"); KinkyDungeonDBSave(num, newValue = loadedsaveslots[num - 1]); @@ -4134,13 +4150,14 @@ function KDDrawLoadMenu() { } else if (KDSlot0) { loadedSaveforPreview = KinkyDungeonLoadPreview(KDSlot0); if (loadedSaveforPreview) LoadMenuCurrentSlot = 0; + LoadMenuCurrentSave = KDSlot0; } else { loadedSaveforPreview = null; LoadMenuCurrentSlot = -1; } if (loadedSaveforPreview) { - LoadMenuCurrentSave = newValue; + LoadMenuCurrentSave = newValue ? newValue : KDSlot0; // @ts-ignore if (!loadedSaveforPreview.invalid) { @@ -4153,7 +4170,7 @@ function KDDrawLoadMenu() { } return true; }, true, CombarXX + 220, 880, 180, 64, - TextGet((!ElementValue("saveInputField") && KDSlot0) ? + TextGet((!newValue && KDSlot0) ? "LoadFromCodeButton0" : "LoadFromCodeButton"), "#ffffff", ""); // Load from File button @@ -4511,7 +4528,7 @@ function KDDrawLoadMenu() { }); // Play Game with current save data! DrawButtonKDEx("KDLoadGame", () => { - if (LoadMenuCurrentSave != false) { + if (LoadMenuCurrentSave != "") { KinkyDungeonKeybindingsTemp = Object.assign({}, KinkyDungeonKeybindingsTemp); KinkyDungeonNewGame = 0; KDMapData.Grid = ""; @@ -4534,15 +4551,15 @@ function KDDrawLoadMenu() { ElementRemove("saveInputField"); } return true; - }, (((LoadMenuCurrentSave != undefined) && (LoadMenuCurrentSave != false)) ? true : false), 1570, 880, 350, 64, + }, (((LoadMenuCurrentSave != undefined) && (LoadMenuCurrentSave != "")) ? true : false), 1570, 880, 350, 64, LoadMenuCurrentSlot > 0 ? TextGet("KDPlayWithSlot") + LoadMenuCurrentSlot - : TextGet("KDPlayWithoutSlot"), (((LoadMenuCurrentSave != undefined) && (LoadMenuCurrentSave != false)) ? "#ffffff" : "#888888"), ""); + : TextGet("KDPlayWithoutSlot"), + (((LoadMenuCurrentSave != undefined) && (LoadMenuCurrentSave != "")) ? "#ffffff" : "#888888"), ""); } function KinkyDungeonDressModelPreview() { - // @ts-ignore - return new Promise((res, rej) => { + return new Promise((res, _rej) => { KDPreviewModel = Object.assign({}, KinkyDungeonPlayer); KDPreviewModel.ID++; if (loadedSaveforPreview.saveStat?.appearance) { @@ -4566,43 +4583,40 @@ function KinkyDungeonDressModelPreview() { }); } -// Generate Preview data function /** - * @param {string} String - * @returns {KinkyDungeonSave} + * Generate Preview data function */ -function KinkyDungeonLoadPreview(String) { - if (!String) return { - // @ts-ignore - nodata: true, - // @ts-ignore - invalid: true, - }; +function KinkyDungeonLoadPreview(String: string): KinkyDungeonSave { + if (!String) { + return { + // @ts-ignore + nodata: true, + invalid: true, + }; + } try { - let str = DecompressB64(String.trim()); - /** - * @type {KinkyDungeonSave} - */ - let returndata = null; + let str: string = DecompressB64(String.trim()); + let returndata: KinkyDungeonSave = null; // We do a little JS witchery here - // @ts-ignore - returndata = {}; + 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) { - + 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; @@ -4632,26 +4646,16 @@ function KinkyDungeonLoadPreview(String) { // These are ignored for compatibility reasons if (saveData.stats) { - // @ts-ignore if (saveData.stats.picks != undefined) returndata.picks = saveData.stats.picks; - // @ts-ignore if (saveData.stats.keys != undefined) returndata.rkeys = saveData.stats.keys; - // @ts-ignore if (saveData.stats.bkeys != undefined) returndata.bkeys = saveData.stats.bkeys; - // @ts-ignore if (saveData.stats.mana != undefined) returndata.mana = saveData.stats.mana; - // @ts-ignore if (saveData.stats.manapool != undefined) returndata.manapool = saveData.stats.manapool; - // @ts-ignore if (saveData.stats.stamina != undefined) returndata.stamina = saveData.stats.stamina; - // @ts-ignore if (saveData.stats.willpower != undefined) returndata.willpower = saveData.stats.willpower; - // @ts-ignore if (saveData.stats.distraction != undefined) returndata.distraction = saveData.stats.distraction; - // @ts-ignore if (saveData.stats.distractionlower != undefined) returndata.distractionlower = saveData.stats.distractionlower; //if (saveData.stats.wep != undefined) KDSetWeapon(saveData.stats.wep); - // @ts-ignore if (saveData.stats.npp != undefined) returndata.npp = saveData.stats.npp; @@ -4809,7 +4813,7 @@ function KinkyDungeonLoadPreview(String) { } } -function KinkyDungeonStartNewGame(Load) { +function KinkyDungeonStartNewGame(Load: boolean = false) { KinkyDungeonSendEvent("beforeNewGame", {Load: Load}); KinkyDungeonNewGame = 0; let cp = KinkyDungeonMapIndex.grv; @@ -4830,6 +4834,7 @@ function KinkyDungeonStartNewGame(Load) { } KDGameData.PlayerName = localStorage.getItem("PlayerName") || "Ada"; + KinkyDungeonPlayer.Name = KDGameData.PlayerName; } if (!KDMapData.Grid) { KinkyDungeonCreateMap(KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)], "JourneyFloor", "", MiniGameKinkyDungeonLevel, false, Load); @@ -4848,7 +4853,7 @@ function KinkyDungeonStartNewGame(Load) { KinkyDungeonSendEvent("afterNewGame", {Load: Load}); } -function KDUpdatePlugSettings(evalHardMode) { +function KDUpdatePlugSettings(evalHardMode: boolean) { KinkyDungeonStatsChoice.set("arousalMode", KinkyDungeonSexyMode ? true : undefined); KinkyDungeonStatsChoice.set("arousalModePlug", KinkyDungeonSexyPlug ? true : undefined); KinkyDungeonStatsChoice.set("arousalModePlugNoFront", KinkyDungeonSexyPlugFront ? true : undefined); @@ -5175,9 +5180,8 @@ function KinkyDungeonHandleClick() { /** * Handles clicks during the kinky dungeon game - * @returns {void} - Nothing */ -function KinkyDungeonClick() { +function KinkyDungeonClick(): void { // } @@ -5232,23 +5236,22 @@ function KDClick() { /** * Handles exit during the kinky dungeon game - * @returns {void} - Nothing */ -function KinkyDungeonExit() { +function KinkyDungeonExit(): void { KinkyDungeonGameKey.removeKeyListener(); CommonDynamicFunction(MiniGameReturnFunction + "()"); // Refresh the player character if needed if (ArcadeDeviousChallenge && KinkyDungeonPlayerNeedsRefresh) { if (ServerPlayerIsInChatRoom()) { - ChatRoomCharacterUpdate(Player); + ChatRoomCharacterUpdate(DefaultPlayer); } else { - CharacterRefresh(Player); + CharacterRefresh(DefaultPlayer); } } if (CharacterAppearancePreviousEmoticon) { - CharacterSetFacialExpression(Player, "Emoticon", CharacterAppearancePreviousEmoticon); + CharacterSetFacialExpression(DefaultPlayer, "Emoticon", CharacterAppearancePreviousEmoticon); CharacterAppearancePreviousEmoticon = ""; } @@ -5259,12 +5262,12 @@ function KinkyDungeonExit() { if (CurrentScreen == "ChatRoom" && KinkyDungeonState != "Menu" && KDLose) { let Dictionary = [ - { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, + { Tag: "SourceCharacter", Text: CharacterNickname(DefaultPlayer), MemberNumber: DefaultPlayer.MemberNumber }, { Tag: "KinkyDungeonLevel", Text: String(MiniGameKinkyDungeonLevel)}, ]; ChatRoomPublishCustomAction("KinkyDungeonLose", false, Dictionary); } - CharacterRefresh(Player, true); + CharacterRefresh(DefaultPlayer, true); KinkyDungeonTeardownCrashHandler(); } @@ -5274,9 +5277,8 @@ function KinkyDungeonExit() { /** * Handles key presses during the mini game. (Both keyboard and mobile) - * @returns {void} - Nothing */ -function KinkyDungeonKeyDown() { +function KinkyDungeonKeyDown(): void { // n/a } @@ -5332,8 +5334,7 @@ window.addEventListener('touchmove', function(event) { MouseClicked = true; // To prevent KDClick on end } }); -// @ts-ignore -window.addEventListener('touchend', function(event) { +window.addEventListener('touchend', function(_event: TouchEvent) { if (CommonIsMobile && mouseDown && !MouseClicked) { KDClick(); MouseClicked = true; @@ -5350,23 +5351,22 @@ window.addEventListener('wheel', function(event) { /** - * Game keyboard input handler object: Handles keyboard inputs. + * Game keyboard input handler object. Contains the functions and properties required to handle key press events. * @constant - * @type {object} - The game keyboard input handler object. Contains the functions and properties required to handle key press events. */ -let KinkyDungeonGameKey = { +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', + 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]; @@ -5382,7 +5382,7 @@ let KinkyDungeonGameKey = { window.removeEventListener('keyup', KinkyDungeonGameKey.keyUpEvent); }, keyDownEvent : { - handleEvent : function (event) { + 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; @@ -5444,7 +5444,7 @@ let KinkyDungeonGameKey = { } }, keyUpEvent : { - handleEvent : function (event) { + handleEvent : function (event: KeyboardEvent) { let code = !(event.code.includes("Digit") || (event.key.length == 1 && event.code != "Space")) ? event.code : event.key.toUpperCase(); KinkyDungeonKeybindingCurrentKeyRelease = code; @@ -5502,11 +5502,9 @@ let KinkyDungeonGameKey = { /** * Outputs a savegame - * @returns {KinkyDungeonSave} - Saved game object */ -function KinkyDungeonGenerateSaveData() { - /** @type {KinkyDungeonSave} */ - let save = {}; +function KinkyDungeonGenerateSaveData(): KinkyDungeonSave { + let save = {} as KinkyDungeonSave; save.version = TextGet("KDVersionStr"); save.level = MiniGameKinkyDungeonLevel; save.checkpoint = MiniGameKinkyDungeonCheckpoint; @@ -5540,10 +5538,13 @@ function KinkyDungeonGenerateSaveData() { save.consumableVariants = KinkyDungeonConsumableVariants; save.uniqueHits = Array.from(KDUniqueBulletHits); + save.KinkyDungeonCurrentTick = KinkyDungeonCurrentTick; + save.saveStat = { 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, @@ -5555,8 +5556,7 @@ function KinkyDungeonGenerateSaveData() { }; let spells = []; - /**@type {item[]} */ - let newInv = []; + let newInv: item[] = []; for (let inv of KinkyDungeonFullInventory()) { let item = Object.assign({}, inv); @@ -5599,7 +5599,7 @@ function KinkyDungeonGenerateSaveData() { return save; } -function KinkyDungeonSaveGame(ToString) { +function KinkyDungeonSaveGame(ToString: boolean = false) { let save = KinkyDungeonGenerateSaveData(); let data = KinkyDungeonCompressSave(save); @@ -5614,30 +5614,31 @@ function KinkyDungeonSaveGame(ToString) { return data; } -function KinkyDungeonCompressSave(save) { +function KinkyDungeonCompressSave(save: any) { return LZString.compressToBase64(JSON.stringify(save)); } // N4IgNgpgbhYgXARgDQgMYAsJoNYAcB7ASwDsAXBABlQCcI8FQBxDAgZwvgFoBWakAAo0ibAiQg0EvfgBkIAQzJZJ8fgFkIZeXFWoASgTwQqqAOpEwO/gFFIAWwjk2JkAGExAKwCudFwElLLzYiMSoAX1Q0djJneGAIkAIaACNYgG0AXUisDnSskAATOjZYkAARCAAzeS8wClQAcwIwApdCUhiEAGZUSBgwWNBbCAcnBBQ3Tx9jJFQAsCCQknGEtiNLPNRSGHIkgE8ENNAokjYvO3lkyEYQEnkHBEECMiW1eTuQBIBHL3eXsgOSAixzEZwuVxmoDuD3gTxeYgAylo7KR5J9UD8/kQAStkCDTudLtc4rd7jM4UsAGLCBpEVrfX7kbGAxDAkAAdwUhGWJOh5IA0iQiJVjGE2cUyDR5B0bnzHmUvGgyAAVeRGOQNZwJF4NDBkcQlca9Ai4R7o0ASqUy3lk+WKlVqiCUiCaNTnOwHbVEXX6iCG2bgE04M1hDJhIA= -function KinkyDungeonLoadGame(String) { +function KinkyDungeonLoadGame(String: string = "") { localStorage.setItem('KDLastSaveSlot', "" + KDSaveSlot); KinkyDungeonSendEvent("beforeLoadGame", {}); let str = String ? DecompressB64(String.trim()) : (localStorage.getItem('KinkyDungeonSave') ? DecompressB64(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) { - + 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; @@ -5658,6 +5659,7 @@ function KinkyDungeonLoadGame(String) { 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; @@ -5739,6 +5741,7 @@ function KinkyDungeonLoadGame(String) { 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); } } @@ -5814,6 +5817,7 @@ function KinkyDungeonLoadGame(String) { 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; @@ -5886,10 +5890,9 @@ 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) { +function KDrandomizeSeed(Native: boolean) { let rand = Native ? KDRandom : () => {return Math.random();}; KinkyDungeonSeed = (rand() * 4294967296).toString(); for (let i = 0; i < 20; i++) { @@ -5902,8 +5905,8 @@ function KDrandomizeSeed(Native) { } } -function KDsetSeed(string) { - KinkyDungeonSeed = string; +function KDsetSeed(str: string) { + KinkyDungeonSeed = str; KDRandom = sfc32(xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)(), xmur3(KinkyDungeonSeed)()); for (let i = 0; i < 1000; i++) { KDRandom(); @@ -5915,7 +5918,7 @@ function KDsetSeed(string) { * @param str - The string to hash. * @returns A function that returns a random number. */ -function xmur3(str) { +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); @@ -5935,7 +5938,7 @@ function xmur3(str) { * @param d - The seed. * @returns A function that returns a random number between 0 and 1. */ -function sfc32(a, b, c, d) { +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; @@ -5949,19 +5952,11 @@ function sfc32(a, b, c, d) { }; } -/** - * @type {Map} - */ -let kdSoundCache = new Map(); +let kdSoundCache: Map = new Map(); -/** - * - * @param {string} Path - * @param {number} [volume] - */ -function AudioPlayInstantSoundKD(Path, volume) { +function AudioPlayInstantSoundKD(Path: string, volume?: number) { if (!KDToggles.Sound) return false; - const vol = KDSfxVolume * (volume != null ? volume : Player.AudioSettings.Volume); + 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(); @@ -5980,14 +5975,14 @@ function AudioPlayInstantSoundKD(Path, volume) { /** * From https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0 */ -function hashCode(s) { +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) { +function TextGetKD(Text: string) { if (TextGet(Text)) return TextGet(Text); else return KDLoadingTextKeys[Text] || "Missing text"; @@ -6009,13 +6004,14 @@ function KinkyDungeonCheckPlayerRefresh() { KinkyDungeonPlayerNeedsRefresh = false; if (ServerPlayerIsInChatRoom()) { - ChatRoomCharacterUpdate(Player); + ChatRoomCharacterUpdate(DefaultPlayer); } else { - CharacterRefresh(Player); + CharacterRefresh(DefaultPlayer); } } -function CJKcheck(text,p = 0,o = "search"){ +function CJKcheck(text: string, p: number = 0, o: string = "search"): RegExpMatchArray | boolean +{ if (o == "search") { //Find all English characters and space @@ -6033,11 +6029,7 @@ function CJKcheck(text,p = 0,o = "search"){ } } -/** - * @param {string} id - * @returns {HTMLCanvasElement} - */ -function KinkyDungeonGetCanvas(id) { +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; @@ -6045,27 +6037,23 @@ function KinkyDungeonGetCanvas(id) { -// @ts-ignore -function KDDrawGameSetupTabs(xOffset) { +function KDDrawGameSetupTabs(_xOffset: number = 0) { if (KDGameData.PlayerName) { DrawTextFitKD(KDGameData.PlayerName, 250, 25, 480, "#ffffff", KDTextGray0, 32, "center", 20); } - // @ts-ignore - DrawButtonKDEx("TabDiff", (b) => { + DrawButtonKDEx("TabDiff", (_b) => { KinkyDungeonState = "Diff"; return true; }, true, 500, 10, 740, 40, TextGet("KDDiffTab_Diff"), "#ffffff", undefined, undefined, undefined, KinkyDungeonState != "Diff", KDButtonColor); - // @ts-ignore - DrawButtonKDEx("TabChallenge", (b) => { + DrawButtonKDEx("TabChallenge", (_b) => { KinkyDungeonState = "Challenge"; return true; }, true, 1250, 10, 740, 40, TextGet("KDDiffTab_Challenge"), "#ffffff", undefined, undefined, undefined, KinkyDungeonState != "Challenge", KDButtonColor); - // @ts-ignore - DrawButtonKDEx("backButton", (b) => { + DrawButtonKDEx("backButton", (_b) => { KinkyDungeonState = "Menu"; return true; }, true, 1075, 900, 350, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", "", undefined, undefined, undefined, undefined, @@ -6077,19 +6065,14 @@ function KDDrawGameSetupTabs(xOffset) { -/** - * - * @param {string} str - * @returns {string} - */ -function DecompressB64(str) { +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) { +function KDDrawToggleTabs(xOffset: number) { let w = 1990 - xOffset; FillRectKD(kdcanvas, kdpixisprites, "maintogglebg", { Left: xOffset, @@ -6114,8 +6097,7 @@ function KDDrawToggleTabs(xOffset) { let list = KDToggleGroups; let II = 0; for (let tab of list) { - // @ts-ignore - DrawButtonKDEx("TabTog" + tab, (b) => { + DrawButtonKDEx("TabTog" + tab, (_b) => { KDToggleTab = tab; return true; }, true, xOffset + II * w / list.length, 10, w / list.length - 4, 40, @@ -6125,14 +6107,14 @@ function KDDrawToggleTabs(xOffset) { } } -// @ts-ignore -function KinkyDungeonMultiplayerUpdate(delay) { +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) { @@ -6160,7 +6142,7 @@ function KDLoadSave(files) { } -function downloadFile(filename, text) { +function downloadFile(filename: string, text: string) { const blob = new Blob([text], { type: 'text/plain' }); const url = URL.createObjectURL(blob); @@ -6181,7 +6163,7 @@ function downloadFile(filename, text) { URL.revokeObjectURL(url); } -function KDChangeZoom(change) { +function KDChangeZoom(change: number) { KDZoomIndex += change; if (KDZoomIndex < 0) KDZoomIndex = 0; else if (KDZoomIndex > KDZoomLevels.length - 1) KDZoomIndex = KDZoomLevels.length - 1; @@ -6196,4 +6178,4 @@ function KDChangeZoom(change) { KinkyDungeonSendActionMessage(10, TextGet("ZoomSet").replace("PCNT", "" + Math.round(100*(72 + KDZoomLevels[KDZoomIndex] * 12)/72) ), "#ffffff", 1); -} \ No newline at end of file +} diff --git a/Game/src/base/KinkyDungeonBones.js b/Game/src/base/KinkyDungeonBones.ts similarity index 98% rename from Game/src/base/KinkyDungeonBones.js rename to Game/src/base/KinkyDungeonBones.ts index c3490b987..f09f53d0e 100644 --- a/Game/src/base/KinkyDungeonBones.js +++ b/Game/src/base/KinkyDungeonBones.ts @@ -1045,16 +1045,14 @@ let KDPatrons = [ ]; /** - * - * @param {enemy} Enemy - * @param {entity} e - * @param {number} chanceBoost - * @returns {any} + * @param Enemy + * @param e + * @param chanceBoost */ -function KDProcessCustomPatron(Enemy, e, chanceBoost) { +function KDProcessCustomPatron(Enemy: enemy, e: entity, chanceBoost: number): any { let chance = 0.05 + (chanceBoost || 0); // Lower chance if 'subordinate' if (!e.CustomName && KDPatronCustomEnemies.get(Enemy.name) && KDRandom() < chance) { - let customs = KDPatronCustomEnemies.get(Enemy.name).filter((element) => { + let customs: any[] = KDPatronCustomEnemies.get(Enemy.name).filter((element) => { return (element.prisoner && KDEnemyHasFlag(e, "imprisoned")) || (element.free && !KDEnemyHasFlag(e, "imprisoned")); }); if (customs.length > 0) { @@ -1085,13 +1083,11 @@ function KDProcessCustomPatron(Enemy, e, chanceBoost) { /** - * - * @param {any[]} pets - * @param {entity} e - * @param {number} index - * @returns {any} + * @param pets + * @param e + * @param index */ -function KDProcessCustomPatronPet(pets, e, 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) { @@ -1118,4 +1114,4 @@ function KDProcessCustomPatronPet(pets, e, index) { } } return undefined; -} \ No newline at end of file +} diff --git a/Game/src/base/KinkyDungeonDraw.js b/Game/src/base/KinkyDungeonDraw.ts similarity index 82% rename from Game/src/base/KinkyDungeonDraw.js rename to Game/src/base/KinkyDungeonDraw.ts index b4261cbd9..c141b4b5b 100644 --- a/Game/src/base/KinkyDungeonDraw.js +++ b/Game/src/base/KinkyDungeonDraw.ts @@ -1,12 +1,11 @@ "use strict"; let KDDebugOverlay = false; -/** @type {PoseMod[]} */ -let CHIBIMOD = [ +let CHIBIMOD: PoseMod[] = [ { Layer: "HairBack", - scale_x: 0.75, - scale_y: 0.75, + scale_x: 0.65, + scale_y: 0.65, rotation_x_anchor: 1190, rotation_y_anchor: 690, offset_x: 1100, @@ -14,8 +13,8 @@ let CHIBIMOD = [ }, { Layer: "Head", - scale_x: 2, - scale_y: 2, + scale_x: 2.25, + scale_y: 2.25, rotation_x_anchor: 1190, rotation_y_anchor: 690, offset_x: 1100, @@ -28,7 +27,7 @@ let KDInspectCamera = {x: 0, y: 0}; let KDRecentRepIndex = 0; -let KDWallReplacers = "146,dDzZbgS"; +let KDWallReplacers = "14f6,dDzZbgS"; let KinkyDungeonSuppressSprint = true; @@ -50,8 +49,7 @@ let KDBreathAnimTime = 1400; let KDFlipPlayer = false; // PIXI experimental -/** @type HTMLCanvasElement */ -let pixiview = null; +let pixiview: HTMLCanvasElement = null; let pixirenderer = null; let pixirendererKD = null; let kdgamefog = new PIXI.Graphics(); @@ -245,52 +243,26 @@ let KDTextRed1 = "#110000"; let KDCurseColor = "#ff55aa"; let KDGoodColor = "#77ff99"; -/** - * @type {Map} - */ -let kdSpritesDrawn = new Map(); +let kdSpritesDrawn: Map = new Map(); -/** - * @type {Map} - */ -let kdlightsprites = new Map(); -/** - * @type {Map} - */ -let kdpixisprites = new Map(); -/** - * @type {Map} - */ -let kdminimapsprites = new Map(); -/** - * @type {Map} - */ -let kdpixifogsprites = new Map(); -/** - * @type {Map} - */ -let kdpixibrisprites = new Map(); +let kdlightsprites: Map = new Map(); +let kdpixisprites: Map = new Map(); +let kdminimapsprites: Map = new Map(); +let kdpixifogsprites: Map = new Map(); +let kdpixibrisprites: Map = new Map(); -/** - * @type {Map} - */ -let kdprimitiveparams = new Map(); +let kdprimitiveparams: Map = new Map(); -/** - * @type {Map} - */ -let kdpixitex = new Map(); +let kdpixitex: Map = new Map(); /** - * - * @param {number} x - * @param {number} y - * @param {string} [noReplace] - * @returns {boolean} + * @param x + * @param y + * @param [noReplace] */ -function KDWallVert(x, y, noReplace) { +function KDWallVert(x: number, y: number, noReplace?: string): boolean { //let tileUp = KinkyDungeonMapGet(x, y); let tileBelow = KinkyDungeonMapGet(x, y + 1); if ( @@ -305,13 +277,11 @@ function KDWallVert(x, y, noReplace) { return false; } /** - * - * @param {number} x - * @param {number} y - * @param {string} [noReplace] - * @returns {boolean} + * @param x + * @param y + * @param [noReplace] */ -function KDWallVertAbove(x, y, noReplace) { +function KDWallVertAbove(x: number, y: number, noReplace?: string): boolean { //let tileUp = KinkyDungeonMapGet(x, y); let tileAbove = KinkyDungeonMapGet(x, y - 1); if ( @@ -324,13 +294,11 @@ function KDWallVertAbove(x, y, noReplace) { return false; } /** - * - * @param {number} x - * @param {number} y - * @param {string} [noReplace] - * @returns {boolean} + * @param x + * @param y + * @param [noReplace] */ -function KDWallVertBoth(x, y, 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); @@ -346,12 +314,10 @@ function KDWallVertBoth(x, y, noReplace) { return false; } /** - * - * @param {number} x - * @param {number} y - * @returns {boolean} + * @param x + * @param y */ -function KDWallHorizTunnel(x, 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); @@ -365,12 +331,11 @@ function KDWallHorizTunnel(x, y) { return false; } /** - * - * @param {number} x - * @param {number} y + * @param x + * @param y * @returns {boolean} */ -function KDWallVertTunnel(x, y) { +function KDWallVertTunnel(x: number, y: number): boolean { //let tileUp = KinkyDungeonMapGet(x, y); let tileRight = KinkyDungeonMapGet(x + 1, y); let tileLeft = KinkyDungeonMapGet(x - 1, y); @@ -387,43 +352,47 @@ function KDWallVertTunnel(x, y) { let KDChainablePillar = 'bdD'; -/** @type KDSprites */ -const KDSprites = { - "5": (x, y, Fog, noReplace) => { +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) => { + "6": (x, y, _Fog, _noReplace) => { let tile = KinkyDungeonTilesGet(x + "," + y); if (tile?.Sprite) return tile.Sprite; return "Wall"; }, - "1": (x, y, Fog, noReplace) => { + "1": (x, y, _Fog, noReplace) => { if (KDWallVert(x, y, noReplace)) return "WallVert"; return "Wall"; }, - "2": (x, y, Fog, noReplace) => { + "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) => { + "3": (_x, _y, Fog, _noReplace) => { return Fog ? "Doodad" : "MimicBlock"; }, - "b": (x, y, Fog, noReplace) => { + "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) => { + "X": (_x, _y, _Fog, _noReplace) => { return "Doodad"; }, - "4": (x, y, Fog, noReplace) => { + "4": (x, y, _Fog, noReplace) => { if (KDWallVert(x, y, noReplace)) return "WallVert"; return "Wall"; }, - "L": (x, y, Fog, noReplace) => { + "L": (x, y, _Fog, _noReplace) => { if (KinkyDungeonTilesGet(x + "," + y)) { let furn = KinkyDungeonTilesGet(x + "," + y).Furniture ? KDFurniture[KinkyDungeonTilesGet(x + "," + y).Furniture] : ""; if (furn) { @@ -432,16 +401,16 @@ const KDSprites = { } return "Barrel"; }, - "F": (x, y, Fog, noReplace) => { + "F": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - "?": (x, y, Fog, noReplace) => { + "?": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - "/": (x, y, Fog, noReplace) => { + "/": (_x, _y, _Fog, _noReplace) => { return "RubbleLooted"; }, - ",": (x, y, Fog, noReplace) => { + ",": (x, y, _Fog, noReplace) => { if (KDWallVert(x, y, noReplace)) return "WallVert"; return "Wall"; @@ -490,24 +459,24 @@ const KDSprites = { else KDMapData.TilesMemory[x + "," + y] = "DoorOpen"; return KDMapData.TilesMemory[x + "," + y]; }, - "a": (x, y, Fog, noReplace) => { + "a": (_x, _y, _Fog, _noReplace) => { return "ShrineBroken"; }, - "A": (x, y, Fog, noReplace) => { + "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) => { + "H": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - "s": (x, y, Fog, noReplace) => { + "s": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - "S": (x, y, Fog, noReplace) => { + "S": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - "g": (x, y, Fog, noReplace) => { + "g": (x, y, _Fog, _noReplace) => { if (KDWallHorizTunnel(x, y)) return "GrateHoriz"; else if (!KDWallVert(x, y)) { @@ -517,175 +486,174 @@ const KDSprites = { } return "Grate"; }, - "r": (x, y, Fog, noReplace) => { + "r": (_x, _y, _Fog, _noReplace) => { return "RubbleLooted"; }, - "T": (x, y, Fog, noReplace) => { + "T": (_x, _y, _Fog, _noReplace) => { return (KinkyDungeonBlindLevel > 0) ?"Floor" : "Trap"; }, - "Y": (x, y, Fog, noReplace) => { + "Y": (_x, _y, _Fog, _noReplace) => { return "Doodad"; }, - "R": (x, y, Fog, noReplace) => { + "R": (_x, _y, _Fog, _noReplace) => { return "RubbleLooted"; }, - "m": (x, y, Fog, noReplace) => { + "m": (_x, _y, _Fog, _noReplace) => { return "Brickwork"; }, - "M": (x, y, Fog, noReplace) => { + "M": (_x, _y, _Fog, _noReplace) => { return "Brickwork"; }, - "O": (x, y, Fog, noReplace) => { + "O": (_x, _y, _Fog, _noReplace) => { return "OrbEmpty"; }, - "P": (x, y, Fog, noReplace) => { + "P": (_x, _y, _Fog, _noReplace) => { return "OrbEmpty"; }, - "p": (x, y, Fog, noReplace) => { + "p": (_x, _y, _Fog, _noReplace) => { return "OrbEmpty"; }, - "o": (x, y, Fog, noReplace) => { + "o": (_x, _y, _Fog, _noReplace) => { return "OrbEmpty"; }, - "w": (x, y, Fog, noReplace) => { + "w": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - "W": (x, y, Fog, noReplace) => { + "W": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - "]": (x, y, Fog, noReplace) => { + "]": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - "[": (x, y, Fog, noReplace) => { + "[": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - "=": (x, y, Fog, noReplace) => { + "=": (_x, _y, _Fog, _noReplace) => { return "Brickwork"; }, - "+": (x, y, Fog, noReplace) => { + "+": (_x, _y, _Fog, _noReplace) => { return "Brickwork"; }, - "-": (x, y, Fog, noReplace) => { + "-": (_x, _y, _Fog, _noReplace) => { return "Brickwork"; }, - "l": (x, y, Fog, noReplace) => { + "l": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - ";": (x, y, Fog, noReplace) => { + ";": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - "V": (x, y, Fog, noReplace) => { + "V": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - "v": (x, y, Fog, noReplace) => { + "v": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - "t": (x, y, Fog, noReplace) => { + "t": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - "u": (x, y, Fog, noReplace) => { + "u": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, - "N": (x, y, Fog, noReplace) => { + "N": (_x, _y, _Fog, _noReplace) => { return "Floor"; }, }; -/** @type KDSprites */ -const KDOverlays = { - "5": (x, y, Fog, noReplace) => { +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) => { + "6": (x, y, _Fog, _noReplace) => { let tile = KinkyDungeonTilesGet(x + "," + y); if (tile?.Overlay) return tile.Overlay; return ""; }, - "Z": (x, y, Fog, noReplace) => { + "Z": (_x, _y, _Fog, _noReplace) => { return "Signal/AutoLock"; }, - "H": (x, y, Fog, noReplace) => { + "H": (_x, _y, _Fog, _noReplace) => { return "StairsDown"; }, - "s": (x, y, Fog, noReplace) => { + "s": (_x, _y, _Fog, _noReplace) => { return "StairsDown"; }, - "S": (x, y, Fog, noReplace) => { + "S": (_x, _y, _Fog, _noReplace) => { return "StairsUp"; }, - "-": (x, y, Fog, noReplace) => { + "-": (_x, _y, _Fog, _noReplace) => { return "ChargerSpent"; }, - "l": (x, y, Fog, noReplace) => { + "l": (_x, _y, _Fog, _noReplace) => { return "Leyline"; }, - ";": (x, y, Fog, noReplace) => { + ";": (x, y, _Fog, _noReplace) => { let tile = KinkyDungeonTilesGet(x + "," + y); if (tile?.Portal) return tile.Portal; return ""; }, - "+": (x, y, Fog, noReplace) => { + "+": (_x, _y, _Fog, _noReplace) => { return "Charger"; }, - "=": (x, y, Fog, noReplace) => { + "=": (_x, _y, _Fog, _noReplace) => { return "ChargerCrystal"; }, - "Y": (x, y, Fog, noReplace) => { + "Y": (_x, _y, _Fog, _noReplace) => { return "Rubble"; }, - "/": (x, y, Fog, noReplace) => { + "/": (_x, _y, _Fog, _noReplace) => { return "Scrap"; }, - "R": (x, y, Fog, noReplace) => { + "R": (_x, _y, _Fog, _noReplace) => { return "Rubble"; }, - "$": (x, y, Fog, noReplace) => { + "$": (_x, _y, _Fog, _noReplace) => { return "Angel"; }, - "m": (x, y, Fog, noReplace) => { + "m": (_x, _y, _Fog, _noReplace) => { return "TabletSpent"; }, - "M": (x, y, Fog, noReplace) => { + "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) => { + "[": (_x, _y, _Fog, _noReplace) => { return "Spores"; }, - "]": (x, y, Fog, noReplace) => { + "]": (_x, _y, _Fog, _noReplace) => { return "HappyGas"; }, - "w": (x, y, Fog, noReplace) => { + "w": (_x, _y, _Fog, _noReplace) => { return "Water"; }, - "W": (x, y, Fog, noReplace) => { + "W": (_x, _y, _Fog, _noReplace) => { return "Water"; }, - "O": (x, y, Fog, noReplace) => { + "O": (_x, _y, _Fog, _noReplace) => { return "Orb"; }, - "P": (x, y, Fog, noReplace) => { + "P": (_x, _y, _Fog, _noReplace) => { return "Perk"; }, - ",": (x, y, Fog, noReplace) => { + ",": (_x, _y, _Fog, _noReplace) => { return "HookLow"; }, - "?": (x, y, Fog, noReplace) => { + "?": (_x, _y, _Fog, _noReplace) => { return "HookHigh"; }, - "B": (x, y, Fog, noReplace) => { + "B": (_x, _y, _Fog, _noReplace) => { return "Bed"; }, - "G": (x, y, Fog, noReplace) => { + "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) => { + "L": (x, y, _Fog, _noReplace) => { if (KinkyDungeonTilesGet(x + "," + y)) { let furn = KinkyDungeonTilesGet(x + "," + y).Furniture ? KDFurniture[KinkyDungeonTilesGet(x + "," + y).Furniture] : ""; if (furn) { @@ -693,7 +661,7 @@ const KDOverlays = { } } }, - "F": (x, y, Fog, noReplace) => { + "F": (x, y, _Fog, _noReplace) => { let sprite = "Table"; if (KinkyDungeonTilesGet(x + "," + y)) { let table = "Table"; @@ -703,7 +671,7 @@ const KDOverlays = { } return sprite; }, - "4": (x, y, Fog, noReplace) => { + "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)); @@ -724,7 +692,7 @@ const KDOverlays = { - "c": (x, y, Fog, noReplace) => { + "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" : @@ -732,7 +700,7 @@ const KDOverlays = { ((KinkyDungeonTilesGet(x + "," + y) && (KinkyDungeonTilesGet(x + "," + y).Loot == "pearl" || KinkyDungeonTilesGet(x + "," + y).Loot == "lesserpearl")) ? "ChestPearlOpen" : "ChestOpen")))); }, - "C": (x, y, Fog, noReplace) => { + "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" : @@ -741,10 +709,10 @@ const KDOverlays = { }, - "@": (x, y, Fog, noReplace) => { + "@": (_x, _y, _Fog, _noReplace) => { return "Signal/Button"; }, - "V": (x, y, Fog, noReplace) => { + "V": (x, y, _Fog, _noReplace) => { let tile = KinkyDungeonTilesGet(x + "," + y); if (tile) { let tU = KinkyDungeonTilesGet(x + "," + (y - 1)); @@ -783,7 +751,7 @@ const KDOverlays = { } return "Conveyor/Conveyor"; }, - "v": (x, y, Fog, noReplace) => { + "v": (x, y, _Fog, _noReplace) => { let tile = KinkyDungeonTilesGet(x + "," + y); if (tile) { let tU = KinkyDungeonTilesGet(x + "," + (y - 1)); @@ -822,13 +790,13 @@ const KDOverlays = { } return "Conveyor/Conveyor"; }, - "t": (x, y, Fog, noReplace) => { + "t": (_x, _y, _Fog, _noReplace) => { return "DollTerminal"; }, - "u": (x, y, Fog, noReplace) => { + "u": (_x, _y, _Fog, _noReplace) => { return "DollSupply"; }, - "N": (x, y, Fog, noReplace) => { + "N": (x, y, _Fog, _noReplace) => { let tile = KinkyDungeonTilesGet(x + ',' + y); let tileAbove = KinkyDungeonMapGet(x, y - 1); let tileBelow = KinkyDungeonMapGet(x, y + 1); @@ -870,9 +838,8 @@ const KDOverlays = { }, }; -/** @type KDSprites */ -const KDOverlays2 = { - "V": (x, y, Fog, noReplace) => { +const KDOverlays2: KDSprites = { + "V": (x, y, _Fog, _noReplace) => { let tile = KinkyDungeonTilesGet(x + "," + y); if (tile && tile.SwitchMode != undefined) { let sprite = ""; @@ -891,7 +858,7 @@ const KDOverlays2 = { } return ""; }, - "v": (x, y, Fog, noReplace) => { + "v": (x, y, _Fog, _noReplace) => { let tile = KinkyDungeonTilesGet(x + "," + y); if (tile && tile.SwitchMode != undefined) { let sprite = ""; @@ -910,19 +877,19 @@ const KDOverlays2 = { } return ""; }, - "W": (x, y, Fog, noReplace) => { + "W": (_x, _y, _Fog, _noReplace) => { return "WaterFoam"; }, }; -function KinkyDungeonGetSprite(code, x, y, Fog, noReplace) { +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, x, y, Fog, noReplace) { +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) { @@ -931,7 +898,7 @@ function KinkyDungeonGetSpriteOverlay2(code, x, y, Fog, noReplace) { return sprite; } -function KinkyDungeonGetSpriteOverlay(code, x, y, Fog, noReplace) { +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) { @@ -948,20 +915,16 @@ let KDSpecialChests = { "robot" : "Chests/Robot", }; -/** - * @type {Record} - */ -let KDLastKeyTime = { -}; +let KDLastKeyTime: Record = {}; -function KDDoModalX(bdata) { +function KDDoModalX(_bdata) { KinkyDungeonTargetTile = null; KinkyDungeonTargetTileLocation = ""; KDModalArea = false; KDPlayerSetPose = false; } -function KDGetSpellRange(spell) { +function KDGetSpellRange(spell: spell): number { let data = { spell: spell, range: spell.range || 0, @@ -1371,21 +1334,21 @@ function KinkyDungeonDrawGame() { if (!KinkyDungeonMessageToggle && !KDIsAutoAction() && !(KinkyDungeonShowInventory && !KinkyDungeonTargetingSpell) && KinkyDungeonIsPlayer() && KDMouseInPlayableArea()) { if (KinkyDungeonInspect) { - KinkyDungeonSetTargetLocation(KDToggles.Helper); + 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(KDToggles.Helper); + 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(KDToggles.Helper); + KinkyDungeonSetTargetLocation(!KinkyDungeonTargetingSpell && KDToggles.Helper); KDDraw(kdstatusboard, kdpixisprites, "ui_spellreticule", KinkyDungeonRootDirectory + "TargetSpell.png", (KinkyDungeonTargetX - CamX)*KinkyDungeonGridSizeDisplay, (KinkyDungeonTargetY - CamY)*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, undefined, { @@ -1399,7 +1362,7 @@ function KinkyDungeonDrawGame() { let spellRange = KDGetSpellRange(KinkyDungeonTargetingSpell) * KinkyDungeonMultiplicativeStat(-KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "spellRange")); - let spellValid = (x, y, projAimOverride) => { + 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 @@ -1487,7 +1450,7 @@ function KinkyDungeonDrawGame() { } } else if ((KinkyDungeonFastMove && !(!KinkyDungeonSuppressSprint && KinkyDungeonToggleAutoSprint && KDCanSprint()) && (KinkyDungeonMoveDirection.x != 0 || KinkyDungeonMoveDirection.y != 0))) { - KinkyDungeonSetTargetLocation(KDToggles.Helper); + KinkyDungeonSetTargetLocation(!KinkyDungeonTargetingSpell && KDToggles.Helper); let allowFog = KDAllowFog(); @@ -1582,35 +1545,35 @@ function KinkyDungeonDrawGame() { if (!enemy.ambushtrigger && KDAIType[KDGetAI(KinkyDungeonEnemyAt(cursorX, cursorY))]?.ambushtile) { ambushTile = KDAIType[KDGetAI(enemy)].ambushtile; } else { - tooltips.push((offset) => KDDrawEnemyTooltip(enemy, offset)); + tooltips.push((offset: number) => KDDrawEnemyTooltip(enemy, offset)); } } if (!enemy && KDGameData.CurrentDialog) { enemy = KDGetSpeaker(); if (enemy) - tooltips.push((offset) => KDDrawEnemyDialogue(enemy, offset)); + 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) => KDDrawItemsTooltip(items, offset)); + 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) => KDDrawEffectTileTooltip(etile, cursorX, cursorY, offset)); + 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) => KDDrawTileTooltip(tile, cursorX, cursorY, offset)); + tooltips.push((offset: number) => KDDrawTileTooltip(tile, cursorX, cursorY, offset)); } } else if (KDGameData.CurrentDialog) { let enemy = KDGetSpeaker(); if (enemy) - tooltips.push((offset) => KDDrawEnemyDialogue(enemy, offset)); + tooltips.push((offset: number) => KDDrawEnemyDialogue(enemy, offset)); } let tooltipOffset = KDFocusControls ? 70 : 0; @@ -1742,30 +1705,6 @@ function KinkyDungeonDrawGame() { - if (!StandalonePatched) { - // 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, - }); - } - MainCanvas.drawImage(KinkyDungeonCanvas, canvasOffsetX, canvasOffsetY); - DrawCharacter(KinkyDungeonPlayer, 0, 0, 1); - } if (KinkyDungeonCurrentEscapingItem && KinkyDungeonFlags.get("escaping")) { let item = KinkyDungeonCurrentEscapingItem; @@ -1853,13 +1792,14 @@ function KinkyDungeonDrawGame() { } KinkyDungeonSendEvent("afterDrawFrame", data); - } else { + } + /*else { DrawTextKD(TextGet("KinkyDungeonLoading"), 1100, 500, "#ffffff", KDTextGray2); if (CommonTime() > KinkyDungeonGameDataNullTimerTime + KinkyDungeonGameDataNullTimer) { ServerSend("ChatRoomChat", { Content: "RequestFullKinkyDungeonData", Type: "Hidden", Target: KinkyDungeonPlayerCharacter.MemberNumber }); KinkyDungeonGameDataNullTimerTime = CommonTime(); } - } + }*/ } else { @@ -1994,31 +1934,31 @@ function KinkyDungeonDrawGame() { DrawButtonVis(1500, 320, 300, 64, "Get save code", "#ffffff", ""); DrawButtonVis(1100, 370, 300, 64, "Enter parole mode", "#ffffff", ""); - DrawButtonKDEx("debugAddKey", (bdata) => { + DrawButtonKDEx("debugAddKey", (_bdata) => { KinkyDungeonRedKeys += 1; KinkyDungeonBlueKeys += 1; KinkyDungeonLockpicks += 1; return true; }, true, 600, 160, 300, 64, "Add keys and lockpicks", "#ffffff", ""); - DrawButtonKDEx("debugAddVision", (bdata) => { + DrawButtonKDEx("debugAddVision", (_bdata) => { KinkyDungeonSeeAll = !KinkyDungeonSeeAll; return true; }, true, 600, 240, 300, 64, "Toggle OmniVisionβ„’", "#ffffff", ""); - DrawButtonKDEx("debugAddSP", (bdata) => { + DrawButtonKDEx("debugAddSP", (_bdata) => { KinkyDungeonSpellPoints += 1; return true; }, true, 600, 320, 300, 64, "Add spell point", "#ffffff", ""); - DrawButtonKDEx("debugClearQuickInv", (bdata) => { + DrawButtonKDEx("debugClearQuickInv", (_bdata) => { KinkyDungeonInventory.get('looserestraint').clear(); KinkyDungeonAdvanceTime(0, true); return true; }, true, 600, 400, 300, 64, "Clear loose restraints", "#ffffff", ""); - DrawButtonKDEx("debugClearPlayerInv", (bdata) => { + DrawButtonKDEx("debugClearPlayerInv", (_bdata) => { KinkyDungeonInventory.get('restraint').clear(); KinkyDungeonAdvanceTime(0, true); return true; }, true, 600, 480, 300, 64, "Clear worn restraints", "#ffffff", ""); - DrawButtonKDEx("debugaddallrest", (bdata) => { + DrawButtonKDEx("debugaddallrest", (_bdata) => { // eslint-disable-next-line no-unused-vars for (let r of KinkyDungeonRestraints) { if (!KinkyDungeonInventoryGetLoose(r.name)) @@ -2026,26 +1966,26 @@ function KinkyDungeonDrawGame() { } return true; }, true, 600, 560, 300, 64, "Add all restraints", "#ffffff", ""); - DrawButtonKDEx("debugIncFloor", (bdata) => { + DrawButtonKDEx("debugIncFloor", (_bdata) => { MiniGameKinkyDungeonLevel += 1; KDGameData.JourneyY += 1; KinkyDungeonSendEvent("tickFlags", {delta: 1}); KDTickSpecialStats(); return true; }, true, 600, 640, 300, 64, "Increment Floor", "#ffffff", ""); - DrawButtonKDEx("+maxAP", (bdata) => { + DrawButtonKDEx("+maxAP", (_bdata) => { KDGameData.StatMaxBonus.AP += 10; return true; }, true, 600, 720, 150, 64, "+Max DP", "#ffaaaa", ""); - DrawButtonKDEx("+maxMP", (bdata) => { + DrawButtonKDEx("+maxMP", (_bdata) => { KDGameData.StatMaxBonus.MP += 10; return true; }, true, 750, 720, 150, 64, "+Max MP", "#0088ff", ""); - DrawButtonKDEx("+maxSP", (bdata) => { + DrawButtonKDEx("+maxSP", (_bdata) => { KDGameData.StatMaxBonus.SP += 10; return true; }, true, 600, 800, 150, 64, "+Max SP", "#44ff00", ""); - DrawButtonKDEx("+maxWP", (bdata) => { + DrawButtonKDEx("+maxWP", (_bdata) => { KDGameData.StatMaxBonus.WP += 10; return true; }, true, 750, 800, 150, 64, "+Max WP", "#ff5555", ""); @@ -2083,7 +2023,7 @@ function KinkyDungeonDrawGame() { DrawButtonVis(1650, 920, 300, 64, TextGet("KinkyDungeonLoadBack"), "#ffffff", ""); if (!KDClipboardDisabled) - DrawButtonKDEx("copyperks", (bdata) => { + DrawButtonKDEx("copyperks", (_bdata) => { let txt = ""; for (let k of KinkyDungeonStatsChoice.keys()) { if (!k.startsWith("arousal") && !k.endsWith("Mode")) txt += (txt ? "\n" : "") + k; @@ -2208,13 +2148,12 @@ function KDShouldDrawFloaters() { /** * 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. + * @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, h, Width, ArousalOverride, Color = '255, 100, 176', AlphaBonus = 0) { +function KDDrawArousalScreenFilter(_y1: number, _h: number, _Width: number, _ArousalOverride: number, _Color: string = '255, 100, 176', _AlphaBonus: number = 0): void { /*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; @@ -2261,9 +2200,10 @@ 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, Amount, Color, Time, LocationOverride, suff = "", size, prefix) { +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; @@ -2286,7 +2226,7 @@ function KinkyDungeonSendFloater(Entity, Amount, Color, Time, LocationOverride, } -function KinkyDungeonDrawFloaters(CamX, CamY, onlyAbs = false) { +function KinkyDungeonDrawFloaters(CamX: number, CamY: number, onlyAbs: boolean = false) { let delta = CommonTime() - KinkyDungeonLastFloaterTime; let KDFloaterYCache = {}; @@ -2346,10 +2286,9 @@ function KinkyDungeonDrawFloaters(CamX, CamY, onlyAbs = false) { /** * Easing function makes things smooth - * @param {number} value - * @returns {number} + * @param value */ -function KDEase(value) { +function KDEase(value: number): number { if (value < 0.25) return Math.sin(value * Math.PI * 2); else if (value > 0.75) @@ -2386,9 +2325,9 @@ let KDLogFilters = [ "Kills", ]; -function KinkyDungeonDrawMessages(NoLog, shiftx = 0, noBG = false, width = KDMsgWidthMin) { +function KinkyDungeonDrawMessages(NoLog?: boolean, shiftx: number = 0, noBG: boolean = false, width: number = KDMsgWidthMin) { if (!NoLog) { - DrawButtonKDEx("logtog", (bdata) => { + DrawButtonKDEx("logtog", (_bdata) => { KinkyDungeonMessageToggle = !KinkyDungeonMessageToggle; KDLogIndex = 0; return true; @@ -2414,7 +2353,7 @@ function KinkyDungeonDrawMessages(NoLog, shiftx = 0, noBG = false, width = KDMsg let ii = 0; for (let filter of KDLogFilters) { if ( - DrawButtonKDEx("logtog" + filter, (bdata) => { + 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", @@ -2532,13 +2471,13 @@ function KinkyDungeonDrawMessages(NoLog, shiftx = 0, noBG = false, width = KDMsg ii++; } if (KinkyDungeonMessageLog.length > KDMaxLog) { - DrawButtonKDEx("logscrollup", (bdata) => { + 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) => { + DrawButtonKDEx("logscrolldown", (_bdata) => { if (KDLogIndex < KinkyDungeonMessageLog.length - KDMaxLog) KDLogIndex = Math.min(Math.max(0, KinkyDungeonMessageLog.length - KDMaxLog), KDLogIndex + KDLogIndexInc); return true; @@ -2552,9 +2491,10 @@ function KinkyDungeonDrawMessages(NoLog, shiftx = 0, noBG = false, width = KDMsg } } -function KDhexToRGB(h) { +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]; @@ -2571,7 +2511,8 @@ function KDhexToRGB(h) { return {r:r, g:g, b:b}; } -function KinkyDungeonUpdateVisualPosition(Entity, amount) { +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; @@ -2651,9 +2592,8 @@ function KinkyDungeonUpdateVisualPosition(Entity, amount) { /** * Sets the target location based on MOUSE location - * @param {boolean} helper */ -function KinkyDungeonSetTargetLocation(helper = true) { +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); @@ -2706,6 +2646,17 @@ function KinkyDungeonSetMoveDirection() { } +type RectParams = { + Left: number, + Top: number, + Width: number, + Height: 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)"; @@ -2713,34 +2664,34 @@ 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 + * @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, Top, Width, Height, Color, NoBorder, Alpha, zIndex = 90) { +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 {any} Container - Container to draw to - * @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 + * @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, Left, Top, Width, Height, Color, NoBorder, Alpha, zIndex = 90) { +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, @@ -2768,43 +2719,86 @@ function DrawBoxKDTo(Container, Left, Top, Width, Height, Color, NoBorder, Alpha 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 {boolean} [unique] - This button is not differentiated by position - * @param {string} [font] - This button is not differentiated by position + * @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, X, Y, Width, Color, BackColor, FontSize, Align, zIndex = 110, alpha = 1.0, border = undefined, unique = undefined, font) { +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 {any} Container - * @param {*} Text - * @param {*} X - * @param {*} Y - * @param {*} Width - * @param {*} Color - * @param {*} [BackColor] - * @param {*} [FontSize] - * @param {*} [Align] - * @param {*} [zIndex] - * @param {*} [alpha] - * @param {*} [border] - * @param {boolean} [unique] - This button is not differentiated by position - * @param {string} [font] - This button is not differentiated by position + * @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, Text, X, Y, Width, Color, BackColor, FontSize, Align, zIndex = 110, alpha = 1.0, border = undefined, unique = undefined, font) { +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"; @@ -2826,18 +2820,28 @@ function DrawTextFitKDTo(Container, Text, X, Y, Width, Color, BackColor, FontSiz } /** - * - * @param {*} Text - * @param {*} X - * @param {*} Y - * @param {*} Color - * @param {*} [BackColor] - * @param {*} [FontSize] - * @param {*} [Align] - * @param {*} [zIndex] - * @param {*} [alpha] + * @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) { +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"; @@ -2857,14 +2861,13 @@ function DrawTextKD(Text, X, Y, Color, BackColor, FontSize, Align, zIndex = 110, } + let KDAllowText = true; /** - * - * @param {{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}} Params - * @returns {boolean} - If it worked + * @returns True if it worked */ -function DrawTextVisKD(Container, Map, id, Params) { +function DrawTextVisKD (Container: PIXIContainer, Map: Map, id: string, Params: TextParamsType): boolean { if (!KDAllowText) return; let sprite = Map.get(id); let same = true; @@ -2934,12 +2937,13 @@ function DrawTextVisKD(Container, Map, id, Params) { /** * 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 + * @param Container + * @param Map + * @param Params - rect parameters + * @param Params - rect parameters + * @returns - If it worked */ -function DrawRectKD(Container, Map, id, Params) { +function DrawRectKD (Container: PIXIContainer, Map: Map, id: string, Params: RectParams): boolean { let sprite = Map.get(id); let same = true; if (sprite && kdprimitiveparams.has(id)) { @@ -2978,12 +2982,12 @@ function DrawRectKD(Container, Map, id, Params) { } /** * Draws a hollow circle - * @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 + * @param Container + * @param Map + * @param Params - Circle drawing parameters (a circle is very blunt rectangle) + * @returns - If it worked */ -function DrawCircleKD(Container, Map, id, Params) { +function DrawCircleKD(Container: PIXIContainer, Map: Map, id: string, Params: RectParams): boolean { let sprite = Map.get(id); let same = true; if (sprite && kdprimitiveparams.has(id)) { @@ -3024,12 +3028,12 @@ function DrawCircleKD(Container, Map, id, Params) { /** * Draws a + - * @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 + * @param Container + * @param Map + * @param Params - rendering parameters + * @returns - If it worked */ -function DrawCrossKD(Container, Map, id, Params) { +function DrawCrossKD(Container: PIXIContainer, Map: Map, id: string, Params: RectParams): boolean { let sprite = Map.get(id); let same = true; if (sprite && kdprimitiveparams.has(id)) { @@ -3071,12 +3075,12 @@ function DrawCrossKD(Container, Map, id, Params) { /** * 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 + * @param Container + * @param Map + * @param Params - rect parameters + * @returns - If it worked */ -function FillRectKD(Container, Map, id, Params) { +function FillRectKD(Container: PIXIContainer, Map: Map, id: string, Params: RectParams): boolean { let sprite = Map.get(id); let same = true; if (sprite && kdprimitiveparams.has(id)) { @@ -3114,72 +3118,136 @@ function FillRectKD(Container, Map, id, Params) { 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 {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 - * @param {boolean} [options.scaleImage] - zIndex - * @param {boolean} [options.centered] - centered - * @param {boolean} [options.centerText] - centered - * @param {string} [options.tint] - tint - * @param {string} [options.hotkey] - hotkey - * @param {string} [options.hotkeyPress] - hotkey - * @returns {void} - Nothing + * @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, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder, FillColor, FontSize, ShiftText, Stretch, zIndex = 100, options) { +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 {any} Container - Container to draw to - * @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 - * @param {boolean} [options.unique] - This button is not differentiated by position - * @param {boolean} [options.scaleImage] - zIndex - * @param {boolean} [options.centered] - centered - * @param {boolean} [options.centerText] - centered - * @param {string} [options.tint] - tint - * @param {string} [options.hotkey] - hotkey - * @param {string} [options.hotkeyPress] - hotkey - * @returns {void} - Nothing + * @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, Left, Top, Width, Height, Label, Color, Image, HoveringText, Disabled, NoBorder, FillColor, FontSize, ShiftText, Stretch, zIndex = 100, options) { +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, @@ -3208,8 +3276,9 @@ function DrawButtonVisTo(Container, Left, Top, Width, Height, Label, Color, Imag if (Stretch || options?.scaleImage) { let o = { zIndex: zIndex + 0.01, + filters: options?.filters, }; - if (options?.tint) o.tint = options.tint; + 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); @@ -3220,8 +3289,9 @@ function DrawButtonVisTo(Container, Left, Top, Width, Height, Label, Color, Imag } else { let o = { zIndex: zIndex + 0.01, + filters: options?.filters, }; - if (options?.tint) o.tint = options.tint; + if (options?.tint) o['tint'] = options.tint; KDDraw(Container || kdcanvas, kdpixisprites, Left + "," + Top + Image + "w" + Width + "h" + Height, Image, (options?.centered ? Width/2 - img.orig.width/2 : 2) + Left, Top + Height/2 - img.orig.height/2, img.orig.width, img.orig.height, undefined, o); @@ -3257,21 +3327,32 @@ function DrawButtonVisTo(Container, Left, Top, Width, Height, Label, Color, Imag /** * 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 + * @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, Top, Width, Height, Text, IsChecked, Disabled = false, TextColor = KDTextGray0, CheckImage = "Icons/Checked.png", options) { +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); @@ -3281,27 +3362,41 @@ function DrawCheckboxVis(Left, Top, Width, Height, Text, IsChecked, Disabled = f /** * 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 - * @param {number} [options.fontSize] - fontSize - * @param {boolean} [options.scaleImage] - zIndex - * @returns {void} - Nothing + * @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, func, enabled, Left, Top, Width, Height, Text, IsChecked, Disabled = false, TextColor = KDTextGray0, CheckImage = "Icons/Checked.png", options) { +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); @@ -3310,25 +3405,39 @@ function DrawCheckboxKDEx(name, func, enabled, Left, Top, Width, Height, Text, I /** * 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] - * @param {string} [options.font] - * @returns {void} - Nothing + * @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, Top, Width, Height, Label, Color, Image, BackText, NextText, Disabled, ArrowWidth, NoBorder, options) { +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 @@ -3434,15 +3543,13 @@ function DrawBackNextButtonVis(Left, Top, Width, Height, Label, Color, Image, Ba /** - * - * @param {number} CamX - * @param {number} CamY - * @param {number} CamX_offset - * @param {number} CamY_offset - * @param {boolean} [Debug] - * @returns {any} + * @param CamX + * @param CamY + * @param CamX_offset + * @param CamY_offset + * @param [Debug] */ -function KDDrawMap(CamX, CamY, CamX_offset, CamY_offset, CamX_offsetVis, CamY_offsetVis, 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 = ""; @@ -3612,24 +3719,40 @@ function KDDrawMap(CamX, CamY, CamX_offset, CamY_offset, CamX_offsetVis, CamY_of } /** - * - * @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] - * @param {Map} [SpritesDrawn] - * @param {number} [Scale] - * @param {boolean} [Nearest] + * @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, Map, id, Image, Left, Top, Width, Height, Rotation, options, Centered, SpritesDrawn, Scale, Nearest) { - let sprite = Map.get(id); +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; if (!sprite) { // Load the texture @@ -3681,9 +3804,9 @@ function KDDraw(Container, Map, id, Image, Left, Top, Width, Height, Rotation, o if (options.filters && sprite.cacheAsBitmap) { sprite.filters = null; } else { - for (let o of Object.entries(options)) { - if (o[1] != undefined || o[0] != "tint") - sprite[o[0]] = o[1]; + for (let [k, v] of Object.entries(options)) { + if (v != undefined || k != "tint") + sprite[k] = v; } } @@ -3727,10 +3850,11 @@ let errorImg = {}; /** * Returns a PIXI.Texture, or null if there isnt one - * @param {string} Image - * @returns {any} + * @param Image + * @param [Nearest] - Use "nearest" scale mode + * @returns - Requested texture */ -function KDTex(Image, Nearest) { +function KDTex(Image: string, Nearest?: boolean): PIXITexture { if (kdpixitex.has(Image)) return kdpixitex.get(Image); if (errorImg[KDModFiles[Image] || Image]) return null; try { @@ -3747,16 +3871,11 @@ function KDTex(Image, Nearest) { } } -/** - * - * @param {string} str - * @returns - */ -function string2hex(str) { +function string2hex(str: string) { return PIXI.utils.string2hex(str); } -function GetAdjacentList(list, index, width) { +function GetAdjacentList(list: string[], index: number, width: number) { return { left: list.slice(0, index), right: list.slice(index+width), @@ -3764,7 +3883,7 @@ function GetAdjacentList(list, index, width) { } -function KDUpdateVision(CamX, CamY, CamX_offset, CamY_offset) { +function KDUpdateVision(CamX?: number, CamY?: number, _CamX_offset?: number, _CamY_offset?: number) { KinkyDungeonUpdateLightGrid = false; KDRedrawFog = 2; @@ -3838,10 +3957,7 @@ function KDUpdateVision(CamX, CamY, CamX_offset, CamY_offset) { KDVisionUpdate = 0; } -/** - * @type {Record {color: string, text: string, desc?: string, noInspect?: boolean}>} - */ -let KDTileTooltips = { +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"};}, @@ -3862,7 +3978,7 @@ let KDTileTooltips = { : undefined};}, 'c': () => {return {color: "#ffffff", text: "c"};}, 'T': () => {return {color: "#444444", text: "T"};}, - '4': () => {return {color: "#ffffff", noInspect: true, text: "4"};}, + '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"};}, @@ -3884,7 +4000,7 @@ let KDTileTooltips = { 'N': () => {return {color: "#4c6885", noInspect: true, text: "N"};}, }; -function KDGetTileColor(x, y) { +function KDGetTileColor(x: number, y: number): string { let color = ""; if (!KDIsInBounds(x, y, 0)) return "#000000"; @@ -3911,7 +4027,7 @@ function KDGetTileColor(x, y) { } -function KDDrawTileTooltip(maptile, x, y, offset) { +function KDDrawTileTooltip(maptile: string, x: number, y: number, offset: number) { let TooltipList = []; TooltipList.push({ str: TextGet("KDTileTooltip" + KDTileTooltips[maptile](x, y).text), @@ -3935,12 +4051,11 @@ function KDDrawTileTooltip(maptile, x, y, offset) { /** - * @type {Record void}>} */ -let KDEffectTileTooltips = { +let KDEffectTileTooltips: Record void}> = { 'Portals/DarkPortal': { color: "#8b53e9", - code: (tile, x, y, TooltipList) => { + code: (tile, _x, _y, TooltipList) => { TooltipList.push({ str: TextGet("KDEffectTileTooltip" + tile.name), fg: "#8b53e9", @@ -3959,7 +4074,7 @@ let KDEffectTileTooltips = { }, 'Runes': { color: "#ff5555", - code: (tile, x, y, TooltipList) => { + code: (tile, _x, _y, TooltipList) => { TooltipList.push({ str: TextGet("KDEffectTileTooltip" + tile.name), fg: "#ff5555", @@ -3978,7 +4093,7 @@ let KDEffectTileTooltips = { }, 'RunesTrap': { color: "#92e8c0", - code: (tile, x, y, TooltipList) => { + code: (tile, _x, _y, TooltipList) => { TooltipList.push({ str: TextGet("KDEffectTileTooltip" + tile.name), fg: "#92e8c0", @@ -3997,7 +4112,7 @@ let KDEffectTileTooltips = { }, 'BoobyTrapMagic': { color: "#92e8c0", - code: (tile, x, y, TooltipList) => { + code: (tile, _x, _y, TooltipList) => { TooltipList.push({ str: TextGet("KDEffectTileTooltip" + tile.name), fg: "#92e8c0", @@ -4016,7 +4131,64 @@ let KDEffectTileTooltips = { }, 'BoobyTrap': { color: "#ffffff", - code: (tile, x, y, TooltipList) => { + 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", @@ -4035,7 +4207,7 @@ let KDEffectTileTooltips = { }, 'Inferno': { color: "#ff8855", - code: (tile, x, y, TooltipList) => { + code: (tile, _x, _y, TooltipList) => { TooltipList.push({ str: TextGet("KDEffectTileTooltip" + tile.name), fg: "#ff8855", @@ -4054,114 +4226,113 @@ let KDEffectTileTooltips = { }, 'Ember': { color: "#ffaa88", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffaa88");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffaa88");}}, 'Ice': { color: "#88ffff", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#88ffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#88ffff");}}, 'Water': { color: "#8888ff", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#8888ff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#8888ff");}}, 'Vines': { color: "#44ff44", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#44ff44", "KDEffectTileTooltipCMDBindings");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#44ff44", "KDEffectTileTooltipCMDBindings");}}, 'Ropes': { color: "#ffae70", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffae70", "KDEffectTileTooltipCMDBindings");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffae70", "KDEffectTileTooltipCMDBindings");}}, 'Chains': { color: "#aaaaaa", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#aaaaaa", "KDEffectTileTooltipCMDBindings");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#aaaaaa", "KDEffectTileTooltipCMDBindings");}}, 'Belts': { color: "#8f4d57", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#8f4d57", "KDEffectTileTooltipCMDBindings");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#8f4d57", "KDEffectTileTooltipCMDBindings");}}, 'Fabric': { color: "#ff5277", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ff5277", "KDEffectTileTooltipCMDBindings");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ff5277", "KDEffectTileTooltipCMDBindings");}}, 'FabricGreen': { color: "#4fd658", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#4fd658", "KDEffectTileTooltipCMDBindings");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#4fd658", "KDEffectTileTooltipCMDBindings");}}, 'Slime': { color: "#d952ff", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#d952ff", "KDEffectTileTooltipCMDSlime");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#d952ff", "KDEffectTileTooltipCMDSlime");}}, 'Glue': { color: "#e7cf1a", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#e7cf1a", "KDEffectTileTooltipCMDGlue");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#e7cf1a", "KDEffectTileTooltipCMDGlue");}}, 'Radiance': { color: "#ffff00", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffff00", "Radiance");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffff00", "Radiance");}}, 'Latex': { color: "#d952ff", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#d952ff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#d952ff");}}, 'LatexThin': { color: "#d952ff", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#d952ff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#d952ff");}}, 'Steam': { color: "#ffffff", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'Smoke': { color: "#000000", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#888888");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#888888");}}, 'Torch': { color: "#ff8933", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'TorchUnlit': { color: "#888888", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'Lantern': { color: "#ff8933", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'LanternUnlit': { color: "#888888", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'IllusOrb': { color: "#ff8933", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'IllusOrbDead': { color: "#555555", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'EdgeOrb': { color: "#ff8933", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'MotionLamp': { color: "#ff8933", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'ManaEmpty': { color: "#ff8933", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'ManaPartial': { color: "#ffffff", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'ManaFull': { color: "#ffffff", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'EdgeOrbDead': { color: "#555555", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'TorchOrb': { color: "#ff8933", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'OrbLantern': { color: "#ff8933", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ffffff");}}, 'Cracked': { color: "#ff8844", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ff8844");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ff8844");}}, 'Rubble': { color: "#ff8844", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ff8844");}}, + code: (tile, _x, _y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ff8844");}}, 'RubbleNoMend': { color: "#ff8844", - code: (tile, x, y, TooltipList) => {KDETileTooltipSimple(tile, TooltipList, "#ff8844");}}, + code: (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] + * @param tile + * @param TooltipList + * @param color + * @param [extra] + * @param [descColor] + * @param [extraColor] */ -function KDETileTooltipSimple(tile, TooltipList, color, extra, descColor = "#ffffff", extraColor = "#ffffff") { +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, @@ -4188,27 +4359,19 @@ function KDETileTooltipSimple(tile, TooltipList, color, extra, descColor = "#fff } /** - * - * @param {effectTile} tile - * @param {number} x - * @param {number} y - * @param {number} offset - * @returns {number} + * @param tile + * @param x + * @param y + * @param offset */ -function KDDrawEffectTileTooltip(tile, x, y, 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); } -/** - * - * @param {any[]} TooltipList - * @param {number} offset - * @returns {number} - */ -function KDDrawTooltip(TooltipList, offset) { +function KDDrawTooltip(TooltipList: any[], offset: number): number { let TooltipWidth = 300; let TooltipHeight = 0; let extra = 5; @@ -4279,13 +4442,13 @@ 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 + * @param Name + * @param Left + * @param Top + * @param Width + * @param Height */ -function KDTextArea(Name, Left, Top, Width, Height) { +function KDTextArea(Name: string, Left: number, Top: number, Width: number, Height: number) { let Element = KDTempElements.get(Name); let created = false; if (!Element) { @@ -4301,17 +4464,17 @@ function KDTextArea(Name, Left, Top, Width, Height) { /** * 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 - * @param {string} [TextSize] + * @param Name + * @param Left + * @param Top + * @param Width + * @param Height + * @param [Type] + * @param [Value] + * @param [MaxLength] + * @param [TextSize] */ -function KDTextField(Name, Left, Top, Width, Height, Type = "text", Value = "", MaxLength = "30", TextSize) { +function KDTextField(Name: string, Left: number, Top: number, Width: number, Height: number, Type: string = "text", Value: string = "", MaxLength: string = "30", TextSize?: string) { let Element = KDTempElements.get(Name); let created = false; if (!Element) { @@ -4332,7 +4495,7 @@ function KDTextField(Name, Left, Top, Width, Height, Type = "text", Value = "", /** * Culls the text fields and other DOM elements created */ -function KDCullTempElements() { +function KDCullTempElements(): void { for (let Name of KDTempElements.keys()) { if (!KDDrawnElements.get(Name)) { ElementRemove(Name); @@ -4346,14 +4509,13 @@ function KDCullTempElements() { /** * 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 + * @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, X, Y, W, H) { +function KDElementPosition(ElementID: string, X: number, Y: number, W: number, H?: number): void { let E = document.getElementById(ElementID); if (!E) { @@ -4383,7 +4545,7 @@ function KDElementPosition(ElementID, X, Y, W, H) { // Sets the element style Object.assign(E.style, { fontSize: Font + "px", - fontFamily: CommonGetFontName(), + fontFamily: "Verdana", position: "fixed", left: Left + "px", top: Top + "px", @@ -4393,10 +4555,10 @@ function KDElementPosition(ElementID, X, Y, W, H) { }); } -/** Whether or not to show the quick inv - * @returns {boolean} -*/ -function KDShowQuickInv() { +/** + * Whether or not to show the quick inv + */ +function KDShowQuickInv(): boolean { return KinkyDungeonShowInventory || (KDGameData.CurrentDialog && KDDialogue[KDGameData.CurrentDialog] && KDDialogue[KDGameData.CurrentDialog].inventory); } @@ -4406,7 +4568,7 @@ let KDLastCamPos = {x: 0, y: 0}; let KDDrawPlayer = true; -function KDPlayerDrawPoseButtons(C) { +function KDPlayerDrawPoseButtons(C: Character) { if (!KDModalArea) { KDModalArea_x = 650; KDModalArea_y = 430; @@ -4418,12 +4580,9 @@ function KDPlayerDrawPoseButtons(C) { } /** - * - * @param {number} x - * @param {number} y - * @returns {number} - the color in hex + * @returns the color in hex */ -function KDGetLightColor(x, y) { +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 @@ -4431,23 +4590,16 @@ function KDGetLightColor(x, y) { } /** - * - * @param {number} x - * @param {number} y - * @returns {number} - the color in hex + * @returns the color in hex */ -function KDGetLightColorGreyscale(x, y) { +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; } -/** - * - * @returns {boolean} - */ -function KDMouseInPlayableArea() { +function KDMouseInPlayableArea(): boolean { return MouseIn(canvasOffsetX, canvasOffsetY, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height) && !MouseIn(0, 0, 500, 1000) && !MouseIn(1940, 0, 70, 1000) @@ -4457,19 +4609,14 @@ function KDMouseInPlayableArea() { && (!KDModalArea || !MouseIn(KDModalArea_x, KDModalArea_y, KDModalArea_width, KDModalArea_height)); } -/** - * - * @param {string} hotkey - * @returns {string} - */ -function KDHotkeyToText(hotkey) { +function KDHotkeyToText(hotkey: string): string { if (!hotkey) return "---"; return hotkey.replace("Digit", "").replace("Key", "").replace("Control", "Ctrl"); } -function KDGetTargetRetType(x, y) { +function KDGetTargetRetType(x: number, y: number): string { let enemy = KinkyDungeonEnemyAt(x, y); if (enemy) { @@ -4484,34 +4631,39 @@ function KDGetTargetRetType(x, y) { return "Move"; } +let KDPIXIPaletteFilters = new Map(); + /** - * - * @param {number} x - * @param {number} y - * @param {number} w - * @param {number} scale - * @param {string} selected - * @param {(string) => void} callback + * @param x + * @param y + * @param w + * @param [scale] + * @param [selected] + * @param [callback] + * @parap [text] + * @param [deffault] */ -function KDDrawPalettes(x, y, w, scale = 72, selected, callback, text = "KDSelectPalette") { - if (selected == undefined) selected = KDDefaultPalette; +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; - /** @type {[string, Record]} */ - let zero = ["", {Highlight: {"gamma":1,"saturation":1,"contrast":1,"brightness":1,"red":1,"green":1,"blue":1,"alpha":1}}]; + 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: [ - new PIXI.filters.AdjustmentFilter(value[1].Highlight), + KDPIXIPaletteFilters.get(value[0]), ] }); - DrawButtonKDEx("choosepalette" + value[0], (b) => { + DrawButtonKDEx("choosepalette" + value[0], (_b) => { if (callback) callback(value[0]); else { KDDefaultPalette = value[0]; @@ -4536,15 +4688,7 @@ function KDDrawPalettes(x, y, w, scale = 72, selected, callback, text = "KDSelec } } -/** - * - * @param {number} color - * @param {number} alpha - * @param {number} quality - * @param {number} thickness - * @returns {PIXIFilter} - */ -function KDGetOutlineFilter(color, alpha, quality, thickness) { +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)); @@ -4554,14 +4698,29 @@ function KDGetOutlineFilter(color, alpha, quality, thickness) { return null; } -function KDClearOutlineFilterCache() { +function KDClearOutlineFilterCache(): void { for (let f of KDOutlineFilterCache.values()) { f.destroy(); } KDOutlineFilterCache = new Map(); } -function KDGetFontMult(font) { +function KDDoGraphicsSanitize(): void { + for (let t of KDRenderTexToDestroy) { + t.destroy(true); + } + KDRenderTexToDestroy = []; + for (let f of KDFilterCacheToDestroy) { + f.destroy(); + } + KDFilterCacheToDestroy = []; + for (let s of KDSpritesToCull) { + s.destroy(); + } + KDSpritesToCull = []; +} + +function KDGetFontMult(font?: string) { if (!font) font = KDSelectedFont; if (KDFontsAlias.get(font)) { return KDFontsAlias.get(font).width; @@ -4580,14 +4739,22 @@ let KDCustomDraw = { } }; +type InvColorFilterData = { + restraints: Record; + id: number; + entity: entity; + player: entity; + force: boolean; +} + let KDCustomDrawInvColorFilter = { - "Bondage": (data) => { - return (inv) => { + "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, p) => (KDQuickBindConditions[KDRestraint(inv)?.quickBindCondition]( + (t: entity, p: entity) => (KDQuickBindConditions[KDRestraint(inv)?.quickBindCondition]( t, p, KDRestraint(inv), inv)) : @@ -4596,5 +4763,4 @@ let KDCustomDrawInvColorFilter = { return "#e64539"; }; }, - -}; \ No newline at end of file +}; diff --git a/Game/src/base/KinkyDungeonErrors.js b/Game/src/base/KinkyDungeonErrors.ts similarity index 85% rename from Game/src/base/KinkyDungeonErrors.js rename to Game/src/base/KinkyDungeonErrors.ts index 57b306f59..3ffac7780 100644 --- a/Game/src/base/KinkyDungeonErrors.js +++ b/Game/src/base/KinkyDungeonErrors.ts @@ -3,32 +3,32 @@ /** * Sets up the KD crash handler */ -function KinkyDungeonSetupCrashHandler() { +function KinkyDungeonSetupCrashHandler(): void { window.addEventListener("error", KinkyDungeonOnUncaughtError); } /** * Tears down the KD crash handler */ -function KinkyDungeonTeardownCrashHandler() { +function KinkyDungeonTeardownCrashHandler(): void { window.removeEventListener("error", KinkyDungeonOnUncaughtError); } /** * Error event handler for uncaught errors - * @param {ErrorEvent} event - The error event + * @param event - The error event */ -function KinkyDungeonOnUncaughtError(event) { +function KinkyDungeonOnUncaughtError(event: ErrorEvent): void { 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 + * @param event - The error event + * @returns The report */ -function KinkyDungeonGenerateErrorReport(event) { +function KinkyDungeonGenerateErrorReport(event: ErrorEvent): string { return [ KinkyDungeonCrashReportErrorDetails(event), KinkyDungeonCrashReportStateData(), @@ -40,16 +40,16 @@ function KinkyDungeonGenerateErrorReport(event) { /** * Generates a report string containing debug data about the current state of the game - * @returns {string} - The report + * @returns The report */ -function KinkyDungeonCrashReportStateData() { - let version; +function KinkyDungeonCrashReportStateData(): string { + let version: string; try { version = (TextGet("KinkyDungeon") + " v" + TextGet("KDVersionStr")) || "Version unknown"; } catch { version = "Version unknown"; } - let modFiles; + let modFiles: string; try { modFiles = KDAllModFiles.map(({filename}) => filename).join(","); } catch { @@ -82,10 +82,10 @@ function KinkyDungeonCrashReportStateData() { /** * Generates an error report string containing debug data about the thrown error - * @param {ErrorEvent} event - The error event - * @returns {string} - The report + * @param event - The error event + * @returns The report */ -function KinkyDungeonCrashReportErrorDetails(event) { +function KinkyDungeonCrashReportErrorDetails(event: ErrorEvent): string { return [ "========== Kinky Dungeon Crash Report ==========", "", @@ -98,9 +98,9 @@ function KinkyDungeonCrashReportErrorDetails(event) { /** * Generates a report string containing the current save state of the game - * @returns {string} - The report + * @returns The report */ -function KinkyDungeonCrashReportSaveData() { +function KinkyDungeonCrashReportSaveData(): string { let saveData = localStorage.getItem("KinkyDungeonSave"); if (!saveData) { try { @@ -118,9 +118,9 @@ function KinkyDungeonCrashReportSaveData() { /** * Generates a report string containing debug data with general diagnostics information - * @returns {string} - The report + * @returns The report */ -function KinkyDungeonCrashReportDiagnostics() { +function KinkyDungeonCrashReportDiagnostics(): string { return [ "========== Diagnostics ==========", "", @@ -135,9 +135,9 @@ function KinkyDungeonCrashReportDiagnostics() { /** * Generates a report string containing debug data with device detection information - * @returns {string} - The report + * @returns The report */ -function KinkyDungeonCrashReportDeviceDetails() { +function KinkyDungeonCrashReportDeviceDetails(): string { return [ "========== Device Detection ==========", "", @@ -147,17 +147,18 @@ function KinkyDungeonCrashReportDeviceDetails() { /** * Sanitizes a string to remove beta codes from it - * @returns {string} - The sanitized string + * @returns The sanitized string */ -function KinkyDungeonStackSanitize(stack) { +function KinkyDungeonStackSanitize(stack: string): string { + // @ts-ignore return stack.replaceAll(/\/\d{10,}/g, ""); } /** * Opens the KD crash report modal, displaying the provided report - * @param {string} report - The report to display + * @param report - The report to display */ -function KinkyDungeonShowCrashReportModal(report) { +function KinkyDungeonShowCrashReportModal(report: string) { const id = "kinky-dungeon-crash-report"; if (document.querySelector(`#${id}`)) { @@ -272,7 +273,7 @@ function KinkyDungeonShowCrashReportModal(report) { document.body.appendChild(backdrop); } -function KinkyDungeonErrorImage(src) { +function KinkyDungeonErrorImage(src: string): HTMLImageElement { const img = document.createElement("img"); img.src = `${KinkyDungeonRootDirectory}Enemies/${src}.png`; Object.assign(img.style, { @@ -281,7 +282,7 @@ function KinkyDungeonErrorImage(src) { return img; } -function KinkyDungeonErrorPreamble(content) { +function KinkyDungeonErrorPreamble(content: string[]): HTMLParagraphElement { const preamble = document.createElement("p"); Object.assign(preamble.style, { margin: "0 0 0.5em", @@ -291,7 +292,7 @@ function KinkyDungeonErrorPreamble(content) { return preamble; } -function KinkyDungeonErrorModalButton(text) { +function KinkyDungeonErrorModalButton(text: string): HTMLButtonElement { const button = document.createElement("button"); button.textContent = text; Object.assign(button.style, { @@ -305,7 +306,7 @@ function KinkyDungeonErrorModalButton(text) { return button; } -function KinkyDungeonErrorCopy(report, reportElement) { +function KinkyDungeonErrorCopy(report: string, reportElement: HTMLElement): Promise { return navigator.clipboard.writeText(report) .then(() => true) .catch(() => { diff --git a/Game/src/base/KinkyDungeonGame.js b/Game/src/base/KinkyDungeonGame.ts similarity index 88% rename from Game/src/base/KinkyDungeonGame.js rename to Game/src/base/KinkyDungeonGame.ts index d44e923ba..5402748e4 100644 --- a/Game/src/base/KinkyDungeonGame.js +++ b/Game/src/base/KinkyDungeonGame.ts @@ -23,27 +23,20 @@ let KinkyDungeonGagMumbleChancePerRestraint = 0.0025; let MiniGameKinkyDungeonCheckpoint = "grv"; let MiniGameKinkyDungeonLevel = -1; -/** - * @type Record - */ -let KinkyDungeonMapIndex = {}; +let KinkyDungeonMapIndex: Record = {}; -/** @type {Record} */ -let KDWorldMap = {}; +let KDWorldMap: Record = {}; let KDCurrentWorldSlot = {x: 0, y: 0}; -/** @type {KDMapDataType} */ -let KDMapData = {}; +let KDMapData: KDMapDataType = {} as KDMapDataType; /** This data can be regenerated as needed */ -let KDMapExtraData = {}; +let KDMapExtraData = { + Boringness: [] as number[], + VisionGrid: [] as number[], + ColorGrid: [] as number[], + ShadowGrid: [] as number[], + BrightnessGrid: [] as number[], +}; -/** - * @type {number[]} - */ -KDMapExtraData.Boringness = []; -KDMapExtraData.VisionGrid = []; -KDMapExtraData.ColorGrid = []; -KDMapExtraData.ShadowGrid = []; -KDMapExtraData.BrightnessGrid = []; let KinkyDungeonUpdateLightGrid = true; let KinkyDungeonGrid_Last = ""; @@ -79,10 +72,10 @@ let KinkyDungeonPOI = []; let KinkyDungeonStairTiles = 'sSH'; let KDDefaultAvoidTiles = "gtVN@"; let KinkyDungeonGroundTiles = "023wW][?/"; -let KinkyDungeonWallTiles = "14,6"; +let KinkyDungeonWallTiles = "14,6f"; let KDCrackableTiles = '4Xaom-'; let KDMendableTiles = '4'; -let KinkyDungeonBlockTiles = "14,6bgX7"; +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 @@ -137,8 +130,7 @@ 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; +let KinkyDungeonTargetingSpell: spell = null; /** * Item to decrement by 1 when spell is cast @@ -168,22 +160,24 @@ let KinkyDungeonSFX = []; /** - * - * @param {string} RoomType - * @param {string} MapMod - * @returns {KDMapDataType} + * @param [RoomType] + * @param [MapMod] */ -function KDDefaultMapData(RoomType = "", MapMod = "") { +function KDDefaultMapData(RoomType: string = "", MapMod: string = ""): KDMapDataType { return { Checkpoint: MiniGameKinkyDungeonCheckpoint, Title: "", + RepopulateQueue: [], + Labels: {}, PrisonState: "", PrisonStateStack: [], PrisonType: "", data: {}, + Regiments: {}, + RoomType: RoomType, MapMod: MapMod, RandomPathablePoints: {}, @@ -237,94 +231,79 @@ KDMapData = KDDefaultMapData(); /** - * - * @param {string} location - * @param {Record} value + * @param location + * @param value */ -function KinkyDungeonEffectTilesSet(location, value) { +function KinkyDungeonEffectTilesSet(location: string, value: Record): void { KDMapData.EffectTiles[location] = value; } /** - * - * @param {string} location - * @returns {Record} + * @param location */ -function KinkyDungeonEffectTilesGet(location) { +function KinkyDungeonEffectTilesGet(location: string): Record { return KDMapData.EffectTiles[location]; } /** - * - * @param {any} value + * @param value */ -function KDSetPlayerTile(value) { +function KDSetPlayerTile(value: any): any { KDMapData.Tiles[KinkyDungeonPlayerEntity.x + ',' + KinkyDungeonPlayerEntity.y] = value; return value; } -/** - * - * @returns {any} - */ -function KDGetPlayerTile() { + +function KDGetPlayerTile(): any { return KDMapData.Tiles[KinkyDungeonPlayerEntity.x + ',' + KinkyDungeonPlayerEntity.y]; } /** - * - * @param {string} location - * @param {any} value + * @param location + * @param value */ -function KinkyDungeonTilesSet(location, value) { +function KinkyDungeonTilesSet(location: string, value: any): any { KDMapData.Tiles[location] = value; return value; } /** - * - * @param {string} location - * @returns {any} + * @param location */ -function KinkyDungeonTilesGet(location) { +function KinkyDungeonTilesGet(location: string): any { return KDMapData.Tiles[location]; } /** - * - * @param {string} location + * @param location */ -function KinkyDungeonTilesDelete(location) { +function KinkyDungeonTilesDelete(location: string): void { delete KDMapData.Tiles[location]; } /** - * - * @param {string} location - * @param {any} value + * @param location + * @param value */ -function KinkyDungeonSkinSet(location, value) { +function KinkyDungeonSkinSet(location: string, value: any) { KDMapData.TilesSkin[location] = value; } /** - * - * @param {string} location - * @returns {any} + * @param location */ -function KinkyDungeonSkinGet(location) { +function KinkyDungeonSkinGet(location: string): any { return KDMapData.TilesSkin[location]; } /** - * - * @param {string} location + * @param location */ -function KinkyDungeonSkinDelete(location) { +function KinkyDungeonSkinDelete(location: string) { delete KDMapData.TilesSkin[location]; } -function KDAlreadyOpened(x, y) { +function KDAlreadyOpened(x: number, y: number): boolean { if (KDGameData.AlreadyOpened) { for (let ao of KDGameData.AlreadyOpened) { if (ao.x == x && ao.y == y) { @@ -335,22 +314,23 @@ function KDAlreadyOpened(x, y) { return false; } -function KinkyDungeonPlaySound(src, entity, vol) { +function KinkyDungeonPlaySound(src: string, entity?: entity, vol?: number) { if (KDToggles.Sound && !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, AutoSave, suppressCheckPoint) { +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() { +function KinkyDungeonNewGamePlus(): void { MiniGameKinkyDungeonLevel = 0; KDInitializeJourney(KDGameData.Journey, MiniGameKinkyDungeonLevel); @@ -369,7 +349,7 @@ function KinkyDungeonNewGamePlus() { } } -function KDResetData(Data) { +function KDResetData(Data?: KDGameDataBase): void { if (!Data) Data = KDGameDataBase; KDGameData = JSON.parse(JSON.stringify( Data)); KDPersistentNPCs = {}; @@ -381,19 +361,20 @@ function KDResetData(Data) { } InitFacilities(); } -function KDResetEventData(Data) { +function KDResetEventData(Data?: any) { if (!Data) Data = KDEventDataBase; KDEventData = JSON.parse(JSON.stringify( Data)); } -function KinkyDungeonInitialize(Level, Load) { +function KinkyDungeonInitialize(Level: number, Load?: any) { KDWorldMap = {}; KDMapData = KDDefaultMapData(); KDCurrentWorldSlot = {x: 0, y: 0}; KDUpdateChokes = true; KDUpdateItemEventCache = true; + KinkyDungeonCurrentTick = 0; if (StandalonePatched) KDInitCurrentPose(true); @@ -422,12 +403,10 @@ function KinkyDungeonInitialize(Level, Load) { KinkyDungeonFlags = new Map(); KinkyDungeonDressSet(); - // Removed to protect against unintended outfit overrides - /*if (KinkyDungeonConfigAppearance) { - localStorage.setItem("kinkydungeonappearance" + KDCurrentOutfit, LZString.compressToBase64(CharacterAppearanceStringify(KinkyDungeonPlayer))); - KinkyDungeonConfigAppearance = false; - }*/ - CharacterAppearanceRestore(KinkyDungeonPlayer, CharacterAppearanceStringify(KinkyDungeonPlayer)); + // Refresh the character + CharacterAppearanceRestore(KinkyDungeonPlayer, CharacterAppearanceStringify(KinkyDungeonPlayer, + KDGetCharMetadata(KinkyDungeonPlayer) + )); KinkyDungeonDrawState = "Game"; KDRefreshCharacter.set(KinkyDungeonPlayer, true); KinkyDungeonDressPlayer(); @@ -481,7 +460,7 @@ function KDInitCanvas() { KinkyDungeonCanvasFow.height = KinkyDungeonCanvas.height; } -function KDCreateBoringness(noBoring) { +function KDCreateBoringness(noBoring: boolean) { let start = performance.now(); // Initialize boringness array KDMapExtraData.Boringness = []; @@ -524,32 +503,62 @@ function KDCreateBoringness(noBoring) { console.log("Time to create Boring" + (performance.now() - start)); } -/** - * @returns {number} - */ -function KDGetMapSize() { - if (KinkyDungeonStatsChoice.get("MapLarge")) return 1; - if (KinkyDungeonStatsChoice.get("MapHuge")) return 3; - if (KinkyDungeonStatsChoice.get("MapGigantic")) return 5; +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 {{x: number, y: number}} point - * @returns {KDWorldSlot} + * @param point */ -function KDGetWorldMapLocation(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 {number} x - * @param {number} y - * @param {string} main - The main maptype which you return to + * @param x + * @param y + * @param [main] - The main maptype which you return to */ -function KDCreateWorldLocation(x, y, main = "") { +function KDCreateWorldLocation(x: number, y: number, _main: string = "") { KDWorldMap[x + ',' + y] = { data: {}, x: x, @@ -561,11 +570,10 @@ function KDCreateWorldLocation(x, y, main = "") { } /** - * - * @param {{x: number; y: number;}} slot - * @param {boolean} saveconstantX + * @param slot + * @param saveconstantX */ -function KDSaveRoom(slot, 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); @@ -575,6 +583,7 @@ function KDSaveRoom(slot, saveconstantX) { // Remove navmap cause it will be regenned KDMapData.RandomPathablePoints = {}; + RandomPathList = []; let CurrentMapData = JSON.parse(JSON.stringify(KDMapData)); @@ -585,39 +594,68 @@ function KDSaveRoom(slot, saveconstantX) { /** * Decompress enemies - * @param {KDMapDataType} data + * @param data */ -function KDUnPackEnemies(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 {entity} enemy + * @param enemy */ -function KDUnPackEnemy(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 {entity} enemy + * @param enemy */ -function KDPackEnemy(enemy) { +function KDPackEnemy(enemy: entity) { if (!enemy.modified) { // @ts-ignore - enemy.Enemy = {name: enemy.Enemy}; + enemy.Enemy = {name: enemy.Enemy.name}; } } /** * Compress enemies to reduce file size - * @param {KDMapDataType} data + * @param data */ -function KDPackEnemies(data) { +function KDPackEnemies(data: KDMapDataType) { for (let enemy of data.Entities) { if (!enemy.modified) { // @ts-ignore @@ -629,14 +667,14 @@ function KDPackEnemies(data) { /** * Loads a map from a world location - * @param {number} x - * @param {number} y - * @param {string} room - * @param {number} direction - 0 is default (start position), 1 is end, 2 is south shortcut, 3 is north shortcut - * @param {boolean} constantX - * @param {boolean} ignoreAware - Enemies will lock the door if this is true and they see you enter + * @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, y, room, direction = 0, constantX, ignoreAware = true) { +function KDLoadMapFromWorld(x: number, y: number, room: string, direction: number = 0, constantX?: boolean, ignoreAware: boolean = true) { let origx = x; if (constantX) x = 0; @@ -659,6 +697,7 @@ function KDLoadMapFromWorld(x, y, room, direction = 0, constantX, ignoreAware = let NewMapData = JSON.parse(JSON.stringify(KDWorldMap[x + ',' + y].data[room])); // UnPack enemies + KDSyncPersistentEntities(y, NewMapData, true); KDUnPackEnemies(NewMapData); // Filter non-present enemies @@ -704,21 +743,20 @@ function KDLoadMapFromWorld(x, y, room, direction = 0, constantX, ignoreAware = } /** - * - * @param {number} direction - * @param {number} sideRoomIndex + * @param [direction] + * @param [sideRoomIndex] */ -function KDPlacePlayerBasedOnDirection(direction = 0, sideRoomIndex = -1) { +function KDPlacePlayerBasedOnDirection(direction: number = 0, sideRoomIndex: number = -1) { if (sideRoomIndex >= 0 && KDMapData.ShortcutPositions && KDMapData.ShortcutPositions[sideRoomIndex]) { - KinkyDungeonPlayerEntity = {MemberNumber:Player.MemberNumber, x: KDMapData.ShortcutPositions[sideRoomIndex].x, y:KDMapData.ShortcutPositions[sideRoomIndex].y, player:true}; + KinkyDungeonPlayerEntity = {MemberNumber:DefaultPlayer.MemberNumber, x: KDMapData.ShortcutPositions[sideRoomIndex].x, y:KDMapData.ShortcutPositions[sideRoomIndex].y, player:true}; } else if (direction == 1 && KDMapData.EndPosition) { - KinkyDungeonPlayerEntity = {MemberNumber:Player.MemberNumber, x: KDMapData.EndPosition.x, y:KDMapData.EndPosition.y, player:true}; + KinkyDungeonPlayerEntity = {MemberNumber:DefaultPlayer.MemberNumber, x: KDMapData.EndPosition.x, y:KDMapData.EndPosition.y, player:true}; } else { - KinkyDungeonPlayerEntity = {MemberNumber:Player.MemberNumber, x: KDMapData.StartPosition.x, y:KDMapData.StartPosition.y, player:true}; + KinkyDungeonPlayerEntity = {MemberNumber:DefaultPlayer.MemberNumber, x: KDMapData.StartPosition.x, y:KDMapData.StartPosition.y, player:true}; } } -function KDInitTempValues(seed) { +function KDInitTempValues(seed?: boolean): void { KDGameData.ChestsGenerated = []; KDPathfindingCacheFails = 0; KDPathfindingCacheHits = 0; @@ -770,7 +808,7 @@ function KDInitTempValues(seed) { } /** Game related options */ -function KDUpdateOptionGame() { +function KDUpdateOptionGame(): void { if (KinkyDungeonStatsChoice.get("NoForceGreet") && !KDGameData.NoForceGreet) { KDGameData.NoForceGreet = true; } else if (!KinkyDungeonStatsChoice.get("NoForceGreet") && KDGameData.NoForceGreet) { @@ -778,25 +816,38 @@ function KDUpdateOptionGame() { } } -// Starts the the game at a specified level -// Example usage: -// KinkyDungeonCreateMap(KinkyDungeonMapParams.grv, 1, false, undefined, "", undefined, true); /** - * - * @param {floorParams} MapParams - * @param {string} RoomType - * @param {string} MapMod - * @param {number} Floor - * @param {boolean} [testPlacement] - * @param {boolean} [seed] - * @param {string} [forceFaction] - * @param {string} [forceEscape] - * @param {{x: number, y: number}} [worldLocation] - * @param {boolean} [useExisting] - * @param {string} [origMapType] - * @param {number} [direction] + * 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, RoomType, MapMod, Floor, testPlacement, seed, forceFaction, worldLocation, useExisting, origMapType = "", direction = 0, 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 +{ KDUpdateOptionGame(); KDBreakTether(KDPlayer()); @@ -819,6 +870,13 @@ function KinkyDungeonCreateMap(MapParams, RoomType, MapMod, Floor, testPlacement }); 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); } @@ -858,7 +916,11 @@ function KinkyDungeonCreateMap(MapParams, RoomType, MapMod, Floor, testPlacement if (!altType?.noPersistentPrisoners && !mapMod?.noPersistentPrisoners) KDRepopulatePersistentNPCs(); } - + UpdateRegiments({ + mapX: worldLocation.x, + mapY: worldLocation.y, + room: KDGameData.RoomType, + }); return; } @@ -924,13 +986,15 @@ function KinkyDungeonCreateMap(MapParams, RoomType, MapMod, Floor, testPlacement // make it more consistent let random = KDRandom(); - let height = MapParams.min_height * 2 + 2*Math.floor(0.5*random * (MapParams.max_height * 2 - MapParams.min_height * 2)); - let width = MapParams.min_width * 2 + 2*Math.floor(0.5*(1 - random) * (MapParams.max_width * 2 - MapParams.min_width * 2)); - 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 + mapSizeBonus); - width = Math.max(2, width + mapSizeBonus); + + height = Math.max(2, height); + width = Math.max(2, width); if (KDTileToTest) { altType = alts.TestTile; @@ -1014,7 +1078,7 @@ function KinkyDungeonCreateMap(MapParams, RoomType, MapMod, Floor, testPlacement 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 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; @@ -1086,7 +1150,7 @@ function KinkyDungeonCreateMap(MapParams, RoomType, MapMod, Floor, testPlacement // Place the player! - KinkyDungeonPlayerEntity = {MemberNumber:Player.MemberNumber, x: KDMapData.StartPosition.x, y:KDMapData.StartPosition.y, player:true}; + KinkyDungeonPlayerEntity = {MemberNumber:DefaultPlayer.MemberNumber, x: KDMapData.StartPosition.x, y:KDMapData.StartPosition.y, player:true}; let traps = []; @@ -1320,7 +1384,7 @@ function KinkyDungeonCreateMap(MapParams, RoomType, MapMod, Floor, testPlacement && 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)) iterations = maxIter; + undefined, false, true)?.length > 0)) 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) { @@ -1415,23 +1479,35 @@ function KinkyDungeonCreateMap(MapParams, RoomType, MapMod, Floor, testPlacement } KinkyDungeonGenNavMap(); + + UpdateRegiments({ + mapX: worldLocation.x, + mapY: worldLocation.y, + room: KDGameData.RoomType, + }); + } let KDStageBossGenerated = false; /** - * Creates a list of all tiles accessible and not hidden by doors + * Creates a list of all tiles accessible and not hidden by doors or dangerous */ -function KinkyDungeonGenNavMap(fromPoint) { +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) - KDMapData.RandomPathablePoints[a[0]] = {x: X, y:Y, tags:tags}; + 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; } @@ -1459,27 +1535,34 @@ function KDLowPriorityNavMesh() { } for (let a of NavMap) { for (let b of NavMap) { - 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); - } + 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, startY, testX, testY) { +function KinkyDungeonGetAccessible(startX: number, startY: number, testX?: number, testY?: number): GridEntry { let tempGrid = {}; - let checkGrid = {}; + let checkGrid: GridEntry = {}; checkGrid[(startX + "," + startY)] = {x: startX, y: startY}; while (Object.entries(checkGrid).length > 0) { for (let g of Object.entries(checkGrid)) { @@ -1505,9 +1588,9 @@ function KinkyDungeonGetAccessible(startX, startY, testX, testY) { } // Checks everything that is accessible to the player, treating all doors as walls -function KinkyDungeonGetAccessibleRoom(startX, startY) { +function KinkyDungeonGetAccessibleRoom(startX: number, startY: number): string[] { let tempGrid = {}; - let checkGrid = {}; + let checkGrid: GridEntry = {}; checkGrid[startX + "," + startY] = {x: startX, y: startY}; while (Object.entries(checkGrid).length > 0) { for (let g of Object.entries(checkGrid)) { @@ -1530,7 +1613,7 @@ function KinkyDungeonGetAccessibleRoom(startX, startY) { } // Tests if the player can reach the end stair even if the test spot is blocked -function KinkyDungeonIsAccessible(testX, testY) { +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; @@ -1541,7 +1624,7 @@ function KinkyDungeonIsAccessible(testX, testY) { } // Tests if the player can reach the spot from the start point -function KinkyDungeonIsReachable(testX, testY, testLockX, testLockY) { +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; @@ -1551,7 +1634,7 @@ function KinkyDungeonIsReachable(testX, testY, testLockX, testLockY) { return false; } -function KinkyDungeonGetAllies() { +function KinkyDungeonGetAllies(): entity[] { let temp = []; for (let e of KDMapData.Entities) { if (KDCanBringAlly(e)) { @@ -1563,28 +1646,24 @@ function KinkyDungeonGetAllies() { } /** - * - * @param {entity} enemy - * @returns {boolean} + * @param enemy */ -function KDIsImprisoned(enemy) { +function KDIsImprisoned(enemy: entity): boolean { return KDEntityHasFlag(enemy, "imprisoned"); } /** - * - * @param {entity} e - * @returns {boolean} + * @param e */ -function KDCanBringAlly(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, Floor, Tags, BonusTags, Set) { +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)); @@ -1623,7 +1702,17 @@ function KDChooseFactions(factionList, Floor, Tags, BonusTags, Set) { return randomFactions; } -function KinkyDungeonPlaceEnemies(spawnPoints, InJail, Tags, BonusTags, Floor, width, height, altRoom, randomFactions, factionEnemy) { +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; @@ -1654,7 +1743,7 @@ function KinkyDungeonPlaceEnemies(spawnPoints, InJail, Tags, BonusTags, Floor, w let filterTagsSpawn = ["boss", "miniboss"]; let filterTagsCluster = ["boss", "miniboss"]; - let spawnBoxes = [ + 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}, @@ -1751,7 +1840,7 @@ function KinkyDungeonPlaceEnemies(spawnPoints, InJail, Tags, BonusTags, Floor, w 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"; + let jt = KDMapData.JailFaction?.length > 0 ? KinkyDungeonFactionTag[KDMapData.JailFaction[Math.floor(KDRandom() * KDMapData.JailFaction.length)]] : "jailer"; if (jt) tags.push(jt); } @@ -1807,7 +1896,7 @@ function KinkyDungeonPlaceEnemies(spawnPoints, InJail, Tags, BonusTags, Floor, w } } - let playerDist = 6; + let playerDist = 9; let PlayerEntity = KDMapData.StartPosition; let spawnBox_filter = spawnBoxes.filter((bb) => { @@ -1917,10 +2006,10 @@ function KinkyDungeonPlaceEnemies(spawnPoints, InJail, Tags, BonusTags, Floor, w let e = {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['spawnX'] = X; + e['spawnY'] = Y; if (keys) { - e.keys = true; + e['keys'] = true; } } KDAddEntity(e); @@ -2003,7 +2092,7 @@ function KinkyDungeonPlaceEnemies(spawnPoints, InJail, Tags, BonusTags, Floor, w let KinkyDungeonSpecialAreas = []; -function KinkyDungeonGetClosestSpecialAreaDist(x ,y) { +function KinkyDungeonGetClosestSpecialAreaDist(x: number, y: number): number { let minDist = 10000; for (let area of KinkyDungeonSpecialAreas) { let dist = KDistChebyshev(x - area.x, y - area.y) - area.radius; @@ -2017,8 +2106,21 @@ function KinkyDungeonGetClosestSpecialAreaDist(x ,y) { // Type 1: hollow, no empty border // Type 2: only empty space // Type 3: completely filled -function KinkyDungeonCreateRectangle(Left, Top, Width, Height, Border, Fill, Padding, OL, NW, flexCorner, Jail) { - let pad = Padding ? Padding : 0; +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++) @@ -2097,7 +2199,7 @@ function KinkyDungeonCreateRectangle(Left, Top, Width, Height, Border, Fill, Pad } } -function KinkyDungeonPlaceStairs(startpos, width, height, noStairs, nostartstairs, origMapType) { +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 (!nostartstairs) { KinkyDungeonMapSet(KDMapData.StartPosition.x, KDMapData.StartPosition.y, 'S'); @@ -2199,7 +2301,7 @@ function KinkyDungeonPlaceStairs(startpos, width, height, noStairs, nostartstair //if (KDMapData.MainPath != MiniGameKinkyDungeonCheckpoint && !nostartstairs) KinkyDungeonSkinArea({skin: KDMapData.MainPath}, KDMapData.EndPosition.x, KDMapData.EndPosition.y, 4.99); } -function KinkyDungeonSkinArea(skin, X, Y, Radius, NoStairs) { +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) { @@ -2219,7 +2321,7 @@ function KinkyDungeonSkinArea(skin, X, Y, Radius, NoStairs) { let KDMinBoringness = 0; // Minimum boringness for treasure spawn -function KinkyDungeonPlaceChests(params, chestlist, spawnPoints, shrinelist, treasurechance, treasurecount, rubblechance, Floor, width, height) { +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(); @@ -2235,7 +2337,7 @@ function KinkyDungeonPlaceChests(params, chestlist, spawnPoints, shrinelist, tre let specialdata = { altType: KDGetAltType(MiniGameKinkyDungeonLevel), - specialChests: params.specialChests ? JSON.parse(JSON.stringify(params.specialChests)) : {}, + specialChests: (params.specialChests ? JSON.parse(JSON.stringify(params.specialChests)) : {}) as Record, }; KinkyDungeonSendEvent("specialChests", specialdata); @@ -2504,7 +2606,7 @@ function KinkyDungeonPlaceChests(params, chestlist, spawnPoints, shrinelist, tre } -function KinkyDungeonPlaceLore(width, height) { +function KinkyDungeonPlaceLore(width: number, height: number): number { let loreList = []; // Populate the lore @@ -2524,7 +2626,7 @@ function KinkyDungeonPlaceLore(width, height) { return count; } -function KinkyDungeonPlaceHeart(width, height, Floor) { +function KinkyDungeonPlaceHeart(width: number, height: number, _Floor: number): boolean { let heartList = []; // Populate the lore @@ -2549,7 +2651,24 @@ function KinkyDungeonPlaceHeart(width, height, Floor) { -function KinkyDungeonPlaceShrines(chestlist, shrinelist, shrinechance, shrineTypes, shrinecount, shrinefilter, ghostchance, manaChance, orbcount, filterTypes, Floor, width, height, allowQuests, allowHearts) { +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; @@ -2582,8 +2701,8 @@ function KinkyDungeonPlaceShrines(chestlist, shrinelist, shrinechance, shrineTyp }; if (allowHearts) { - tablets.Heart = 0; - tabletsAmount.Heart = 2; + tablets['Heart'] = 0; + tabletsAmount['Heart'] = 2; } for (let goddess of Object.keys(KinkyDungeonShrineBaseCosts)) { tablets[goddess] = 0; @@ -2601,10 +2720,10 @@ function KinkyDungeonPlaceShrines(chestlist, shrinelist, shrinechance, shrineTyp maxcount += amt; } - let isDoodad = (X, Y) => { + let isDoodad = (X: number, Y: number) => { return "aXmo".includes(KinkyDungeonMapGet(X, Y)); }; - if (shrinelist <= maxcount) + if (shrinelist.length <= maxcount) // Populate the chests for (let X = 1; X < width; X += 1) for (let Y = 1; Y < height; Y += 1) @@ -2692,7 +2811,7 @@ function KinkyDungeonPlaceShrines(chestlist, shrinelist, shrinechance, shrineTyp // If we STILL dont have enough, we expand the criteria - if (shrinelist <= maxcount) + 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 @@ -2816,10 +2935,7 @@ function KinkyDungeonPlaceShrines(chestlist, shrinelist, shrinechance, shrineTyp else { let placedChampion = !allowQuests; let playerTypes = KinkyDungeonRestraintTypes(shrinefilter); - /** - * @type {{type: string, drunk?: boolean}} - */ - let stype = shrineTypes.length < orbcount ? {type: "Orb"} + 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)]} @@ -2886,7 +3002,7 @@ function KinkyDungeonPlaceShrines(chestlist, shrinelist, shrinechance, shrineTyp } -function KinkyDungeonPlaceChargers(chargerlist, chargerchance, litchargerchance, chargercount, Floor, width, height) { +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) { @@ -2986,13 +3102,11 @@ function KinkyDungeonPlaceChargers(chargerlist, chargerchance, litchargerchance, let KinkyDungeonCommercePlaced = 0; /** - * - * @param {number} Floor - * @param {number} manaChance - * @param {string[]} filterTypes - * @returns + * @param Floor + * @param manaChance + * @param filterTypes */ -function KinkyDungeonGenerateShrine(Floor, filterTypes, manaChance) { +function KinkyDungeonGenerateShrine(_Floor: number, filterTypes: string[], manaChance: number) { let Params = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; let drunk = !(KDRandom() < manaChance); @@ -3025,7 +3139,7 @@ function KinkyDungeonGenerateShrine(Floor, filterTypes, manaChance) { } -function KinkyDungeonPlaceSpecialTiles(gaschance, gasType, Floor, width, height) { +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) @@ -3046,7 +3160,7 @@ function KinkyDungeonPlaceSpecialTiles(gaschance, gasType, Floor, width, height) } -function KinkyDungeonPlaceBrickwork( brickchance, Floor, width, height) { +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) @@ -3068,7 +3182,7 @@ function KinkyDungeonPlaceBrickwork( brickchance, Floor, width, height) { } } -function KinkyDungeonPlaceTraps( traps, traptypes, trapchance, doorlocktrapchance, Floor, width, height) { +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); @@ -3159,7 +3273,7 @@ function KinkyDungeonPlaceTraps( traps, traptypes, trapchance, doorlocktrapchanc } -function KinkyDungeonPlacePatrols(Count, width, height) { +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 @@ -3175,21 +3289,14 @@ function KinkyDungeonPlacePatrols(Count, width, height) { } } -/** - * - * @returns {number} - */ -function KDGetEffLevel() { +function KDGetEffLevel(): number { let effLevel = MiniGameKinkyDungeonLevel + Math.round(KinkyDungeonDifficulty/5); if (KinkyDungeonNewGame) effLevel += KinkyDungeonMaxLevel; return effLevel; } -/** - * @returns {string} - */ -function KDRandomizeRedLock() { +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"; @@ -3198,16 +3305,14 @@ function KDRandomizeRedLock() { /** - * @param {boolean} [Guaranteed] - * @param {number} [Floor] - * @param {boolean} [AllowGold] - * @param {string} [Type] - Used to customize the type - * @param {any} [Data] - Used to customize the type - * + * @param [Guaranteed] + * @param [Floor] + * @param [AllowGold] + * @param [Type] - Used to customize the type + * @param [Data] - Used to customize the type */ -function KDGetLockList(Guaranteed, Floor, AllowGold, Type, Data) { - /** @type {Record} */ - let ret = {}; +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); @@ -3217,14 +3322,13 @@ function KDGetLockList(Guaranteed, Floor, AllowGold, Type, Data) { /** * Generates a lock - * @param {boolean} [Guaranteed] - * @param {number} [Floor] - * @param {boolean} [AllowGold] - * @param {string} [Type] - Used to customize the type - * @param {any} [Data] - Used to customize the type - * @returns {string} + * @param [Guaranteed] + * @param [Floor] + * @param [AllowGold] + * @param [Type] - Used to customize the type + * @param [Data] - Used to customize the type */ -function KinkyDungeonGenerateLock(Guaranteed, Floor, AllowGold, Type, Data) { +function KinkyDungeonGenerateLock(Guaranteed?: boolean, Floor?: number, AllowGold?: boolean, Type?: string, Data?: any): string { let level = (Floor) ? Floor : KDGetEffLevel(); //let Params = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; @@ -3280,7 +3384,19 @@ let KDPlaceMode = { MODE_MODIFYPOTENTIALANDEXISTING: 0x1, MODE_MODIFYEXISTINGONLY: 0x2, }; -function KinkyDungeonPlaceDoors(doorchance, doortrapchance, nodoorchance, doorlockchance, trapChance, grateChance, Floor, width, height, placeMode = KDPlaceMode.MODE_PLACENEW) { +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 = []; @@ -3288,13 +3404,13 @@ function KinkyDungeonPlaceDoors(doorchance, doortrapchance, nodoorchance, doorlo // 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))) { + 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; @@ -3423,12 +3539,41 @@ function KinkyDungeonPlaceDoors(doorchance, doortrapchance, nodoorchance, doorlo return trapLocations; } -function KinkyDungeonReplaceDoodads(Chance, barchance, wallRubblechance, wallhookchance, ceilinghookchance, width, height, altType) { +function KinkyDungeonReplaceDoodads(Chance: number, barchance: number, wallRubblechance: number, wallhookchance: number, ceilinghookchance: number, 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' && KDRandom() < Chance) + 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'); - else + // Cracks then expand in a random direction twice + let curXOld = X; + let curYOld = Y; + 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'); + } else { + curX -= xd; + curY -= yd; + } + } + } + + } else if (KinkyDungeonMapGet(X, Y) == '1' && KDRandom() < wallRubblechance && !KDMapData.TilesSkin[X + "," + Y]) { KinkyDungeonMapSet(X, Y, 'Y'); if (KDAlreadyOpened(X, Y)) { @@ -3482,11 +3627,13 @@ function KinkyDungeonReplaceDoodads(Chance, barchance, wallRubblechance, wallhoo } -function KinkyDungeonPlaceFurniture(barrelChance, cageChance, width, height, altType) { +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' @@ -3530,7 +3677,7 @@ let KDFood = { }, }; -function KinkyDungeonPlaceFood(foodChance, width, height, altType) { +function KinkyDungeonPlaceFood(foodChance: number, width: number, height: number, altType: any) { if (altType && altType.noClutter) return; @@ -3656,7 +3803,8 @@ function KinkyDungeonPlaceFood(foodChance, width, height, altType) { list.splice(N, 1); } } -function KinkyDungeonPlaceTorches(torchchance, torchlitchance, torchchanceboring, width, height, altType, torchreplace) { + +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' @@ -3684,10 +3832,10 @@ function KinkyDungeonPlaceTorches(torchchance, torchlitchance, torchchanceboring /** * Replace vertical wall '1' with '|' - * @param {number} width - * @param {number} height + * @param width + * @param height */ -function KinkyDungeonReplaceVert(width, 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); @@ -3713,14 +3861,21 @@ function KinkyDungeonReplaceVert(width, height) { } -function KinkyDungeonMazeWalls(Cell, Walls, WallsList) { +/* 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}; } -function KinkyDungeonMapSet(X, Y, SetTo, VisitedRooms) { +/** + * @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; @@ -3732,7 +3887,7 @@ function KinkyDungeonMapSet(X, Y, SetTo, VisitedRooms) { } return false; } -function KinkyDungeonMapSetForce(X, Y, SetTo, VisitedRooms) { +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); @@ -3743,11 +3898,28 @@ function KinkyDungeonMapSetForce(X, Y, SetTo, VisitedRooms) { } -function KinkyDungeonBoringGet(X, Y) { +/** + * @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, Y, SetTo) { +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; @@ -3755,14 +3927,27 @@ function KinkyDungeonBoringSet(X, Y, SetTo) { return false; } -function KinkyDungeonMapGet(X, Y) { +/** + * @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)]; } -function KinkyDungeonVisionSet(X, Y, SetTo) { +/** + * @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; @@ -3770,7 +3955,7 @@ function KinkyDungeonVisionSet(X, Y, SetTo) { return false; } -function KinkyDungeonBrightnessSet(X, Y, SetTo, monotonic) { +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; @@ -3779,7 +3964,7 @@ function KinkyDungeonBrightnessSet(X, Y, SetTo, monotonic) { return false; } -function KinkyDungeonColorSet(X, Y, SetTo, monotonic) { +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; @@ -3787,7 +3972,7 @@ function KinkyDungeonColorSet(X, Y, SetTo, monotonic) { } return false; } -function KinkyDungeonShadowSet(X, Y, SetTo, monotonic) { +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; @@ -3796,21 +3981,21 @@ function KinkyDungeonShadowSet(X, Y, SetTo, monotonic) { return false; } -function KinkyDungeonVisionGet(X, Y) { +function KinkyDungeonVisionGet(X: number, Y: number): number { return KDMapExtraData.VisionGrid[X + Y*(KDMapData.GridWidth)]; } -function KinkyDungeonBrightnessGet(X, Y) { +function KinkyDungeonBrightnessGet(X: number, Y: number): number { return KDMapExtraData.BrightnessGrid[X + Y*(KDMapData.GridWidth)]; } -function KinkyDungeonColorGet(X, Y) { +function KinkyDungeonColorGet(X: number, Y: number): number { return KDMapExtraData.ColorGrid[X + Y*(KDMapData.GridWidth)]; } -function KinkyDungeonShadowGet(X, Y) { +function KinkyDungeonShadowGet(X: number, Y: number): number { return KDMapExtraData.ShadowGrid[X + Y*(KDMapData.GridWidth)]; } -function KinkyDungeonFogGet(X, Y) { +function KinkyDungeonFogGet(X: number, Y: number): any { return KDMapData.FogGrid[X + Y*(KDMapData.GridWidth)]; } @@ -3820,7 +4005,7 @@ 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) { +function KinkyDungeonGetDirection(dx: number, dy: number) { let X = 0; let Y = 0; @@ -3844,7 +4029,7 @@ function KinkyDungeonGetDirection(dx, dy) { } // GetDirection, but it also pivots randomly 45 degrees to either side -function KinkyDungeonGetDirectionRandom(dx, dy) { +function KinkyDungeonGetDirectionRandom(dx: number, dy: number) { let dir = KinkyDungeonGetDirection(dx, dy); let pivot = Math.floor(KDRandom()*3)-1; @@ -3868,7 +4053,7 @@ function KinkyDungeonControlsEnabled() { return !KinkyDungeonInspect && KDGameData.SlowMoveTurns < 1 && KinkyDungeonStatFreeze < 1 && KDGameData.SleepTurns < 1 && !KDGameData.CurrentDialog && !KinkyDungeonMessageToggle; } -function KDStartSpellcast(tx, ty, SpellToCast, enemy, player, bullet, data) { +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) { @@ -3879,7 +4064,7 @@ function KDStartSpellcast(tx, ty, SpellToCast, enemy, player, bullet, data) { } // Click function for the game portion -function KinkyDungeonClickGame(Level) { +function KinkyDungeonClickGame(_Level?: number) { let _CharacterRefresh = CharacterRefresh; let _CharacterAppearanceBuildCanvas = CharacterAppearanceBuildCanvas; CharacterRefresh = () => {KDRefresh = true;}; @@ -3961,22 +4146,19 @@ function KinkyDungeonClickGame(Level) { if (KinkyDungeonTargetingSpell) { if (KDMouseInPlayableArea()) { - 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; - KinkyDungeonTargetingSpellItem = null; - KinkyDungeonTargetingSpellWeapon = null; - } - } else { + //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; @@ -4027,12 +4209,13 @@ function KinkyDungeonGetMovable() { function KinkyDungeonListenKeyMove() { if ((document.activeElement && KDFocusableTextFields.includes(document.activeElement.id))) return true; - if (KinkyDungeonLastMoveTimer < performance.now() && (KinkyDungeonControlsEnabled() || KinkyDungeonInspect) && KinkyDungeonDrawState == "Game" && !KDModalArea) { + if (KinkyDungeonLastMoveTimer < performance.now() && (KinkyDungeonControlsEnabled() || KinkyDungeonInspect) + && KinkyDungeonDrawState == "Game" && !KDModalArea) { let moveDirection = null; let moveDirectionDiag = null; let MovableTiles = KinkyDungeonGetMovable(); - let itemsAtTile = (x, y) => { + let itemsAtTile = (x: number, y: number) => { return KDMapData.GroundItems.some((item) => {return item.x == KinkyDungeonPlayerEntity.x + x && item.y == KinkyDungeonPlayerEntity.y + y;}); }; @@ -4089,7 +4272,7 @@ function KinkyDungeonListenKeyMove() { } } if (KinkyDungeonLastMoveTimerStart < performance.now() && KinkyDungeonLastMoveTimer == 0) KinkyDungeonLastMoveTimerStart = 0; - if (!KinkyDungeonGameKey.keyPressed.some((element)=>{return element;})) { KinkyDungeonLastMoveTimer = 0;} + if (!KinkyDungeonGameKey.keyPressed.some((element: any)=>{return element;})) { KinkyDungeonLastMoveTimer = 0;} //KDSetFocusControl(""); } @@ -4294,6 +4477,32 @@ function KinkyDungeonGameKeyDown() { 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[8]: KinkyDungeonDrawState = "Restart"; break; + } + if (KDToggles.Sound) 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 KinkyDungeonKeySkip[0]: + case KinkyDungeonKeyMenu[8]: + KinkyDungeonDrawState = "Game"; break; } if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Click.ogg"); return true; @@ -4304,7 +4513,7 @@ function KinkyDungeonGameKeyDown() { } -function KinkyDungeonGameKeyUp(lastPress) { +function KinkyDungeonGameKeyUp(lastPress: number): boolean { //if (KDGameData.CurrentDialog) return; //if (!KinkyDungeonControlsEnabled()) return; let delta = CommonTime() - lastPress; @@ -4374,7 +4583,7 @@ function KinkyDungeonGameKeyUp(lastPress) { return false; } -function KinkyDungeonSendTextMessage(priority, text, color, time, noPush, noDupe, entity, filter = "Self") { +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) @@ -4396,7 +4605,7 @@ function KinkyDungeonSendTextMessage(priority, text, color, time, noPush, noDupe } -function KinkyDungeonSendActionMessage(priority, text, color, time, noPush, noDupe, entity, filter = "Action", antifilter) { +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) @@ -4418,7 +4627,7 @@ function KinkyDungeonSendActionMessage(priority, text, color, time, noPush, noDu let KinkyDungeonNoMoveFlag = false; -function KDAttackCost(weapon) { +function KDAttackCost(weapon?: weapon) { let data = { attackCost: KinkyDungeonStatStaminaCostAttack, bonus: KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "AttackStaminaBonus"), @@ -4434,12 +4643,10 @@ function KDAttackCost(weapon) { } /** - * - * @param {entity} Enemy - * @param {number} [skip] - * @returns {string} + * @param Enemy + * @param [skip] */ -function KinkyDungeonLaunchAttack(Enemy, skip) { +function KinkyDungeonLaunchAttack(Enemy: entity, skip?: number): string { let attackCost = KDAttackCost(); let capture = false; let result = "fail"; @@ -4605,7 +4812,7 @@ function KinkyDungeonLaunchAttack(Enemy, skip) { return result; } -function KinkyDungeonMove(moveDirection, delta, AllowInteract, SuppressSprint) { +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; @@ -4627,7 +4834,7 @@ function KinkyDungeonMove(moveDirection, delta, AllowInteract, SuppressSprint) { } } - let allowPass = Enemy + let allowPass: boolean = Enemy && KDCanPassEnemy(KinkyDungeonPlayerEntity, Enemy); if (Enemy && !allowPass && !passThroughSprint) { if (AllowInteract) { @@ -4873,7 +5080,7 @@ function KinkyDungeonMove(moveDirection, delta, AllowInteract, SuppressSprint) { return moved; } -function KinkyDungeonWaitMessage(NoTime, delta) { +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" @@ -4896,9 +5103,11 @@ function KinkyDungeonWaitMessage(NoTime, delta) { } -// Returns th number of turns that must elapse -// Sets MovePoints to 0 -function KinkyDungeonMoveTo(moveX, moveY, willSprint, allowPass) { +/** + * 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; @@ -4997,7 +5206,7 @@ let KDVisionUpdate = 0; let KDLastTick = 0; -function KinkyDungeonAdvanceTime(delta, NoUpdate, NoMsgTick) { +function KinkyDungeonAdvanceTime(delta: number, NoUpdate?: boolean, NoMsgTick?: boolean) { if (!KinkyDungeonPlayerEntity.id) KinkyDungeonPlayerEntity.id = -1; if (delta > 0) { @@ -5212,6 +5421,16 @@ function KinkyDungeonAdvanceTime(delta, NoUpdate, NoMsgTick) { } } + if (delta > 0) { + KDTickMaps(delta, + MiniGameKinkyDungeonLevel - KDMapTickRange, + MiniGameKinkyDungeonLevel + KDMapTickRange, + false, + true, + true + ); + } + KinkyDungeonSendEvent("tickAfter", {delta: delta}); KinkyDungeonUpdateStats(0); @@ -5329,18 +5548,28 @@ function KinkyDungeonTargetTileMsg() { /** * 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 + * @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 {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 + * @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, Group, ItemAsset, NewColor, DifficultyFactor, ItemMemberNumber, Refresh, item) { +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 @@ -5353,8 +5582,7 @@ function KDAddAppearance(C, Group, ItemAsset, NewColor, DifficultyFactor, ItemMe // Add the new item to the character appearance if (ItemAsset != null) { - /** @type {Item} */ - const NA = { + const NA: Item = { Asset: ItemAsset, Difficulty: parseInt((ItemAsset.Difficulty == null) ? 0 : ItemAsset.Difficulty) + parseInt(DifficultyFactor), Color: data.color, @@ -5369,16 +5597,25 @@ function KDAddAppearance(C, Group, ItemAsset, NewColor, DifficultyFactor, ItemMe /** * 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 {Model} ItemModel - The asset collection of the item to be changed - * @param {string|string[]} NewColor - The new color (as "#xxyyzz" hex value) for that item - * @param {item} [item] - The item, to pass to the event - * @param {Record} filters - The item, to pass to the event - * @param {Record} [Properties] - The item, to pass to the event - * @returns {Item} - the item itself + * @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, Group, ItemModel, NewColor, filters, item, Properties) { +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 = { @@ -5390,8 +5627,7 @@ function KDAddModel(C, Group, ItemModel, NewColor, filters, item, Properties) { // Add the new item to the character appearance if (ItemModel != null) { - /** @type {Item} */ - const NA = { + const NA: Item = { Model: JSON.parse(JSON.stringify(ItemModel)), Difficulty: 0,//parseInt((ItemModel.Difficulty == null) ? 0 : ItemModel.Difficulty) + parseInt(DifficultyFactor), Color: data.color, @@ -5413,7 +5649,7 @@ function KDAddModel(C, Group, ItemModel, NewColor, filters, item, Properties) { return null; } -function KinkyDungeonCloseDoor(x, y) { +function KinkyDungeonCloseDoor(x: number, y: number) { if (KinkyDungeonStatsChoice.get("Doorknobs") && KinkyDungeonIsArmsBound(true) && KinkyDungeonIsHandsBound(true, true, 0.5)) KinkyDungeonSendTextMessage(8, TextGet("KDCantCloseDoor"), "#ff8933", 2); else { @@ -5427,14 +5663,8 @@ function KinkyDungeonCloseDoor(x, y) { } } -/** - * @type {Map} - */ -let KDEnemyCache = null; -/** - * @type {Map>} - */ -let KDEnemyEventCache = null; +let KDEnemyCache: Map = null; +let KDEnemyEventCache: Map> = null; let KDUpdateEnemyCache = true; let KDIDCache = new Map(); @@ -5465,11 +5695,10 @@ let KDTileQuery = ""; let KDTileLast = null; /** - * - * @param {number} [x] - * @param {number} [y] + * @param [x] + * @param [y] */ -function KDTile(x, y) { +function KDTile(x?: number, y?: number): any { if (x == undefined) x = KinkyDungeonPlayerEntity.x; if (y == undefined) y = KinkyDungeonPlayerEntity.y; let q = x + "," + y; @@ -5483,11 +5712,10 @@ function KDTile(x, y) { } /** - * - * @param {number} [x] - * @param {number} [y] + * @param [x] + * @param [y] */ -function KDTileDelete(x, y) { +function KDTileDelete(x?: number, y?: number): void { if (x == undefined) x = KinkyDungeonPlayerEntity.x; if (y == undefined) y = KinkyDungeonPlayerEntity.y; KinkyDungeonTilesDelete(x + "," + y); @@ -5495,10 +5723,10 @@ function KDTileDelete(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 + * @param turns + * @param [noFlag] - Doesn't add the 'stun' flag which makes the game think you are in trouble */ -function KDStunTurns(turns, noFlag) { +function KDStunTurns(turns: number, noFlag?: boolean) { if (!noFlag) KinkyDungeonSetFlag("playerStun", turns + 1); KDGameData.SlowMoveTurns = Math.max(KDGameData.SlowMoveTurns, turns); @@ -5507,19 +5735,19 @@ function KDStunTurns(turns, noFlag) { /** * Kneels the player for [turns] turns - * @param {number} turns + * @param turns */ -function KDKneelTurns(turns) { +function KDKneelTurns(turns: number) { 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 + * @param list - a list of weights with string keys + * @returns - the key that was selected */ -function KDGetByWeight(list) { +function KDGetByWeight(list: Record): string { let WeightTotal = 0; let Weights = []; let type = ""; @@ -5650,12 +5878,11 @@ let KDKeyCheckers = { /** * - * @param {number} Floor - * @param {string} [MapMod] - * @param {string} [RoomType] - * @returns {any} + * @param Floor + * @param [MapMod] + * @param [RoomType] */ -function KDGetAltType(Floor, MapMod, RoomType) { +function KDGetAltType(Floor: number, MapMod?: string, RoomType?: string): any { let mapMod = null; if (MapMod ? MapMod : KDGameData.MapMod) { mapMod = KDMapMods[MapMod ? MapMod : KDGameData.MapMod]; @@ -5667,11 +5894,10 @@ function KDGetAltType(Floor, MapMod, RoomType) { /** * - * @param {entity} player - * @param {entity} Enemy - * @returns {boolean} + * @param player + * @param Enemy */ -function KDCanPassEnemy(player, Enemy) { +function KDCanPassEnemy(_player: entity, Enemy: entity): boolean { return !KDIsImmobile(Enemy) && ((!KinkyDungeonAggressive(Enemy) && !Enemy.playWithPlayer) || (KDHelpless(Enemy))) && ((KinkyDungeonToggleAutoPass @@ -5693,22 +5919,18 @@ function KDCanPassEnemy(player, Enemy) { /** - * - * @param {number} x - * @param {number} y - * @param {number} pad - * @returns {boolean} + * @param x + * @param y + * @param [pad] */ -function KDIsInBounds(x, y, pad = 1) { +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 - * @returns {number} + * @param sprintdata */ -function KDSprintCost(sprintdata) { +function KDSprintCost(sprintdata?: any): number { let data = { sprintdata: sprintdata, sprintCostMult: KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SprintEfficiency")), @@ -5723,11 +5945,10 @@ function KDSprintCost(sprintdata) { /** - * - * @param {KDMapDataType} map - * @param {string} flag + * @param map + * @param flag */ -function KDSetMapFlag(map, flag) { +function KDSetMapFlag(map: KDMapDataType, flag: string) { if (!map) return; if (!map.flags) { map.flags = []; @@ -5738,10 +5959,9 @@ function KDSetMapFlag(map, flag) { } /** - * - * @param {Character} C + * @param C */ -function KDUpdateForceOutfit(C) { +function KDUpdateForceOutfit(C: Character) { let forceOutfit = ""; let forceOutfitPri = 0; let r = null; @@ -5757,13 +5977,16 @@ function KDUpdateForceOutfit(C) { } } -function KDGenerateBaseTraffic(width, height) { +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(3); + row.push(5); KDMapData.Traffic.push(row); } } @@ -5781,7 +6004,7 @@ function KDPruneWorld() { } -function KDTurnToFace(dx, dy) { +function KDTurnToFace(dx: number, dy: number) { KinkyDungeonPlayerEntity.facing_x = Math.min(1, Math.abs(dx)) * Math.sign(dx); KinkyDungeonPlayerEntity.facing_y = Math.min(1, Math.abs(dy)) * Math.sign(dy); @@ -5790,3 +6013,56 @@ function KDTurnToFace(dx, dy) { KinkyDungeonPlayerEntity.facing_y_last = KinkyDungeonPlayerEntity.facing_y; } } + + +function KDAddRepopQueue(repopdata: RepopQueueData, data: KDMapDataType) { + if (!data.RepopulateQueue) + data.RepopulateQueue = []; + + data.RepopulateQueue.push(repopdata); +} + +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 + ); + } + } + } +} \ No newline at end of file diff --git a/Game/src/base/KinkyDungeonHUD.ts b/Game/src/base/KinkyDungeonHUD.ts index 726522b45..709a449e1 100644 --- a/Game/src/base/KinkyDungeonHUD.ts +++ b/Game/src/base/KinkyDungeonHUD.ts @@ -7,8 +7,8 @@ let KinkyDungeonStruggleGroups = []; let KinkyDungeonStruggleGroupsBase = [ "ItemDevices", "ItemEars", - "ItemH", - "ItemM", + "ItemHead", + "ItemMouth", "ItemNeck", "ItemNeckRestraints", "ItemArms", @@ -232,7 +232,7 @@ function KDHandleGame() { } if (KinkyDungeonIsPlayer() && MouseIn(canvasOffsetX, canvasOffsetY, KinkyDungeonCanvas.width, KinkyDungeonCanvas.height)) - KinkyDungeonSetTargetLocation(KDToggles.Helper); + KinkyDungeonSetTargetLocation(!KinkyDungeonTargetingSpell && KDToggles.Helper); @@ -252,7 +252,7 @@ function KDHandleGame() { -function KinkyDungeonDrawInterface(showControls) { +function KinkyDungeonDrawInterface(_showControls: boolean) { if (KDToggles.TurnCounter) DrawTextKD(TextGet("TurnCounter") + KinkyDungeonCurrentTick, 1995, 995, "#ffffff", "#333333", 12, "right"); @@ -265,7 +265,7 @@ function KinkyDungeonDrawInterface(showControls) { - if (!KDPatched) DrawButtonKDEx("quitbutton", (b) => { + if (!KDPatched) DrawButtonKDEx("quitbutton", (_b) => { KinkyDungeonDrawState = "Restart"; KDConfirmDeleteSave = false; if (KDDebugMode) { @@ -410,7 +410,7 @@ function KDDrawSpellChoices() { if (KinkyDungeonSpellChoices.some((num) => {return KinkyDungeonSpells[num] != undefined;})) { DrawButtonKDEx("empowerSpell", - (bdata) => { + (_bdata) => { KDSendInput("upcast", {}); return true; }, true, @@ -423,7 +423,7 @@ function KDDrawSpellChoices() { ); if (KDUpcastLevel > 0) DrawButtonKDEx("empowerSpellCancel", - (bdata) => { + (_bdata) => { KDSendInput("upcastcancel", {}); return true; }, true, @@ -590,7 +590,7 @@ function KDDrawSpellChoices() { if (MouseIn(buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h)) { DrawTextFitKD(TextGet((arm ? "Restraint" : ("KinkyDungeonInventoryItem")) + name), - buttonDim.x, buttonDim.y - 140, 300, 300, + buttonDim.x, buttonDim.y - 140, 300, "#ffffff", "#333333", undefined, "center"); } // Render number @@ -718,7 +718,7 @@ function KDDrawSpellChoices() { } } -function KDCycleSpellPage(reverse, noWrap, force = false) { +function KDCycleSpellPage(reverse: boolean = false, noWrap: boolean = false, force: boolean = false) { if (reverse) { KDSpellPage -= 1; } else KDSpellPage += 1; @@ -741,18 +741,18 @@ function KinkyDungeonCanSleep() { else return true; } -function KDLinspace(min, max, steps) { +function KDLinspace(min: number, max: number, steps: number): number[] { if (steps == 0 || Number.isNaN(steps)) return []; - let spaces = []; + let spaces: number[] = []; for (let i = 0; i < steps; i+= 1) { spaces.push(min + i * (max - min) / steps); } return spaces; } -function KDSteps(max, step, maxStep = 20) { +function KDSteps(max: number, step: number, maxStep: number = 20): number[] { if (step == 0 || Number.isNaN(step)) return []; - let spaces = []; + 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); } @@ -760,12 +760,11 @@ function KDSteps(max, step, maxStep = 20) { } /** - * - * @param {number} x - * @param {number} y - * @param {number} width + * @param x + * @param y + * @param width */ -function KDDrawStatusBars(x, y, width = 125) { +function KDDrawStatusBars(x: number, y: number, width: number = 125) { // Draw labels let buttonWidth = 48; let heightPerBar = 24; @@ -796,7 +795,7 @@ function KDDrawStatusBars(x, y, width = 125) { .replace("CURRENT", Math.floor(KinkyDungeonStatStamina*10) + ""), x, y - 5 - 1.5*heightPerBar, 200, "#ffffff", "#000000", 16, "left", undefined, undefined, 4); - DrawButtonKDEx("usePotionStamina", (b) => { + DrawButtonKDEx("usePotionStamina", (_b) => { //if (KinkyDungeonCanTalk(true) || KinkyDungeonPotionCollar()) // Done, converted to input KDSendInput("consumable", {item: "PotionStamina", quantity: 1}); @@ -820,7 +819,7 @@ function KDDrawStatusBars(x, y, width = 125) { 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) => { + DrawButtonKDEx("usePotionMana", (_b) => { //if (KinkyDungeonCanTalk(true) || KinkyDungeonPotionCollar()) // Done, converted to input KDSendInput("consumable", {item: "PotionMana", quantity: 1}); @@ -873,7 +872,7 @@ function KDDrawStatusBars(x, y, width = 125) { , x + width * barWidthOffset2ndSet, y + heightPerBar * barHeightOffset2ndSet - 1 - 0.5*heightPerBar, 200, "#ffffff", "#000000", 16, "left", undefined, undefined, 4); - DrawButtonKDEx("usePotionFrigid", (b) => { + DrawButtonKDEx("usePotionFrigid", (_b) => { //if (KinkyDungeonCanTalk(true) || KinkyDungeonPotionCollar()) // Done, converted to input KDSendInput("consumable", {item: "PotionFrigid", quantity: 1}); @@ -900,7 +899,7 @@ function KDDrawStatusBars(x, y, width = 125) { x + width * barWidthOffset2ndSet, y - 5 + heightPerBar * barHeightOffset2ndSet - 1.5*heightPerBar, 200, "#ffffff", "#000000", 16, "left", undefined, undefined, 4); - DrawButtonKDEx("usePotionWill", (b) => { + DrawButtonKDEx("usePotionWill", (_b) => { //if (KinkyDungeonCanTalk(true) || KinkyDungeonPotionCollar()) // Done, converted to input KDSendInput("consumable", {item: "PotionWill", quantity: 1}); @@ -918,7 +917,7 @@ function KDDrawStatusBars(x, y, width = 125) { } -function KDDrawWeaponSwap(x, y) { +function KDDrawWeaponSwap(x: number, y: number): boolean { let heightPerBar = 24; let buttonWidth = 48; let chargeX = 1775; @@ -932,10 +931,10 @@ function KDDrawWeaponSwap(x, y) { 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) => { + (_bdata) => { KDSendInput("consumable", {item: "AncientPowerSource", quantity: 1}); return true; - }, KDGameData.AncientEnergyLevel < 1.0 && KinkyDungeonItemCount("AncientPowerSource"), + }, 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); @@ -990,7 +989,7 @@ function KDDrawWeaponSwap(x, y) { for (let wep of KDGameData.PreviousWeapon) { if (ii >= KDMaxPreviousWeapon) break; let Index = ii; - if (wep && KDWeapon({name: wep}) && DrawButtonKDEx("previousweapon" + wep + "," + ii,(bdata) => { + if (wep && KDWeapon({name: wep}) && DrawButtonKDEx("previousweapon" + wep + "," + ii,(_bdata) => { if (!KinkyDungeonControlsEnabled()) return false; if (KinkyDungeonInventoryGet(wep)) KDSwitchWeapon(wep, Index); @@ -1016,7 +1015,7 @@ function KDDrawWeaponSwap(x, y) { 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 (DrawButtonKDEx("switchWeapon", (_bdata) => { if (!KinkyDungeonControlsEnabled()) return false; KDSwitchWeapon(); return true; @@ -1036,7 +1035,7 @@ function KDDrawWeaponSwap(x, y) { return hover; } -function KinkyDungeonDrawActionBar(x, y) { +function KinkyDungeonDrawActionBar(_x: number, _y: number) { let str = ""; let BalanceOffset = KDToggles.BuffSide ? 850 : 800; if (KDGameData.Balance < 1 && !KinkyDungeonStatsChoice.get("TrustFall")) { @@ -1054,7 +1053,7 @@ function KinkyDungeonDrawActionBar(x, y) { } - if (DrawButtonKDEx("RestHide", (bdata) => { + if (DrawButtonKDEx("RestHide", (_bdata) => { KinkyDungeonDrawStruggle += 1; if (KinkyDungeonDrawStruggle > 3) KinkyDungeonDrawStruggle = 0; return true; @@ -1066,13 +1065,13 @@ function KinkyDungeonDrawActionBar(x, y) { "False")))) + ".png", "")) str = "KDHideRest"; if (MouseIn(0, 0, 500, 1000) || MouseIn(500, 900, 320, 200) || KDPlayerSetPose || KDToggleXRay) { if (StandalonePatched) { - if (DrawButtonKDEx("SetPose", (bdata) => { + 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) => { + if (DrawButtonKDEx("ToggleXray", (_bdata) => { KDToggleXRay += 1; if (KDToggleXRay > (StandalonePatched ? 2 : 1)) KDToggleXRay = 0; @@ -1083,7 +1082,7 @@ function KinkyDungeonDrawActionBar(x, y) { 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) => { + if (DrawButtonKDEx("SetTransparentBullets", (_bdata) => { KDBulletTransparency = !KDBulletTransparency; return true; }, true, 720, 925, 60, 60, "", "#ffffff", KinkyDungeonRootDirectory + "UI/BulletTransparency.png", "", false, false, @@ -1153,7 +1152,7 @@ function KinkyDungeonDrawActionBar(x, y) { } - if (DrawButtonKDEx("openQuickInv", (b) => { + if (DrawButtonKDEx("openQuickInv", (_b) => { KinkyDungeonShowInventory = !KinkyDungeonShowInventory; return true; }, true, 510, 825, 60, 90, "", "#ffffff", KinkyDungeonRootDirectory + (KinkyDungeonShowInventory ? "BackpackOpen.png" : "Backpack.png"), "", @@ -1171,7 +1170,7 @@ function KinkyDungeonDrawActionBar(x, y) { } if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.special) { if (MouseIn(580, 825, 50, 90)) DrawTextFitKD(TextGet("KinkyDungeonSpecial" + KinkyDungeonPlayerDamage.name), MouseX, MouseY - 150, 750, "#ffffff", "#333333"); - DrawButtonKDEx("rangedattackButton", (b) => { + DrawButtonKDEx("rangedattackButton", (_b) => { return KinkyDungeonRangedAttack(); }, true, 580, 825, 50, 90, "", "#ffffff", KinkyDungeonRootDirectory + "Ranged.png", "", undefined, undefined, undefined, undefined, undefined, @@ -1273,7 +1272,7 @@ function KinkyDungeonDrawActionBar(x, y) { // Crouch button - if (DrawButtonKDEx("toggleCrouch", (bdata) => { + if (DrawButtonKDEx("toggleCrouch", (_bdata) => { KDSendInput("crouch", {}); return true; @@ -1285,7 +1284,7 @@ function KinkyDungeonDrawActionBar(x, y) { })) str = "KDCrouch"; // Pass button - if (DrawButtonKDEx("togglePass", (bdata) => { + if (DrawButtonKDEx("togglePass", (_bdata) => { KinkyDungeonToggleAutoPass = !KinkyDungeonToggleAutoPass; if (KinkyDungeonToggleAutoPass) { KDSetFocusControl("AutoPass"); @@ -1299,7 +1298,7 @@ function KinkyDungeonDrawActionBar(x, y) { hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[1]), })) str = "KDPass"; - if (DrawButtonKDEx("toggleFastMove", (bdata) => { + if (DrawButtonKDEx("toggleFastMove", (_bdata) => { if (!KinkyDungeonFastMoveSuppress) KinkyDungeonFastMove = !KinkyDungeonFastMove; KinkyDungeonFastMoveSuppress = false; @@ -1313,7 +1312,7 @@ function KinkyDungeonDrawActionBar(x, y) { })) str = "KDAutoPath"; // Auto Struggle Button - if (DrawButtonKDEx("AutoStruggle", (bdata) => { + if (DrawButtonKDEx("AutoStruggle", (_bdata) => { if (!KinkyDungeonControlsEnabled()) return false; KDAutoStruggleClick(); return true; @@ -1324,7 +1323,7 @@ function KinkyDungeonDrawActionBar(x, y) { hotkey: KDHotkeyToText(KinkyDungeonKeyToggle[3]), })) str = "KDAutoStruggle"; - if (DrawButtonKDEx("toggleInspect", (bdata) => { + if (DrawButtonKDEx("toggleInspect", (_bdata) => { KDInteracting = false; KinkyDungeonInspect = !KinkyDungeonInspect; KinkyDungeonUpdateLightGrid = true; // Rerender since cam moved @@ -1367,7 +1366,7 @@ function KinkyDungeonDrawActionBar(x, y) { })) str = "KDSprint"; // Door button - if (DrawButtonKDEx("interact", (bdata) => { + if (DrawButtonKDEx("interact", (_bdata) => { KDInteracting = !KDInteracting; KinkyDungeonInspect = false; return true; @@ -1387,7 +1386,7 @@ function KinkyDungeonDrawActionBar(x, y) { else if (KinkyDungeonStatDistraction < KinkyDungeonStatDistractionMax * 0.75) playColor = "#9c2a70"; else playColor = "#cc2f7b"; } else playColor = "#283540"; - if (DrawButtonKDEx("PlayButton", (bdata) => { + if (DrawButtonKDEx("PlayButton", (_bdata) => { if (!KinkyDungeonControlsEnabled()) return false; if (KinkyDungeonCanTryOrgasm()) { // Done, converted to input @@ -1408,7 +1407,7 @@ function KinkyDungeonDrawActionBar(x, y) { })) str = KinkyDungeonCanTryOrgasm() ? "KDLetGo" : "KDPlay"; // Wait Button - if (DrawButtonKDEx("WaitButton", (bdata) => { + if (DrawButtonKDEx("WaitButton", (_bdata) => { if (!KinkyDungeonControlsEnabled()) return false; if (KinkyDungeonAutoWait) { KinkyDungeonAutoWait = false; @@ -1430,7 +1429,7 @@ function KinkyDungeonDrawActionBar(x, y) { })) str = "KDWait"; // Make Noise button - if (DrawButtonKDEx("HelpButton", (bdata) => { + if (DrawButtonKDEx("HelpButton", (_bdata) => { if (!KinkyDungeonControlsEnabled()) return false; KDSendInput("noise", {}); return true; @@ -1456,7 +1455,7 @@ function KinkyDungeonDrawActionBar(x, y) { let setTo = KDFocusControls; for (let button of list) { - DrawButtonKDEx("focus" + KDFocusControls + button[0], (bdata) => { + 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; @@ -1801,17 +1800,6 @@ function KinkyDungeonUpdateStruggleGroups() { 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); @@ -1833,11 +1821,9 @@ function KinkyDungeonUpdateStruggleGroups() { } /** - * - * @param {item} item - * @returns {boolean} + * @param item */ -function KDCanStruggle(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;}); @@ -1845,11 +1831,9 @@ function KDCanStruggle(item) { return true; } /** - * - * @param {item} item - * @returns {boolean} + * @param item */ -function KDCanRemove(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;}); @@ -1858,21 +1842,19 @@ function KDCanRemove(item) { } /** - * - * @param {item} inv - * @param {boolean} allowInaccessible + * @param inv + * @param [allowInaccessible] */ -function KDGetItemLinkIndex(inv, allowInaccessible) { +function KDGetItemLinkIndex(inv: item, _allowInaccessible?: boolean): number { let item = KinkyDungeonGetRestraintItem(KDRestraint(inv).Group); let surfaceItems = KDDynamicLinkListSurface(item); return surfaceItems.indexOf(inv); } /** - * - * @param {number} skip - Skips the button being drawn in this instance + * @param skip - Skips the button being drawn in this instance */ -function KDDrawNavBar(skip, quit = false) { +function KDDrawNavBar(skip: number, _quit: boolean = false) { let by = 440; let bwidth = 140; let bx = 2000 - 10 - bwidth; @@ -1887,7 +1869,7 @@ function KDDrawNavBar(skip, quit = false) { - DrawButtonKDEx((skip == bindex) ? "goGame" : "goQuit", (bdata) => { + DrawButtonKDEx((skip == bindex) ? "goGame" : "goQuit", (_bdata) => { if (skip == 0) { KinkyDungeonDrawState = "Game"; KDRefreshCharacter.set(KinkyDungeonPlayer, true); @@ -1915,9 +1897,9 @@ function KDDrawNavBar(skip, quit = false) { }, 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[1]), + hotkey: KDHotkeyToText(KinkyDungeonKeyMenu[8]), }); bindex++; bInc(); - DrawButtonKDEx((skip == bindex) ? "goGame" : "goInv", (bdata) => { + DrawButtonKDEx((skip == bindex) ? "goGame" : "goInv", (_bdata) => { if (skip == 1) KinkyDungeonDrawState = "Game"; else @@ -1941,7 +1923,7 @@ function KDDrawNavBar(skip, quit = false) { { hotkey: KDHotkeyToText(KinkyDungeonKeyMenu[2]), }); bindex++; bInc();*/ - DrawButtonKDEx((skip == bindex) ? "goGame" : "goSpells", (bdata) => { + DrawButtonKDEx((skip == bindex) ? "goGame" : "goSpells", (_bdata) => { if (skip == 2) KinkyDungeonDrawState = "Game"; else @@ -1958,7 +1940,7 @@ function KDDrawNavBar(skip, quit = false) { 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) => { + DrawButtonKDEx((skip == bindex) ? "goGame" : "goLog", (_bdata) => { if (skip == 3) KinkyDungeonDrawState = "Game"; else { @@ -1995,9 +1977,9 @@ let currentDrawnSGLength = 0; /** * Sets the focus control and also initializes default settings - * @param {string} control + * @param control */ -function KDSetFocusControl(control) { +function KDSetFocusControl(control: string) { KDFocusControls = control; if (control) @@ -2005,9 +1987,14 @@ function KDSetFocusControl(control) { } /** * Sets the focus control and also initializes default settings - * @param {string} control + * @param control */ -function KDInitFocusControl(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])) { @@ -2019,11 +2006,11 @@ function KDInitFocusControl(control) { } } -function KDSetFocusControlToggle(key, value) { +function KDSetFocusControlToggle(key: any, value: any) { KDSendInput("focusControlToggle", {key: key, value: value}); } -function KDInputFocusControlToggle(key, value) { +function KDInputFocusControlToggle(key: string, value: boolean) { if (!KDGameData.FocusControlToggle) KDGameData.FocusControlToggle = {}; if (key) KDGameData.FocusControlToggle[key] = value; @@ -2035,39 +2022,41 @@ function KDInputFocusControlToggle(key, value) { } } } + + localStorage.setItem("focusControl", JSON.stringify(KDGameData.FocusControlToggle)); } -function KDDrawMinimap(MinimapX, MinimapY) { +function KDDrawMinimap(MinimapX: number, MinimapY: number) { if (kdminimap.visible) { let zIndex = (KDExpandMinimap || MouseIn(MinimapX, MinimapY, KDMinimapWidth()+21, KDMinimapHeight()+21)) ? 150 : 90; if (KDExpandMinimap) { let spacing = 40; let starty = MinimapY; let ii = 0; - DrawButtonKDEx("minimapzoomin", (bdata) => { + 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) => { + 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) => { + 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) => { + DrawButtonKDEx("minimapshrink", (_bdata) => { KDMinimapExpandedZoom = Math.max(KDMinimapExpandedZoomTick, KDMinimapExpandedZoom - KDMinimapExpandedZoomTick); KDRedrawMM = 2; KDUpdateMinimapTarget(true); @@ -2078,7 +2067,7 @@ function KDDrawMinimap(MinimapX, MinimapY) { kdminimap.zIndex = zIndex - 1; // Dummy button to prevent clicks from moving the player inadvertently - DrawButtonKDEx("minimapdummy", (bdata) => { + DrawButtonKDEx("minimapdummy", (_bdata) => { KDExpandMinimap = !KDExpandMinimap; return true; }, true, MinimapX-10, MinimapY-10, KDMinimapWidth()+21, KDMinimapHeight()+21, "", KDButtonColor, undefined, undefined, false, true, @@ -2118,7 +2107,7 @@ function KDDrawMinimap(MinimapX, MinimapY) { * @param {number} PartyY * @param {object[]} tooltips */ -function KDDrawPartyMembers(PartyX, PartyY, tooltips) { +function KDDrawPartyMembers(PartyX: number, PartyY: number, tooltips: object[]) { if (KDGameData.Party && KinkyDungeonDrawState == "Game") { let PartyDy = 72; let PartyPad = 8; @@ -2133,25 +2122,25 @@ function KDDrawPartyMembers(PartyX, PartyY, tooltips) { let selected = (PM.buffs?.AllySelect?.duration > 0); - DrawButtonKDExTo(kdstatusboard, "PM" + i + "click", (bdata) => { + 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) => { + 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) => { + 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) => { + 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, @@ -2159,7 +2148,7 @@ function KDDrawPartyMembers(PartyX, PartyY, tooltips) { } if (MouseIn(PartyX, PartyY, PartyDy, PartyDy)) { - tooltips.push((offset) => KDDrawEnemyTooltip(PM, offset)); + tooltips.push((offset: number) => KDDrawEnemyTooltip(PM, offset)); } } else { @@ -2177,14 +2166,14 @@ function KDDrawPartyMembers(PartyX, PartyY, tooltips) { let selected = (PM.buffs?.AllySelect?.duration > 0); - DrawButtonKDExTo(kdstatusboard, "PM" + i + "click", (bdata) => { + 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) => { + 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, @@ -2193,7 +2182,7 @@ function KDDrawPartyMembers(PartyX, PartyY, tooltips) { } if (MouseIn(PartyX, PartyY, PartyDy, PartyDy)) { - tooltips.push((offset) => KDDrawEnemyTooltip(PM, offset)); + tooltips.push((offset: number) => KDDrawEnemyTooltip(PM, offset)); } } @@ -2251,7 +2240,7 @@ function KDGetStatsWeaponCast() { return statsDraw; } -function KDProcessBuffIcons(minXX, minYY, side = false) { +function KDProcessBuffIcons(minXX: number, minYY: number, side: boolean = false) { let statsDraw: Record = {}; let accuracy = KinkyDungeonGetEvasion(); @@ -2720,7 +2709,7 @@ function KDProcessBuffIcons(minXX, minYY, side = false) { KDDrawBuffIcons(minXX, minYY, statsDraw, side); } -function KDDrawBuffIcons(minXX, minYY, statsDraw: Record, side) { +function KDDrawBuffIcons(minXX: number, minYY: number, statsDraw: Record, side: boolean) { // Draw the buff icons let II = 0; let spriteSize = 46; @@ -2739,7 +2728,7 @@ function KDDrawBuffIcons(minXX, minYY, statsDraw: Record, side let tooltipY = 700; //if (Object.values(statsDraw).length > 0 || KDToggleShowAllBuffs) - if (DrawButtonKDEx("toggleShowAllBuffs", (bdata) => { + if (DrawButtonKDEx("toggleShowAllBuffs", (_bdata) => { KDToggleShowAllBuffs = !KDToggleShowAllBuffs; return true; }, true, @@ -2791,7 +2780,7 @@ function KDDrawBuffIcons(minXX, minYY, statsDraw: Record, side 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) => { + DrawButtonKDEx("statHighlight" + II, (_bdata) => { KDSendInput("buffclick", { click: stat.click, buff: stat.buffid, @@ -2881,7 +2870,7 @@ function KDDrawStruggleGroups() { let btn = buttons[sg.left ? button_index : (buttons.length - 1 - button_index)]; if (btn == "Struggle") { - if (DrawButtonKDEx("sgStruggle" + button_index + sg.group, (b) => { + 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) { @@ -2897,19 +2886,19 @@ function KDDrawStruggleGroups() { StruggleType = btn; i++; } else if ((KDGetCurse(item)) && btn == "CurseInfo") { - DrawButtonKDEx("sgCurseInfo" + button_index + sg.group, (b) => { + 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) => { + 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 (DrawButtonKDEx("sgRemove" + button_index + sg.group, (_b) => { if (KinkyDungeonFastStruggle) { KinkyDungeonFastStruggleGroup = sg.group; KinkyDungeonFastStruggleType = (item.lock) ? "Unlock" : "Remove"; @@ -2924,7 +2913,7 @@ function KDDrawStruggleGroups() { && !sg.noCut) { let name = ((KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.name && !KinkyDungeonPlayerDamage.unarmed) ? "Items/" + KinkyDungeonPlayerDamage.name + ".png" : "Cut.png"); if ( - DrawButtonKDEx("sgCut" + button_index + sg.group, (b) => { + DrawButtonKDEx("sgCut" + button_index + sg.group, (_b) => { if (KinkyDungeonFastStruggle) { KinkyDungeonFastStruggleGroup = sg.group; KinkyDungeonFastStruggleType = "Cut"; @@ -2938,7 +2927,7 @@ function KDDrawStruggleGroups() { i++; } else if (!(KDGetCurse(item)) && !sg.blocked && btn == "Pick" && KinkyDungeonLockpicks > 0 && item.lock) { if ( - DrawButtonKDEx("sgPick" + button_index + sg.group, (b) => { + DrawButtonKDEx("sgPick" + button_index + sg.group, (_b) => { if (KinkyDungeonFastStruggle) { KinkyDungeonFastStruggleGroup = sg.group; KinkyDungeonFastStruggleType = "Pick"; @@ -3118,14 +3107,25 @@ function KDDrawStruggleGroups() { } 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)))) + "" + 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(1, Math.max(-1, struggleData.escapeChance - Math.max(0, struggleData.extraLim, struggleData.limitChance))); - let b = Math.min(1, Math.max(-1, struggleData.escapeChance)); + 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; + 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)); @@ -3142,18 +3142,30 @@ function KDDrawStruggleGroups() { b = maxPossible; } - let amnt = Math.round(100 * a) - + "-" - + Math.round(100 * b); + 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) { + else if (a < 0 && b > 0) { a = Math.max(0, a); - amnt = Math.round(100 * a) - + "-" - + Math.round(100 * b); + 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 @@ -3204,7 +3216,7 @@ function KDDrawStruggleGroups() { x + (sg.left ? 250 : 12), y, 48, 48, undefined, {zIndex: 70}); } - DrawButtonKDEx("surfaceItems"+sg.group, (bdata) => { + 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; @@ -3249,11 +3261,9 @@ function KDDrawStruggleGroups() { } /** - * - * @param {number} tightness - * @returns {string} + * @param tightness */ -function KDTightnessRank(tightness) { +function KDTightnessRank(tightness: number): string { let factor = Math.min(10, Math.max(0, Math.floor(tightness/2) * 2)); return factor + ""; -} \ No newline at end of file +} diff --git a/Game/src/base/KinkyDungeonInput.ts b/Game/src/base/KinkyDungeonInput.ts index 8b5dad5ae..21f4ca225 100644 --- a/Game/src/base/KinkyDungeonInput.ts +++ b/Game/src/base/KinkyDungeonInput.ts @@ -3,9 +3,9 @@ let KinkyDungeonInputQueue: {type: string, data: any}[] = []; /** - * - * Delegate to KDProcessInputs */ -function KDProcessInput(type, data): string { + * Delegate to KDProcessInputs + */ +function KDProcessInput(type: string, data: any): string { let Result = null; let loose = null; let msg = ""; @@ -36,8 +36,7 @@ function KDProcessInput(type, data): string { 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); + 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"); } @@ -204,7 +203,8 @@ function KDProcessInput(type, data): string { 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); + //KDCurrentItemLinkable(currentItem, newItem); } if (linkable) { equipped = false; @@ -237,18 +237,22 @@ function KDProcessInput(type, data): string { KDStunTurns(KinkyDungeonGetRestraintByName(data.name)?.protection ? 4 : 2, true); - 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"; + let customEq = KDRestraint(loose).customEquip || ""; + 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"; } - } else if (KDRestraint(loose).enchanted) { - msg = "KinkyDungeonSelfBondageEnchanted"; } + KinkyDungeonSendTextMessage(10, TextGet(msg).replace("RestraintName", TextGet("Restraint" + KDRestraint(loose).name)), "yellow", 1); return msg; @@ -892,7 +896,7 @@ function KDProcessInput(type, data): string { KinkyDungeonConsumableChoices[data.I] = data.name; } else if (KDWeapon({name: data.name})) { KinkyDungeonWeaponChoices[data.I] = data.name; - } else { + } else if (KDRestraint({name: data.name})) { KinkyDungeonArmorChoices[data.I] = data.name; } /* @@ -1265,10 +1269,13 @@ function KDProcessInput(type, data): string { 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" : "")) @@ -1286,6 +1293,8 @@ function KDProcessInput(type, data): string { } if (KDNPCChar.get(data.npc)) KDRefreshCharacter.set(KDNPCChar.get(data.npc), true); + + if (packed) KDPackEnemy(enemy); break; } if (data.GameData) { @@ -1294,7 +1303,7 @@ function KDProcessInput(type, data): string { return ""; } -function KDSendInput(type, data, frame?: boolean, noUpdate?: boolean, process = true): string { +function KDSendInput(type: string, data: any, _frame?: boolean, noUpdate?: boolean, process = true): string { if (!noUpdate) { KDGameData.OrigEnergyLevel = KDGameData.AncientEnergyLevel; @@ -1307,14 +1316,13 @@ function KDSendInput(type, data, frame?: boolean, noUpdate?: boolean, process = KinkyDungeonInputQueue.push({type: type, data: data}); if (process) return KDProcessInputs(true); - else return; + else return ""; } /** * Handles inputs once per frame - * @returns {string} */ -function KDProcessInputs(ReturnResult) { +function KDProcessInputs(ReturnResult?: boolean): string { for (let i = 0; i < 3; i++) { if (KinkyDungeonInputQueue.length > 0) { let input = KinkyDungeonInputQueue.splice(0, 1)[0]; @@ -1329,7 +1337,8 @@ function KDProcessInputs(ReturnResult) { } function KDInteract(x, y) { - KinkyDungeonItemCheck(x, y, MiniGameKinkyDungeonLevel, true); + if (KDistChebyshev(x - KDPlayer().x, y - KDPlayer().y)) + KinkyDungeonItemCheck(x, y, MiniGameKinkyDungeonLevel, true); KDInteracting = false; let tile = KinkyDungeonTilesGet(x + ',' + y); if (tile?.Type) { @@ -1344,4 +1353,4 @@ function KDInteract(x, y) { return KDTileInteract[tiletype](x, y); } -} \ No newline at end of file +} diff --git a/Game/src/base/KinkyDungeonMusic.js b/Game/src/base/KinkyDungeonMusic.ts similarity index 87% rename from Game/src/base/KinkyDungeonMusic.js rename to Game/src/base/KinkyDungeonMusic.ts index ce605b39c..83b109296 100644 --- a/Game/src/base/KinkyDungeonMusic.js +++ b/Game/src/base/KinkyDungeonMusic.ts @@ -22,12 +22,12 @@ let KDMusicYMax = 50; let KDMusicYSpeed = 0.15; let KDMusicToast = ""; -function KDSendMusicToast(song) { +function KDSendMusicToast(song: string): void { KDMusicToast = song; KDMusicUpdateTime = CommonTime(); } -function KDDrawMusic(delta) { +function KDDrawMusic(delta: number): void { if (CommonTime() - KDMusicUpdateTime < KDMusicUpdateDuration) { if (KDMusicY < KDMusicYMax) { KDMusicY = Math.max(0, Math.min(KDMusicY + delta*KDMusicYSpeed, KDMusicYMax)); @@ -61,8 +61,7 @@ let KDCurrentFade = 1; let KDMusicFadeTime = 2500; // 2 seconds let KDMusicFadeInTime = 2500; // 2 seconds let KDMusicTickRate = 100; -/** @type {HTMLAudioElement} */ -let KDCurrentMusicSound = null; +let KDCurrentMusicSound: HTMLAudioElement = null; let KDCurrentMusicSoundUpdate = null; let allowMusic = navigator.userAgent.includes('Electron'); @@ -121,7 +120,7 @@ function KDUpdateMusic() { } if (KDCurrentMusicSound) { - KDCurrentMusicSound.volume = Math.min(Player.AudioSettings.Volume * globalVolume, 1) * KDCurrentFade; + KDCurrentMusicSound.volume = Math.min(globalVolume, 1) * KDCurrentFade; } lastKDMusicTick = performance.now(); @@ -130,11 +129,14 @@ function KDUpdateMusic() { } -function KDPlayMusic(Sound, Volume) { +let KDMusicBusy = false; +function KDPlayMusic(Sound: string, Volume?: number) { + if (KDMusicBusy) return; + KDMusicBusy = true; // Start the new sound let audio = KDCurrentMusicSound || new Audio(); - let vol = Player.AudioSettings.Volume * (Volume != undefined ? Volume : 1.0); + let vol = (typeof Volume != 'undefined' ? Volume : 1.0); KDCurrentMusicSound = audio; KDCurrentMusicSoundUpdate = true; if (KDPatched) { @@ -164,14 +166,17 @@ function KDPlayMusic(Sound, Volume) { 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 the audio:', error.message); - KDSendMusicToast(error.message); // This shouldn't happen, but now you'll get a bug report. + 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; } }); } @@ -184,4 +189,4 @@ function KDEndMusic() { KDCurrentMusicSound.currentTime = 0; KDCurrentMusicSoundUpdate = true; } -} \ No newline at end of file +} diff --git a/Game/src/base/KinkyDungeonVision.js b/Game/src/base/KinkyDungeonVision.ts similarity index 84% rename from Game/src/base/KinkyDungeonVision.js rename to Game/src/base/KinkyDungeonVision.ts index 310d58c0e..5bffbbe04 100644 --- a/Game/src/base/KinkyDungeonVision.js +++ b/Game/src/base/KinkyDungeonVision.ts @@ -3,11 +3,11 @@ // -Ada let KDMinimapIcons = { - '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";}, + '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) @@ -17,15 +17,15 @@ let KDMinimapIcons = { 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";}, + '=': (_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";}, }; @@ -36,7 +36,7 @@ let KinkyDungeonSeeAll = false; let KDVisionBlockers = new Map(); let KDLightBlockers = new Map(); -function KinkyDungeonCheckProjectileClearance(xx, yy, x2, y2) { +function KinkyDungeonCheckProjectileClearance(xx: number, yy: number, x2: number, y2: number): boolean { let tiles = KinkyDungeonTransparentObjects; let moveDirection = KinkyDungeonGetDirection(x2 - xx, y2 - yy); let x1 = xx + moveDirection.x; @@ -51,7 +51,7 @@ function KinkyDungeonCheckProjectileClearance(xx, yy, x2, y2) { return true; } -function KinkyDungeonCheckPathCount(x1, y1, x2, y2, allowBars, blockEnemies, maxFails, blockOnlyLOSBlock) { +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 @@ -88,13 +88,16 @@ function KinkyDungeonCheckPathCount(x1, y1, x2, y2, allowBars, blockEnemies, max return fails; } -function KinkyDungeonCheckPath(x1, y1, x2, y2, allowBars, blockEnemies, maxFails = 1, blockOnlyLOSBlock) { +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; + function KinkyDungeonResetFog() { KDMapData.FogGrid = []; // Generate the grid @@ -104,7 +107,7 @@ function KinkyDungeonResetFog() { } } -function KinkyDungeonMakeBrightnessMap(width, height, mapBrightness, Lights, delta) { +function KinkyDungeonMakeBrightnessMap(_width: number, _height: number, mapBrightness: number, Lights: any[], delta: number): void { let flags = { SeeThroughWalls: 0, }; @@ -132,9 +135,10 @@ function KinkyDungeonMakeBrightnessMap(width, height, mapBrightness, Lights, del let baseBrightness = mapBrightness * KDMapBrightnessMult; for (let X = 0; X < KDMapData.GridWidth; X++) { for (let Y = 0; Y < KDMapData.GridHeight; Y++) - if (KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(X, Y))) { - KinkyDungeonBrightnessSet(X, Y, baseBrightness); - } + if (!GiantMapOptimizations || KDistChebyshev(KDPlayer().x-X, KDPlayer().y-Y) < GiantMapOptimizations) + if (KinkyDungeonTransparentObjects.includes(KinkyDungeonMapGet(X, Y))) { + KinkyDungeonBrightnessSet(X, Y, baseBrightness); + } } let maxPass = 0; @@ -188,10 +192,7 @@ function KinkyDungeonMakeBrightnessMap(width, height, mapBrightness, Lights, del } } - /** - * @type {{x: number, y: number, brightness: number, color: number, shadow: number}[]} - */ - let nextBrightness = []; + 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 @@ -199,31 +200,34 @@ function KinkyDungeonMakeBrightnessMap(width, height, mapBrightness, Lights, del // Main grid square loop for (let X = 1; X < KDMapData.GridWidth - 1; X++) { for (let Y = 1; Y < KDMapData.GridHeight - 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; - + // 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) { - 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)); + 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)); + } } } } @@ -251,14 +255,12 @@ function KinkyDungeonMakeBrightnessMap(width, height, mapBrightness, Lights, del KDPlayerLight = KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); } -/** Averages two hex colors according to weights w1 and w2 - * @param {number} color1 - * @param {number} color2 +/** + * Averages two hex colors according to weights w1 and w2 * @param {number} w1 - Weight of color1 * @param {number} w2 - Weight of color2 - * @returns {number} */ -function KDAvgColor(color1, color2, w1, w2) { +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); @@ -269,7 +271,7 @@ function KDAvgColor(color1, color2, w1, w2) { return (r << 16) + (g << 8) + b; } -function KinkyDungeonMakeVisionMap(width, height, Viewports, Lights, delta, mapBrightness) { +function KinkyDungeonMakeVisionMap(width: number, height: number, Viewports: any, Lights: any, delta: number, _mapBrightness: number): void { let flags = { SeeThroughWalls: 0, nightVision: KDGameData.NightVision, @@ -341,13 +343,16 @@ function KinkyDungeonMakeVisionMap(width, height, Viewports, Lights, delta, mapB 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 (KinkyDungeonCheckPath(X, Y, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, true, flags.SeeThroughWalls ? flags.SeeThroughWalls + 1 : 1, true) + 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); @@ -417,10 +422,7 @@ function KinkyDungeonMakeVisionMap(width, height, Viewports, Lights, delta, mapB } - /** - * @type {{x: number, y: number, brightness: number}[]} - */ - let nextBrightness = []; + 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 @@ -428,6 +430,7 @@ function KinkyDungeonMakeVisionMap(width, height, Viewports, Lights, delta, mapB // 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); @@ -475,6 +478,7 @@ function KinkyDungeonMakeVisionMap(width, height, Viewports, Lights, delta, mapB // 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)) { @@ -485,6 +489,7 @@ function KinkyDungeonMakeVisionMap(width, height, Viewports, Lights, delta, mapB 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); @@ -514,7 +519,7 @@ function KinkyDungeonMakeVisionMap(width, height, Viewports, Lights, delta, mapB let fog = true;//KDAllowFog(); 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 (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); @@ -549,7 +554,7 @@ function KinkyDungeonMakeVisionMap(width, height, Viewports, Lights, delta, mapB let KDLightCropValue = 6; -function KDDrawFog(CamX, CamY, CamX_offset, CamY_offset, CamX_offsetVis, CamY_offsetVis) { +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(); @@ -765,7 +770,8 @@ function KDDrawFog(CamX, CamY, CamX_offset, CamY_offset, CamX_offsetVis, CamY_of } PIXIapp.renderer.render(kdlightmapGFX, { - renderTexture: kdlightmap + renderTexture: kdlightmap, + blit: true, }); @@ -798,7 +804,8 @@ function KDDrawFog(CamX, CamY, CamX_offset, CamY_offset, CamX_offsetVis, CamY_of } PIXIapp.renderer.render(kdbrightnessmapGFX, { - renderTexture: kdbrightnessmap + renderTexture: kdbrightnessmap, + blit: true, }); } @@ -882,17 +889,16 @@ let KDMinimapHTarget = KDMinimapHCurrent; /** - * - * @param {number} x - * @param {number} y - * @param {number} w - * @param {number} h - * @param {number} scale - * @param {number} alpha - * @param {boolean} gridborders - * @param {boolean} blackMap + * @param x + * @param y + * @param w + * @param h + * @param scale + * @param alpha + * @param gridborders + * @param blackMap */ -function KDRenderMinimap(x, y, w, h, scale, alpha, gridborders, 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); @@ -974,14 +980,13 @@ function KDAllowFog() { } /** - * - * @param {number} x - * @param {number} y - * @param {number} amount + * @param x + * @param y + * @param amount */ -function KDRevealTile(x, y, 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); -} \ No newline at end of file +} diff --git a/Game/src/collection/KDCollectionWander.ts b/Game/src/collection/KDCollectionWander.ts index 3f0a54cdf..17e4ce76d 100644 --- a/Game/src/collection/KDCollectionWander.ts +++ b/Game/src/collection/KDCollectionWander.ts @@ -80,6 +80,8 @@ function KDSetServantSpawnTemplate(e: entity) { KDNPCRefreshBondage(e.id, 0, true); KinkyDungeonSetEnemyFlag(e, "NoFollow", -1); e.hp = e.Enemy.maxhp; + e.hostile = undefined; + e.rage = undefined; } } function KDSetPrisonerSpawnTemplate(e: entity) { diff --git a/Game/src/collection/KDCuddleLounge.ts b/Game/src/collection/KDCuddleLounge.ts index abb41d13b..4e0d4d24b 100644 --- a/Game/src/collection/KDCuddleLounge.ts +++ b/Game/src/collection/KDCuddleLounge.ts @@ -7,9 +7,15 @@ function KDDrawCuddleLounge(x: number, y: number, width: number): number { let rate = KDCuddleLoungeGain(); let ii = 0; - DrawTextFitKD(TextGet("KDCuddleLounge1").replace("AMNT", Math.round(rate.servants*10)/10 + ""), + 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.prisoners*10)/10 + ""), + 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"); @@ -32,10 +38,12 @@ let KDCuddleLoungePersonalityMult = { }, }; -function KDCuddleLoungeGain(): {servants: number, prisoners: number} { +function KDCuddleLoungeGain(): {servants: number, prisoners: number, servantPoints: number, prisonerPoints: number} { let data = { servants: 0, prisoners: 0, + servantPoints: 0, + prisonerPoints: 0, efficiency: KDGetManagementEfficiency(), }; @@ -46,6 +54,7 @@ function KDCuddleLoungeGain(): {servants: number, prisoners: number} { 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; @@ -54,24 +63,29 @@ function KDCuddleLoungeGain(): {servants: number, prisoners: number} { mult *= KDCuddleLoungePersonalityMult.Servant[personality]; } let x = (1+KDEnemyTypeRank(KinkyDungeonGetEnemyByName(value.type))); - data.servants += mult * 0.1 * (0.65+0.25*x+0.125*x*x); - data.prisoners += mult * 1 * (0.65+0.25*x+0.125*x*x); + 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.Servant[personality]; + mult *= KDCuddleLoungePersonalityMult.Prisoner[personality]; } let x = (1+KDEnemyTypeRank(KinkyDungeonGetEnemyByName(value.type))); - data.servants += mult * 0.1 * (0.65+0.25*x+0.125*x*x); - data.prisoners += mult * 1 * (0.65+0.25*x+0.125*x*x); + 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); } } diff --git a/Game/src/collection/KDRecyclerList.ts b/Game/src/collection/KDRecyclerList.ts index 6e004ba06..0fd93d36b 100644 --- a/Game/src/collection/KDRecyclerList.ts +++ b/Game/src/collection/KDRecyclerList.ts @@ -29,6 +29,8 @@ let KDRecyclerCategories: Record = { 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: { @@ -315,6 +317,8 @@ let KDRecyclerCategories: Record = { name: "Dress", prereq: () => {return true;}, items: [ + KDAutoGenRestraintBlueprint("ObsidianLeash", "Dress", "", 1, + {Rope: 20, Runes: 1}, undefined, 20), KDAutoGenRestraintBlueprint("BindingDress", "Dress", "", 1, {Rope: 50, Latex: 10}), KDAutoGenRestraintBlueprint("DressGag", "Dress", "", 1, diff --git a/Game/src/collection/KinkyDungeonCollection.js b/Game/src/collection/KinkyDungeonCollection.ts similarity index 85% rename from Game/src/collection/KinkyDungeonCollection.js rename to Game/src/collection/KinkyDungeonCollection.ts index 6c86dfdbb..de2d30865 100644 --- a/Game/src/collection/KinkyDungeonCollection.js +++ b/Game/src/collection/KinkyDungeonCollection.ts @@ -3,10 +3,7 @@ let KDCollectionTab = ""; let KDCurrentFacilityTarget = ""; -/** - * @type {string[]} - */ -let KDCurrentFacilityCollectionType = []; +let KDCurrentFacilityCollectionType: string[] = []; let KDCurrentRestrainingTarget = 0; let KDCollectionTabStatus = ""; @@ -29,12 +26,18 @@ let KDCollectionTabButtons = [ let KDCollFilter = ""; -let KDCollectionFilters = { +type CollectionFilterItem = { + Current: number; + Options: string[]; + FilterCode: Record boolean>; +} + +let KDCollectionFilters: Record = { Opinion: { Current: 0, Options: ["", "Positive", "Negative"], FilterCode: { - "": (value) => {return true;}, + "": (_value) => {return true;}, Negative: (value) => {return !value.Opinion || value.Opinion < 0;}, Positive: (value) => {return value.Opinion > 0;}, }, @@ -43,7 +46,7 @@ let KDCollectionFilters = { Current: 0, Options: ["", "EscapeRisk", "Escaped", "Imprisoned"], FilterCode: { - "": (value) => {return true;}, + "": (_value) => {return true;}, Safe: (value) => {return !KDNPCUnavailable(value.id, value.status);}, EscapeRisk: (value) => {return !value.escaped && value.escapegrace;}, Escaped: (value) => {return value.escaped;}, @@ -54,7 +57,7 @@ let KDCollectionFilters = { Current: 0, Options: ["", "Bound", "Free"], FilterCode: { - "": (value) => {return true;}, + "": (_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;}, }, @@ -63,7 +66,7 @@ let KDCollectionFilters = { Current: 0, Options: ["", "Available", "Unavailable"], FilterCode: { - "": (value) => {return true;}, + "": (_value) => {return true;}, Available: (value) => {return !KDNPCUnavailable(value.id, value.status);}, Unavailable: (value) => {return KDNPCUnavailable(value.id, value.status);}, }, @@ -72,7 +75,7 @@ let KDCollectionFilters = { Current: 0, Options: ["", "Rank0", "Rank1", "Rank2", "Rank3", "Rank4", "Rank5"], FilterCode: { - "": (value) => {return true;}, + "": (_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));}, @@ -92,11 +95,11 @@ let KDCollectionFilters = { },*/ }; -function KDDrawCollectionFilters(x, y) { +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) => { + if (DrawButtonKDEx("KDCollFilter" + filter[0], (_b) => { filter[1].Current += 1; if (filter[1].Current >= filter[1].Options.length) { filter[1].Current = 0; @@ -112,11 +115,12 @@ function KDDrawCollectionFilters(x, y) { } } } -function KDDrawCollectionTabOptions(x, y) { + +function KDDrawCollectionTabOptions(x: number, y: number) { let spacing = 80; let II = 0; for (let tab of KDCollectionTabButtons) { - if (DrawButtonKDEx("KDCollTabSet" + tab, (b) => { + if (DrawButtonKDEx("KDCollTabSet" + tab, (_b) => { if (KDCollectionTab) KDCollectionTab = ""; else KDCollectionTab = tab; return true; @@ -132,7 +136,7 @@ function KDDrawCollectionTabOptions(x, y) { } } -function KinkyDungeonDrawCollection(xOffset = -125) { +function KinkyDungeonDrawCollection(xOffset: number = -125) { let x = 1225 + xOffset; if (!KDGameData.Collection) KDGameData.Collection = {}; @@ -171,11 +175,9 @@ function KinkyDungeonDrawBondage(xOffset = -125) { } /** - * - * @param {number} id - * @returns {string} + * @param id */ -function KDCollectionImage(id) { +function KDCollectionImage(id: number): string { let value = KDGameData.Collection["" + id]; if (value) { let sp = (value.sprite || value.type); @@ -194,11 +196,10 @@ function KDCollectionImage(id) { } /** - * - * @param {number} id - * @param {number} amount + * @param id + * @param amount */ -function KDAddOpinionPersistent(id, amount) { +function KDAddOpinionPersistent(id: number, amount: number): void { let opinion = undefined; if (KDIsNPCPersistent(id)) { KDUpdatePersistentNPC(id); @@ -212,24 +213,20 @@ function KDAddOpinionPersistent(id, amount) { } else { KDAddOpinionCollection(KDGameData.Collection[id + ""], amount); } - } - - } /** * Gets the opinion, unmodified by various factors - * @param {number} id - * @param {boolean} [allowFaction] Optionally apply faction rep modifier - * @param {boolean} [allowSub] Optionally apply sub modifier - * @param {boolean} [allowPerk] Optionally apply perk modifiers - * @param {number} [allowOnlyPosNegFaction] positive: allows only positive faction rep, negative: allows only negative faction rep - * @returns {number} + * @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, allowFaction = true, allowSub = true, allowPerk = true, allowOnlyPosNegFaction = 0) { +function KDGetModifiedOpinionID(id: number, allowFaction: boolean = true, allowSub: boolean = true, allowPerk: boolean = true, allowOnlyPosNegFaction: number = 0): number { if (KDIsNPCPersistent(id)) { let enemy = KDGetPersistentNPC(id).entity; let op = enemy.opinion || KDGameData.Collection[enemy.id]?.Opinion || 0; @@ -275,22 +272,27 @@ function KDGetModifiedOpinionID(id, allowFaction = true, allowSub = true, allowP /** * - * @param {entity} enemy - * @returns {boolean} + * @param enemy */ -function KDCapturable(enemy) { - return !(KDNoCaptureTypes.some((tag) => {return enemy.Enemy.tags[tag];})); +function KDCapturable(enemy: entity): boolean { + return enemy?.Enemy.bound && !enemy.Enemy.allied && !(KDNoCaptureTypes.some((tag) => {return enemy.Enemy.tags[tag];})); } /** - * - * @param {entity} enemy - * @param {string} [status] - * @param {string} [status] - * @param {string} [servantclass] - * @param {string} [type] + * @param enemy */ -function KDAddCollection(enemy, type, status, servantclass) { +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(); @@ -298,8 +300,7 @@ function KDAddCollection(enemy, type, status, servantclass) { if (!KDGameData.Collection["" + enemy.id]) { // Add her - /** @type {KDCollectionEntry} */ - let entry = { + let entry: KDCollectionEntry = { id: enemy.id, name: KDGetPersistentNPC(enemy.id).Name, sprite: (enemy.CustomSprite) || enemy.Enemy.name, @@ -369,11 +370,10 @@ function KDAddCollection(enemy, type, status, servantclass) { -function KDUpdateCollectionFlags(delta) { +function KDUpdateCollectionFlags(delta: number) { for (let npc of Object.values(KDGameData.Collection)) { if (npc.flags) { - /** @type {Record} */ - let newF = {}; + 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; @@ -386,33 +386,27 @@ function KDUpdateCollectionFlags(delta) { } /** - * - * @param {entity} entity - * @returns {Character} + * @param entity */ -function KDGetCharacter(entity) { +function KDGetCharacter(entity: entity): Character { if (entity?.id == KDPlayer().id) { return KinkyDungeonPlayer; } return KDNPCChar.get(entity.id); } /** - * - * @param {Character} C - * @returns {number} + * @param C */ -function KDGetCharacterID(C) { +function KDGetCharacterID(C: Character): number { if (C == KinkyDungeonPlayer) { return KDPlayer().id; } return KDNPCChar_ID.get(C); } /** - * - * @param {Character} C - * @returns {entity} + * @param C */ -function KDGetCharacterEntity(C) { +function KDGetCharacterEntity(C: Character): entity { if (C == KinkyDungeonPlayer) { return KDPlayer(); } @@ -422,14 +416,13 @@ function KDGetCharacterEntity(C) { } /** - * - * @param {KDCollectionEntry} value - * @param {number} x - * @param {number} y - * @param {number} index - * @param {string} tab + * @param value + * @param x + * @param y + * @param index + * @param [tab] */ -function KDDrawSelectedCollectionMember(value, x, y, index, tab = "") { +function KDDrawSelectedCollectionMember(value: KDCollectionEntry, x: number, y: number, index: number, tab: string = "") { FillRectKD(kdcanvas, kdpixisprites, "collectionselectionbg", { Left: x, @@ -527,7 +520,7 @@ function KDDrawSelectedCollectionMember(value, x, y, index, tab = "") { } if (!KDNPCChar.get(value.id)) { - KDSpeakerNPC = suppressCanvasUpdate(() => CharacterLoadNPC("coll" + value.id)); + KDSpeakerNPC = suppressCanvasUpdate(() => CharacterLoadNPC(value.id, value.name, value.Palette)); KDNPCChar.set(value.id, KDSpeakerNPC); KDNPCChar_ID.set(KDSpeakerNPC, value.id); KDNPCStyle.set(KDSpeakerNPC, value); @@ -564,7 +557,7 @@ function KDDrawSelectedCollectionMember(value, x, y, index, tab = "") { } if (KDSpeakerNPC) { - if (KinkyDungeonCheckClothesLoss) { + if (KinkyDungeonCheckClothesLoss || KDRefreshCharacter.get(KDSpeakerNPC)) { if (!NPCTags.get(KDSpeakerNPC)) { NPCTags.set(KDSpeakerNPC, new Map()); } @@ -578,7 +571,7 @@ function KDDrawSelectedCollectionMember(value, x, y, index, tab = "") { let III = 0; let buttonSpacing = 85; - if (!KDCollectionTab && KDGameData.Collection[value.id + ""] && DrawButtonKDEx("dressNPC", (b) => { + if (!KDCollectionTab && KDGameData.Collection[value.id + ""] && DrawButtonKDEx("dressNPC", (_b) => { if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "LightJingle" + ".ogg"); //KDSpeakerNPC = null; @@ -590,7 +583,8 @@ function KDDrawSelectedCollectionMember(value, x, y, index, tab = "") { KDWardrobeCallback = () => { let value2 = value; //if (KDOriginalValue) { - value2.customOutfit = LZString.compressToBase64(CharacterAppearanceStringify(KDSpeakerNPC)); + value2.customOutfit = LZString.compressToBase64(AppearanceItemStringify(KDSpeakerNPC.Appearance)); + value2.Palette = KDSpeakerNPC.Palette; KDRefreshCharacter.set(KDSpeakerNPC, true); //} @@ -622,8 +616,11 @@ function KDDrawSelectedCollectionMember(value, x, y, index, tab = "") { KinkyDungeonInitializeDresses(); KDUpdateModelList(); KDRefreshOutfitInfo(); - let orig = localStorage.getItem("kinkydungeonappearance" + KDCurrentOutfit); - let current = LZString.compressToBase64(CharacterAppearanceStringify(KinkyDungeonPlayer)); + 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); //KinkyDungeonDressPlayer(KDSpeakerNPC, true, true); @@ -663,7 +660,7 @@ function KDDrawSelectedCollectionMember(value, x, y, index, tab = "") { zIndex: 160, } ); - if (DrawButtonKDEx("facilityAssign", (b) => { + if (DrawButtonKDEx("facilityAssign", (_b) => { if (!valid) return false; if (!assigned) { let data = KDGameData.FacilitiesData[collType + "_" + KDCurrentFacilityTarget]; @@ -677,10 +674,7 @@ function KDDrawSelectedCollectionMember(value, x, y, index, tab = "") { }); for (let f of listRender) { for (let dt of KDFacilityCollectionDataTypes) { - /** - * @type {number[]} - */ - let data = KDGameData.FacilitiesData[dt + "_" + f[0]]; + let data: number[] = KDGameData.FacilitiesData[dt + "_" + f[0]]; if (data?.includes(value.id)) { delete value.Facility; data.splice(data.indexOf(value.id), 1); @@ -715,12 +709,11 @@ function KDDrawSelectedCollectionMember(value, x, y, index, tab = "") { } /** - * - * @param {number} id - * @param {number} x - * @param {number} y + * @param id + * @param x + * @param y */ -function KDDrawCollectionRestrain(id, x, y) { +function KDDrawCollectionRestrain(id: number, x: number, y: number) { if (!KDGameData.CollectionSorted) KDSortCollection(); KDDrawCollectionRestrainMain(id, x, y); @@ -731,17 +724,13 @@ function KDDrawCollectionRestrain(id, x, y) { /** * Gets the collection entry, or a virtual one if one doesnt exist - * @param {number} id - * @returns {KDCollectionEntry} + * @param id */ -function KDGetVirtualCollectionEntry(id) { +function KDGetVirtualCollectionEntry(id: number): KDCollectionEntry { if (KDGameData.Collection["" + id]) return KDGameData.Collection["" + id]; let enemy = KDGetGlobalEntity(id); - /** - * @type {KDCollectionEntry} - */ - let entry = { + let entry: KDCollectionEntry = { id: enemy.id, name: KDIsNPCPersistent(id) ? KDGetPersistentNPC(enemy.id).Name @@ -788,31 +777,25 @@ function KDGetVirtualCollectionEntry(id) { } /** - * - * @param {number} id - * @param {number} x - * @param {number} y + * @param id + * @param x + * @param y */ -function KDDrawCollectionRestrainMain(id, x, y) { - +function KDDrawCollectionRestrainMain(id: number, x: number, y: number) { let restraints = KDGetNPCRestraints(id); KDDrawNPCRestrain(id, restraints, x, y); - - } -function KDIsImprisonedByEnemy(id) { +function KDIsImprisonedByEnemy(id: number) { return KDIsImprisoned(KDGetGlobalEntity(id)) && !KDIsInPlayerBase(id); } /** - * - * @param {number} id - * @param {string} status - * @returns {boolean} + * @param id + * @param status */ -function KDNPCUnavailable(id, status) { +function KDNPCUnavailable(id: number, status: string): boolean { return KDGameData.Collection[id + ""]?.escaped || (KDIsNPCPersistent(id) && ( //KDGameData.NPCRestraints[id + ""]?.Device != undefined @@ -827,14 +810,8 @@ function KDNPCUnavailable(id, status) { } -/** - * @type {Map} - */ -let KDNPCChar = new Map(); -/** - * @type {Map} - */ -let KDNPCChar_ID = new Map(); +let KDNPCChar: Map = new Map(); +let KDNPCChar_ID: Map = new Map(); let KDNPCStyle = new Map(); let KDCollectionSelected = 0; let KDCollectionIndex = 0; @@ -843,12 +820,9 @@ let KDCollectionRows = 6; let KDCollectionColumns = 10; let KDCollectionSpacing = 80; -/** - * @type {KDCollectionEntry[]} - */ -let KDDrawnCollectionInventory = []; +let KDDrawnCollectionInventory: KDCollectionEntry[] = []; -function KDDrawCollectionInventory(x, y, drawCallback) { +function KDDrawCollectionInventory(x: number, y: number, drawCallback?: (value: KDCollectionEntry, X: number, Y: number) => void) { if (!KDGameData.CollectionSorted) KDSortCollection(); let XX = x; @@ -861,7 +835,7 @@ function KDDrawCollectionInventory(x, y, drawCallback) { if (KDCollectionIndex + KDCollectionRows * KDCollectionColumns < KDGameData.CollectionSorted.length) { - DrawButtonKDEx("collDOWN", (b) => { + DrawButtonKDEx("collDOWN", (_b) => { KDCollectionIndex = Math.max( 0, Math.min( @@ -874,7 +848,7 @@ function KDDrawCollectionInventory(x, y, drawCallback) { ); } if (KDCollectionIndex > 0) { - DrawButtonKDEx("collUP", (b) => { + DrawButtonKDEx("collUP", (_b) => { KDCollectionIndex = Math.max( 0, Math.min( @@ -898,7 +872,7 @@ function KDDrawCollectionInventory(x, y, drawCallback) { let xpad = 24; for (let i = 0; i < KDCollectionTabStatusOptions.length; i++) { let option = KDCollectionTabStatusOptions[i]; - DrawButtonKDEx("collectionTab" + option, (b) => { + DrawButtonKDEx("collectionTab" + option, (_b) => { KDCollectionTabStatus = option; return true; },true, @@ -917,7 +891,7 @@ function KDDrawCollectionInventory(x, y, drawCallback) { if (TF.Created) { //KDCollFilter = ""; ElementValue("CollFilter", KDCollFilter || ""); - TF.Element.oninput = (event) => { + TF.Element.oninput = (_event) => { KDCollFilter = ElementValue("CollFilter"); KDCollectionIndex = 0; }; @@ -979,7 +953,7 @@ function KDDrawCollectionInventory(x, y, drawCallback) { } - if (DrawButtonKDEx(value.name + "_coll," + value.id, (data) => { + if (DrawButtonKDEx(value.name + "_coll," + value.id, (_data) => { KDCollectionSelected = value.id; return true; }, true, @@ -1060,7 +1034,7 @@ function KDDrawCollectionInventory(x, y, drawCallback) { } - if (DrawButtonKDEx(value.name + "_guest," + value.id, (data) => { + if (DrawButtonKDEx(value.name + "_guest," + value.id, (_data) => { KDCollectionSelected = value.id; return true; }, true, @@ -1128,10 +1102,9 @@ function KDDrawCollectionInventory(x, y, drawCallback) { } /** - * - * @param {KDCollectionEntry} value + * @param value */ -function KDValidateEscapeGrace(value) { +function KDValidateEscapeGrace(value: KDCollectionEntry) { if (KDWantsToEscape(value)) { let entity = KDGetGlobalEntity(value.id); let bondageAmount = Math.min(entity?.boundLevel || 0, @@ -1179,11 +1152,9 @@ function KDSortCollection() { } /** - * - * @param {entity} enemy - * @returns {string} + * @param enemy */ -function KDGetEnemyName(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; @@ -1192,18 +1163,23 @@ function KDGetEnemyName(enemy) { else return KDNameList.default[Math.floor(KDNameList.default.length * KDRandom())]; } +/** + * @deprecated + * @param enemy + */ +function KDGetEnemyName(enemy: entity): string { + return KDGenEnemyName(enemy); +} + let KDCollectionTabScreen = { }; -/** - * @type {Record} - */ -let KDCollectionTabDraw = { +let KDCollectionTabDraw: Record = { Imprison: (value, buttonSpacing, III, x, y) => { let entity = KinkyDungeonFindID(value.id) || KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); - if (DrawButtonKDEx("ImprisonNPC", (b) => { + if (DrawButtonKDEx("ImprisonNPC", (_b) => { if (entity || KDNPCUnavailable(value.id, value.status)) { return false; @@ -1251,8 +1227,69 @@ let KDCollectionTabDraw = { } 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 (KDToggles.Sound) + 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) ? "#ff5555" : KDButtonColor)) { + 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 (KDGameData.Collection[value.id + ""] && DrawButtonKDEx("RestrainFree", (_b) => { if (!KDIsNPCPersistent(value.id) || KDGetPersistentNPC(value.id).collect) KDSendInput("freeNPCRestraint", { npc: value.id, @@ -1271,7 +1308,7 @@ let KDCollectionTabDraw = { DrawTextFitKD(TextGet("KDFreePrisoner"), x + 220, y + 750, 500, "#ffffff", KDTextGray0); } - if (DrawButtonKDEx("returnToCollectionRestrain", (b) => { + if (DrawButtonKDEx("returnToCollectionRestrain", (_b) => { KDCurrentRestrainingTarget = 0; if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "LockLight" + ".ogg"); @@ -1285,7 +1322,7 @@ let KDCollectionTabDraw = { return III; }, Default: (value, buttonSpacing, III, x, y) => { - if (KDPromotableStatus.includes(value.status) && DrawButtonKDEx("promoteNPC", (b) => { + if (KDPromotableStatus.includes(value.status) && DrawButtonKDEx("promoteNPC", (_b) => { if (!(KDGameData.CollectionGuests >= KDCollectionGuestRows*KDCollectionColumns)) { if (KDCanPromote(value)) { KDPromote(value); @@ -1299,7 +1336,7 @@ let KDCollectionTabDraw = { }, 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) ? "#ff5555" : "")) { DrawTextFitKD(TextGet(KDCanPromote(value) ? "KDPromoteNPC" : "KDPromoteNotEnough"), x + 220, y + 750, 500, "#ffffff", KDTextGray0); - } else if (value.status == "Servant" && DrawButtonKDEx("demoteNPC", (b) => { + } else if (value.status == "Servant" && DrawButtonKDEx("demoteNPC", (_b) => { value.status = value.oldstatus || ""; delete value.Facility; KDSortCollection(); @@ -1316,7 +1353,7 @@ let KDCollectionTabDraw = { || Object.values(KDGetNPCRestraints(value.id)).length > 0 || KDIsOKWithRestraining(value)) && !KDNPCUnavailable(value.id, value.status)) - if (DrawButtonKDEx("CollectionRestrain", (b) => { + if (DrawButtonKDEx("CollectionRestrain", (_b) => { KDCurrentRestrainingTarget = value.id; if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + "Chain" + ".ogg"); @@ -1332,13 +1369,13 @@ let KDCollectionTabDraw = { }; /** - * - * @param {KDCollectionEntry} value - * @param {number} x - * @param {number} y - * @returns {number} II + * @param value + * @param x + * @param y + * @param width + * @returns II */ -function KDDrawNPCBars(value, x, y, width) { +function KDDrawNPCBars(value: KDCollectionEntry, x: number, y: number, width: number): number { let enemy = KDGetGlobalEntity(value.id); if (!enemy) return 0; @@ -1361,7 +1398,7 @@ function KDDrawNPCBars(value, x, y, width) { let visualbond = bindAmpMod * enemy.visual_boundlevel; let bindingBars = maxBars;//Math.ceil( visualbond / enemy.Enemy.maxhp); let SM = KDGetEnemyStruggleMod(enemy, true, defaultSpeed); - let futureBound = KDPredictStruggle(enemy, SM, 1); + 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++; @@ -1424,14 +1461,13 @@ function KDDrawNPCBars(value, x, y, width) { /** * Whether or not you can promote to servant - * @param {KDCollectionEntry} value - * @returns {boolean} + * @param value */ -function KDCanPromote(value) { +function KDCanPromote(value: KDCollectionEntry): boolean { return KDGetModifiedOpinionID(value.id) > 0 || value.Opinion > 0; } -function KDPromote(value) { +function KDPromote(value: KDCollectionEntry) { value.status = "Servant"; if (KDIsNPCPersistent(value.id)) { KDGetPersistentNPC(value.id).collect = true; @@ -1440,4 +1476,4 @@ function KDPromote(value) { KDUpdatePersistentNPC(value.id); } delete value.Facility; -} \ No newline at end of file +} diff --git a/Game/src/collection/NPCAutoBind.ts b/Game/src/collection/NPCAutoBind.ts index 5c595b6d2..8e2d2b3cd 100644 --- a/Game/src/collection/NPCAutoBind.ts +++ b/Game/src/collection/NPCAutoBind.ts @@ -32,50 +32,45 @@ KDCollectionTabDraw.AutoBind = (value, buttonSpacing, III, x, y) => { if (restraints) { // Readd for (let i = 0; i < 2; i++) // To bruteforce conditions - for (let inv of Object.entries(restraints)) { - 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 - ) - ) { - if (!(KinkyDungeonInventoryGetSafe(inv[1].name) - && KinkyDungeonInventoryGetSafe(inv[1].name).quantity != 0)) { - if ((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, - variant: inv[1].variant, - events: inv[1].events, - powerbonus: inv[1].powerbonus, - inventoryVariant: inv[1].inventoryVariant, - - npc: value.id, - player: KDPlayer().id, - })) { - 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) - ); - } - } + 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, + variant: inv[1].variant, + 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)) @@ -147,50 +142,44 @@ KDCollectionTabDraw.AutoBind = (value, buttonSpacing, III, x, y) => { let restraints: Record = JSON.parse(JSON.stringify(KDAutoBindRestraints)); if (restraints) { for (let i = 0; i < 2; i++) // To bruteforce conditions - for (let inv of Object.entries(restraints)) { - 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 - ) - ) { - if (!(KinkyDungeonInventoryGetSafe(inv[1].name) - && KinkyDungeonInventoryGetSafe(inv[1].name).quantity != 0)) { - if ((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, - variant: inv[1].variant, - events: inv[1].events, - powerbonus: inv[1].powerbonus, - inventoryVariant: inv[1].inventoryVariant, - - npc: value.id, - player: KDPlayer().id, - })) { - 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) - ); - } - } + 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, + variant: inv[1].variant, + 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); } } diff --git a/Game/src/collection/NPCRelease.ts b/Game/src/collection/NPCRelease.ts index 502ecc297..cfd40075d 100644 --- a/Game/src/collection/NPCRelease.ts +++ b/Game/src/collection/NPCRelease.ts @@ -1,5 +1,6 @@ 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) => { @@ -140,6 +141,7 @@ KDCollectionTabDraw.Release = (value, buttonSpacing, III, x, y) => { 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]) @@ -175,4 +177,4 @@ function KDRansomValue(id: number) { function KDIsInPlayerBase(id: number) { return (KDIsNPCPersistent(id) && KDGetPersistentNPC(id)?.room == "Summit") || (KDGameData.Collection[id + ""] && !KDIsNPCPersistent(id)); -} \ No newline at end of file +} diff --git a/Game/src/collection/NPCRestrain.ts b/Game/src/collection/NPCRestrain.ts index df5d67ac8..82e80e87f 100644 --- a/Game/src/collection/NPCRestrain.ts +++ b/Game/src/collection/NPCRestrain.ts @@ -704,10 +704,15 @@ function KDInputSetNPCRestraint(data): boolean { } 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), @@ -784,6 +789,8 @@ function KDInputSetNPCRestraint(data): boolean { } } } + + if (packed) KDPackEnemy(globalEntity); } else { let rests = KDGetNPCRestraints(data.npc); @@ -826,6 +833,8 @@ function KDInputSetNPCRestraint(data): boolean { NPCTags.set(npcSprite, KinkyDungeonUpdateRestraints(npcSprite, data.npc, 0)); } + if (packed) KDPackEnemy(globalEntity); + return true; } @@ -884,9 +893,13 @@ function KDGetExpectedBondageAmount(id: number, target: entity): Record= stats.amount) { - retval.push({slot: entry[0], inv: entry[1]}); + if (KDRestraint(entry[1])) { + let stats = KDGetRestraintBondageStats(entry[1], target); + if (strugglePoints[stats.type] >= stats.amount) { + retval.push({slot: entry[0], inv: entry[1]}); + } + } else if (entry[1]) { + KinkyDungeonSendTextMessage(12, TextGet("KDErrorMods"), "#ff5555", 2, true); } + } } return retval; @@ -975,7 +993,9 @@ 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))); + || (!KDIsImprisoned(KDGetGlobalEntity(value.id)) + )) + && !KDIsInPartyID(value.id); } function KDIsOKWithRestraining(value: KDCollectionEntry): boolean { return (value.Opinion > 0) diff --git a/Game/src/collection/NPCRestrainList.ts b/Game/src/collection/NPCRestrainList.ts index 085749838..bb6a07f9f 100644 --- a/Game/src/collection/NPCRestrainList.ts +++ b/Game/src/collection/NPCRestrainList.ts @@ -23,6 +23,18 @@ let NPCBindingRestraintSize = { Spreaderbars: 2, Petsuits: 2, } +let NPCBindingMouthSlots = [ + "Muzzle", + "OuterGag", + "InterGag", + "InnerGag", +] +let NPCBindingNeckSlots = [ + "Collar", + "ModulePunish", + "ModuleUtility", + "CollarTag", +] interface KDBondageStats { level: number, diff --git a/Game/src/dialogue/KinkyDungeonDialogue.js b/Game/src/dialogue/KinkyDungeonDialogue.ts similarity index 86% rename from Game/src/dialogue/KinkyDungeonDialogue.js rename to Game/src/dialogue/KinkyDungeonDialogue.ts index 94a90f625..fd2c27989 100644 --- a/Game/src/dialogue/KinkyDungeonDialogue.js +++ b/Game/src/dialogue/KinkyDungeonDialogue.ts @@ -4,26 +4,29 @@ let KDDialogueData = { CurrentDialogueIndex: 0, }; +/** + * Milliseconds during which clicks are ignored to avoid inadverdent clicking + */ +let KDDialogueDelay = 400; + /** - * - * @param {number} Min - * @param {number} Avg - * @param {number} Max - * @param {entity} [Enemy] - * @returns {number} + * @param Min + * @param Avg + * @param Max + * @param [Enemy] */ -function KDPersonalitySpread(Min, Avg, Max, 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() { +function KinkyDungeonCanPutNewDialogue(): boolean { return !KDGameData.CurrentDialog && !KinkyDungeonFlags.get("NoDialogue"); } -function KDBasicCheck(PositiveReps, NegativeReps, Modifier = 0) { +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; @@ -38,11 +41,11 @@ function KDBasicCheck(PositiveReps, NegativeReps, Modifier = 0) { return value; } -function KDDialogueApplyPersonality(allowed) { +function KDDialogueApplyPersonality(allowed: string[]) { if (allowed.includes(KDGameData.CurrentDialogMsgPersonality)) KDGameData.CurrentDialogMsg = KDGameData.CurrentDialogMsg + KDGameData.CurrentDialogMsgPersonality; } -function KDGetDialogue() { +function KDGetDialogue(): KinkyDialogue { let dialogue = KDDialogue[KDGameData.CurrentDialog]; if (KDGameData.CurrentDialogStage && dialogue?.options) { let stages = KDGameData.CurrentDialogStage.split("_"); @@ -64,7 +67,7 @@ let KDMaxDialogue = 7; let KDOptionOffset = 0; -function KDDrawDialogue(delta) { +function KDDrawDialogue(delta: number): void { KDDraw(kdcanvas, kdpixisprites, "dialogbg", KinkyDungeonRootDirectory + "DialogBackground.png", 500, 0, 1000, 1000, undefined, { zIndex: 111, }); @@ -119,7 +122,7 @@ function KDDrawDialogue(delta) { } } let notGrey = !entries[i][1].greyoutFunction || entries[i][1].greyoutFunction(gagged, KinkyDungeonPlayerEntity); - DrawButtonKDEx(KDOptionOffset + "dialogue" + II, (bdata) => { + DrawButtonKDEx(KDOptionOffset + "dialogue" + II, (_bdata) => { if (notGrey) { KDOptionOffset = 0; KDDialogueData.CurrentDialogueIndex = 0; @@ -140,7 +143,7 @@ function KDDrawDialogue(delta) { } if (II >= KDMaxDialogue || KDOptionOffset > 0) { if (KDOptionOffset > 0) - DrawButtonKDEx("dialogueUP", (bdata) => { + DrawButtonKDEx("dialogueUP", (_bdata) => { if (KDOptionOffset > 0) { KDOptionOffset -= 1; //if (KDDialogueData.CurrentDialogueIndex > 0) @@ -152,7 +155,7 @@ function KDDrawDialogue(delta) { zIndex: 122, }); if (II >= KDMaxDialogue) - DrawButtonKDEx("dialogueDOWN", (bdata) => { + DrawButtonKDEx("dialogueDOWN", (_bdata) => { if (II >= KDMaxDialogue) { KDOptionOffset += 1; //KDDialogueData.CurrentDialogueIndex += 1; @@ -180,9 +183,9 @@ function KDDrawDialogue(delta) { } /** - * @param {number} Amount + * @param Amount */ -function KDIncreaseOfferFatigue(Amount) { +function KDIncreaseOfferFatigue(Amount: number): void { if (!KDGameData.OfferFatigue) { KDGameData.OfferFatigue = 0; } @@ -193,20 +196,15 @@ function KDIncreaseOfferFatigue(Amount) { } /** - * @param {entity} enemy - * @returns {number} + * @param enemy */ -function KDEnemyHelpfulness(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; } -/** - * - * @returns {entity} - */ -function KDGetSpeaker() { +function KDGetSpeaker(): entity { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { return enemy; @@ -216,9 +214,8 @@ function KDGetSpeaker() { /** * Same as KDGetSpeaker - * @returns {entity} */ -function KDDialogueEnemy() { +function KDDialogueEnemy(): entity { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { return enemy; @@ -228,20 +225,15 @@ function KDDialogueEnemy() { -/** - * - * @returns {string} - */ -function KDGetSpeakerFaction() { +function KDGetSpeakerFaction(): string { let speaker = KDGetSpeaker(); return speaker ? KDGetFactionOriginal(speaker) : undefined; } /** - * - * @param {number} Amount + * @param Amount */ -function KDPleaseSpeaker(Amount) { +function KDPleaseSpeaker(Amount: number) { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KDAddOpinionPersistent(enemy.id, Amount * 100); @@ -256,11 +248,10 @@ function KDPleaseSpeaker(Amount) { } /** - * - * @param {any} enemy - * @param {number} Amount + * @param enemy + * @param Amount */ -function KDAddOpinion(enemy, 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)) { @@ -274,14 +265,18 @@ function KDAddOpinion(enemy, Amount) { 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 {KDCollectionEntry} enemy - * @param {number} Amount + * @param enemy + * @param Amount */ -function KDAddOpinionCollection(enemy, 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)) { @@ -295,7 +290,7 @@ function KDAddOpinionCollection(enemy, Amount) { return enemy.Opinion || 0; } -function KDAllySpeaker(Turns, Follow) { +function KDAllySpeaker(Turns: number, Follow: boolean) { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (!KDEntityHasFlag(enemy, "helped")) { @@ -312,11 +307,10 @@ function KDAllySpeaker(Turns, Follow) { } /** - * - * @param {number} Turns - * @param {boolean} NoAlertFlag + * @param [Turns] + * @param [NoAlertFlag] */ -function KDAggroSpeaker(Turns = 300, NoAlertFlag = false) { +function KDAggroSpeaker(Turns: number = 300, NoAlertFlag: boolean = false) { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (!(enemy.hostile > 0)) { @@ -330,18 +324,18 @@ function KDAggroSpeaker(Turns = 300, NoAlertFlag = false) { // Success chance for a basic dialogue -function KDBasicDialogueSuccessChance(checkResult) { +function KDBasicDialogueSuccessChance(checkResult: number): number { return Math.max(0, Math.min(1.0, checkResult/100)); } // Success chance for a basic dialogue -function KDAgilityDialogueSuccessChance(checkResult) { +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) { +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)); @@ -350,17 +344,16 @@ function KDOffensiveDialogueSuccessChance(checkResult) { let KinkyDungeonDialogueTimer = 0; /** - * - * @param {string} Dialogue - * @param {string} [Speaker] - * @param {boolean} [Click] - * @param {string} [Personality] - * @param {entity} [enemy] + * @param Dialogue + * @param [Speaker] + * @param [Click] + * @param [Personality] + * @param [enemy] */ -function KDStartDialog(Dialogue, Speaker, Click, Personality, enemy) { +function KDStartDialog(Dialogue: string, Speaker?: string, Click?: boolean, Personality?: string, enemy?: entity) { KinkyDungeonInterruptSleep(); KDDisableAutoWait(); - KinkyDungeonDialogueTimer = CommonTime() + 700 + KDGameData.SlowMoveTurns * 200; + KinkyDungeonDialogueTimer = CommonTime() + KDDialogueDelay + KDGameData.SlowMoveTurns * 200; KDOptionOffset = 0; KinkyDungeonFastMovePath = []; KinkyDungeonDrawState = "Game"; @@ -373,7 +366,7 @@ function KDStartDialog(Dialogue, Speaker, Click, Personality, enemy) { } -function KDDoDialogue(data) { +function KDDoDialogue(data: any) { KDDelayedActionPrune(["Action", "Dialogue"]); if (!KDGameData.CurrentDialogMsgData) KDGameData.CurrentDialogMsgData = {}; if (!KDGameData.CurrentDialogMsgValue) KDGameData.CurrentDialogMsgValue = {}; @@ -444,14 +437,13 @@ function KDDoDialogue(data) { } /** - * - * @param {string} Dialogue - * @param {string} [Speaker] - * @param {boolean} [Click] - * @param {string} [Personality] - * @param {entity} [enemy] + * @param Dialogue + * @param [Speaker] + * @param [Click] + * @param [Personality] + * @param [enemy] */ -function KDStartDialogInput(Dialogue, Speaker, Click, Personality, enemy) { +function KDStartDialogInput(Dialogue: string, Speaker?: string, Click?: boolean, Personality?: string, enemy?: entity) { KinkyDungeonInterruptSleep(); KDDisableAutoWait(); KinkyDungeonDialogueTimer = CommonTime() + 700 + KDGameData.SlowMoveTurns * 200; @@ -487,15 +479,13 @@ function KDHandleDialogue() { /** - * - * @param {number} x - * @param {number} y - * @param {string} Name - * @param {number} [persistentid] - * @param {boolean} [noLoadout] - * @returns {entity} + * @param x + * @param y + * @param Name + * @param [persistentid] + * @param [noLoadout] */ -function DialogueCreateEnemy(x, y, Name, persistentid, 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(), @@ -507,18 +497,17 @@ function DialogueCreateEnemy(x, y, Name, persistentid, noLoadout) { } -function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight) { +function KDAllyDialogue(name: string, requireTags: string[], requireSingleTag: string[], excludeTags: string[], weight: number): KinkyDialogue { /** - * @type {KinkyDialogue} */ - let dialog = { + let dialog: KinkyDialogue = { response: "Default", options: {}, }; dialog.options.Leash = {playertext: name + "Leash", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (enemy.leash) return false; @@ -532,7 +521,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight } return false; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (KDGetLeashedToCount(enemy) >= 3) { @@ -548,7 +537,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }; dialog.options.ReleaseLeash = {playertext: name + "ReleaseLeash", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (enemy.leash?.reason == "PlayerLeash") return true; @@ -556,7 +545,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight } return false; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KDBreakTether(enemy); @@ -566,14 +555,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight leadsToStage: "", }; dialog.options.Shop = {playertext: name + "Shop", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { return KDEnemyHasFlag(enemy, "Shop"); } return false; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { for (let shop of Object.values(KDShops)) { @@ -587,14 +576,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight exitDialogue: true, }; dialog.options.ShopBuy = {playertext: name + "ShopBuy", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KDStartDialog("ShopBuy", enemy.Enemy.name, true, enemy.personality, enemy); @@ -605,7 +594,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight exitDialogue: true, }; dialog.options.Leave = {playertext: "Leave", exitDialogue: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "NoShop", 9999); @@ -614,14 +603,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }, }; dialog.options.Attack = {playertext: name + "Attack", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (!enemy.Enemy.allied) { @@ -647,14 +636,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight } }; dialog.options.AttackPlay = {playertext: name + "AttackPlay", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (!enemy.Enemy.allied) { @@ -677,14 +666,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight } }; dialog.options.AttackUnaware = {playertext: name + "AttackUnaware", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (!enemy.Enemy.allied) { @@ -706,14 +695,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }; dialog.options.Food = {playertext: name + "Food", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KDGameData.InventoryAction = "Food"; @@ -728,13 +717,13 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight leadsToStage: "", dontTouchText: true, }; dialog.options.Flirt = {playertext: name + "Flirt", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy) KDGameData.CurrentDialogMsg = name + "Flirt" + (!KDEnemyCanTalk(enemy) ? "Gagged" : (enemy.personality || "")); return false; }, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy) return KDPlayPossible(enemy); @@ -746,7 +735,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }, LinkRequestArms: { playertext: "Default", response: "Default", gag: true, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { let r = KinkyDungeonGetRestraint({tags: ["armLink"]}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), @@ -758,7 +747,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight } return false; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { let r = KinkyDungeonGetRestraint({tags: ["armLink"]}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), @@ -781,7 +770,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }, LinkRequestLegs: { playertext: "Default", response: "Default", gag: true, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { let r = KinkyDungeonGetRestraint({tags: ["legLink", "feetLink"]}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), @@ -793,7 +782,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight } return false; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { let r = KinkyDungeonGetRestraint({tags: ["legLink", "feetLink"]}, MiniGameKinkyDungeonLevel * 2 + KDGetOfferLevelMod(), @@ -816,14 +805,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }, PlayRequest: { playertext: "Default", response: "Default", gag: true, - prerequisiteFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "forcePlay", 20); @@ -845,7 +834,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }, Release: { playertext: "Default", response: "Default", gag: true, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { return (KDIsDistracted(enemy)) && !enemy.playWithPlayer; @@ -855,10 +844,10 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight options: { "Wand": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KinkyDungeonInventoryGet("VibeWand") != undefined && !KinkyDungeonIsHandsBound(true, true, 0.99); }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KDEnemyRelease(enemy); @@ -871,10 +860,10 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }, "Cuddle": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return true; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KDEnemyRelease(enemy); @@ -888,11 +877,11 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }, "Vibe": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); return KDEntityBuffedStat(enemy, "Plug") && KinkyDungeonInventoryGet("VibeRemote") != undefined && !KinkyDungeonIsHandsBound(true, true, 0.99); }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KDEnemyRelease(enemy); @@ -908,7 +897,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }, BondageOffer: { playertext: "Default", response: "Default", gag: true, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker && KDEnemyCanTalk(enemy)) { KinkyDungeonSetEnemyFlag(enemy, "allyOffer", 1); @@ -928,7 +917,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }, options: { "Yes": {playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "allyOffer", 1); @@ -957,7 +946,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }, LeashWalk: { playertext: "Default", response: "Default", gag: true, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (enemy == KinkyDungeonJailGuard() || enemy == KinkyDungeonLeashingEnemy()) return false; @@ -965,7 +954,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight } return false; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "allowLeashWalk", -1); @@ -1002,14 +991,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight } }; dialog.options.LetMePass = {playertext: name + "LetMePass", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { return !KinkyDungeonFlags.has("passthrough"); } return false; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (KinkyDungeonFlags.has("LetMePass")) { @@ -1023,7 +1012,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }, options: { "Confirm": {playertext: name + "LetMePass_Confirm", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "passthrough", 8); @@ -1038,7 +1027,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight exitDialogue: true, }, "ConfirmAll": {playertext: name + "LetMePass_ConfirmAll", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetFlag("Passthrough", 8); @@ -1053,14 +1042,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight } }; dialog.options.StopFollowingMe = {playertext: name + "StopFollowingMe", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "NoFollow", 9999); @@ -1070,14 +1059,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight leadsToStage: "", dontTouchText: true, }; dialog.options.FollowMe = {playertext: name + "FollowMe", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (!KDEnemyHasFlag(enemy, "NoStay") @@ -1094,14 +1083,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight leadsToStage: "", dontTouchText: true, }; dialog.options.DontStayHere = {playertext: name + "DontStayHere", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "StayHere", 0); @@ -1111,14 +1100,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight leadsToStage: "", dontTouchText: true, }; dialog.options.StayHere = {playertext: name + "StayHere", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) => { + 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)) { @@ -1135,14 +1124,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight leadsToStage: "", dontTouchText: true, }; dialog.options.Aggressive = {playertext: name + "Aggressive", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "Defensive", 0); @@ -1152,14 +1141,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight leadsToStage: "", dontTouchText: true, }; dialog.options.Defensive = {playertext: name + "Defensive", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "Defensive", -1); @@ -1169,7 +1158,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight leadsToStage: "", dontTouchText: true, }; dialog.options.HelpMe = {playertext: name + "HelpMe", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) @@ -1179,7 +1168,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }, options: { "Confirm": {playertext: name + "HelpMe_Confirm", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (!KDEnemyHasFlag(enemy, "NoHelp") @@ -1207,17 +1196,18 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight } }; dialog.options.HelpMeCommandWord = {playertext: name + "HelpMeCommandWord", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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; + && !KDEnemyHasFlag(enemy, "NoHelpCommandWord") && !KDEnemyHasFlag(enemy, "commandword") + && KinkyDungeonPlayerGetRestraintsWithLocks(KDMagicLocks).length > 0; } return false; }, options: { "Confirm": {playertext: name + "HelpMeCommandWord_Confirm", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (!KDEnemyHasFlag(enemy, "NoHelpCommandWord") @@ -1251,7 +1241,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight } }; dialog.options.HelpMeKey = {playertext: name + "HelpMeKey", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) @@ -1261,7 +1251,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }, options: { "Confirm": {playertext: name + "HelpMeKey_Confirm", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (!KDEnemyHasFlag(enemy, "NoHelpKey") @@ -1288,7 +1278,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight } }; dialog.options.DontHelpMe = {playertext: name + "DontHelpMe", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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; @@ -1297,7 +1287,7 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight }, options: { "Confirm": {playertext: name + "DontHelpMe_Confirm", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "HelpMe", 0); @@ -1313,16 +1303,22 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight } }; dialog.options.JoinParty = {playertext: name + "JoinParty", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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.Enemy.allied; + 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) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "NoFollow", 0); @@ -1333,14 +1329,14 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight leadsToStage: "", dontTouchText: true, }; dialog.options.RemoveParty = {playertext: name + "RemoveParty", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { return KDIsInParty(enemy); } return false; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "NoFollow", -1); @@ -1355,26 +1351,18 @@ function KDAllyDialogue(name, requireTags, requireSingleTag, excludeTags, weight } -/** - * @type {Record} - */ -let KDPrisonRescues = {}; +let KDPrisonRescues: Record = {}; /** - * - * @param {string} name - * @param {string} faction - * @param {string[]} enemytypes - * @returns {KinkyDialogue} + * @param name + * @param faction + * @param enemytypes */ -function KDPrisonerRescue(name, faction, enemytypes) { - /** - * @type {KinkyDialogue} - */ - let dialogue = { +function KDPrisonerRescue(name: string, faction: string, enemytypes: string[]): KinkyDialogue { + let dialogue: KinkyDialogue = { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonInterruptSleep(); let door = KDGetJailDoor(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); if (door) { @@ -1418,13 +1406,26 @@ function KDPrisonerRescue(name, faction, enemytypes) { } // ["wolfGear", "wolfRestraints"] -function KDRecruitDialogue(name, faction, outfitName, goddess, restraints, restraintscount, restraintsAngry, restraintscountAngry, requireTags, requireSingleTag, excludeTags, chance) { +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 +{ /** - * @type {KinkyDialogue} */ - let recruit = { + let recruit: KinkyDialogue = { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag(name, -1, 1); return false; }, @@ -1432,7 +1433,7 @@ function KDRecruitDialogue(name, faction, outfitName, goddess, restraints, restr "Yes": {gag: true, playertext: "Default", response: "Default", options: { "Yes": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDPleaseSpeaker(0.5); let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); KinkyDungeonChangeRep("Ghost", 2); @@ -1456,7 +1457,7 @@ function KDRecruitDialogue(name, faction, outfitName, goddess, restraints, restr options: {"Leave": {playertext: "Leave", exitDialogue: true}}, }, "No": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let diff = KinkyDungeonStatsChoice.has("Dominant") ? 0 : 35; if (KDBasicCheck([goddess], ["Ghost"]) <= diff) { KDGameData.CurrentDialogStage = "Force"; @@ -1473,7 +1474,7 @@ function KDRecruitDialogue(name, faction, outfitName, goddess, restraints, restr }, }, "No": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let diff = KinkyDungeonStatsChoice.has("Dominant") ? 0 : 45; if (KDBasicCheck(["Metal"], ["Ghost"]) <= diff) { KDGameData.CurrentDialogStage = "Force"; @@ -1488,10 +1489,10 @@ function KDRecruitDialogue(name, faction, outfitName, goddess, restraints, restr options: {"Leave": {playertext: "Leave", exitDialogue: true}}, }, "Force": {gag: true, playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => {return false;}, + prerequisiteFunction: (_gagged, _player) => {return false;}, options: { "Yes": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDPleaseSpeaker(0.08); KinkyDungeonChangeRep("Ghost", 2); let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); @@ -1514,7 +1515,7 @@ function KDRecruitDialogue(name, faction, outfitName, goddess, restraints, restr }, options: {"Leave": {playertext: "Leave", exitDialogue: true}},}, "No": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let percent = KDGameData.CurrentDialogMsgValue.Percent; KinkyDungeonChangeRep("Ghost", -1); if (KDRandom() > percent) { @@ -1556,14 +1557,11 @@ function KDRecruitDialogue(name, faction, outfitName, goddess, restraints, restr let KDMaxSellItems = 6; // A shop where the NPC buys items -function KDShopDialogue(name, items, requireTags, requireSingleTag, chance, itemsdrop) { - /** - * @type {KinkyDialogue} - */ - let shop = { +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) => { + clickFunction: (_gagged, _player) => { /*let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "Shop", 0); @@ -1578,14 +1576,13 @@ function KDShopDialogue(name, items, requireTags, requireSingleTag, chance, item 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]; - //} } return false; }, options: {}, }; shop.options.Leave = {playertext: "Leave", exitDialogue: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "NoShop", 9999); @@ -1595,14 +1592,14 @@ function KDShopDialogue(name, items, requireTags, requireSingleTag, chance, item }, }; shop.options.Buy = {playertext: "ItemShopBuy", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { let e = KDGetSpeaker(); KDStartDialog("ShopBuy", e.Enemy.name, true, e.personality, e); return true; @@ -1611,7 +1608,7 @@ function KDShopDialogue(name, items, requireTags, requireSingleTag, chance, item shop.options.Attack = {gag: true, playertext: "ItemShopAttack", response: "Default", options: { "Confirm": {playertext: "ItemShopAttack_Confirm", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KDMakeHostile(enemy); @@ -1632,11 +1629,11 @@ function KDShopDialogue(name, items, requireTags, requireSingleTag, chance, item 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) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); return KinkyDungeonInventoryGetSafe(item) != undefined && enemy && !KDHelpless(enemy); }, - greyoutFunction: (gagged, player) => { + greyoutFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { return KDGameData.CurrentDialogMsgValue["ItemCost"+i] < enemy.gold; @@ -1644,7 +1641,7 @@ function KDShopDialogue(name, items, requireTags, requireSingleTag, chance, item return false; }, greyoutTooltip: "KDNotEnoughMoneyVendor", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let itemInv = KinkyDungeonInventoryGetSafe(item); if (itemInv.type == Consumable) KinkyDungeonChangeConsumable(KDConsumable(itemInv), -1); @@ -1670,17 +1667,13 @@ function KDShopDialogue(name, items, requireTags, requireSingleTag, chance, item } // The dialogue for allies sellin g you their inventory -function KDShopBuyDialogue(name) { - /** - * @type {KinkyDialogue} - */ - let shop = { +function KDShopBuyDialogue(name: string): KinkyDialogue { + let shop: KinkyDialogue = { inventory: true, response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - /** @type {string[]} */ - let items = []; + let items: string[] = []; if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (enemy.items?.length > 0) items = enemy.items; } @@ -1700,7 +1693,7 @@ function KDShopBuyDialogue(name) { options: {}, }; shop.options.Leave = {playertext: "Leave", exitDialogue: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "NoShop", 9999); @@ -1710,14 +1703,14 @@ function KDShopBuyDialogue(name) { }, }; shop.options.Sell = {playertext: "ShopBuySell", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { return KDEnemyHasFlag(enemy, "Shop"); } return false; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { for (let shp of Object.values(KDShops)) { @@ -1732,7 +1725,7 @@ function KDShopBuyDialogue(name) { shop.options.Attack = {gag: true, playertext: "ItemShopAttack", response: "Default", options: { "Confirm": {playertext: "ItemShopAttack_Confirm", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KDMakeHostile(enemy); @@ -1763,10 +1756,9 @@ function KDShopBuyDialogue(name) { }; for (let i = 0; i < maxNum; i++) { shop.options["Item" + i] = {playertext: "ShopBuyItem" + i, response: name + "Item", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - /** @type {string[]} */ - let items = []; + let items: string[] = []; if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (enemy.items?.length > 0) items = enemy.items; } @@ -1785,10 +1777,9 @@ function KDShopBuyDialogue(name) { } return false; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); - /** @type {string[]} */ - let items = []; + let items: string[] = []; if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { if (enemy.items?.length > 0) items = enemy.items; } @@ -1836,48 +1827,47 @@ function KDShopBuyDialogue(name) { let KDOfferCooldown = 20; +type refuseFunc = (firstRefused: boolean) => boolean; + /** - * - * @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} + * @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, yesFunction, noFunction, domFunction) { +function KDYesNoTemplate(setupFunction: refuseFunc, yesFunction: refuseFunc, noFunction: refuseFunc, domFunction: refuseFunc): KinkyDialogue { /** - * @type {KinkyDialogue} */ - let dialogue = { + let dialogue: KinkyDialogue = { tags: ["BondageOffer"], response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("BondageOffer", KDOfferCooldown); return false; }, options: { "Yes": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return setupFunction(false); }, options: { "Yes": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return yesFunction(false); }, options: {"Leave": {playertext: "Leave", exitDialogue: true}}, }, "No": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return noFunction(false); }, options: {"Leave": {playertext: "Leave", exitDialogue: true}}, }, "Dominant": {gag: true, playertext: "OfferDominant", response: "OfferDominantSuccess", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return domFunction(false); }, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return !KinkyDungeonStatsChoice.get("Undeniable") && KDGetSpeaker()?.Enemy?.bound != undefined; }, options: {"Leave": {playertext: "Leave", exitDialogue: true}}, @@ -1885,30 +1875,30 @@ function KDYesNoTemplate(setupFunction, yesFunction, noFunction, domFunction) { }, }, "No": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return setupFunction(true); }, options: {"Leave": {playertext: "Leave", exitDialogue: true}}, }, "Force": {gag: true, playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => {return false;}, + prerequisiteFunction: (_gagged, _player) => {return false;}, options: { "Yes": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return yesFunction(true); }, options: {"Leave": {playertext: "Leave", exitDialogue: true}},}, "No": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return noFunction(true); }, options: {"Leave": {playertext: "Leave", exitDialogue: true}}, }, "Dominant": {gag: true, playertext: "OfferDominant", response: "OfferDominantSuccess", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return domFunction(true); }, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDGetSpeaker()?.Enemy?.bound != undefined; }, options: {"Leave": {playertext: "Leave", exitDialogue: true}}, @@ -1924,23 +1914,37 @@ function KDYesNoTemplate(setupFunction, yesFunction, noFunction, domFunction) { /** - * - * @param {string} name - * @param {string[]} goddess - * @param {string[]} allowedPrisonStates - * @param {string[]} allowedPersonalities - * @param {string[]} requireTagsSingle - * @param {string[]} requireTags - * @param {string[]} excludeTags - * @param {string[]} requireFlags - * @param {string[]} excludeFlags - * @param {string[]} restraintTags - * @param {string} Lock - * @param {number} WeightMult - * @returns {KinkyDialogueTrigger} + * @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, goddess, restraintTags, allowedPrisonStates, allowedPersonalities, requireTagsSingle, requireTagsSingle2, requireTags, excludeTags, requireFlags, excludeFlags, Lock = "Red", WeightMult = 1.0) { - let trigger = { +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, @@ -1962,7 +1966,7 @@ function KDDialogueTriggerOffer(name, goddess, restraintTags, allowedPrisonState dist,1.5,0.1,restraintTags, KDEnemyHasFlag(enemy, "allyOffer") || KDEnemyHasFlag(enemy, "forceOffer"), Lock)); }, - weight: (enemy, dist) => { + weight: (_enemy, _dist) => { if (requireFlags && !requireFlags.some((element) => KinkyDungeonFlags.get(element))) { return 0; } @@ -1983,14 +1987,27 @@ function KDDialogueTriggerOffer(name, goddess, restraintTags, allowedPrisonState * @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 + * @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, goddess, antigoddess, restraint, diffSpread, OffdiffSpread, count = 1, countAngry = 1, Lock = "Red", Ally = false, Flags = []) { +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 }[] = [] +): 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) { @@ -2143,7 +2160,7 @@ function KDYesNoBasic(name, goddess, antigoddess, restraint, diffSpread, Offdiff } } return false; - },(refused) => { // Dom function. This is what happens when you try the dominant option + },(_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) { @@ -2172,14 +2189,12 @@ function KDYesNoBasic(name, goddess, antigoddess, restraint, diffSpread, Offdiff /** * A shop where the seller sells items - * @returns {KinkyDialogue} */ -function KDSaleShop(name, items, requireTags, requireSingleTag, chance, markup, itemsdrop, multiplier = 1) { +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 = { - shop: true, + let shop: KinkyDialogue = { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { /*let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "Shop", 0); @@ -2194,14 +2209,13 @@ function KDSaleShop(name, items, requireTags, requireSingleTag, chance, markup, 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]; - //} } return false; }, options: {}, }; shop.options.Leave = {playertext: "Leave", exitDialogue: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KinkyDungeonSetEnemyFlag(enemy, "NoShop", 9999); @@ -2213,7 +2227,7 @@ function KDSaleShop(name, items, requireTags, requireSingleTag, chance, markup, shop.options.Attack = {gag: true, playertext: "ItemShopAttack", response: "Default", options: { "Confirm": {playertext: "ItemShopAttack_Confirm", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { KDMakeHostile(enemy); @@ -2234,10 +2248,10 @@ function KDSaleShop(name, items, requireTags, requireSingleTag, chance, markup, 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) => { + prerequisiteFunction: (_gagged, _player) => { return true;//KinkyDungeonInventoryGet(item) != undefined; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let buy = false; if (KinkyDungeonGold >= KDGameData.CurrentDialogMsgValue["ItemCost"+i]) { buy = true; @@ -2294,22 +2308,21 @@ function KDSaleShop(name, items, requireTags, requireSingleTag, chance, markup, /* "Leave": {playertext: "Leave", exitDialogue: true} - clickFunction: (gagged, player) => {KinkyDungeonStartChase(undefined, "Refusal");}, + clickFunction: (_gagged, _player) => {KinkyDungeonStartChase(undefined, "Refusal");}, -clickFunction: (gagged, player) => { +clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", 3); },*/ -/** Yoinks a nearby enemy and brings them next to x */ /** + * Yoinks a nearby enemy and brings them next to x * - * @param {number} x - * @param {number} y - * @param {number} radius - * @param {boolean} [unaware] - * @returns {entity} + * @param x + * @param y + * @param radius + * @param [unaware] */ -function DialogueBringNearbyEnemy(x, y, radius, 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) @@ -2329,15 +2342,14 @@ function DialogueBringNearbyEnemy(x, y, radius, unaware) { return null; } -/** Yoinks a nearby enemy and brings them next to x */ /** + * Yoinks a nearby enemy and brings them next to x * - * @param {number} x - * @param {number} y - * @param {entity} enemy - * @returns {entity} + * @param x + * @param y + * @param enemy */ -function DialogueBringSpecific(x, y, 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) { @@ -2350,10 +2362,9 @@ function DialogueBringSpecific(x, y, enemy) { /** * Returns if you are submissive enough to be played with by this enemy - * @param {entity} enemy - * @returns {boolean} + * @param enemy */ -function KDIsSubmissiveEnough(enemy) { +function KDIsSubmissiveEnough(_enemy: entity): boolean { let diff = KDPersonalitySpread(20, -20, -51); if (KinkyDungeonGoddessRep.Ghost >= diff) return true; return false; @@ -2361,15 +2372,13 @@ function KDIsSubmissiveEnough(enemy) { /** - * - * @param {entity} enemy - * @param {boolean} [allowFaction] Optionally apply faction rep modifier - * @param {boolean} [allowSub] Optionally apply sub modifier - * @param {boolean} [allowPerk] Optionally apply perk modifiers - * @param {number} [allowOnlyPosNegFaction] - * @returns {number} + * @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, allowFaction = true, allowSub = true, allowPerk = true, allowOnlyPosNegFaction = 0) { +function KDGetModifiedOpinion(enemy: entity, allowFaction: boolean = true, allowSub: boolean = true, allowPerk: boolean = true, allowOnlyPosNegFaction: number = 0): number { if (!enemy) return 0; let op = enemy.opinion || KDGameData.Collection[enemy.id]?.Opinion || 0; @@ -2389,26 +2398,21 @@ function KDGetModifiedOpinion(enemy, allowFaction = true, allowSub = true, allow } /** - * - * @param {number} Amount + * @param Amount */ -function KDAddOffer(Amount) { +function KDAddOffer(Amount: number) { if (!KDGameData.OfferCount) KDGameData.OfferCount = 0; KDGameData.OfferCount += Amount; } -/** - * @returns {number} - */ -function KDGetOfferLevelMod() { +function KDGetOfferLevelMod(): number { return Math.round(0.25 * (KDGameData.OfferCount || 0)); } /** - * - * @param {entity} player + * @param player */ -function KDRunChefChance(player) { +function KDRunChefChance(player: entity) { if (!KinkyDungeonFlags.get("SpawnedChef")) { let x = player.x; let y = player.y; @@ -2428,11 +2432,10 @@ function KDRunChefChance(player) { } /** - * - * @param {string} item - * @returns {number} + * @param item + * @param [nomult] */ -function KDItemSubThreshold(item, nomult) { +function KDItemSubThreshold(item: string, nomult?: boolean): number { let mult = 1.0; if (!nomult) { if (KinkyDungeonStatsChoice.get("Oppression")) mult = 0.25; @@ -2445,7 +2448,7 @@ function KDItemSubThreshold(item, nomult) { if (KinkyDungeonFindWeapon(item)?.cutBonus) return Math.max(0, 1 - mult*KinkyDungeonFindWeapon(item)?.cutBonus*3); } -function KDGetShopCost(enemy) { +function KDGetShopCost(enemy: entity): number { let shopCost = KDEnemyHasFlag(enemy, "Shop") ? 0.5 : 1.5 + (0.1 * MiniGameKinkyDungeonLevel); shopCost *= KinkyDungeonMultiplicativeStat(0.02*KDGetModifiedOpinion(enemy)); shopCost += 1; diff --git a/Game/src/dialogue/KinkyDungeonDialogueList.js b/Game/src/dialogue/KinkyDungeonDialogueList.ts similarity index 86% rename from Game/src/dialogue/KinkyDungeonDialogueList.js rename to Game/src/dialogue/KinkyDungeonDialogueList.ts index ee69d5ae2..68490d7a4 100644 --- a/Game/src/dialogue/KinkyDungeonDialogueList.js +++ b/Game/src/dialogue/KinkyDungeonDialogueList.ts @@ -13,9 +13,8 @@ let KDDialogueParams = { /** * Tags that are deleted on ng++ - * @type {string[]} */ -let KDResertNGTags = [ +let KDResertNGTags: string[] = [ "BossDialogueFuuka", "BossDialogueTheWarden", "BossDialogueSilverWitch", @@ -25,32 +24,22 @@ let KDResertNGTags = [ let KDShopPersonalities = ["", "Sub", "Dom", "Brat", "Robot"]; -/** - * @type {Record} - */ -let KDShops = {}; +let KDShops: Record = {}; -/** - * @type {Record} - */ -let KDRecruitDialog = {}; +let KDRecruitDialog: Record = {}; -/** - * @type {Record} - */ -let KDAllyDialog = {}; +let KDAllyDialog: Record = {}; let KDSleepBedPercentage = 0.5; -/** @type {Record} */ -let KDDialogue = { +let KDDialogue: Record = { "GhostInfo": { response: "Default", options: { "Continue" : { - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonTargetTile = null; KinkyDungeonTargetTileLocation = ""; return false; @@ -66,7 +55,7 @@ let KDDialogue = { response: "Default", options: { "Continue" : { - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonTargetTile = null; KinkyDungeonTargetTileLocation = ""; let zombie = DialogueCreateEnemy(KDMapData.StartPosition.x + 7, 3, "FastZombie"); @@ -86,7 +75,7 @@ let KDDialogue = { response: "Default", options: { "Continue" : { - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonTargetTile = null; KinkyDungeonTargetTileLocation = ""; DialogueCreateEnemy(KDMapData.StartPosition.x + 22, 3, "FastZombie"); @@ -103,7 +92,7 @@ let KDDialogue = { response: "Default", options: { "Continue" : { - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonTargetTile = null; KinkyDungeonTargetTileLocation = ""; DialogueCreateEnemy(KDMapData.StartPosition.x + 32, 4, "FastZombie"); @@ -121,7 +110,7 @@ let KDDialogue = { personalities: ["Robot"], options: { "Accept": {gag: true, playertext: "WeaponFoundAccept", response: "GoodGirl", personalities: ["Dom", "Sub", "Robot"], - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSendTextMessage(10, TextGet("KDWeaponConfiscated"), "#ff5277", 2); if (!isUnarmed(KinkyDungeonPlayerDamage)) { KinkyDungeonChangeRep("Ghost", 3); @@ -138,18 +127,18 @@ let KDDialogue = { }, options: {"Leave": {playertext: "Leave", exitDialogue: true}}}, "Bluff": {playertext: "", response: "", - prerequisiteFunction: (gagged, player) => {return false;}, + 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) => { + 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) => { + prerequisiteFunction: (_gagged, _player) => {return KinkyDungeonGoddessRep.Illusion >= 51;}, + clickFunction: (_gagged, _player) => { if (KDGameData.CurrentDialogMsgSpeaker == "MaidforceHead") { KDGameData.CurrentDialogStage = "Deny"; KDGameData.CurrentDialogMsg = "HeadMaidExcuseMe"; @@ -168,8 +157,8 @@ let KDDialogue = { }, 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) => { + 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"; @@ -181,8 +170,8 @@ let KDDialogue = { }, 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) => { + 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"; @@ -194,8 +183,8 @@ let KDDialogue = { }, 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) => { + 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"; @@ -207,8 +196,8 @@ let KDDialogue = { }, 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) => { + 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"; @@ -228,14 +217,14 @@ let KDDialogue = { options: { "Pout": {playertext: "Default", response: "Default", options: {"Continue" : {playertext: "Continue", leadsToStage: "Rules"}}}, "Brat": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", 10); return false; }, @@ -246,14 +235,14 @@ let KDDialogue = { options: { "Pout": {playertext: "Default", response: "Default", options: {"Continue" : {playertext: "Continue", exitDialogue: true}}}, "Brat": {gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", 10); return false; }, @@ -264,7 +253,7 @@ let KDDialogue = { }, "PrisonRepeat": { response: "Default", - clickFunction: (gagged) => { + clickFunction: (_gagged) => { let GoldAmount = Math.round(KDGetEffLevel() * 100 * (1 + 0.02 * Math.max(0, KDGetEffSecurityLevel() + 50))); KDGameData.CurrentDialogMsgData = { "BRIBECOST": "" + GoldAmount, @@ -273,8 +262,8 @@ let KDDialogue = { }, options: { "Smile": {playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => {return !(KinkyDungeonGetRestraintItem("ItemVulva"));}, - clickFunction: (gagged, player) => { + 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); @@ -282,8 +271,8 @@ let KDDialogue = { }, options: { "Correct": {playertext: "Default", response: "Default", gagDisabled: true, - prerequisiteFunction: (gagged, player) => {return !(KinkyDungeonGetRestraintItem("ItemMouth") || KinkyDungeonGetRestraintItem("ItemMouth2") || KinkyDungeonGetRestraintItem("ItemMouth3"));}, - clickFunction: (gagged, player) => { + 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; @@ -296,36 +285,36 @@ let KDDialogue = { }, }, "Smile2": {playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => {return KinkyDungeonGetRestraintItem("ItemVulva") != undefined;}, - clickFunction: (gagged, player) => { + 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) => { + 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) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", -3); return false; }, options: {"Leave": {playertext: "Leave", exitDialogue: true}}, }, "Bribe": {playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { let GoldAmount = Math.round(KDGetEffLevel() * 100 * (1 + 0.02 * Math.max(0, KDGetEffSecurityLevel() + 50))); if (KDGetEffSecurityLevel() >= 49.5) { KDGameData.CurrentDialogMsg = "PrisonRepeatBribeFail"; @@ -396,17 +385,17 @@ let KDDialogue = { "AngelHelp": { response: "Default", inventory: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("AngelHelp", 55); return false; }, options: { "Knife": { playertext: "Default", response: "AngelHelpKnife", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return !KinkyDungeonFlags.get("AngelHelped") && !KinkyDungeonInventoryGet("Knife"); }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonInventoryAddWeapon("Knife"); KinkyDungeonSetFlag("AngelHelped", 5); return false; @@ -415,10 +404,10 @@ let KDDialogue = { }, "Pick": { playertext: "Default", response: "AngelHelpPick", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (__gagged, _player) => { return !KinkyDungeonFlags.get("AngelHelped"); }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonLockpicks += 3; KinkyDungeonSetFlag("AngelHelped", 5); return false; @@ -427,23 +416,44 @@ let KDDialogue = { }, "BlueKey": { playertext: "Default", response: "AngelHelpBlueKey", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return !KinkyDungeonFlags.get("AngelHelped"); }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonBlueKeys += 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) => { + clickFunction: (_gagged, _player) => { return false; }, options: { @@ -453,7 +463,7 @@ let KDDialogue = { }, "Help": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDAddQuest("DressmakerQuest"); return false; }, @@ -467,7 +477,7 @@ let KDDialogue = { "Complete": { playertext: "Default", response: "Default", gag: true, - clickFunction: (gagged, player) => { + 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; @@ -481,14 +491,14 @@ let KDDialogue = { KDRemoveEntity(KDDialogueEnemy(), false); return false; }, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KinkyDungeonPlayerTags.has("BindingDress"); }, options: { "Question": { playertext: "Default", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (KinkyDungeonStatsChoice.has("Dominant")) { KinkyDungeonRemoveRestraintsWithShrine("BindingDress"); KDGameData.CurrentDialogMsg = "DressmakerQuestComplete_QuestionSuccess"; @@ -513,7 +523,7 @@ let KDDialogue = { "ApprenticeQuest": { response: "Default", inventory: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return false; }, options: { @@ -523,11 +533,11 @@ let KDDialogue = { }, "Help": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDAddQuest("ApprenticeQuest"); return false; }, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return !KDHasQuest("ApprenticeQuest"); }, options: { @@ -539,7 +549,7 @@ let KDDialogue = { }, "CompleteLegs": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDRemoveQuest("ApprenticeQuest"); KDRemoveEntity(KDDialogueEnemy(), false); KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollLegs, -1); @@ -549,7 +559,7 @@ let KDDialogue = { KinkyDungeonChangeFactionRep("Apprentice", 0.005); return false; }, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDHasQuest("ApprenticeQuest") && KinkyDungeonInventoryGet("ScrollLegs") != undefined; }, options: { @@ -561,7 +571,7 @@ let KDDialogue = { }, "CompleteArms": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDRemoveQuest("ApprenticeQuest"); KDRemoveEntity(KDDialogueEnemy(), false); KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollArms, -1); @@ -571,7 +581,7 @@ let KDDialogue = { KinkyDungeonChangeFactionRep("Apprentice", 0.005); return false; }, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDHasQuest("ApprenticeQuest") && KinkyDungeonInventoryGet("ScrollArms") != undefined; }, options: { @@ -583,7 +593,7 @@ let KDDialogue = { }, "CompleteVerbal": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDRemoveQuest("ApprenticeQuest"); KDRemoveEntity(KDDialogueEnemy(), false); KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollVerbal, -1); @@ -593,7 +603,7 @@ let KDDialogue = { KinkyDungeonChangeFactionRep("Apprentice", 0.005); return false; }, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDHasQuest("ApprenticeQuest") && KinkyDungeonInventoryGet("ScrollVerbal") != undefined; }, options: { @@ -605,7 +615,7 @@ let KDDialogue = { }, "CompletePurity": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDRemoveQuest("ApprenticeQuest"); KDRemoveEntity(KDDialogueEnemy(), false); KinkyDungeonChangeConsumable(KinkyDungeonConsumables.ScrollPurity, -1); @@ -615,7 +625,7 @@ let KDDialogue = { KinkyDungeonChangeFactionRep("Apprentice", 0.005); return false; }, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDHasQuest("ApprenticeQuest") && KinkyDungeonInventoryGet("ScrollPurity") != undefined; }, options: { @@ -629,7 +639,7 @@ let KDDialogue = { }, "DragonheartQuest": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return false; }, options: { @@ -639,7 +649,7 @@ let KDDialogue = { }, "Help": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDAddQuest("DragonheartQuest"); return false; }, @@ -654,7 +664,7 @@ let KDDialogue = { }, "MaidforceQuest": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return false; }, options: { @@ -664,7 +674,7 @@ let KDDialogue = { }, "Help": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDAddQuest("MaidforceQuest"); return false; }, @@ -679,14 +689,14 @@ let KDDialogue = { }, "JailerHiSec": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("LeashToPrison", -1); return false; }, options: { "Submit": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonDefeat(true); return true; }, @@ -694,7 +704,7 @@ let KDDialogue = { }, "Resist": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (KDDialogueEnemy() && !KDDialogueEnemy().hostile) { KDDialogueEnemy().hostile = 300; } @@ -712,14 +722,14 @@ let KDDialogue = { }, "CyberHiSec": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("LeashToPrison", -1); return false; }, options: { "Submit": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDEnterDollTerminal(false, true, false); return true; }, @@ -779,7 +789,7 @@ let KDDialogue = { }, "Resist": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (KDDialogueEnemy() && !KDDialogueEnemy().hostile) { KDDialogueEnemy().hostile = 300; } @@ -797,14 +807,14 @@ let KDDialogue = { }, "Tutorial": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("nobed", 8); return false; }, options: { "Continue": { playertext: "Default", response: "Default", - drawFunction: (gagged, player, delta) => { + drawFunction: (_gagged, _player, _delta) => { // Portrait DrawBoxKD(5, 5, 490, 990, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); return false; @@ -812,7 +822,7 @@ let KDDialogue = { options: { "Continue": { playertext: "Continue", response: "Default", - drawFunction: (gagged, player, delta) => { + drawFunction: (_gagged, _player, _delta) => { // Portrait DrawBoxKD(5, 5, 490, 990, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); return false; @@ -820,7 +830,7 @@ let KDDialogue = { options: { "Continue": { playertext: "Continue", response: "Default", - drawFunction: (gagged, player, delta) => { + 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; @@ -828,7 +838,7 @@ let KDDialogue = { options: { "Continue": { playertext: "Continue", response: "Default", - drawFunction: (gagged, player, delta) => { + drawFunction: (_gagged, _player, _delta) => { // Buff bar DrawBoxKD(740, 750, 800, 175, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); return false; @@ -836,7 +846,7 @@ let KDDialogue = { options: { "Continue": { playertext: "Continue", response: "Default", - drawFunction: (gagged, player, delta) => { + drawFunction: (_gagged, _player, _delta) => { // Action Bar DrawBoxKD(1620, 820, 440, 175, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); return false; @@ -844,7 +854,7 @@ let KDDialogue = { options: { "Continue": { playertext: "Continue", response: "Default", - drawFunction: (gagged, player, delta) => { + drawFunction: (_gagged, _player, _delta) => { // Submenus DrawBoxKD(1845, 450, 150, 320, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); return false; @@ -853,14 +863,14 @@ let KDDialogue = { "Continue": { // Status Bar playertext: "Continue", response: "Default", - drawFunction: (gagged, player, delta) => { + 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) => { + drawFunction: (_gagged, _player, _delta) => { // Hotbar DrawBoxKD(780, 920, 900, 75, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); return false; @@ -868,7 +878,7 @@ let KDDialogue = { options: { "Continue": { playertext: "Continue", response: "Default", - drawFunction: (gagged, player, delta) => { + drawFunction: (_gagged, _player, _delta) => { DrawBoxKD(550, 100, 1000, 200, "#ffffff", false, 0.1 + 0.05 * Math.sin(CommonTime()/200), 100); return false; }, @@ -942,7 +952,7 @@ let KDDialogue = { }, "LeaveAndDisable": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDToggles.SkipTutorial = true; KDSaveToggles(); return false; @@ -953,14 +963,14 @@ let KDDialogue = { }, "Bed": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("nobed", 8); return false; }, options: { "Sleep": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + 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); @@ -968,7 +978,7 @@ let KDDialogue = { } KinkyDungeonSetFlag("slept", -1); - if (KinkyDungeonPlayerInCell(true)) { + if (KinkyDungeonPlayerInCell(true) && KDGameData.PrisonerState == 'jail') { KinkyDungeonChangeRep("Ghost", KinkyDungeonIsArmsBound() ? 5 : 2); } //KinkyDungeonChangeWill(KinkyDungeonStatWillMax * KDSleepBedPercentage); @@ -991,14 +1001,28 @@ let KDDialogue = { }, "DollDropoff": { response: "Default", - clickFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { let nearestJail = KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); if (nearestJail && nearestJail.x == KDGameData.InteractTargetX && nearestJail.y == KDGameData.InteractTargetY) { @@ -1019,6 +1043,208 @@ let KDDialogue = { }, } }, + "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; + }, + 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, @@ -1027,7 +1253,7 @@ let KDDialogue = { }, "Furniture": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, player) => { KinkyDungeonSetFlag("nobed", 8); let en = KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); @@ -1044,11 +1270,11 @@ let KDDialogue = { options: { "Use": { playertext: "Default", response: "Default", - greyoutFunction: (gagged, player) => { + greyoutFunction: (_gagged, _player) => { return KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY) != KDPlayer(); }, greyoutTooltip: "KDOccupied", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let tile = KinkyDungeonTilesGet(KDGameData.InteractTargetX + ',' + KDGameData.InteractTargetY); if (tile?.Furniture) { @@ -1056,7 +1282,7 @@ let KDDialogue = { let furn = KDFurniture[tile.Furniture]; if (furn) { - KinkyDungeonSetFlag("GuardCalled", 300); + KinkyDungeonSetFlag("GuardCalled", 50); let rest = KinkyDungeonGetRestraint( {tags: [furn.restraintTag]}, MiniGameKinkyDungeonLevel, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), @@ -1082,11 +1308,11 @@ let KDDialogue = { }, "NPC": { playertext: "Default", response: "Default", - greyoutFunction: (gagged, player) => { + greyoutFunction: (_gagged, _player) => { return !KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); }, greyoutTooltip: "KDOccupied", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let tile = KinkyDungeonTilesGet(KDGameData.InteractTargetX + ',' + KDGameData.InteractTargetY); if (tile?.Furniture) { @@ -1109,14 +1335,14 @@ let KDDialogue = { }, "EnemyHelpless": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let en = KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); if (en && !en.player && KDCanBind(en)) { return KDHelpless(en); } return false; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let en = KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); if (en && !en.player && KDCanBind(en)) { let tile = KinkyDungeonTilesGet(KDGameData.InteractTargetX + ',' + KDGameData.InteractTargetY); @@ -1149,14 +1375,14 @@ let KDDialogue = { }, "Enemy": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + 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) => { + greyoutFunction: (_gagged, _player) => { let en = KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); if (en && !en.player && KDCanBind(en)) { return KinkyDungeonIsDisabled(en) || KDGameData.CurrentDialogMsgValue.PRCNT > 0; @@ -1164,7 +1390,7 @@ let KDDialogue = { return false; }, greyoutTooltip: "KDFurnEnemyDisabled", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let en = KinkyDungeonEntityAt(KDGameData.InteractTargetX, KDGameData.InteractTargetY); if (en && !en.player && KDCanBind(en)) { if (KDRandom() < KDGameData.CurrentDialogMsgValue.PRCNT) { @@ -1200,7 +1426,7 @@ let KDDialogue = { }, "Elevator": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return false; }, options: { @@ -1212,14 +1438,13 @@ let KDDialogue = { ...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) => { /** - * @type {KinkyDialogue} */ - let d = { + let d: KinkyDialogue = { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDIsElevatorFloorUnlocked(num); }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDElevatorToFloor( KDElevatorFloorIndex[num] ? (KDElevatorFloorIndex[num].Floor) : (typeof num === "string" ? 0 : num), KDElevatorFloorIndex[num]?.RoomType || @@ -1235,17 +1460,17 @@ let KDDialogue = { }, "Oriel": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return false; }, options: { "WhoAreYou": { playertext: "Default", response: "Default", gag: true, responseGag: true, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return !KinkyDungeonFlags.get("dOriel_WhoAreYou"); }, - clickFunction: (gagged, player) => { + clickFunction: (gagged, _player) => { if (!gagged) KinkyDungeonSetFlag("dOriel_WhoAreYou", -1); return false; @@ -1255,10 +1480,10 @@ let KDDialogue = { "Goddess": { playertext: "Default", response: "Default", gag: true, responseGag: true, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KinkyDungeonFlags.get("dOriel_WhoAreYou") && !KinkyDungeonFlags.get("dOriel_Goddess"); }, - clickFunction: (gagged, player) => { + clickFunction: (gagged, _player) => { if (!gagged) KinkyDungeonSetFlag("dOriel_Goddess", -1); return false; @@ -1268,10 +1493,10 @@ let KDDialogue = { "Control": { playertext: "Default", response: "Default", gag: true, responseGag: true, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KinkyDungeonFlags.get("dOriel_WhoAreYou") && !KinkyDungeonFlags.get("dOriel_Control"); }, - clickFunction: (gagged, player) => { + clickFunction: (gagged, _player) => { if (!gagged) KinkyDungeonSetFlag("dOriel_Control", -1); return false; @@ -1281,7 +1506,7 @@ let KDDialogue = { "Elevator": { playertext: "Default", response: "Default", gag: true, responseGag: true, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return (KinkyDungeonFlags.get("dOriel_WhoAreYou") && KDMapData.RoomType == "ElevatorRoom"); }, leadsToStage: "", dontTouchText: true, @@ -1289,7 +1514,7 @@ let KDDialogue = { "Help": { playertext: "Default", response: "Default", gag: true, responseGag: true, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (gagged, _player) => { if (KinkyDungeonFlags.get("dOriel_WhoAreYou") || gagged) return KinkyDungeonAllRestraintDynamic().some((element) => { return !KDRestraint(element.item)?.armor && !KDRestraint(element.item)?.good; @@ -1301,7 +1526,7 @@ let KDDialogue = { "Hello": { playertext: "Default", response: "Default", gag: true, responseGag: true, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (gagged, _player) => { return (KinkyDungeonFlags.get("dOriel_WhoAreYou") == -1) || gagged; }, leadsToStage: "", dontTouchText: true, @@ -1315,7 +1540,7 @@ let KDDialogue = { "ToolsOfTheTrade": { response: "Default", inventory: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return false; }, options: { @@ -1325,7 +1550,7 @@ let KDDialogue = { }, "SmokeBomb": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let amount = KinkyDungeonInventoryGetConsumable("Gunpowder")?.quantity; if (amount >= 1) { KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("Gunpowder"), -1); @@ -1345,7 +1570,7 @@ let KDDialogue = { }, "FlashBomb": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let amount = KinkyDungeonInventoryGetConsumable("Gunpowder")?.quantity; let amount2 = KinkyDungeonInventoryGetConsumable("AncientPowerSource")?.quantity; if (amount >= 1 && amount2 >= 1) { @@ -1367,7 +1592,7 @@ let KDDialogue = { }, "Bomb": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let amount = KinkyDungeonInventoryGetConsumable("Gunpowder")?.quantity; if (amount >= 2) { KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("Gunpowder"), -2); @@ -1387,7 +1612,7 @@ let KDDialogue = { }, "PotionInvisibility": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let amount = KinkyDungeonInventoryGetConsumable("Ectoplasm")?.quantity; if (amount >= 3) { KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("Ectoplasm"), -3); @@ -1409,7 +1634,7 @@ let KDDialogue = { }, "CommercePortal": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("noportal", 1); if (!KDGameData.TeleportLocations) KDGameData.TeleportLocations = {}; KDGameData.TeleportLocations.commerce = {x: KDCurrentWorldSlot.x, y: KDCurrentWorldSlot.y, type: KDGameData.RoomType, level: MiniGameKinkyDungeonLevel, checkpoint: MiniGameKinkyDungeonCheckpoint}; @@ -1418,7 +1643,7 @@ let KDDialogue = { options: { "Go": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let params = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; if (KDTile() && KDTile().Portal == "CommercePortal") { @@ -1454,14 +1679,14 @@ let KDDialogue = { }, "CommercePortalReturn": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("noportal", 1); return false; }, options: { "Go": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, player) => { if (KDTile() && KDTile().Portal == "CommercePortalReturn") { KinkyDungeonMapSet(player.x, player.y, '0'); KDTileDelete(); @@ -1493,7 +1718,7 @@ let KDDialogue = { }, "TableFood": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (KinkyDungeonTargetTile) { let tile = KinkyDungeonTilesGet(KinkyDungeonTargetTileLocation); if (tile) { @@ -1510,7 +1735,7 @@ let KDDialogue = { options: { "Eat": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let tile = KinkyDungeonTilesGet(KinkyDungeonTargetTileLocation); if (tile && tile.Type == "Food") { let gagTotal = KinkyDungeonGagTotal(); @@ -1538,7 +1763,7 @@ let KDDialogue = { }, options: { "Leave": { - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonTargetTile = null; KinkyDungeonTargetTileLocation = ""; return false; @@ -1550,14 +1775,14 @@ let KDDialogue = { }, "Take": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { let tile = KinkyDungeonTilesGet(KinkyDungeonTargetTileLocation); if (tile && tile.Type == "Food" && KDFood[tile.Food]?.Theft) { return true; } return false; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let tile = KinkyDungeonTilesGet(KinkyDungeonTargetTileLocation); if (tile && tile.Type == "Food" && KDFood[tile.Food]?.Theft) { KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable(KDFood[tile.Food].Theft), 1); @@ -1576,7 +1801,7 @@ let KDDialogue = { }, options: { "Leave": { - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonTargetTile = null; KinkyDungeonTargetTileLocation = ""; return false; @@ -1587,7 +1812,7 @@ let KDDialogue = { } }, "Leave": { - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonTargetTile = null; KinkyDungeonTargetTileLocation = ""; return false; @@ -1599,14 +1824,14 @@ let KDDialogue = { }, "Button": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("nobutton", 3); return false; }, options: { "Press": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, player) => { // PUSH the BUTTON KDCreateEffectTile(player.x, player.y, { name: "WireSparks", @@ -1632,14 +1857,14 @@ let KDDialogue = { "LeylineMap": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("nodollterm", 4); return false; }, options: { "Leave": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDPushSpell(KinkyDungeonFindSpell("ManaPoolUp")); KinkyDungeonUpdateStats(0); return false; @@ -1652,7 +1877,7 @@ let KDDialogue = { "Leave": { playertext: "Default", response: "Default", exitDialogue: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDPushSpell(KinkyDungeonFindSpell("ManaPoolUp")); KinkyDungeonUpdateStats(0); return false; @@ -1668,7 +1893,7 @@ let KDDialogue = { }, "DollTerminal_Step": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("nodollterm", 4); return false; }, @@ -1689,7 +1914,7 @@ let KDDialogue = { options: { "Leave": { playertext: "Leave", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDEnterDollTerminal(true); return false; }, @@ -1703,7 +1928,7 @@ let KDDialogue = { }, "DollTerminal_Forced": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("nodollterm", 4); KDGameData.CurrentDialogMsgValue = { Percent: Math.max(0, 0.25 * KinkyDungeonSlowLevel), @@ -1716,7 +1941,7 @@ let KDDialogue = { options: { "Resist": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (KDRandom() < KDGameData.CurrentDialogMsgValue.Percent) { KDGameData.CurrentDialogMsg = "DollTerminal_ForcedForced"; KDGameData.CurrentDialogStage = "Forced"; @@ -1735,7 +1960,7 @@ let KDDialogue = { options: { "Leave": { playertext: "Leave", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDEnterDollTerminal(true); return false; }, @@ -1744,11 +1969,11 @@ let KDDialogue = { } }, "Forced": { - prerequisiteFunction: (gagged, player) => {return false;}, + prerequisiteFunction: (_gagged, _player) => {return false;}, playertext: "Default", response: "Default", options: { "Leave": { - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDEnterDollTerminal(false); return false; }, @@ -1761,14 +1986,14 @@ let KDDialogue = { }, "Leyline": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("noleyline", 8); return false; }, options: { "Use": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, player) => { KinkyDungeonChangeMana(0, false, 100, false, false); if (KDTile() && KDTile().Leyline) { KinkyDungeonMapSet(player.x, player.y, '0'); @@ -1791,7 +2016,7 @@ let KDDialogue = { }, "BanditQuest": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return false; }, options: { @@ -1801,7 +2026,7 @@ let KDDialogue = { }, "Help": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDAddQuest("BanditPrisoner"); return false; }, @@ -1831,22 +2056,21 @@ let KDDialogue = { "ShopkeeperRescue": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return false; }, options: { "Accept": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, player) => { KDGameData.PrisonerState = ""; KinkyDungeonInterruptSleep(); // Type shenanigans unintended let doorTile = KDGetJailDoor(player.x, player.y); - /** @type {KDPoint} */ - let door = doorTile; - if (door) { + let door: KDPoint = doorTile; + if (door && KDistChebyshev(door.x-player.x, door.y-player.y) < 5) { if (doorTile.tile) { - doorTile.OGLock = doorTile.Lock; + doorTile['OGLock'] = doorTile['Lock']; doorTile.tile.Lock = undefined; KDUpdateDoorNavMap(); } @@ -1878,7 +2102,7 @@ let KDDialogue = { "Refuse": { playertext: "Default", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("refusedShopkeeperRescue", 100); return false; }, @@ -1893,7 +2117,7 @@ let KDDialogue = { }, "ShopkeeperRescueChatter": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return false; }, options: { @@ -1923,7 +2147,7 @@ let KDDialogue = { }, "ShopkeeperTeleport": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (!KDGameData.ShopkeeperFee) KDGameData.ShopkeeperFee = 0; KDGameData.ShopkeeperFee += KDDialogueParams.ShopkeeperFee + Math.max(0, KDDialogueParams.ShopkeeperFeePerLevel * (KDGameData.HighestLevelCurrent || 1)); KDGameData.CurrentDialogMsgValue = { @@ -1937,10 +2161,10 @@ let KDDialogue = { options: { "Pay": { playertext: "Default", response: "Default", gag: true, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KinkyDungeonGold >= KDGameData.ShopkeeperFee; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonGold -= KDGameData.ShopkeeperFee; KDGameData.ShopkeeperFee = 0; KinkyDungeonRemoveRestraintsWithShrine("Rope", undefined, true, false, true, false, true); @@ -1957,11 +2181,11 @@ let KDDialogue = { } }, "Tab": { - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return !KDGameData.CurrentDialogMsgData.Please; }, playertext: "Default", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (KinkyDungeonGold >= KDDialogueParams.ShopkeeperFee + Math.max(0, KDDialogueParams.ShopkeeperFeePerLevel * (KDGameData.HighestLevelCurrent || 1))) { KDGameData.CurrentDialogMsg = "ShopkeeperTeleportTabNo"; KDGameData.CurrentDialogStage = ""; @@ -2001,11 +2225,11 @@ let KDDialogue = { } }, "TabRetry": { - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDGameData.CurrentDialogMsgData.Please != undefined; }, playertext: "Default", response: "Default", gag: true, - clickFunction: (gagged, player) => { + 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( @@ -2038,27 +2262,27 @@ let KDDialogue = { } }, "Debt": { - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return false; }, playertext: "Default", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return false; }, options: { "Armor": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Armor != undefined; }, - clickFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { if (KDRandom() > (KDBasicArmorWeight_Cursed) / (KDBasicArmorWeight_Cursed + KDBasicArmorWeight)) { KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt_Armor_YesUncursed"; @@ -2067,8 +2291,7 @@ let KDDialogue = { let curs = KDGetByWeight(KinkyDungeonGetHexByListWeighted("Common", armor, false, 0, 50, [])); let events = JSON.parse(JSON.stringify(KDRestraint({name: armor}).events || [])); - /** @type {KDRestraintVariant} */ - let variant = { + let variant: KDRestraintVariant = { template: armor, events: events, }; @@ -2093,7 +2316,7 @@ let KDDialogue = { }, "No": { playertext: "ShopkeeperTeleportDebt_No", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDGameData.CurrentDialogStage = "Debt"; KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; return true; @@ -2103,23 +2326,22 @@ let KDDialogue = { }, "Restraint": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Restraint != undefined; }, - clickFunction: (gagged, player) => { + 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) => { + 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 || [])); - /** @type {KDRestraintVariant} */ - let variant = { + let variant: KDRestraintVariant = { template: armor, events: events, }; @@ -2139,7 +2361,7 @@ let KDDialogue = { }, "No": { playertext: "ShopkeeperTeleportDebt_No", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDGameData.CurrentDialogStage = "Debt"; KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; return true; @@ -2149,23 +2371,22 @@ let KDDialogue = { }, "Collar": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Collar != undefined; }, - clickFunction: (gagged, player) => { + 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) => { + 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 || [])); - /** @type {KDRestraintVariant} */ - let variant = { + let variant: KDRestraintVariant = { template: armor, events: events, }; @@ -2185,7 +2406,7 @@ let KDDialogue = { }, "No": { playertext: "ShopkeeperTeleportDebt_No", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDGameData.CurrentDialogStage = "Debt"; KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; return true; @@ -2195,23 +2416,22 @@ let KDDialogue = { }, "Catsuit": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Catsuit != undefined; }, - clickFunction: (gagged, player) => { + 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) => { + 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 || [])); - /** @type {KDRestraintVariant} */ - let variant = { + let variant: KDRestraintVariant = { template: armor, events: events, }; @@ -2231,7 +2451,7 @@ let KDDialogue = { }, "No": { playertext: "ShopkeeperTeleportDebt_No", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDGameData.CurrentDialogStage = "Debt"; KDGameData.CurrentDialogMsg = "ShopkeeperTeleportDebt"; return true; @@ -2241,10 +2461,10 @@ let KDDialogue = { }, "Pay": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KinkyDungeonGold >= KDGameData.ShopkeeperFee; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonGold -= KDGameData.ShopkeeperFee; KDGameData.ShopkeeperFee = 0; KinkyDungeonRemoveRestraintsWithShrine("Rope", undefined, true, false, true, false, true); @@ -2266,7 +2486,7 @@ let KDDialogue = { }, "ShopkeeperOfferHelp": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDGameData.CurrentDialogMsgValue = { "RESCUECOST": Math.round(KDDialogueParams.ShopkeeperHelpFee + (KDDialogueParams.ShopkeeperHelpFeePerLevel * (KDGameData.HighestLevelCurrent || 1)) + (KDDialogueParams.ShopkeeperHelpFeePerPower * (KDGetTotalRestraintPower( @@ -2281,10 +2501,10 @@ let KDDialogue = { options: { "Pay": { playertext: "Default", response: "Default", gag: true, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KinkyDungeonGold >= KDGameData.CurrentDialogMsgValue.RESCUECOST; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonGold -= KDGameData.CurrentDialogMsgValue.RESCUECOST; KinkyDungeonRemoveRestraintsWithShrine("Rope", undefined, true, false, true, false, true); KinkyDungeonRemoveRestraintsWithShrine("Leather", undefined, true, false, true, false, true); @@ -2300,11 +2520,11 @@ let KDDialogue = { } }, "Tab": { - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return !KDGameData.CurrentDialogMsgData.Please; }, playertext: "Default", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (KinkyDungeonGold >= KDGameData.CurrentDialogMsgValue.RESCUECOST) { KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpTabNo"; KDGameData.CurrentDialogStage = ""; @@ -2344,11 +2564,11 @@ let KDDialogue = { } }, "TabRetry": { - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDGameData.CurrentDialogMsgData.Please != undefined; }, playertext: "Default", response: "Default", gag: true, - clickFunction: (gagged, player) => { + 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( @@ -2385,27 +2605,27 @@ let KDDialogue = { } }, "Debt": { - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return false; }, playertext: "Default", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return false; }, options: { "Armor": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Armor != undefined; }, - clickFunction: (gagged, player) => { + 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) => { + clickFunction: (_gagged, _player) => { if (KDRandom() > (KDBasicArmorWeight_Cursed) / (KDBasicArmorWeight_Cursed + KDBasicArmorWeight)) { KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpDebt_Armor_YesUncursed"; @@ -2414,8 +2634,7 @@ let KDDialogue = { let curs = KDGetByWeight(KinkyDungeonGetHexByListWeighted("Common", armor, false, 0, 50, [])); let events = JSON.parse(JSON.stringify(KDRestraint({name: armor}).events || [])); - /** @type {KDRestraintVariant} */ - let variant = { + let variant: KDRestraintVariant = { template: armor, events: events, }; @@ -2439,7 +2658,7 @@ let KDDialogue = { }, "No": { playertext: "ShopkeeperOfferHelpDebt_No", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDGameData.CurrentDialogStage = "Debt"; KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpDebt"; return true; @@ -2449,23 +2668,22 @@ let KDDialogue = { }, "Restraint": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Restraint != undefined; }, - clickFunction: (gagged, player) => { + 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) => { + 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 || [])); - /** @type {KDRestraintVariant} */ - let variant = { + let variant: KDRestraintVariant = { template: armor, events: events, }; @@ -2485,7 +2703,7 @@ let KDDialogue = { }, "No": { playertext: "ShopkeeperOfferHelpDebt_No", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDGameData.CurrentDialogStage = "Debt"; KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpDebt"; return true; @@ -2495,23 +2713,22 @@ let KDDialogue = { }, "Collar": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Collar != undefined; }, - clickFunction: (gagged, player) => { + 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) => { + 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 || [])); - /** @type {KDRestraintVariant} */ - let variant = { + let variant: KDRestraintVariant = { template: armor, events: events, }; @@ -2531,7 +2748,7 @@ let KDDialogue = { }, "No": { playertext: "ShopkeeperOfferHelpDebt_No", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDGameData.CurrentDialogStage = "Debt"; KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpDebt"; return true; @@ -2541,23 +2758,22 @@ let KDDialogue = { }, "Catsuit": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDGameData.CurrentDialogMsgData?.RESTRAINTNAME_Catsuit != undefined; }, - clickFunction: (gagged, player) => { + 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) => { + 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 || [])); - /** @type {KDRestraintVariant} */ - let variant = { + let variant: KDRestraintVariant = { template: armor, events: events, }; @@ -2577,7 +2793,7 @@ let KDDialogue = { }, "No": { playertext: "ShopkeeperOfferHelpDebt_No", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDGameData.CurrentDialogStage = "Debt"; KDGameData.CurrentDialogMsg = "ShopkeeperOfferHelpDebt"; return true; @@ -2587,10 +2803,10 @@ let KDDialogue = { }, "Pay": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KinkyDungeonGold >= KDGameData.CurrentDialogMsgValue.RESCUECOST; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonGold -= KDGameData.CurrentDialogMsgValue.RESCUECOST; KinkyDungeonRemoveRestraintsWithShrine("Rope", undefined, true, false, true, false, true); KinkyDungeonRemoveRestraintsWithShrine("Leather", undefined, true, false, true, false, true); @@ -2615,7 +2831,7 @@ let KDDialogue = { }, "ShopkeeperStart": { response: "Default", - clickFunction: (gagged, player) => { + 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)))), @@ -2629,7 +2845,7 @@ let KDDialogue = { "Shop": { playertext: "Default", response: "Default", gag: true, - clickFunction: (gagged, player) => { + clickFunction: (gagged, _player) => { if (gagged) { KDGameData.CurrentDialogMsg = "ShopkeeperStartShopGag"; } @@ -2639,7 +2855,7 @@ let KDDialogue = { "Sell": { playertext: "Default", response: "Default", exitDialogue: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDGameData.InventoryAction = "Sell"; KDGameData.SellMarkup = 0.7; KinkyDungeonDrawState = "Inventory"; @@ -2650,7 +2866,7 @@ let KDDialogue = { /*"SellBulk": { playertext: "Default", response: "Default", exitDialogue: true, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KDGameData.InventoryAction = "SellBulk"; KDGameData.SellMarkup = 0.7; KinkyDungeonDrawState = "Inventory"; @@ -2666,12 +2882,12 @@ let KDDialogue = { }, "Help": { playertext: "Default", response: "Default", gag: true, - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KinkyDungeonAllRestraintDynamic().some((element) => { return !KDRestraint(element.item)?.armor && !KDRestraint(element.item)?.good; }); }, - clickFunction: (gagged, player) => { + 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 @@ -2738,7 +2954,7 @@ let KDDialogue = { "MummyElevator": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let e = KDGetSpeaker(); if (e) { e.hp = 0; @@ -2783,11 +2999,11 @@ let KDDialogue = { "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), + ["RopeSnakeRaw", "VinylTapeRaw", "Stuffing", "ClothGag", "ClothGag2", "ClothGag3", "ClothGagOver"], [], ["blacksmith"], 0.4, 5, ["SmokeBomb"], 10), "PrisonerBandit": { response: "Default", personalities: ["Sub"], - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { return false; }, options: { @@ -2798,7 +3014,7 @@ let KDDialogue = { "Help": { playertext: "Default", response: "Default", personalities: ["Sub"], - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (KDDialogueEnemy()) { let e = KDDialogueEnemy(); KDRemoveEntity(KDDialogueEnemy(), false); @@ -2844,7 +3060,7 @@ let KDDialogue = { }, "PrisonerJail": { // For prisoners in the prison level. Doesnt increase rep much, but useful for jailbreak purposes response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let e = KDDialogueEnemy(); if (e && !KDEnemyHasFlag(e, "LockJammed")) { KDGameData.CurrentDialogMsgData = {}; @@ -2866,7 +3082,7 @@ let KDDialogue = { exitDialogue: true, }, "Jammed": { - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return false; }, playertext: "Default", response: "Default", @@ -2878,13 +3094,13 @@ let KDDialogue = { } }, "JammedRecent": { - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return false; }, playertext: "Default", response: "Default", options: { "Apologize": { - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", 5); return false; }, @@ -2900,7 +3116,7 @@ let KDDialogue = { }, "Unlock": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, player) => { if (KinkyDungeonRedKeys > 0) { if (KinkyDungeonCanUseKey() || !KinkyDungeonIsArmsBound()) { if (KDDialogueEnemy()) { @@ -2950,7 +3166,7 @@ let KDDialogue = { }, "Pick": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, player) => { if (KinkyDungeonLockpicks > 0) { if (!KinkyDungeonIsHandsBound(false, true, 0.45)) { if (KDDialogueEnemy()) { @@ -3008,7 +3224,7 @@ let KDDialogue = { }, "PrisonerJailOwn": { // For prisoners in the prison level. Doesnt increase rep much, but useful for jailbreak purposes response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let e = KDDialogueEnemy(); if (e) { KDGameData.CurrentDialogMsgData = {}; @@ -3024,7 +3240,7 @@ let KDDialogue = { }, "Unlock": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, player) => { if (KinkyDungeonRedKeys > 0) { if (KinkyDungeonCanUseKey() || !KinkyDungeonIsArmsBound()) { if (KDDialogueEnemy()) { @@ -3060,7 +3276,7 @@ let KDDialogue = { }, "Flip": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (KDDialogueEnemy()) { let e = KDDialogueEnemy(); @@ -3085,7 +3301,7 @@ let KDDialogue = { }, "Reclaim": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { if (KDDialogueEnemy()) { let e = KDDialogueEnemy(); @@ -3094,7 +3310,7 @@ let KDDialogue = { } return false; }, - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (KDDialogueEnemy()) { let e = KDDialogueEnemy(); @@ -3122,7 +3338,7 @@ let KDDialogue = { }, "Pick": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, player) => { if (KinkyDungeonLockpicks > 0) { if (!KinkyDungeonIsHandsBound(false, true, 0.45)) { if (KDDialogueEnemy()) { @@ -3159,7 +3375,7 @@ let KDDialogue = { }, "Fuuka": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { enemy.hostile = 9999; @@ -3258,7 +3474,7 @@ let KDDialogue = { }, "Question3": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDUnlockedPerks.includes("StartCyberDoll"); }, options: { @@ -3430,7 +3646,7 @@ let KDDialogue = { }, "Dom": { gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", -2); return false; }, @@ -3483,7 +3699,7 @@ let KDDialogue = { }, "Sub": { gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", 2); return false; }, @@ -3537,7 +3753,7 @@ let KDDialogue = { "Attack": {playertext: "Default", exitDialogue: true}, "PostIntro": { - prerequisiteFunction: (gagged, player) => {return false;}, + prerequisiteFunction: (_gagged, _player) => {return false;}, playertext: "Default", response: "Default", options: { "Zombie": { @@ -3552,7 +3768,7 @@ let KDDialogue = { "Dom": {gag: true, playertext: "Default", response: "FuukaPostIntro_Dom", leadsToStage: "Fight", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", -2); return false; } @@ -3560,7 +3776,7 @@ let KDDialogue = { "Sub": {gag: true, playertext: "Default", response: "FuukaPostIntro_Sub", leadsToStage: "Fight", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", 2); return false; } @@ -3572,7 +3788,7 @@ let KDDialogue = { } }, "Fight": { - prerequisiteFunction: (gagged, player) => {return false;}, + prerequisiteFunction: (_gagged, _player) => {return false;}, playertext: "Default", dontTouchText: true, options: { "Fight1": {gag: true, @@ -3590,7 +3806,7 @@ let KDDialogue = { }, "TheWarden": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { enemy.hostile = 9999; @@ -3707,7 +3923,7 @@ let KDDialogue = { }, "Question3": { playertext: "Default", response: "Default", - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KDUnlockedPerks.includes("StartCyberDoll"); }, options: { @@ -3833,7 +4049,7 @@ let KDDialogue = { options: { "Question": {gagDisabled: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (KinkyDungeonPlayerTags.get("Collars")) { KDGameData.CurrentDialogMsg = "TheWardenBrat_Question_Collar"; } @@ -3876,7 +4092,7 @@ let KDDialogue = { }, "Dom": { gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", -2); return false; }, @@ -3929,7 +4145,7 @@ let KDDialogue = { }, "Sub": { gag: true, playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", 2); return false; }, @@ -3983,7 +4199,7 @@ let KDDialogue = { "Attack": {playertext: "Default", exitDialogue: true}, "PostIntro": { - prerequisiteFunction: (gagged, player) => {return false;}, + prerequisiteFunction: (_gagged, _player) => {return false;}, playertext: "Default", response: "Default", options: { "Zombie": { @@ -3998,7 +4214,7 @@ let KDDialogue = { "Dom": {gag: true, playertext: "Default", response: "TheWardenPostIntro_Dom", leadsToStage: "Fight", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", -2); return false; } @@ -4006,7 +4222,7 @@ let KDDialogue = { "Sub": {gag: true, playertext: "Default", response: "TheWardenPostIntro_Sub", leadsToStage: "Fight", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", 2); return false; } @@ -4018,7 +4234,7 @@ let KDDialogue = { } }, "Fight": { - prerequisiteFunction: (gagged, player) => {return false;}, + prerequisiteFunction: (_gagged, _player) => {return false;}, playertext: "Default", dontTouchText: true, options: { "Fight1": {gag: true, @@ -4036,7 +4252,7 @@ let KDDialogue = { }, "Dollmaker": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { enemy.hostile = 9999; @@ -4057,7 +4273,7 @@ let KDDialogue = { leadsToStage: "Fight", }, "Staff": { - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KinkyDungeonPlayerDamage?.name == "StaffDoll"; }, playertext: "Default", response: "Default", @@ -4082,7 +4298,7 @@ let KDDialogue = { leadsToStage: "Fight", }, "Staff": { - prerequisiteFunction: (gagged, player) => { + prerequisiteFunction: (_gagged, _player) => { return KinkyDungeonPlayerDamage?.name == "StaffDoll"; }, playertext: "Default", response: "Default", @@ -4097,7 +4313,7 @@ let KDDialogue = { }, "Fight": { - prerequisiteFunction: (gagged, player) => {return false;}, + prerequisiteFunction: (_gagged, _player) => {return false;}, playertext: "Default", response: "Default", options: { "Wait": {gagDisabled: true, @@ -4148,7 +4364,7 @@ let KDDialogue = { }, "DollmakerStage2": { response: "Default", - clickFunction: (gagged, player) => { + 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}; @@ -4171,7 +4387,7 @@ let KDDialogue = { }, "DollmakerStage3": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, player) => { // Remove the doors for (let en of KDMapData.Entities) { if (en.Enemy.tags.dolldoor) en.hp = 0; @@ -4198,7 +4414,7 @@ let KDDialogue = { }, "DollmakerWin": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("BossUnlocked", -1); KinkyDungeonSetFlag("SpawnMap", -1); return false; @@ -4206,7 +4422,7 @@ let KDDialogue = { options: { "Leave": { playertext: "Leave", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (KinkyDungeonIsPlayer()) { KDUnlockPerk("DollmakerVisor"); KDUnlockPerk("StartCyberDoll"); @@ -4218,7 +4434,7 @@ let KDDialogue = { }, "Accept": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerVisor"), 0, true); KinkyDungeonAddGold(1000); if (KinkyDungeonIsPlayer()) { @@ -4237,7 +4453,7 @@ let KDDialogue = { }, "Accept2": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerMask"), 0, true); KinkyDungeonAddGold(1000); if (KinkyDungeonIsPlayer()) { @@ -4256,7 +4472,7 @@ let KDDialogue = { }, "Gag": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", -5); if (KinkyDungeonIsPlayer()) { KDUnlockPerk("DollmakerVisor"); @@ -4276,7 +4492,7 @@ let KDDialogue = { }, "DollmakerLose": { response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { enemy.hostile = 0; @@ -4293,7 +4509,7 @@ let KDDialogue = { "Continue1": { playertext: "DollmakerLose_Continue1", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerVisor"), 0, true); return false; }, @@ -4301,7 +4517,7 @@ let KDDialogue = { "Continue2": { playertext: "DollmakerLose_Continue2", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerMask"), 0, true); return false; }, @@ -4309,7 +4525,7 @@ let KDDialogue = { "Continue3": { playertext: "DollmakerLose_Continue3", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(KDRandom() < 0.5 ? "DollmakerVisor" : "DollmakerMask"), 0, true); return false; }, @@ -4322,7 +4538,7 @@ let KDDialogue = { "Continue1": { playertext: "DollmakerLose_Continue1", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerVisor"), 0, true); return false; }, @@ -4330,7 +4546,7 @@ let KDDialogue = { "Continue2": { playertext: "DollmakerLose_Continue2", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DollmakerMask"), 0, true); return false; }, @@ -4338,7 +4554,7 @@ let KDDialogue = { "Continue3": { playertext: "DollmakerLose_Continue3", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(KDRandom() < 0.5 ? "DollmakerVisor" : "DollmakerMask"), 0, true); return false; }, @@ -4346,7 +4562,7 @@ let KDDialogue = { } }, "Finish": { - prerequisiteFunction: (gagged, player) => {return false;}, + prerequisiteFunction: (_gagged, _player) => {return false;}, playertext: "Default", response: "DollmakerLoseFinish", options: { "Leave": { @@ -4359,7 +4575,7 @@ let KDDialogue = { }, "FuukaLose": { // Player loses to Fuuka response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { enemy.hostile = 0; @@ -4376,7 +4592,7 @@ let KDDialogue = { "Continue1": { playertext: "FuukaLose_Continue1", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); return false; }, @@ -4384,7 +4600,7 @@ let KDDialogue = { "Continue2": { playertext: "FuukaLose_Continue2", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); return false; }, @@ -4392,7 +4608,7 @@ let KDDialogue = { "Continue3": { playertext: "FuukaLose_Continue3", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); return false; }, @@ -4405,7 +4621,7 @@ let KDDialogue = { "Continue1": { playertext: "FuukaLose_Continue1", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); return false; }, @@ -4413,7 +4629,7 @@ let KDDialogue = { "Continue2": { playertext: "FuukaLose_Continue2", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); return false; }, @@ -4421,7 +4637,7 @@ let KDDialogue = { "Continue3": { playertext: "FuukaLose_Continue3", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); return false; }, @@ -4434,7 +4650,7 @@ let KDDialogue = { "Continue1": { playertext: "FuukaLose_Continue1", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); return false; }, @@ -4442,7 +4658,7 @@ let KDDialogue = { "Continue2": { playertext: "FuukaLose_Continue2", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); return false; }, @@ -4450,7 +4666,7 @@ let KDDialogue = { "Continue3": { playertext: "FuukaLose_Continue3", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar"), 0, true); return false; }, @@ -4458,7 +4674,7 @@ let KDDialogue = { } }, "Finish": { - prerequisiteFunction: (gagged, player) => {return false;}, + prerequisiteFunction: (_gagged, _player) => {return false;}, playertext: "Default", response: "FuukaLoseFinish", options: { "Leave": { @@ -4471,7 +4687,7 @@ let KDDialogue = { }, "DragonQueenCrystal": { // Player defeats fuuka's first form response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, player) => { let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true, undefined, true); if (!point) { point = KinkyDungeonGetRandomEnemyPoint(false, false, null); @@ -4481,7 +4697,6 @@ let KDDialogue = { 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; return false; }, @@ -4494,7 +4709,7 @@ let KDDialogue = { }, "FuukaStage2": { // Player defeats fuuka's first form response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, player) => { let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true); if (!point) { point = KinkyDungeonGetRandomEnemyPoint(false, false, null); @@ -4517,7 +4732,7 @@ let KDDialogue = { }, "FuukaWin": { // Player beats Fuuka response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("BossUnlocked", -1); KinkyDungeonSetFlag("SpawnMap", -1); if (KinkyDungeonPlayerBuffs?.FuukaOrb) KinkyDungeonPlayerBuffs.FuukaOrb.duration = 0; @@ -4526,7 +4741,7 @@ let KDDialogue = { options: { "Leave": { playertext: "Leave", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (KinkyDungeonIsPlayer()) { KDUnlockPerk("FuukaCollar"); KDUnlockPerk("CommonFuuka"); @@ -4537,7 +4752,7 @@ let KDDialogue = { }, "Accept": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("MikoCollar2"), 0, true); //KinkyDungeonAddGold(1000); if (KinkyDungeonIsPlayer()) { @@ -4555,7 +4770,7 @@ let KDDialogue = { }, "Gag": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", -5); if (KinkyDungeonIsPlayer()) { KDUnlockPerk("FuukaCollar"); @@ -4576,7 +4791,7 @@ let KDDialogue = { "TheWardenLose": { // Player loses to TheWarden response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { let enemy = KinkyDungeonFindID(KDGameData.CurrentDialogMsgID); if (enemy && enemy.Enemy.name == KDGameData.CurrentDialogMsgSpeaker) { enemy.hostile = 0; @@ -4593,7 +4808,7 @@ let KDDialogue = { "Continue1": { playertext: "TheWardenLose_Continue1", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); KinkyDungeonChangeRep("Prisoner", -100); return false; @@ -4602,7 +4817,7 @@ let KDDialogue = { "Continue2": { playertext: "TheWardenLose_Continue2", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); KinkyDungeonChangeRep("Prisoner", -100); return false; @@ -4611,7 +4826,7 @@ let KDDialogue = { "Continue3": { playertext: "TheWardenLose_Continue3", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); KinkyDungeonChangeRep("Prisoner", -100); return false; @@ -4625,7 +4840,7 @@ let KDDialogue = { "Continue1": { playertext: "TheWardenLose_Continue1", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); KinkyDungeonChangeRep("Prisoner", -100); return false; @@ -4634,7 +4849,7 @@ let KDDialogue = { "Continue2": { playertext: "TheWardenLose_Continue2", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); KinkyDungeonChangeRep("Prisoner", -100); return false; @@ -4643,7 +4858,7 @@ let KDDialogue = { "Continue3": { playertext: "TheWardenLose_Continue3", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); KinkyDungeonChangeRep("Prisoner", -100); return false; @@ -4657,7 +4872,7 @@ let KDDialogue = { "Continue1": { playertext: "TheWardenLose_Continue1", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); KinkyDungeonChangeRep("Prisoner", -100); return false; @@ -4666,7 +4881,7 @@ let KDDialogue = { "Continue2": { playertext: "TheWardenLose_Continue2", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); KinkyDungeonChangeRep("Prisoner", -100); return false; @@ -4675,7 +4890,7 @@ let KDDialogue = { "Continue3": { playertext: "TheWardenLose_Continue3", response: "Default", leadsToStage: "Finish", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt"), 0, true); KinkyDungeonChangeRep("Prisoner", -100); return false; @@ -4684,7 +4899,7 @@ let KDDialogue = { } }, "Finish": { - prerequisiteFunction: (gagged, player) => {return false;}, + prerequisiteFunction: (_gagged, _player) => {return false;}, playertext: "Default", response: "TheWardenLoseFinish", options: { "Leave": { @@ -4697,7 +4912,7 @@ let KDDialogue = { }, "TheWardenStage2": { // Player defeats thewarden's first form response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, player) => { let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true); if (!point) { point = KinkyDungeonGetRandomEnemyPoint(false, false, null); @@ -4720,7 +4935,7 @@ let KDDialogue = { }, "TheWardenWin": { // Player beats TheWarden response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonSetFlag("BossUnlocked", -1); KinkyDungeonSetFlag("SpawnMap", -1); return false; @@ -4728,7 +4943,7 @@ let KDDialogue = { options: { "Leave": { playertext: "Leave", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { if (KinkyDungeonIsPlayer()) { KDUnlockPerk("WardenBelt"); KDUnlockPerk("CommonWarden"); @@ -4739,7 +4954,7 @@ let KDDialogue = { }, "Accept": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("WardenBelt2"), 0, true); KinkyDungeonAddGold(1000); if (KinkyDungeonIsPlayer()) { @@ -4757,7 +4972,7 @@ let KDDialogue = { }, "Gag": { playertext: "Default", response: "Default", - clickFunction: (gagged, player) => { + clickFunction: (_gagged, _player) => { KinkyDungeonChangeRep("Ghost", -5); if (KinkyDungeonIsPlayer()) { KDUnlockPerk("WardenBelt"); diff --git a/Game/src/dialogue/KinkyDungeonDialogueTriggers.js b/Game/src/dialogue/KinkyDungeonDialogueTriggers.ts similarity index 90% rename from Game/src/dialogue/KinkyDungeonDialogueTriggers.js rename to Game/src/dialogue/KinkyDungeonDialogueTriggers.ts index fcdda72f4..c792a3daf 100644 --- a/Game/src/dialogue/KinkyDungeonDialogueTriggers.js +++ b/Game/src/dialogue/KinkyDungeonDialogueTriggers.ts @@ -3,8 +3,7 @@ /** No dialogues will trigger when the player dist is higher than this */ let KinkyDungeonMaxDialogueTriggerDist = 5.9; -/** @type {Record} */ -let KDDialogueTriggers = { +let KDDialogueTriggers: Record = { "WeaponStop": { dialogue: "WeaponFound", allowedPrisonStates: ["parole"], @@ -14,7 +13,7 @@ let KDDialogueTriggers = { noAlly: true, talk: true, blockDuringPlaytime: false, - prerequisite: (enemy, dist, AIData) => { + prerequisite: (enemy, dist, _AIData) => { return (KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed && KinkyDungeonPlayerDamage.name @@ -23,7 +22,7 @@ let KDDialogueTriggers = { && KDRandom() < 0.25 && !KinkyDungeonFlags.has("demand")); }, - weight: (enemy, dist) => { + weight: (enemy, _dist) => { return KDStrictPersonalities.includes(enemy.personality) ? 10 : 1; }, }, @@ -167,7 +166,7 @@ let KDDialogueTriggers = { noAlly: true, talk: true, blockDuringPlaytime: true, - prerequisite: (enemy, dist, AIData) => { + prerequisite: (_enemy, dist, _AIData) => { return (dist < 1.5 && KinkyDungeonStatsChoice.has("arousalMode") && !KinkyDungeonFlags.get("DangerFlag") @@ -190,7 +189,7 @@ let KDDialogueTriggers = { allowLowPower: true }) != undefined); }, - weight: (enemy, dist) => { + 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); }, }, @@ -217,16 +216,16 @@ let KDDialogueTriggers = { /** * 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 - * @param {string} Lock - * @returns {boolean} + * @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, AIData, dist, maxdist, chance, restraintTags, force, Lock = "Red") { +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") @@ -255,7 +254,8 @@ function KDDefaultPrereqs(enemy, AIData, dist, maxdist, chance, restraintTags, f }) != undefined) && (KinkyDungeonStatsChoice.get("Undeniable") || !KDIsBrat(enemy) || force); } -function KDShopTrigger(name) { + +function KDShopTrigger(name: string): KinkyDialogueTrigger { return { dialogue: name, allowedPrisonStates: ["parole", ""], @@ -264,7 +264,7 @@ function KDShopTrigger(name) { talk: true, excludeTags: ["noshop"], blockDuringPlaytime: true, - prerequisite: (enemy, dist, AIData) => { + prerequisite: (enemy, dist, _AIData) => { return (dist < 1.5 && !KinkyDungeonFlags.get("NoTalk") && !KDGameData.NoForceGreet @@ -272,19 +272,17 @@ function KDShopTrigger(name) { && KDEnemyHasFlag(enemy, name) && !KDEnemyHasFlag(enemy, "NoShop")); }, - weight: (enemy, dist) => { + weight: (_enemy, _dist) => { return 100; }, }; } /** - * - * @param {string} name - * @param {KinkyDialogue} name - * @returns {KinkyDialogueTrigger} + * @param name + * @param dialogue */ -function KDRecruitTrigger(name, dialogue) { +function KDRecruitTrigger(name: string, dialogue: KinkyDialogue): KinkyDialogueTrigger { if (dialogue) return { dialogue: name, @@ -296,7 +294,7 @@ function KDRecruitTrigger(name, dialogue) { nonHostile: true, noCombat: true, blockDuringPlaytime: true, - prerequisite: (enemy, dist, AIData) => { + prerequisite: (enemy, dist, _AIData) => { return (dist < 1.5 && !KinkyDungeonFlags.get("Recruited") && !KinkyDungeonFlags.get("DangerFlag") @@ -308,7 +306,7 @@ function KDRecruitTrigger(name, dialogue) { && KDFactionRelation("Player", KDGetFactionOriginal(enemy)) > -0.1 && KDRandom() < dialogue.chance); }, - weight: (enemy, dist) => { + weight: (_enemy, _dist) => { return 10; }, }; @@ -316,11 +314,11 @@ function KDRecruitTrigger(name, dialogue) { } /** Boss intro dialogue */ -function KDBossTrigger(name, enemyName) { +function KDBossTrigger(name: string, enemyName: string[]): KinkyDialogueTrigger { return { dialogue: name, nonHostile: true, - prerequisite: (enemy, dist, AIData) => { + prerequisite: (enemy, dist, _AIData) => { return (dist < 2.5 && !KinkyDungeonFlags.get("NoTalk") && !(KDGameData.SleepTurns > 0) @@ -328,22 +326,22 @@ function KDBossTrigger(name, enemyName) { && !KinkyDungeonFlags.has("BossUnlocked") && !KinkyDungeonFlags.has("BossDialogue" + name)); }, - weight: (enemy, dist) => { + weight: (_enemy, _dist) => { return 100; }, }; } /** * Lose to a boss - * @param {string} name - * @param {string[]} enemyName - * @param {string[]} tags - * @returns {KinkyDialogueTrigger} + * @param name + * @param enemyName + * @param tags + * @param [condition] */ -function KDBossLose(name, enemyName, tags, condition) { +function KDBossLose(name: string, enemyName: string[], tags: string[], condition?: () => boolean): KinkyDialogueTrigger { return { dialogue: name, - prerequisite: (enemy, dist, AIData) => { + prerequisite: (enemy, dist, _AIData) => { return (dist < 1.5 && !KinkyDungeonFlags.get("NoTalk") && !(KDGameData.SleepTurns > 0) @@ -352,13 +350,13 @@ function KDBossLose(name, enemyName, tags, condition) { && ((!condition && !KinkyDungeonHasWill(0.1)) || (condition && condition())) && (!tags || !KinkyDungeonGetRestraint({tags: tags}, MiniGameKinkyDungeonLevel * 2, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)))); }, - weight: (enemy, dist) => { + weight: (_enemy, _dist) => { return 100; }, }; } -function KinkyDungeonGetShopForEnemy(enemy, guaranteed) { +function KinkyDungeonGetShopForEnemy(enemy: entity, guaranteed?: boolean): string { if (enemy.Enemy.tags.noshop) return ""; let shoplist = []; for (let s of Object.values(KDShops)) { diff --git a/Game/src/dialogue/KinkyDungeonLore.js b/Game/src/dialogue/KinkyDungeonLore.ts similarity index 91% rename from Game/src/dialogue/KinkyDungeonLore.js rename to Game/src/dialogue/KinkyDungeonLore.ts index 3984cf1d3..070509bbe 100644 --- a/Game/src/dialogue/KinkyDungeonLore.js +++ b/Game/src/dialogue/KinkyDungeonLore.ts @@ -1,48 +1,27 @@ "use strict"; -/** - * @type {Record>} - */ -let KDLore = { +let KDLore: Record> = { }; let KinkyDungeonCurrentLore = "Cover"; -/** - * @type {Record} - */ -let KDLoreImg = {}; -/** - * @type {Record} - */ -let KDLoreEnemy = {}; -/** - * @type {string} - */ -let KinkyDungeonCurrentLoreTab = "Default"; -/** - * @type {string[]} - */ -let KinkyDungeonCurrentLoreTabs = ["Default"]; -/** - * @type {string[]} - */ -let KinkyDungeonCurrentLoreItems = []; +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 -/** @type {string[]} */ -let KinkyDungeonNewLoreList = localStorage.getItem("kdnewLore") ? JSON.parse(localStorage.getItem("kdnewLore")) : ["Cover"]; +let KinkyDungeonNewLoreList: string[] = localStorage.getItem("kdnewLore") ? JSON.parse(localStorage.getItem("kdnewLore")) : ["Cover"]; function KinkyDungeonNewLore() { - /** @type {string[]} */ - let availableLore = []; + let availableLore: string[] = []; - /** @type {Record} */ - let exploredLore = localStorage.getItem("kdexpLore") ? JSON.parse(localStorage.getItem("kdexpLore")) : {Cover: 1}; + 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); @@ -123,7 +102,7 @@ function KinkyDungeonNewLore() { return result; } -function KinkyDungeonUpdateTabs(exploredLore) { +function KinkyDungeonUpdateTabs(exploredLore: Record) { KinkyDungeonCurrentLoreTabs = ["Default"]; for (let lore of Object.keys(exploredLore)) { for (let tab of Object.keys(KDLore)) { @@ -342,7 +321,7 @@ function KinkyDungeonDrawLore() { } let list = Array.from(Object.keys(map)); let magic = false; - let repeats = {}; + let repeats: Record = {}; //for (let t of list) { let t = list; for (let dt of Object.values(KinkyDungeonDamageTypes)) { @@ -429,7 +408,7 @@ function KinkyDungeonDrawLore() { } if (i == -1) { - DrawButtonKDEx("loretab" + i, (b) => { + DrawButtonKDEx("loretab" + i, (_b) => { KinkyDungeonCurrentLoreTab = "Default"; KinkyDungeonUpdateLore(localStorage.getItem("kdexpLore") ? JSON.parse(localStorage.getItem("kdexpLore")) : {}); return true; @@ -437,7 +416,7 @@ function KinkyDungeonDrawLore() { "" == KinkyDungeonCurrentLoreTab ? "#ffffff" : (newLore ? "#88ff88" : "#ffffff"), undefined, undefined, undefined, KinkyDungeonCurrentLoreTab != "", KDButtonColor); } else { let index = i; - DrawButtonKDEx("loretab" + i, (b) => { + DrawButtonKDEx("loretab" + i, (_b) => { if (tabNames[index + KinkyDungeonCurrentLoreTabOffset]) { KinkyDungeonCurrentLoreTab = tabNames[index + KinkyDungeonCurrentLoreTabOffset]; KinkyDungeonUpdateLore(localStorage.getItem("kdexpLore") ? JSON.parse(localStorage.getItem("kdexpLore")) : {}); @@ -457,11 +436,11 @@ function KinkyDungeonDrawLore() { } - DrawButtonKDEx("loreUp", (b) => { + 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) => { + 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"); @@ -470,11 +449,11 @@ function KinkyDungeonDrawLore() { let numNotes = 57; // Draw the lore itself - DrawButtonKDEx("loreCurrentUp", (b) => { + 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) => { + 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"); @@ -483,7 +462,7 @@ function KinkyDungeonDrawLore() { let xx = i % 2; if (i + KinkyDungeonCurrentLoreItemOffset < KinkyDungeonCurrentLoreItems.length) { let loreNum = KinkyDungeonCurrentLoreItems[i + KinkyDungeonCurrentLoreItemOffset]; - DrawButtonKDEx("loreItem" + loreNum, (b) => { + DrawButtonKDEx("loreItem" + loreNum, (_b) => { KinkyDungeonCurrentLore = loreNum; return true; }, true, x + 150 * xx, 142 + (ii) * 42, 145, 40, TextGet("KDLoreLabel" + loreNum), @@ -499,7 +478,7 @@ function KinkyDungeonDrawLore() { KDDrawLoreRepTabs(xOffset); } -function KDDrawLoreRepTabs(xOffset) { +function KDDrawLoreRepTabs(xOffset: number) { FillRectKD(kdcanvas, kdpixisprites, "mainlorebg", { Left: canvasOffsetX_ui + xOffset, Top: canvasOffsetY_ui - 150, @@ -520,7 +499,7 @@ function KDDrawLoreRepTabs(xOffset) { zIndex: -19, alpha: 0.9 }); - let scrollFunc = (amount) => { + let scrollFunc = (amount: number) => { switch (KinkyDungeonDrawState) { case "Logbook": KinkyDungeonDrawState = amount < 0 ? "Quest" : "Reputation"; break; case "Reputation": KinkyDungeonDrawState = amount < 0 ? "Logbook" : "Quest"; break; @@ -534,17 +513,17 @@ function KDDrawLoreRepTabs(xOffset) { let num = 4; let width = 1100 / num; let II = 0; - DrawButtonKDExScroll("TabLore", scrollFunc, (b) => { + 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) => { + 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) => { + DrawButtonKDExScroll("TabQuest", scrollFunc, (_b) => { KinkyDungeonDrawState = "Quest"; return true; }, true, xxstart + II*width, yy, width - 10, 40, TextGet("KinkyDungeonQuest"), "#ffffff", undefined, undefined, undefined, @@ -566,7 +545,7 @@ function KDDrawLoreRepTabs(xOffset) { let KDInvBG = "#222222"; -function KDDrawInventoryTabs(xOffset, drawBG = true) { +function KDDrawInventoryTabs(xOffset: number, drawBG: boolean = true): void { if (drawBG) { FillRectKD(kdcanvas, kdpixisprites, "mainlorebg", { Left: canvasOffsetX_ui + xOffset, @@ -589,7 +568,7 @@ function KDDrawInventoryTabs(xOffset, drawBG = true) { alpha: 0.9 }); } - let scrollFunc = (amount) => { + let scrollFunc = (amount: number) => { switch (KinkyDungeonDrawState) { case "Inventory": KinkyDungeonDrawState = amount < 0 ? "Facilities" : "Collection"; break; case "Collection": KinkyDungeonDrawState = amount < 0 ? "Inventory" : "Facilities"; break; @@ -601,12 +580,12 @@ function KDDrawInventoryTabs(xOffset, drawBG = true) { let num = 4; let width = 1100 / num; let II = 0; - DrawButtonKDExScroll("TabLore", scrollFunc, (b) => { + 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) => { + DrawButtonKDExScroll("TabCollection", scrollFunc, (_b) => { KinkyDungeonDrawState = "Collection"; KDRefreshCharacter.set(KinkyDungeonPlayer, true); KDCollectionTab = ""; @@ -627,10 +606,9 @@ function KDDrawInventoryTabs(xOffset, drawBG = true) { /** - * - * @param {Record} exploredLore + * @param exploredLore */ -function KinkyDungeonUpdateLore(exploredLore) { +function KinkyDungeonUpdateLore(exploredLore: Record) { KinkyDungeonCurrentLoreItems = []; if (!KinkyDungeonCurrentLoreTab) KinkyDungeonCurrentLoreTab = "Default"; if (KDLore[KinkyDungeonCurrentLoreTab]) @@ -646,18 +624,17 @@ function KinkyDungeonHandleLore() { } /** - * - * @param {string | string[]} tabs - * @param {string} id - * @param {string} label - * @param {string} title - * @param {string} text - * @param {() => boolean} [condition ] - * @param {string} [image ] - * @param {string[]} [noShow] - * @param {string} [enemy] + * @param tabs + * @param id + * @param label + * @param title + * @param text + * @param [condition] + * @param [image] + * @param [noShow] + * @param [enemy] */ -function KDNewLore(tabs, id, label, title, text, condition, image, noShow, 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); @@ -681,4 +658,4 @@ function KDNewLore(tabs, id, label, title, text, condition, image, noShow, enemy noShow: !noShow ? undefined : noShow.includes(tab) }; } -} \ No newline at end of file +} diff --git a/Game/src/dialogue/KinkyDungeonLoreList.js b/Game/src/dialogue/KinkyDungeonLoreList.ts similarity index 100% rename from Game/src/dialogue/KinkyDungeonLoreList.js rename to Game/src/dialogue/KinkyDungeonLoreList.ts diff --git a/Game/src/effect/KinkyDungeonBuffs.js b/Game/src/effect/KinkyDungeonBuffs.ts similarity index 74% rename from Game/src/effect/KinkyDungeonBuffs.js rename to Game/src/effect/KinkyDungeonBuffs.ts index 134697f2e..5e99c7ebe 100644 --- a/Game/src/effect/KinkyDungeonBuffs.js +++ b/Game/src/effect/KinkyDungeonBuffs.ts @@ -1,6 +1,6 @@ "use strict"; -function KinkyDungeonSendBuffEvent(Event, data) { +function KinkyDungeonSendBuffEvent(Event: string, data: any) { if (!KDMapHasEvent(KDEventMapBuff, Event)) return; for (let buff of Object.values(KinkyDungeonPlayerBuffs)) { if (buff && buff.events) { @@ -27,19 +27,19 @@ function KinkyDungeonSendBuffEvent(Event, data) { } } -// Decreases time left in buffs and also applies effects /** - * - * @param {entity} entity - * @param {number} delta - * @param {boolean} endFloor + * Decreases time left in buffs and also applies effects + * @param entity + * @param delta + * @param endFloor */ -function KinkyDungeonTickBuffs(entity, delta, 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, value] of Object.entries(list)) { + 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); @@ -70,18 +70,18 @@ function KinkyDungeonTickBuffs(entity, delta, endFloor) { } /** - * - * @param {entity} entity - * @param {string} tag - * @param {number} Amount + * @param entity + * @param tag + * @param Amount */ -function KinkyDungeonTickBuffTag(entity, tag, Amount = 1) { +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, value] of Object.entries(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; @@ -93,12 +93,10 @@ function KinkyDungeonTickBuffTag(entity, tag, Amount = 1) { } /** - * - * @param {entity} entity - * @param {string} tag - * @returns {boolean} + * @param entity + * @param tag */ -function KDEntityHasBuffTags(entity, tag) { +function KDEntityHasBuffTags(entity: entity, tag: string): boolean { let list = entity.player ? KinkyDungeonPlayerBuffs : entity.buffs; if (list) { for (const buff of Object.values(list)) { @@ -109,13 +107,13 @@ function KDEntityHasBuffTags(entity, tag) { } return false; } + /** - * - * @param {entity} entity - * @param {string} tag + * @param entity + * @param tag * @returns {Record} */ -function KDGetBuffsWithTag(entity, tag) { +function KDGetBuffsWithTag(entity: entity, tag: string): Record { let ret = {}; let list = entity.player ? KinkyDungeonPlayerBuffs : entity.buffs; if (list) { @@ -129,17 +127,17 @@ function KDGetBuffsWithTag(entity, tag) { } /** - * - * @param {entity} entity - * @param {string[]} tags + * @param entity + * @param tags */ -function KinkyDungeonRemoveBuffsWithTag(entity, 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, value] of Object.entries(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)) { @@ -150,7 +148,7 @@ function KinkyDungeonRemoveBuffsWithTag(entity, tags) { } // Updates buffs for all creatures -function KinkyDungeonUpdateBuffs(delta, endFloor) { +function KinkyDungeonUpdateBuffs(delta: number, endFloor: boolean) { // Tick down buffs the buffs KinkyDungeonSendEvent("tickBuffs", {delta: delta}); KinkyDungeonTickBuffs(KinkyDungeonPlayerEntity, delta, endFloor); @@ -172,7 +170,7 @@ function KinkyDungeonUpdateBuffs(delta, endFloor) { for (let enemy of nearby) { if ((KDHostile(enemy) || !buff.noAlly) && (KDAllied(enemy) || !buff.onlyAlly) - && (!b.bullet.spell.filterTags || b.bullet.spell.filterTags.some((tag) => {return enemy.Enemy.tags[tag];})) + && (!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); @@ -187,19 +185,20 @@ function KinkyDungeonUpdateBuffs(delta, endFloor) { KDUpdatePlayerShield(); } -function KDUpdatePlayerShield(PlayerBuffs) { +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 (let b of buffs) { + for (const bb of buffs) { + const b: any = bb; if (b.type == "Shield" && b.power > 0) KDGameData.Shield += b.power; } } -function KDDamagePlayerShield(Amount, Player) { +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);}); @@ -219,15 +218,14 @@ function KDDamagePlayerShield(Amount, Player) { KDUpdatePlayerShield(PlayerBuffs); } -/** */ -function KDBuffEnabled(list, buff, onlyPositiveDuration) { +function KDBuffEnabled(list: Record, buff: any, onlyPositiveDuration: boolean) { return (!onlyPositiveDuration || buff.duration > 0) - && (!buff.disabletypes || !buff.disabletypes.some((tag) => { + && (!buff.disabletypes || !buff.disabletypes.some((tag: string) => { return list[tag] != undefined; })); } -function KinkyDungeonGetBuffedStat(list, Stat, onlyPositiveDuration) { +function KinkyDungeonGetBuffedStat(list: Record, Stat: any, onlyPositiveDuration?: boolean): number { let stat = 0; if (list) for (let buff of Object.values(list)) { @@ -238,12 +236,11 @@ function KinkyDungeonGetBuffedStat(list, Stat, onlyPositiveDuration) { } return stat; } -function KinkyDungeonGetMaxBuffedStat(list, Stat, onlyPositiveDuration) { +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)) { + if (buff && buff.type == Stat && KDBuffEnabled(list, buff, onlyPositiveDuration)) { stat = Math.max(stat, buff.power); } } @@ -251,11 +248,10 @@ function KinkyDungeonGetMaxBuffedStat(list, Stat, onlyPositiveDuration) { } /** - * - * @param {entity} entity - * @param {string} key + * @param entity + * @param key */ -function KinkyDungeonExpireBuff(entity, key) { +function KinkyDungeonExpireBuff(entity: entity, key: string): void { let list = null; if (entity == KinkyDungeonPlayerEntity) list = KinkyDungeonPlayerBuffs; @@ -271,12 +267,11 @@ function KinkyDungeonExpireBuff(entity, key) { } /** - * - * @param {entity} entity - * @param {any} origbuff - * @param {any} [changes] + * @param entity + * @param origbuff + * @param [changes] */ -function KinkyDungeonApplyBuffToEntity(entity, origbuff, changes) { +function KinkyDungeonApplyBuffToEntity(entity: entity, origbuff: any, changes?: any) { if (entity && entity.player) { return KDApplyBuff(KinkyDungeonPlayerBuffs, origbuff, changes, entity); } else if (entity) { @@ -286,9 +281,9 @@ function KinkyDungeonApplyBuffToEntity(entity, origbuff, changes) { return null; } -function KDApplyBuff(list, origbuff, changes, entity) { +function KDApplyBuff(list: Record, origbuff: any, changes: any, entity: entity): any { if (!origbuff) return null; - let buff = {}; + let buff: any = {}; Object.assign(buff, origbuff); if (changes) Object.assign(buff, changes); @@ -314,60 +309,55 @@ function KDApplyBuff(list, origbuff, changes, entity) { } } -function KinkyDungeonGetbuff(list, Buff) { +function KinkyDungeonGetbuff(list: Record, Buff: string): any { if (list && list[Buff]) return list[Buff]; else return null; } -function KinkyDungeonHasBuff(list, Buff, excludeNoDuration) { +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} entity - * @param {string} buff - * @param {boolean} excludeNoDuration - * @returns {boolean} + * @param entity + * @param buff + * @param [excludeNoDuration] */ -function KDEntityHasBuff(entity, buff, excludeNoDuration = false) { +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} entity - * @param {string} stat - * @param {boolean} [onlyPositiveDuration] - * @returns {number} + * @param entity + * @param stat + * @param [onlyPositiveDuration] */ -function KDEntityBuffedStat(entity, stat, 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} entity - * @param {string} stat - * @param {boolean} [onlyPositiveDuration] - * @returns {number} + * @param entity + * @param stat + * @param [onlyPositiveDuration] */ -function KDEntityMaxBuffedStat(entity, stat, 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} entity + * @param entity */ -function KDEntityGetBuff(entity, buff) { +function KDEntityGetBuff(entity: entity, buff: string): any { if (entity.player) { return KinkyDungeonGetbuff(KinkyDungeonPlayerBuffs, buff); } else return KinkyDungeonGetbuff(entity.buffs, buff); -} \ No newline at end of file +} diff --git a/Game/src/effect/KinkyDungeonBuffsList.js b/Game/src/effect/KinkyDungeonBuffsList.ts similarity index 96% rename from Game/src/effect/KinkyDungeonBuffsList.js rename to Game/src/effect/KinkyDungeonBuffsList.ts index af9e95548..9ae6b7f45 100644 --- a/Game/src/effect/KinkyDungeonBuffsList.js +++ b/Game/src/effect/KinkyDungeonBuffsList.ts @@ -15,6 +15,16 @@ let KDDrenched = {id: "Drenched", type: "fireDamageResist", aura: "#59a0d1", aur ]}; +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"}, @@ -203,7 +213,7 @@ let KDWaterSlow = {id: "WaterSlow", type: "MoveSpeed", power: -1.0, player: true 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) { +function KDChillWalk(entity: entity) { return KDEntityHasBuff(entity, "ChillWalk") || KDEntityHasBuff(entity, "ChillWalk2"); } @@ -227,15 +237,13 @@ let KDBuffReference = { let KDDisenchantSelf = {id: "DisenchantSelf", aura: "#8888ff", type: "Disenchant", power: 9.9, player: true, enemies: true, duration: 10,}; -/** @type {Record void>}>} */ -let KDCustomBuff = { +let KDCustomBuff: Record void> = { }; /** - * @type {Record void>}} */ -let KDBuffClick = { - "SlimeMimic": (buff, entity) => { +let KDBuffClick: Record void> = { + "SlimeMimic": (_buff, entity) => { // Toggle SlimeMimic on/off let b = KinkyDungeonPlayerBuffs.d_SlimeMimic; if (b && b.duration > 0) { @@ -246,7 +254,7 @@ let KDBuffClick = { ); } }, - "OrgasmResist": (buff, entity) => { + "OrgasmResist": (_buff, entity) => { // Toggle SlimeMimic on/off let b = KinkyDungeonPlayerBuffs.d_OrgasmResist; if (b && b.duration > 0) { @@ -261,4 +269,4 @@ let KDBuffClick = { if (KinkyDungeonPlayerBuffs.e_OrgasmResist) KinkyDungeonPlayerBuffs.e_OrgasmResist.duration = 0; } }, -}; \ No newline at end of file +}; diff --git a/Game/src/effect/KinkyDungeonEvents.js b/Game/src/effect/KinkyDungeonEvents.ts similarity index 91% rename from Game/src/effect/KinkyDungeonEvents.js rename to Game/src/effect/KinkyDungeonEvents.ts index adda2fd71..b7ef8a3db 100644 --- a/Game/src/effect/KinkyDungeonEvents.js +++ b/Game/src/effect/KinkyDungeonEvents.ts @@ -23,14 +23,15 @@ let KDEventDataBase = { SlimeLevelStart: 0, CurseHintTick: false, ActivationsThisTurn: 0, + shockwaves: undefined, }; let KDEventData = Object.assign({}, KDEventDataBase); -function KDMapHasEvent(map, event) { +function KDMapHasEvent(map: Record, event: string) { return map[event] != undefined; } -function KinkyDungeonSendEvent(Event, data, forceSpell) { +function KinkyDungeonSendEvent(Event: string, data: any, forceSpell?: any) { KinkyDungeonSendMagicEvent(Event, data, forceSpell); KinkyDungeonSendWeaponEvent(Event, data); KinkyDungeonSendInventorySelectedEvent(Event, data); @@ -49,7 +50,7 @@ function KinkyDungeonResetEventVariables() { KinkyDungeonHandleGenericEvent("resetEventVar", {}); } /** Called every tick */ -function KinkyDungeonResetEventVariablesTick(delta) { +function KinkyDungeonResetEventVariablesTick(delta: number) { KDEventDataReset = {}; KinkyDungeonAttackTwiceFlag = false; @@ -60,9 +61,8 @@ function KinkyDungeonResetEventVariablesTick(delta) { /** * Function mapping * to expand, keep (e, item, data) => {...} as a constant API call - * @type {Object.>} */ -let KDEventMapInventoryIcon = { +let KDEventMapInventoryIcon: Record void>> = { "icon": { "tintIcon": (e, item, data) => { if (item == data.item) { @@ -79,13 +79,12 @@ let KDEventMapInventoryIcon = { }; /** - * - * @param {string} Event - * @param {KinkyDungeonEvent} e - * @param {item} item - * @param {*} data + * @param Event + * @param e + * @param item + * @param data */ -function KinkyDungeonHandleInventoryIconEvent(Event, e, item, 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); @@ -95,9 +94,8 @@ function KinkyDungeonHandleInventoryIconEvent(Event, e, item, data) { /** * Function mapping * to expand, keep (e, item, data) => {...} as a constant API call - * @type {Object.>} */ -let KDEventMapInventorySelected = { +let KDEventMapInventorySelected: Record void>> = { "inventoryTooltip": { "varModifier": (e, item, data) => { if (item == data.item) { @@ -147,14 +145,14 @@ let KDEventMapInventorySelected = { }, }, }; + /** - * - * @param {string} Event - * @param {KinkyDungeonEvent} kinkyDungeonEvent - * @param {item} item - * @param {*} data + * @param Event + * @param kinkyDungeonEvent + * @param item + * @param data */ -function KinkyDungeonHandleInventorySelectedEvent(Event, kinkyDungeonEvent, item, 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); } @@ -168,11 +166,10 @@ function KinkyDungeonHandleInventorySelectedEvent(Event, kinkyDungeonEvent, item /** * Function mapping * to expand, keep (e, item, data) => {...} as a constant API call - * @type {Object.>} */ -let KDEventMapInventory = { +let KDEventMapInventory: Record void>> = { "dynamic": { - "wardenPunish": (e, item, data) => { + "wardenPunish": (_e, item, _data) => { let restraintAdd = KinkyDungeonGetRestraint({tags: ["wardenLink"]}, KDGetEffLevel(), (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), true, "Purple", undefined, undefined, undefined, undefined, undefined, { allowedGroups: [KDRestraint(item)?.Group], @@ -193,15 +190,15 @@ let KDEventMapInventory = { duration: e.time, }; if (e.desc) { - b.aura = e.color || "#ffffff"; - b.desc = e.desc; + b['aura'] = e.color || "#ffffff"; + b['esc'] = e.desc; } if (e.buffSprite != undefined) { if (e.buffSprite) { - b.buffSpriteSpecific = e.buffSprite; + b['buffSpriteSpecific'] = e.buffSprite; } - b.buffSprite = true; + b['buffSprite'] = true; } KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, b); } @@ -212,20 +209,16 @@ let KDEventMapInventory = { "spellOrb": {}, "afterFailGoddessQuest": {}, "curseCount": { - /** - * @param {KDEventData_CurseCount} data - */ - "add": (e, item, data) => { + "add": (e, item, data: KDEventData_CurseCount) => { if (!data.activatedOnly || (KDGetCurse(item) && KDCurses[KDGetCurse(item)].activatecurse)) { data.count += e.power; } } }, "beforeCast": { - "ReduceMiscastVerbal": (e, item, data) => { + "ReduceMiscastVerbal": (e, _item, data) => { if (data.spell) { - /** @type {spell} */ - let spell = data.spell; + let spell: spell = data.spell; if (spell.components?.includes("Verbal")) { data.flags.miscastChance -= e.power; } @@ -233,10 +226,7 @@ let KDEventMapInventory = { } }, "postApply": { - /** - * @param {KDEventData_PostApply} data - */ - "ControlHarness": (e, item, data) => { + "ControlHarness": (e, item, data: KDEventData_PostApply) => { let itemAdded = data.item; if (!itemAdded) return; let itemtags = KDRestraint(itemAdded)?.shrine; @@ -269,11 +259,8 @@ let KDEventMapInventory = { } } }, - /** - * @param {KDEventData_PostApply} data - */ - "BubbleCombine": (e, item, data) => { - KinkyDungeonUpdateRestraints(0); + "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"))) { @@ -283,7 +270,7 @@ let KDEventMapInventory = { if (restraint.shrine?.includes("CombineBubble1") || restraint.shrine?.includes("CombineBubble2") || restraint.shrine?.includes("CombineBubble3")) { - KinkyDungeonRemoveRestraintSpecific(inv.item, true, true, true); + KinkyDungeonRemoveRestraintSpecific(inv.item, true, false, true); } } } @@ -292,15 +279,21 @@ let KDEventMapInventory = { } }, - "NoYoke": (e, item, data) => { + "NoYoke": (_e, item, data) => { if (item == data.item && KinkyDungeonPlayerTags.get("Yoked")) - KinkyDungeonRemoveRestraintSpecific(item, true, true); + KinkyDungeonRemoveRestraintSpecific(item, true, false); }, - "EngageCurse": (e, item, data) => { + "requireNoGags": (_e, item, data) => { + if (item != data.item && KinkyDungeonPlayerTags.get("Gags")) { + KinkyDungeonRemoveRestraintSpecific(item, true, false); + KinkyDungeonSendTextMessage(4, TextGet("KDGagNecklaceOff"), "#ffffff", 4); + } + }, + "EngageCurse": (_e, item, data) => { if (item == data.item) KinkyDungeonSendEvent("EngageCurse", {}); }, - "cursePrefix": (e, item, data) => { + "cursePrefix": (_e, item, data) => { if (item == data.item) { let variant = KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]; if (variant) { @@ -313,29 +306,29 @@ let KDEventMapInventory = { }, }, "calcOrgThresh": { - "CurseSensitivity": (e, item, data) => { + "CurseSensitivity": (e, _item, data) => { if (data.player == KinkyDungeonPlayerEntity) { data.threshold *= e.power; } } }, "afterCalcManaPool": { - "MultManaPoolRegen": (e, item, data) => { + "MultManaPoolRegen": (e, _item, data) => { data.manaPoolRegen *= e.power; }, }, "calcEfficientMana": { - "ManaCost": (e, item, data) => { + "ManaCost": (e, _item, data) => { data.efficiency += e.power; }, }, "calcMultMana": { - "ManaCost": (e, item, data) => { + "ManaCost": (e, _item, data) => { data.cost = Math.max(data.cost * e.power, 0); }, }, "edge": { - "CursedDenial": (e, item, data) => { + "CursedDenial": (e, _item, _data) => { KinkyDungeonSendTextMessage(5, TextGet("KDCursedDenialDeny" + Math.floor(KDRandom() * e.count)), "#9074ab", 10); }, "IncrementRemovalVar": (e, item, data) => { @@ -383,7 +376,7 @@ let KDEventMapInventory = { }, - "RobeOfChastity": (e, item, data) => { + "RobeOfChastity": (e, item, _data) => { let player = !(item.onEntity > 0) ? KDPlayer() : KinkyDungeonFindID(item.onEntity); if (player) { if (player.player && KDRandom() < 0.1) @@ -392,7 +385,7 @@ let KDEventMapInventory = { KDSetIDFlag(player.id, "disableRobeChast", e.time); } }, - "CursedDenial": (e, item, data) => { + "CursedDenial": (e, _item, _data) => { KinkyDungeonSendTextMessage(5, TextGet("KDCursedDenialAllow" + Math.floor(KDRandom() * e.count)), "#9074ab", 10); }, "CursedHeal": (e, item, data) => { @@ -452,7 +445,7 @@ let KDEventMapInventory = { }, }, "capture": { - "ManaBounty": (e, item, data) => { + "ManaBounty": (e, _item, data) => { if (data.attacker && data.attacker.player && data.enemy) { KinkyDungeonChangeMana(0, false, e.power); } @@ -460,7 +453,7 @@ let KDEventMapInventory = { }, "calcPlayChance": { - "CurseAttraction": (e, item, data) => { + "CurseAttraction": (e, _item, data) => { if (data.enemy) { data.playChance += e.power; if (!data.enemy.playWithPlayer && data.enemy.playWithPlayerCD > 5) { @@ -470,39 +463,39 @@ let KDEventMapInventory = { } }, "changeDistraction": { - "multDistractionPos": (e, item, data) => { + "multDistractionPos": (e, _item, data) => { if (data.Amount > 0) data.Amount *= e.power; }, }, "changeWill": { - "multWillPos": (e, item, data) => { + "multWillPos": (e, _item, data) => { if (data.Amount > 0) data.Amount *= e.power; }, }, "changeStamina": { - "multStaminaPos": (e, item, data) => { + "multStaminaPos": (e, _item, data) => { if (data.Cap > 0 && data.regen) data.Cap *= e.power; }, }, "getLights": { - "ItemLight": (e, item, data) => { + "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) => { + "setSkinColor": (_e, item, data) => { if (item == data.item) { // Ne } } }, "afterDress": { - "PrisonerJacket": (e, item, data) => { + "PrisonerJacket": (_e, item, _data) => { if (!StandalonePatched) for (let A = 0; A < KinkyDungeonPlayer.Appearance.length; A++) { let asset = KinkyDungeonPlayer.Appearance[A].Asset; @@ -546,7 +539,7 @@ let KDEventMapInventory = { }, }, "kill": { - "MikoGhost": (e, item, data) => { + "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); @@ -554,7 +547,7 @@ let KDEventMapInventory = { } } }, - "MikoGhost2": (e, item, data) => { + "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"); @@ -562,11 +555,11 @@ let KDEventMapInventory = { } } }, - "DollmakerMask": (e, item, data) => { + "DollmakerMask": (_e, _item, data) => { // if (item.player == data.player) if (data.enemy?.Enemy.tags.escapeddoll) KinkyDungeonSetFlag("DollmakerGrace", 70); }, - "CursedPunishment": (e, item, data) => { + "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); @@ -622,12 +615,12 @@ let KDEventMapInventory = { }, "perksBonus": { - "spellDamage": (e, item, data) => { + "spellDamage": (e, _item, _data) => { KDDamageAmpPerksSpell += e.power; }, }, "calcBlind": { - "DollmakerMask": (e, item, data) => { + "DollmakerMask": (_e, _item, data) => { if (!KinkyDungeonFlags.get("DollmakerGrace")) { // if item.player == data.player data.blindness = Math.max(data.blindness, 5); @@ -637,7 +630,7 @@ let KDEventMapInventory = { }, "draw": { - "DollmakerMask": (e, item, data) => { + "DollmakerMask": (_e, _item, data) => { let altType = KDGetAltType(MiniGameKinkyDungeonLevel); if (altType && altType.spawns === false) return; for (let enemy of KDMapData.Entities) { @@ -741,8 +734,7 @@ let KDEventMapInventory = { "cursedDamage": (e, item, data) => { if (data.dmg > 0 && !["cold", "soul", "charm"].includes(data.type) && !data.flags?.includes("EnvDamage") && KinkyDungeonStatWill > 0) { - /** @type {number} */ - let alreadyDone = KDItemDataQuery(item, "cursedDamage") || 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; @@ -772,7 +764,7 @@ let KDEventMapInventory = { } } }, - "CursedDistract": (e, item, data) => { + "CursedDistract": (e, _item, data) => { if (data.dmg > 0) { if (data.dmg >= 3 || !KinkyDungeonPlayerBuffs.CursedDistract) KinkyDungeonSendTextMessage(2, TextGet("KDCursedDistractActivate"), "#9074ab", e.time); @@ -803,10 +795,9 @@ let KDEventMapInventory = { let curse = KDGetByWeight(KinkyDungeonGetCurseByListWeighted([data.curselist || listname], KDRestraint(item).name, false, 0, 1000)); // Load the current inventory variant - /** @type {KDRestraintVariant} */ - let newvariant = JSON.parse(JSON.stringify(KinkyDungeonRestraintVariants[item.inventoryVariant || item.name] || {})); - /** @type {restraint} - New restraint to transform to*/ - let newRestraint = null; + 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(), @@ -862,7 +853,7 @@ let KDEventMapInventory = { }, }, "tick": { - "InvisibleGhosts": (e, item, data) => { + "InvisibleGhosts": (_e, _item, _data) => { for (let entity of KDMapData.Entities) { if (entity.Enemy?.tags?.ghost) { KinkyDungeonSetEnemyFlag(entity, "hidden", 2); @@ -872,7 +863,7 @@ let KDEventMapInventory = { - "ShrineUnlockWiggle": (e, item, data) => { + "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)); @@ -962,7 +953,7 @@ let KDEventMapInventory = { } }, - "wardenMelt": (e, item, data) => { + "wardenMelt": (e, item, _data) => { let alreadyDone = KDItemDataQuery(item, "wardenMelt") || 0; if (alreadyDone < e.count) { alreadyDone += e.power; @@ -972,7 +963,7 @@ let KDEventMapInventory = { KinkyDungeonSendTextMessage(4, TextGet("KDWardenMelt").replace("RestraintName", TextGet("Restraint"+item.name)), "#88ff88", 2); } }, - "iceMelt": (e, item, data) => { + "iceMelt": (e, item, _data) => { let alreadyDone = KDItemDataQuery(item, "iceMelt") || 0; if (alreadyDone < e.count) { alreadyDone += e.power; @@ -986,14 +977,14 @@ let KDEventMapInventory = { KinkyDungeonSendTextMessage(4, TextGet("KDIceMelt").replace("RestraintName", TextGet("Restraint"+item.name)), "#88ff88", 2); } }, - "tetherRegen": (e, item, data) => { + "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) => { + "AntiMagicGag": (e, item, _data) => { let alreadyDone = KDItemDataQuery(item, "manaDrained") || 0; let multiplier = KDItemDataQuery(item, "manaDrainMultiplier"); if (!multiplier) { @@ -1012,7 +1003,7 @@ let KDEventMapInventory = { } // else {KDChangeItemName(item, item.type, "MagicGag2");} }, - "DollmakerMask": (e, item, data) => { + "DollmakerMask": (_e, _item, _data) => { let altType = KDGetAltType(MiniGameKinkyDungeonLevel); if (altType && altType.spawns === false) return; if (KDRandom() < 0.1) { @@ -1029,7 +1020,7 @@ let KDEventMapInventory = { } } }, - "RemoveOnBuffName": (e, item, data) => { + "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; @@ -1040,31 +1031,31 @@ let KDEventMapInventory = { KinkyDungeonSendTextMessage(5, TextGet("KDRemoveOnDmgType").replace("RESTRAINTNAME", TextGet("Restraint" + item.name)), "lightgreen", 2); } }, - "armorBuff": (e, item, data) => { + "armorBuff": (e, item, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: (e.original || "") + item.name + "Armor", type: "Armor", power: e.power, duration: 2,}); }, - "spellWardBuff": (e, item, data) => { + "spellWardBuff": (e, item, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: (e.original || "") + item.name + "SpellResist", type: "SpellResist", power: e.power, duration: 2,}); }, - "sneakBuff": (e, item, data) => { + "sneakBuff": (e, item, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: (e.original || "") + item.name + "Sneak", type: "SlowDetection", power: e.power, duration: 2,}); }, - "evasionBuff": (e, item, data) => { + "evasionBuff": (e, item, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: (e.original || "") + item.name + "Evasion", type: "Evasion", power: e.power, duration: 2,}); }, - "blockBuff": (e, item, data) => { + "blockBuff": (e, item, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: (e.original || "") + item.name + "Block", type: "Block", power: e.power, duration: 2,}); }, - "buff": (e, item, data) => { + "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) => { + "RestraintBlock": (e, item, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: (e.original || "") + item.name + "Block", type: "RestraintBlock", power: e.power, duration: 2,}); }, - "ShadowHandTether": (e, item, data) => { + "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())) { @@ -1082,7 +1073,7 @@ let KDEventMapInventory = { } } }, - "Buff": (e, item, data) => { + "Buff": (e, item, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.original || "") + item.name + e.buffType, type: e.buffType, @@ -1113,7 +1104,7 @@ let KDEventMapInventory = { } } }, - "AccuracyBuff": (e, item, data) => { + "AccuracyBuff": (e, item, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.original || "") + item.name + e.type + e.trigger, type: "Accuracy", @@ -1121,7 +1112,7 @@ let KDEventMapInventory = { power: e.power }); }, - "spellRange": (e, item, data) => { + "spellRange": (e, item, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.original || "") + item.name + e.type + e.trigger, type: "spellRange", @@ -1129,7 +1120,7 @@ let KDEventMapInventory = { power: e.power }); }, - "SneakBuff": (e, item, data) => { + "SneakBuff": (e, item, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.original || "") + item.name + e.type + e.trigger, type: "Sneak", @@ -1137,7 +1128,7 @@ let KDEventMapInventory = { power: e.power }); }, - "EvasionBuff": (e, item, data) => { + "EvasionBuff": (e, item, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.original || "") + item.name + e.type + e.trigger, type: "Evasion", @@ -1145,7 +1136,7 @@ let KDEventMapInventory = { power: e.power }); }, - "AllyHealingAura": (e, item, data) => { + "AllyHealingAura": (e, _item, data) => { if (!data.delta) return; let healed = false; for (let enemy of KDMapData.Entities) { @@ -1162,29 +1153,29 @@ let KDEventMapInventory = { if (e.energyCost) KinkyDungeonChangeCharge(- e.energyCost);//KinkyDungeonChangeCharge(- e.energyCost); } }, - "EnchantedAnkleCuffs2": (e, item, data) => { + "EnchantedAnkleCuffs2": (_e, item, _data) => { KinkyDungeonRemoveRestraint(KDRestraint(item).Group); KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("EnchantedAnkleCuffs"), 0, true, undefined, false, undefined, undefined, item.faction, true); }, - "EnchantedAnkleCuffs": (e, item, data) => { + "EnchantedAnkleCuffs": (_e, item, _data) => { if (KDGameData.AncientEnergyLevel <= 0.0000001) { KinkyDungeonRemoveRestraint(KDRestraint(item).Group); KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("EnchantedAnkleCuffs2"), 0, true, undefined, false, undefined, undefined, item.faction, true); } }, - "RegenMana": (e, item, data) => { + "RegenMana": (e, _item, _data) => { if (!e.limit || KinkyDungeonStatMana / KinkyDungeonStatManaMax < e.limit) { if (e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KinkyDungeonChangeCharge(- e.energyCost);//KinkyDungeonChangeCharge(- e.energyCost); KinkyDungeonChangeMana(e.power); } }, - "RegenStamina": (e, item, data) => { + "RegenStamina": (e, _item, _data) => { if (!e.limit || KinkyDungeonStatStamina / KinkyDungeonStatStaminaMax < e.limit) { if (e.energyCost && KinkyDungeonStatStamina < KinkyDungeonStatStaminaMax - 0.01) KinkyDungeonChangeCharge(- e.energyCost);//KinkyDungeonChangeCharge(- e.energyCost); KinkyDungeonChangeStamina(e.power); } }, - "ApplySlowLevelBuff": (e, item, data) => { + "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); @@ -1207,7 +1198,7 @@ let KDEventMapInventory = { if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); } }, - "iceDrain": (e, item, data) => { + "iceDrain": (e, _item, data) => { if (!data.delta) return; if (e.power) { KinkyDungeonChangeMana(e.power); @@ -1215,15 +1206,15 @@ let KDEventMapInventory = { KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonIceDrain"), "lightblue", 2, true); } }, - "crystalDrain": (e, item, data) => { + "crystalDrain": (e, _item, data) => { if (!data.delta) return; if (e.power) { KinkyDungeonChangeMana(e.power); - KinkyDungeonChangeDistraction(-e.power * 3 * KDBuffResist(KinkyDungeonPlayerBuffs, "soul"), false, 0.1); + KinkyDungeonChangeDistraction(-e.power * KDBuffResist(KinkyDungeonPlayerBuffs, "soul"), false, 0.1); KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonCrystalDrain"), "lightblue", 2, true); } }, - "shadowDrain": (e, item, data) => { + "shadowDrain": (e, _item, data) => { if (!data.delta) return; if (e.power) { KinkyDungeonChangeMana(e.power); @@ -1231,7 +1222,7 @@ let KDEventMapInventory = { KinkyDungeonSendTextMessage(1, TextGet("KinkyDungeonShadowDrain"), "lightblue", 2, true); } }, - "tickleDrain": (e, item, data) => { + "tickleDrain": (e, _item, data) => { if (!data.delta) return; if (KinkyDungeonFlags.get("tickleDrain")) return; if (e.power) { @@ -1240,17 +1231,17 @@ let KDEventMapInventory = { KinkyDungeonSendTextMessage(0.5, TextGet("KinkyDungeonTickleDrain"), "lightblue", 2, true); } }, - "barrelDebuff": (e, item, data) => { + "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) => { + "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) => { + "callGuard": (_e, _item, data) => { if (!data.delta) return; if (KinkyDungeonFlags.get("SuppressGuardCall")) return; if (!KinkyDungeonFlags.has("GuardCalled") && KDRandom() < 0.25) { @@ -1262,15 +1253,15 @@ let KDEventMapInventory = { } } }, - "callGuardFurniture": (e, item, data) => { + "callGuardFurniture": (e, _item, data) => { if (!data.delta) return; if (KinkyDungeonFlags.get("SuppressGuardCall")) return; if (!KinkyDungeonFlags.get("GuardCallBlock")) { - KinkyDungeonSetFlag("GuardCallBlock", 300); + KinkyDungeonSetFlag("GuardCallBlock", 80); if (!KinkyDungeonFlags.get("GuardCalled")) { KinkyDungeonSetFlag("GuardCalled", -1); } else { - KinkyDungeonSendTextMessage(10, TextGet("KDCallForHelpHint"), "#ffffff", 20); + KinkyDungeonSendTextMessage(11, TextGet("KDCallForHelpHint"), "#ffffff", 35, true); } } if (!KinkyDungeonFlags.has("GuardCalled") && KDRandom() < (e.chance ? e.chance : 0.05)) { @@ -1310,7 +1301,7 @@ let KDEventMapInventory = { KinkyDungeonSetFlag("guardTP", 20); } }, - "slimeSpread": (e, item, data) => { + "slimeSpread": (e, _item, data) => { if (!data.delta) return; let mult = 0.4 * Math.max(0.25, Math.min(2.0, KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist")))); @@ -1378,7 +1369,7 @@ let KDEventMapInventory = { KDItemDataSet(item, "livingFreq", frequency); }, - "ApplyConduction": (e, item, data) => { + "ApplyConduction": (e, _item, _data) => { let bb = Object.assign({}, KDConduction); if (e.duration) bb.duration = e.duration; if (e.power) bb.power = e.power; @@ -1386,7 +1377,7 @@ let KDEventMapInventory = { }, }, "tickAfter": { - "RobeOfChastity": (e, item, data) => { + "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( @@ -1425,7 +1416,7 @@ let KDEventMapInventory = { } }, - "RemoveOnETTag": (e, item, data) => { + "RemoveOnETTag": (e, item, _data) => { let tiles = KDEffectTileTags(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); if (e.tags.some((t) => {return tiles[t] != undefined;}) ) { // Increase damage count @@ -1446,7 +1437,7 @@ let KDEventMapInventory = { } } }, - "CursedSubmission": (e, item, data) => { + "CursedSubmission": (e, _item, _data) => { if (KinkyDungeonStatWill < 0.1) { if (KinkyDungeonLastTurnAction == "Move" && KDEntityBuffedStat(KinkyDungeonPlayerEntity, "ForcedSubmission", true) > 0 @@ -1474,19 +1465,19 @@ let KDEventMapInventory = { }, }, "calcDisplayDamage": { - "BoostDamage": (e, item, data) => { + "BoostDamage": (e, _item, data) => { if (KDCheckPrereq(null, e.prereq, e, data)) { data.buffdmg = Math.max(0, data.buffdmg + e.power); } }, - "AmpDamage": (e, item, data) => { + "AmpDamage": (e, _item, data) => { if (KDCheckPrereq(null, e.prereq, e, data)) { data.buffdmg = Math.max(0, data.buffdmg + (KinkyDungeonPlayerDamage.dmg || 0) * e.power); } }, }, "remove": { - "slimeStop": (e, item, data) => { + "slimeStop": (_e, item, data) => { if (data.item === item) KDEventData.SlimeLevel = 0; }, "unlinkItem": (e, item, data) => { @@ -1498,7 +1489,7 @@ let KDEventMapInventory = { }, }, "postUnlock": { - "RequireLocked": (e, item, data) => { + "RequireLocked": (_e, item, data) => { if (data.item == item && !item.lock && !item.curse) { KinkyDungeonRemoveRestraintSpecific(item, true, false, false); KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonRemoveCuffsNoLock") @@ -1508,13 +1499,25 @@ let KDEventMapInventory = { }, "postRemoval": { "replaceItem": (e, item, data) => { - if (data.item === item && !data.add && !data.shrine && e.list) { + 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) { - KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(restraint), e.power, true, e.lock, data.keep); + if (KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName(restraint), + e.power, true, + 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) => { + "RequireHogtie": (_e, item, data) => { if (!data.add && data.item !== item && KDRestraint(item).Group) { let upper = false; let lower = false; @@ -1559,7 +1562,7 @@ let KDEventMapInventory = { } } }, - "RequireBaseArmCuffs": (e, item, data) => { + "RequireBaseArmCuffs": (_e, item, data) => { if (!data.add && data.item !== item && KDRestraint(item).Group) { let cuffsbase = false; for (let inv of KinkyDungeonAllRestraint()) { @@ -1611,7 +1614,7 @@ let KDEventMapInventory = { } } }, - "RequireCollar": (e, item, data) => { + "RequireCollar": (_e, item, data) => { if (!data.add && data.item !== item && KDRestraint(item).Group) { let collar = false; if (data.item && KDRestraint(data.item)?.Group == "ItemNeck") { @@ -1623,7 +1626,7 @@ let KDEventMapInventory = { } } }, - "RequireBaseAnkleCuffs": (e, item, data) => { + "RequireBaseAnkleCuffs": (_e, item, data) => { if (!data.add && data.item !== item && KDRestraint(item).Group) { let cuffsbase = false; for (let inv of KinkyDungeonAllRestraint()) { @@ -1649,7 +1652,7 @@ let KDEventMapInventory = { } } }, - "RequireBaseLegCuffs": (e, item, data) => { + "RequireBaseLegCuffs": (_e, item, data) => { if (!data.add && data.item !== item && KDRestraint(item).Group) { let cuffsbase = false; for (let inv of KinkyDungeonAllRestraint()) { @@ -1675,7 +1678,7 @@ let KDEventMapInventory = { } } }, - "collarModule": (e, item, data) => { + "collarModule": (_e, item, data) => { if (!data.add && data.item !== item && KDRestraint(item).Group) { let collar = false; for (let inv of KinkyDungeonAllRestraint()) { @@ -1701,7 +1704,7 @@ let KDEventMapInventory = { } } }, - "armbinderHarness": (e, item, data) => { + "armbinderHarness": (_e, item, data) => { if (!data.add && data.item !== item && KDRestraint(item).Group) { let armbinder = false; for (let inv of KinkyDungeonAllRestraint()) { @@ -1729,7 +1732,7 @@ let KDEventMapInventory = { } }, "tryOrgasm": { - "CursedDenial": (e, item, data) => { + "CursedDenial": (e, _item, data) => { if (KinkyDungeonStatWill > 0.1) { if (data.auto <= 1) KinkyDungeonChangeWill(-e.power); @@ -1737,12 +1740,12 @@ let KDEventMapInventory = { data.chance *= 0; } }, - "DivineBelt": (e, item, data) => { + "DivineBelt": (_e, _item, data) => { data.chance *= 0; KinkyDungeonEndVibration(); KinkyDungeonSendTextMessage(6, TextGet("KDDivineBeltDeny"), "#ffff88", 4); }, - "DivineBelt2": (e, item, data) => { + "DivineBelt2": (_e, _item, data) => { data.chance *= 0; KinkyDungeonSendTextMessage(6, TextGet("KDDivineBelt2Deny"), "#ffff88", 4); }, @@ -1850,34 +1853,34 @@ let KDEventMapInventory = { }, }, "apply": { - "FilterLayer": (e, item, data) => { + "FilterLayer": (e, _item, data) => { data.Filters[e.kind] = e.filter; }, }, "missPlayer": { - "EnergyCost": (e, item, data) => { + "EnergyCost": (e, _item, _data) => { if (e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KinkyDungeonChangeCharge(- e.energyCost); } }, "missEnemy": { - "EnergyCost": (e, item, data) => { + "EnergyCost": (e, _item, _data) => { if (e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KinkyDungeonChangeCharge(- e.energyCost); } }, "calcEvasion": { - "HandsFree": (e, item, data) => { + "HandsFree": (e, _item, data) => { if (data.flags.KDEvasionHands) { data.flags.KDEvasionHands = false; if (data.cost && e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KinkyDungeonChangeCharge(- e.energyCost); } }, - "ArmsFree": (e, item, data) => { + "ArmsFree": (e, _item, data) => { if (data.flags.KDEvasionArms) { data.flags.KDEvasionArms = false; if (data.cost && e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KinkyDungeonChangeCharge(- e.energyCost); } }, - "BlindFighting": (e, item, data) => { + "BlindFighting": (e, _item, data) => { if (data.flags.KDEvasionSight) { data.flags.KDEvasionSight = false; if (data.cost && e.energyCost && KinkyDungeonStatMana < KinkyDungeonStatManaMax - 0.01) KinkyDungeonChangeCharge(- e.energyCost); @@ -1885,13 +1888,13 @@ let KDEventMapInventory = { } }, "beforePlayerAttack": { - "BoostDamage": (e, item, data) => { + "BoostDamage": (e, _item, data) => { if (KDCheckPrereq(data.target, e.prereq, e, data)) { data.buffdmg = Math.max(0, data.buffdmg + e.power); if (e.energyCost) KinkyDungeonChangeCharge(- e.energyCost); } }, - "AmpDamage": (e, item, data) => { + "AmpDamage": (e, _item, data) => { if (KDCheckPrereq(data.target, e.prereq, e, data)) { data.buffdmg = Math.max(0, data.buffdmg + (data.Damage?.damage || KinkyDungeonPlayerDamage.dmg || 0) * e.power); if (e.energyCost) KinkyDungeonChangeCharge(- e.energyCost); @@ -1899,7 +1902,7 @@ let KDEventMapInventory = { }, }, "beforeDamage": { - "ModifyDamageFlat": (e, item, data) => { + "ModifyDamageFlat": (e, _item, data) => { if (data.damage > 0) { if (!e.chance || KDRandom() < e.chance) { data.damage = Math.max(data.damage + e.power, 0); @@ -1909,7 +1912,7 @@ let KDEventMapInventory = { }, }, "beforeDamageEnemy": { - "MultiplyDamageStealth": (e, item, data) => { + "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)); @@ -1918,7 +1921,7 @@ let KDEventMapInventory = { } } }, - "AddDamageStealth": (e, item, data) => { + "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) KinkyDungeonChangeCharge(- e.energyCost * (e.power - 1)); @@ -1926,7 +1929,7 @@ let KDEventMapInventory = { } } }, - "MultiplyDamageStatus": (e, item, data) => { + "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)); @@ -1935,7 +1938,7 @@ let KDEventMapInventory = { } } }, - "MultiplyDamageMagic": (e, item, data) => { + "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)); @@ -1946,7 +1949,7 @@ let KDEventMapInventory = { } }, "calcSneak": { - FactionStealth: (e, item, data) => { + 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; @@ -1955,14 +1958,14 @@ let KDEventMapInventory = { }, "defeat": { - "linkItem": (e, item, data) => { + "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) => { + "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); @@ -1974,7 +1977,7 @@ let KDEventMapInventory = { }, }, "struggle": { - "crotchrope": (e, item, data) => { + "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); @@ -1992,7 +1995,7 @@ let KDEventMapInventory = { if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); } }, - "celestialRopePunish": (e, item, data) => { + "celestialRopePunish": (_e, item, data) => { if (data.restraint && item === data.restraint) { KinkyDungeonChangeDistraction(3); KinkyDungeonChangeMana(-1); @@ -2011,7 +2014,7 @@ let KDEventMapInventory = { KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonCelestialPunish" + Math.floor(KDRandom() * 3)), "#ff5277", 2); } }, - "crystalPunish": (e, item, data) => { + "crystalPunish": (_e, item, data) => { if (data.restraint && item === data.restraint) { KinkyDungeonChangeDistraction(1, false, 0.1); KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonCrystalPunish" + Math.floor(KDRandom() * 3)), "#ff5277", 2); @@ -2105,7 +2108,7 @@ let KDEventMapInventory = { KinkyDungeonSendTextMessage(10, TextGet("KDElbowCuffsBlock" + Math.floor(KDRandom() * 3)), "#ff5277", 2); } }, - "vibeStruggle": (e, item, data) => { + "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) @@ -2144,7 +2147,7 @@ let KDEventMapInventory = { } }, - "shadowBuff": (e, item, data) => { + "shadowBuff": (_e, item, data) => { if (data.restraint && data.struggleType === "Struggle" && item == data.restraint) { let brightness = KinkyDungeonBrightnessGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); @@ -2166,7 +2169,7 @@ let KDEventMapInventory = { }, }, "sprint": { - "NippleWeights": (e, item, data) => { + "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); @@ -2190,7 +2193,7 @@ let KDEventMapInventory = { }, "playerAttack": { - "DestroyDirt": (e, item, data) => { + "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)) { @@ -2206,7 +2209,7 @@ let KDEventMapInventory = { } } }, - "DestroyMold": (e, item, data) => { + "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)) { @@ -2222,7 +2225,7 @@ let KDEventMapInventory = { } } }, - "ElementalEffect": (e, item, data) => { + "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)) { @@ -2238,7 +2241,7 @@ let KDEventMapInventory = { } } }, - "ElementalEcho": (e, item, data) => { + "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)) { @@ -2267,7 +2270,7 @@ let KDEventMapInventory = { if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); } }, - "NippleWeights": (e, item, data) => { + "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); @@ -2278,7 +2281,7 @@ let KDEventMapInventory = { } } }, - "ShadowHeel": (e, item, data) => { + "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) KinkyDungeonChangeCharge(- e.energyCost); @@ -2336,7 +2339,7 @@ let KDEventMapInventory = { }, }, "calcMiscast": { - "ReduceMiscastFlat": (e, item, data) => { + "ReduceMiscastFlat": (e, _item, data) => { if (data.miscastChance > 0) { data.miscastChance -= e.power; } @@ -2353,8 +2356,7 @@ let KDEventMapInventory = { }, "remotePunish": { "RemoteActivatedShock": (e, item, data) => { - /** @type {entity} */ - const enemy = data.enemy; + const enemy: entity = data.enemy; if (!enemy || KDRandom() >= (enemy.Enemy.RemoteControl?.punishRemoteChance || 0.25) || KDEnemyHasFlag(enemy, "remoteShockCooldown") || (e.noLeash && KDGameData.KinkyDungeonLeashedPlayer >= 1)) { return; } @@ -2436,7 +2438,7 @@ let KDEventMapInventory = { } }, "playerMove": { - "removeOnMove": (e, item, data) => { + "removeOnMove": (e, item, _data) => { if (!e.chance || KDRandom() < e.chance) { if (!e.prereq || KDCheckPrereq(KinkyDungeonPlayerEntity)) { KinkyDungeonRemoveRestraint(KDRestraint(item).Group, false, false); @@ -2444,7 +2446,7 @@ let KDEventMapInventory = { if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); } }, - "tipBallsuit": (e, item, data) => { + "tipBallsuit": (e, _item, _data) => { if (!e.chance || KDRandom() < e.chance) { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "tipBallsuit", @@ -2498,20 +2500,20 @@ let KDEventMapInventory = { if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); } }, - "DivineBra": (e, item, data) => { + "DivineBra": (e, _item, data) => { if (!e.chance || KDRandom() < e.chance) { data.amount = 0; KinkyDungeonSendTextMessage(6, TextGet("KDDivineBraDeny"), "#ffff88", 4); } }, - "DivineBra2": (e, item, data) => { + "DivineBra2": (e, _item, data) => { if (!e.chance || KDRandom() < e.chance) { KinkyDungeonChangeDistraction(-4 - data.amount, true, 0); KinkyDungeonChangeStamina(1 + data.amount * 2, false); KinkyDungeonSendTextMessage(6, TextGet("KDDivineBra2Deny"), "#ffff88", 4); } }, - "QuakeCollar": (e, item, data) => { + "QuakeCollar": (e, _item, data) => { let amnt = -1 + data.amount * 2; if (amnt > 0) { if (!e.chance || KDRandom() < e.chance) { @@ -2567,7 +2569,7 @@ let KDEventMapInventory = { } }, - "AlertEnemies": (e, item, data) => { + "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); @@ -2618,27 +2620,26 @@ let KDEventMapInventory = { }, }, "calcEscapeMethod": { - "DollmakerMask": (e, item, data) => { + "DollmakerMask": (_e, _item, data) => { if (KDGameData.RoomType == "" && !KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel)) { data.escapeMethod = "Kill"; } }, }, "calcEscapeKillTarget": { - "DollmakerMask": (e, item, data) => { + "DollmakerMask": (_e, _item, data) => { data.enemy = "DollmakerTarget"; } }, }; /** - * - * @param {string} Event - * @param {KinkyDungeonEvent} e - * @param {item} item - * @param {*} data + * @param Event + * @param e + * @param item + * @param data */ -function KinkyDungeonHandleInventoryEvent(Event, e, item, 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); @@ -2649,7 +2650,7 @@ function KinkyDungeonHandleInventoryEvent(Event, e, item, data) { /** * @type {Object.>} */ -const KDEventMapBuff = { +const KDEventMapBuff: Record void>> = { "dynamic": { "BuffSelf": (e, buff, entity, data) => { if (KDCheckPrereq(null, e.prereq, e, data)) @@ -2665,7 +2666,7 @@ const KDEventMapBuff = { }, }, "tickFlags": { - "latexIntegration": (e, buff, entity, data) => { + "latexIntegration": (_e, buff, _entity, _data) => { buff.duration -= 100; if (buff.duration < 100) { delete buff.infinite; @@ -2674,11 +2675,11 @@ const KDEventMapBuff = { }, }, "beforeStruggleCalc": { - "BreakFree": (e, buff, entity, data) => { + "BreakFree": (_e, buff, _entity, data) => { if (data.struggleType == "Struggle") - data.escapePenalty -= e.power; + data.escapePenalty -= buff.power; }, - "latexIntegrationDebuff": (e, buff, entity, data) => { + "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) @@ -2687,7 +2688,7 @@ const KDEventMapBuff = { }, }, "expireBuff": { - "ChaoticOverflow": (e, buff, entity, data) => { + "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); @@ -2707,7 +2708,7 @@ const KDEventMapBuff = { }, }, "beforeDamageEnemy": { - "Conduction": (e, buff, entity, data) => { + "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; @@ -2759,7 +2760,7 @@ const KDEventMapBuff = { } } }, - "EchoDamage": (e, buff, entity, data) => { + "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, @@ -2768,25 +2769,25 @@ const KDEventMapBuff = { }, false, false, undefined, undefined, undefined, data.faction); } }, - "Volcanism": (e, buff, entity, data) => { + "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) => { + "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) => { + "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) => { + "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) { @@ -2813,7 +2814,7 @@ const KDEventMapBuff = { } } }, - "EchoDamage": (e, buff, entity, data) => { + "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({ @@ -2825,7 +2826,7 @@ const KDEventMapBuff = { }, }, "beforeAttack": { - "CounterattackDamage": (e, buff, entity, data) => { + "CounterattackDamage": (e, _buff, entity, data) => { if (data.attacker && data.target == entity && data.eventable && (!(e.prereq == "hit") || (!data.missed && data.hit)) @@ -2842,7 +2843,7 @@ const KDEventMapBuff = { KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, e.requiredTag, 1); } }, - "CounterattackSpell": (e, buff, entity, data) => { + "CounterattackSpell": (e, _buff, entity, data) => { if (data.attacker && data.target == entity && data.eventable && (!(e.prereq == "hit") || (!data.missed && data.hit)) @@ -2857,9 +2858,9 @@ const KDEventMapBuff = { }, }, "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; + "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"); @@ -2895,7 +2896,7 @@ const KDEventMapBuff = { } } }, - "ShadowStep": (e, buff, entity, data) => { + "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"]}); @@ -2903,7 +2904,7 @@ const KDEventMapBuff = { KinkyDungeonTickBuffTag(KinkyDungeonPlayerEntity, e.requiredTag, 1); } }, - "ApplyDisarm": (e, buff, entity, data) => { + "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"); @@ -2914,34 +2915,34 @@ const KDEventMapBuff = { }, }, "calcMana": { - "Tablet": (e, buff, entity, data) => { + "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) => { + "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) => { + "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) => { + "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) => { + "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) => { + "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}; @@ -2949,12 +2950,12 @@ const KDEventMapBuff = { let outfit = KDOutfit({name: KinkyDungeonCurrentDress}); for (let inv of KDGetRestraintsForEntity(entity)) { - if ((!inv.faction || KDToggles.ForcePalette || outfit?.palette) && (!KDDefaultPalette || KinkyDungeonFactionFilters[KDDefaultPalette])) { + if ((!inv.faction || KDToggles.ForcePalette || outfit?.palette) + && (KDToggles.ApplyPaletteTransform && (!KDDefaultPalette || KinkyDungeonFactionFilters[KDDefaultPalette]))) { palette = outfit?.palette || KDDefaultPalette; } } - /** @type {alwaysDressModel} */ - let efd = { + let efd: alwaysDressModel = { Model: "Catsuit", faction: palette || "AncientRobot", Filters: { @@ -2972,7 +2973,7 @@ const KDEventMapBuff = { }, }, "tick": { - "TrainingUnit": (e, buff, entity, data) => { + "TrainingUnit": (_e, _buff, entity, _data) => { if (!entity.player) { if (!KDMapData.PrisonStateStack.includes("Training")) { KDRemoveEntity(entity, false, false, true); @@ -2995,7 +2996,7 @@ const KDEventMapBuff = { } } }, - "ShadowDommed": (e, buff, entity, data) => { + "ShadowDommed": (_e, buff, entity, _data) => { if (buff.duration > 0) { if (entity.player) { if (!KDIsPlayerTethered(KinkyDungeonPlayerEntity)) { @@ -3005,7 +3006,7 @@ const KDEventMapBuff = { } } }, - "Haunting": (e, buff, entity, data) => { + "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", @@ -3045,7 +3046,7 @@ const KDEventMapBuff = { buff.duration = 0; } }, - "Cursed": (e, buff, entity, data) => { + "Cursed": (e, buff, entity, _data) => { if (buff.power > 0 && entity.player) { if (KinkyDungeonStatDistraction > 0.99 * KinkyDungeonStatDistractionMax) { let tags = ["obsidianRestraints", "shadowLatexRestraints", "shadowLatexPetsuit", "shadowLatexRestraintsHeavy"]; @@ -3076,7 +3077,7 @@ const KDEventMapBuff = { buff.duration = 0; } }, - "BoundByFate": (e, buff, entity, data) => { + "BoundByFate": (e, buff, entity, _data) => { if (buff.duration > 0) { if (entity.player) { if (!KDEffectTileTags(entity.x, entity.y).fate) { @@ -3087,7 +3088,7 @@ const KDEventMapBuff = { } } }, - "Taunted": (e, buff, entity, data) => { + "Taunted": (e, buff, entity, _data) => { if (buff.duration > 0) { if (entity.player) { if (!KDEffectTileTags(entity.x, entity.y).taunt) { @@ -3098,7 +3099,7 @@ const KDEventMapBuff = { } } }, - "ApplyConduction": (e, buff, entity, data) => { + "ApplyConduction": (e, _buff, entity, _data) => { let bb = Object.assign({}, KDConduction); if (e.duration) bb.duration = e.duration; if (e.power) bb.power = e.power; @@ -3109,7 +3110,7 @@ const KDEventMapBuff = { KinkyDungeonApplyBuffToEntity(entity, bb); } }, - "ApplySlowed": (e, buff, entity, data) => { + "ApplySlowed": (e, _buff, entity, _data) => { let bb = Object.assign({}, KDSlowed); if (e.duration) bb.duration = e.duration; if (e.power) bb.power = e.power; @@ -3120,7 +3121,7 @@ const KDEventMapBuff = { KinkyDungeonApplyBuffToEntity(entity, bb); } }, - "ApplyKnockback": (e, buff, entity, data) => { + "ApplyKnockback": (e, _buff, entity, _data) => { let bb = Object.assign({}, KDKnockbackable); if (e.duration) bb.duration = e.duration; if (e.power) bb.power = e.power; @@ -3131,12 +3132,12 @@ const KDEventMapBuff = { KinkyDungeonApplyBuffToEntity(entity, bb); } }, - "ApplyVuln": (e, buff, entity, data) => { + "ApplyVuln": (_e, _buff, entity, _data) => { if (!entity.player) { if (!entity.vulnerable) entity.vulnerable = 1; } }, - "ApplyAttackSlow": (e, buff, entity, data) => { + "ApplyAttackSlow": (e, _buff, entity, _data) => { let bb = Object.assign({}, KDAttackSlow); if (e.duration) bb.duration = e.duration; if (e.power) bb.power = e.power; @@ -3147,14 +3148,14 @@ const KDEventMapBuff = { KinkyDungeonApplyBuffToEntity(entity, bb); } }, - "ApplySilence": (e, buff, entity, data) => { + "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) => { + "ApplyGlueVuln": (e, _buff, entity, _data) => { let bb = Object.assign({}, KDGlueVulnLow); if (e.duration) bb.duration = e.duration; if (e.power) bb.power = e.power; @@ -3165,7 +3166,7 @@ const KDEventMapBuff = { KinkyDungeonApplyBuffToEntity(entity, bb); } }, - "RemoveDrench": (e, buff, entity, data) => { + "RemoveDrench": (_e, _buff, entity, _data) => { if (!KDWettable(entity)) { if (entity.player) { delete KinkyDungeonPlayerBuffs.Drenched; @@ -3188,7 +3189,7 @@ const KDEventMapBuff = { }, - "BreakFree": (e, buff, entity, data) => { + "BreakFree": (_e, _buff, entity, _data) => { if (KinkyDungeonStatWill <= 0.01) { if (entity.player) { delete KinkyDungeonPlayerBuffs.BreakFree; @@ -3196,7 +3197,7 @@ const KDEventMapBuff = { } }, - "RemoveConduction": (e, buff, entity, data) => { + "RemoveConduction": (_e, _buff, entity, _data) => { if (!KDConducting(entity)) { if (entity.player) { delete KinkyDungeonPlayerBuffs.Conduction; @@ -3205,7 +3206,7 @@ const KDEventMapBuff = { } } }, - "RemoveSlimeWalk": (e, buff, entity, data) => { + "RemoveSlimeWalk": (_e, buff, entity, _data) => { if (KDSlimeImmuneEntity(entity)) { if (entity.player) { delete KinkyDungeonPlayerBuffs[buff.id]; @@ -3256,12 +3257,12 @@ const KDEventMapBuff = { } } }, - "Distract": (e, buff, entity, data) => { + "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) => { + "RemoveBurning": (_e, _buff, entity, data) => { let drench = KDEntityGetBuff(entity, "Drenched"); if (drench && drench.duration > data.delta) { if (entity.player) { @@ -3272,14 +3273,14 @@ const KDEventMapBuff = { drench.duration -= data.delta; } }, - "RemoveRestraint": (e, buff, entity, data) => { + "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) => { + "ElementalEffect": (e, buff, entity, _data) => { if (buff.duration > 0) { if (entity.player) { KinkyDungeonDealDamage({ @@ -3305,7 +3306,7 @@ const KDEventMapBuff = { } }, - "ShadowElementalEffect": (e, buff, entity, data) => { + "ShadowElementalEffect": (e, buff, entity, _data) => { if (KinkyDungeonBrightnessGet(entity.x, entity.y) <= KDShadowThreshold) { if (buff.duration > 0) { if (entity.player) { @@ -3332,7 +3333,7 @@ const KDEventMapBuff = { } } }, - "UnShadowElementalEffect": (e, buff, entity, data) => { + "UnShadowElementalEffect": (e, buff, entity, _data) => { if (KinkyDungeonBrightnessGet(entity.x, entity.y) > KDShadowThreshold) { if (buff.duration > 0) { if (entity.player) { @@ -3364,11 +3365,11 @@ const KDEventMapBuff = { "afterEnemyTick": { - "nurseAura": (e, buff, enemy, data) => { + "nurseAura": (e, _buff, enemy, data) => { KDEventMapEnemy[e.trigger][e.type](e, enemy, data); }, // Simple spell checkerboard pattern - "spellX": (e, buff, enemy, data) => { + "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 @@ -3377,22 +3378,36 @@ const KDEventMapBuff = { && KinkyDungeonCanCastSpells(enemy) && ((data.allied && KDAllied(enemy)) || (!data.allied && !KDAllied(enemy)))) { - let nearby = (e.always || enemy.aware || enemy.vp > 0.5) ? KDNearbyEnemies(enemy.x, enemy.y, e.dist, enemy) : []; + let nearby = (e.always || enemy.aware || enemy.vp > 0.5) ? + KDNearbyEnemies(enemy.x, enemy.y, e.dist, enemy) : []; if ((e.always || enemy.aware || enemy.vp > 0.5) && (e.always || nearby.length > 0 || KinkyDungeonAggressive(enemy))) { if (buff.power > 0) { - let player = KinkyDungeonPlayerEntity; - let playerdist = KDistChebyshev(enemy.x - player.x, enemy.y - player.y); + let player = KDHostile(enemy, KDPlayer()) ? KDPlayer() : null; + let dist = 11 - Math.min(4, buff.power); + 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) { - player = nearby[Math.floor(KDRandom() * nearby.length)]; + // 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, 2)) break; + } } } - if (KinkyDungeonCheckLOS(enemy, player, KDistChebyshev(enemy.x - player.x, enemy.y - player.y), 11 - Math.min(4, buff.power), false, true, 2)) { + if (KinkyDungeonCheckLOS( + enemy, + player, + KDistChebyshev(enemy.x - player.x, enemy.y - player.y), + dist, false, true, 2)) { let origin = enemy; let spell = KinkyDungeonFindSpell(e.spell, true); let b = KinkyDungeonLaunchBullet(origin.x, origin.y, @@ -3512,7 +3527,7 @@ const KDEventMapBuff = { }, "tickAfter": { - "ApplyConduction": (e, buff, entity, data) => { + "ApplyConduction": (e, buff, entity, _data) => { if (!buff.duration) return; let bb = Object.assign({}, KDConduction); if (e.duration) bb.duration = e.duration; @@ -3524,7 +3539,7 @@ const KDEventMapBuff = { KinkyDungeonApplyBuffToEntity(entity, bb); } }, - "ApplySlowed": (e, buff, entity, data) => { + "ApplySlowed": (e, buff, entity, _data) => { if (!buff.duration) return; let bb = Object.assign({}, KDSlowed); if (e.duration) bb.duration = e.duration; @@ -3536,7 +3551,7 @@ const KDEventMapBuff = { KinkyDungeonApplyBuffToEntity(entity, bb); } }, - "ApplyKnockback": (e, buff, entity, data) => { + "ApplyKnockback": (e, _buff, entity, _data) => { let bb = Object.assign({}, KDKnockbackable); if (e.duration) bb.duration = e.duration; if (e.power) bb.power = e.power; @@ -3547,12 +3562,12 @@ const KDEventMapBuff = { KinkyDungeonApplyBuffToEntity(entity, bb); } }, - "ApplyVuln": (e, buff, entity, data) => { + "ApplyVuln": (_e, _buff, entity, _data) => { if (!entity.player) { if (!entity.vulnerable) entity.vulnerable = 1; } }, - "ApplyAttackSlow": (e, buff, entity, data) => { + "ApplyAttackSlow": (e, buff, entity, _data) => { if (!buff.duration) return; let bb = Object.assign({}, KDAttackSlow); if (e.duration) bb.duration = e.duration; @@ -3564,14 +3579,14 @@ const KDEventMapBuff = { KinkyDungeonApplyBuffToEntity(entity, bb); } }, - "ApplySilence": (e, buff, entity, data) => { + "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) => { + "ApplyGlueVuln": (e, buff, entity, _data) => { if (!buff.duration) return; let bb = Object.assign({}, KDGlueVulnLow); if (e.duration) bb.duration = e.duration; @@ -3587,13 +3602,13 @@ const KDEventMapBuff = { }; /** - * - * @param {string} Event - * @param {any} buff - * @param {any} entity - * @param {*} data + * @param Event + * @param e + * @param buff + * @param entity + * @param data */ -function KinkyDungeonHandleBuffEvent(Event, e, buff, entity, 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); @@ -3601,19 +3616,16 @@ function KinkyDungeonHandleBuffEvent(Event, e, buff, entity, data) { } -/** - * @type {Object.>} - */ -let KDEventMapOutfit = { +let KDEventMapOutfit: Record void>> = { "calcEvasion": { - "AccuracyBuff": (e, outfit, data) => { + "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) => { + 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; @@ -3622,16 +3634,16 @@ let KDEventMapOutfit = { }, "tick": { - "sneakBuff": (e, outfit, data) => { + "sneakBuff": (e, outfit, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: outfit.name + "Sneak", type: "SlowDetection", power: e.power, duration: 2,}); }, - "armorBuff": (e, outfit, data) => { + "armorBuff": (e, outfit, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: outfit.name + "Armor", type: "Armor", power: e.power, duration: 2,}); }, - "buff": (e, outfit, data) => { + "buff": (e, outfit, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: outfit.name + e.kind, type: e.kind, power: e.power, duration: 2,}); }, - "damageResist": (e, outfit, data) => { + "damageResist": (e, outfit, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: outfit.name + e.damage + "damageResist", type: e.damage + "DamageResist", power: e.power, duration: 2,}); }, }, @@ -3639,24 +3651,21 @@ let KDEventMapOutfit = { }; /** - * - * @param {string} Event - * @param {any} outfit - * @param {*} data + * @param Event + * @param e + * @param outfit + * @param data */ -function KinkyDungeonHandleOutfitEvent(Event, e, outfit, 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); } } -/** - * @type {Object.>} - */ -let KDEventMapSpell = { +let KDEventMapSpell: Record void>> = { "afterChangeCharge": { - "Gunslinger": (e, spell, data) => { + "Gunslinger": (e, _spell, data) => { if (-data.change > 0) { let player = KinkyDungeonPlayerEntity; let buff = KDEntityGetBuff(player, "BattleRhythm"); @@ -3711,14 +3720,14 @@ let KDEventMapSpell = { }, }, "calcSpellRange": { - "AddRange": (e, spell, data) => { + "AddRange": (e, _spell, data) => { if (data.spell?.tags?.includes(e.requiredTag)) { data.range += e.power; } }, }, "afterPlayerAttack": { - "BattleTrance": (e, spell, data) => { + "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)) { @@ -3741,14 +3750,14 @@ let KDEventMapSpell = { }, }, "canOffhand": { - "RogueOffhand": (e, spell, data) => { + "RogueOffhand": (_e, _spell, data) => { if (data.canOffhand && KDHasSpell("RogueOffhand") && !KDHasSpell("BattleRhythm")) { if (KDWeapon(data.item)?.clumsy || KDWeapon(data.item)?.heavy || KDWeapon(data.item)?.massive) { data.canOffhand = false; } } }, - "WizardOffhand": (e, spell, data) => { + "WizardOffhand": (_e, _spell, data) => { if (data.canOffhand && KDHasSpell("WizardOffhand") && !KDHasSpell("BattleRhythm")) { if (!KDWeaponIsMagic(data.item)) { data.canOffhand = false; @@ -3757,7 +3766,7 @@ let KDEventMapSpell = { }, }, "attackCost": { - "CombatTraining": (e, spell, data) => { + "CombatTraining": (e, _spell, data) => { if (KinkyDungeonStatWill > 0) { let amount = Math.min(e.power, e.mult * KinkyDungeonStatWill); data.mult *= 1 - amount; @@ -3765,10 +3774,7 @@ let KDEventMapSpell = { }, }, "affinity": { - /** - * @param {KDEventData_affinity} data - */ - "RogueEscape": (e, spell, data) => { + "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; @@ -3778,10 +3784,7 @@ let KDEventMapSpell = { }, }, "postApply": { - /** - * @param {KDEventData_PostApply} data - */ - "RogueEscape": (e, spell, data) => { + "RogueEscape": (e, _spell, data: KDEventData_PostApply) => { if (KinkyDungeonFlags.get("SelfBondage")) { let buff = KDEntityGetBuff(data.player, "RogueEscape"); if (buff) @@ -3808,7 +3811,7 @@ let KDEventMapSpell = { }, }, "beforeCrit": { - "RogueTraps2": (e, spell, data) => { + "RogueTraps2": (_e, _spell, data) => { if (data.faction == "Player" && data.spell && data.spell.tags?.includes("trap")) { data.forceCrit = true; } @@ -3817,7 +3820,7 @@ let KDEventMapSpell = { "postQuest": { }, "blockPlayer": { - "Riposte": (e, spell, data) => { + "Riposte": (_e, _spell, data) => { KinkyDungeonDamageEnemy(data.enemy, { type: "stun", damage: 0, @@ -3829,14 +3832,14 @@ let KDEventMapSpell = { } }, "beforeCast": { - "RogueTraps": (e, spell, data) => { + "RogueTraps": (_e, _spell, data) => { if (data.spell && data.spell.tags?.includes("trapReducible") && data.channel) { data.channel = 0; } } }, "calcComp": { - "OneWithSlime": (e, spell, data) => { + "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)) { @@ -3847,7 +3850,7 @@ let KDEventMapSpell = { } } }, - "Psychokinesis": (e, spell, data) => { + "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 = []; @@ -3856,7 +3859,7 @@ let KDEventMapSpell = { }, }, "calcCompPartial": { - "OneWithSlime": (e, spell, data) => { + "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)) { @@ -3868,7 +3871,7 @@ let KDEventMapSpell = { } } }, - "Psychokinesis": (e, spell, data) => { + "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 = []; @@ -3878,7 +3881,7 @@ let KDEventMapSpell = { }, }, "canSprint": { - "VaultBasic": (e, spell, data) => { + "VaultBasic": (_e, _spell, data) => { if (!data.passThru && KinkyDungeonSlowLevel < 2) { let enemy = KinkyDungeonEntityAt(data.nextPosx, data.nextPosy); if (enemy && !enemy?.player && (KDIsFlying(enemy) || !KDIsImmobile(enemy)) @@ -3887,7 +3890,7 @@ let KDEventMapSpell = { } } }, - "Vault": (e, spell, data) => { + "Vault": (_e, _spell, data) => { if (!data.passThru && KinkyDungeonSlowLevel < 2) { let enemy = KinkyDungeonEntityAt(data.nextPosx, data.nextPosy); if (enemy && !enemy?.player && (KDIsFlying(enemy) || !KDIsImmobile(enemy))) { @@ -3897,7 +3900,7 @@ let KDEventMapSpell = { }, }, "perkOrb": { - "Cursed": (e, spell, data) => { + "Cursed": (_e, _spell, data) => { if (data.perks && data.perks.includes("Cursed")) { for (let shrine in KinkyDungeonShrineBaseCosts) { KinkyDungeonGoddessRep[shrine] = -25; @@ -3906,17 +3909,17 @@ let KDEventMapSpell = { }, }, "calcEdgeDrain": { - "ChangeEdgeDrain": (e, spell, data) => { + "ChangeEdgeDrain": (e, _spell, data) => { data.edgeDrain *= e.mult || 1; data.edgeDrain += e.power || 0; }, }, "calcMaxStats": { - "IronWill": (e, spell, data) => { + "IronWill": (e, _spell, data) => { if (KinkyDungeonStatWill >= 9.999) data.staminaRate += e.power; }, - "SteadfastGuard": (e, spell, data) => { + "SteadfastGuard": (e, _spell, _data) => { if (!e.power || KinkyDungeonStatWill >= e.power) KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "SteadfastGuard", @@ -3925,12 +3928,12 @@ let KDEventMapSpell = { duration: 2 }); }, - "IncreaseManaPool": (e, spell, data) => { + "IncreaseManaPool": (e, _spell, _data) => { KinkyDungeonStatManaPoolMax += e.power; }, }, "calcInvolOrgasmChance": { - "OrgasmResist": (e, spell, data) => { + "OrgasmResist": (e, _spell, data) => { if (KinkyDungeonStatWill >= 0.1 && !KinkyDungeonPlayerBuffs?.d_OrgasmResist) { data.invol_chance *= e.power; } @@ -3938,7 +3941,7 @@ let KDEventMapSpell = { }, "orgasm": { - "RestoreOrgasmMana": (e, spell, data) => { + "RestoreOrgasmMana": (e, _spell, data) => { //if (KinkyDungeonStatWill > 0) { let willPercentage = data.wpcost < 0 ? -KinkyDungeonStatWill/data.wpcost : 1.0; if (willPercentage > 0) @@ -3954,23 +3957,23 @@ let KDEventMapSpell = { duration: e.time + (data.stunTime || 0) }); }, - "ChangeOrgasmStamina": (e, spell, data) => { + "ChangeOrgasmStamina": (e, _spell, _data) => { KDGameData.OrgasmStamina *= e.mult || 1; KDGameData.OrgasmStamina += e.power || 0; }, }, "tryOrgasm": { - "ChangeWPCost": (e, spell, data) => { + "ChangeWPCost": (e, _spell, data) => { data.wpcost *= e.mult || 1; data.wpcost += e.power || 0; }, - "ChangeSPCost": (e, spell, data) => { + "ChangeSPCost": (e, _spell, data) => { data.spcost *= e.mult || 1; data.spcost += e.power || 0; }, }, "deny": { - "RestoreDenyMana": (e, spell, data) => { + "RestoreDenyMana": (e, _spell, data) => { let willPercentage = data.edgewpcost < 0 ? -KinkyDungeonStatWill/data.edgewpcost : 1.0; if (willPercentage > 0) KinkyDungeonChangeMana(0, false, e.power * willPercentage); @@ -3978,20 +3981,20 @@ let KDEventMapSpell = { }, }, "calcEfficientMana": { - "ManaCost": (e, item, data) => { + "ManaCost": (e, _item, data) => { data.efficiency += e.power; }, }, "calcMultMana": { - "StaffUser1": (e, spell, data) => { + "StaffUser1": (e, _spell, data) => { if (KinkyDungeonPlayerDamage && KDWeaponIsMagic({name: KinkyDungeonPlayerWeapon})) data.cost = Math.max(data.cost * e.power, 0); }, - "StaffUser3": (e, spell, data) => { + "StaffUser3": (e, _spell, data) => { if (data.spell && data.spell.upcastFrom) data.cost = data.cost * e.power; }, - "TheShadowWithin": (e, spell, data) => { + "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;}))) @@ -3999,12 +4002,12 @@ let KDEventMapSpell = { }, }, "beforeMultMana": { - "KineticMastery": (e, spell, data) => { + "KineticMastery": (e, _spell, data) => { if (data.spell?.tags?.includes(e.requiredTag) && KinkyDungeonPlayerDamage?.light) { data.cost = Math.max(0, data.cost*e.mult); } }, - "ManaRegen": (e, spell, data) => { + "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); @@ -4017,7 +4020,7 @@ let KDEventMapSpell = { data.cost += e.power; } }, - "StaffUser2": (e, spell, data) => { + "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)); }, @@ -4026,12 +4029,12 @@ let KDEventMapSpell = { // }, "calcMiscast": { - "DistractionCast": (e, spell, data) => { + "DistractionCast": (_e, _spell, data) => { if (KinkyDungeonStatDistraction / KinkyDungeonStatDistractionMax > 0.99 || KinkyDungeonPlayerBuffs.DistractionCast) data.miscastChance -= 1.0; }, }, "duringPlayerDamage": { - "ArcaneBarrier": (e, spell, data) => { + "ArcaneBarrier": (_e, _spell, _data) => { /*if (data.dmg > 0) { let player = KinkyDungeonPlayerEntity; let buff = KDEntityGetBuff(player, "ArcaneEnergy"); @@ -4051,7 +4054,7 @@ let KDEventMapSpell = { } }, "doAttackCalculation": { - "BattleRhythm": (e, spell, data) => { + "BattleRhythm": (e, _spell, data) => { if (data.target?.player && data.attacker) { let player = KinkyDungeonPlayerEntity; let buff = KDEntityGetBuff(player, "BattleRhythm"); @@ -4077,7 +4080,7 @@ let KDEventMapSpell = { }, }, "afterPlayerCast": { - "ManaRegenSuspend": (e, spell, data) => { + "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, { @@ -4085,7 +4088,7 @@ let KDEventMapSpell = { }); } }, - "Psychokinesis": (e, spell, data) => { + "Psychokinesis": (e, _spell, data) => { if (data.spell && data.spell.tags && data.spell.tags.includes("telekinesis")) { if (KinkyDungeoCheckComponents(data.spell, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true).length > 0) { KinkyDungeonChangeDistraction((data.spell.manacost ? data.spell.manacost : 1) * e.mult); @@ -4094,7 +4097,7 @@ let KDEventMapSpell = { }, }, "afterSpellTrigger": { - "ManaRegenSuspend": (e, spell, data) => { + "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; @@ -4105,7 +4108,7 @@ let KDEventMapSpell = { }, }, "spellTrigger": { - "ArcaneStore": (e, spell, data) => { + "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); @@ -4122,7 +4125,7 @@ let KDEventMapSpell = { }, }, "playerCast": { - "ArcaneStore": (e, spell, data) => { + "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")); @@ -4134,7 +4137,7 @@ let KDEventMapSpell = { KinkyDungeonSetFlag("ArcaneStore" + data.castID, 1); } }, - "ArcaneBlast": (e, spell, data) => { + "ArcaneBlast": (e, _spell, data) => { if (data.spell && data.spell.name == "ArcaneBlast") { let player = KinkyDungeonPlayerEntity; let buff = KDEntityGetBuff(player, "ArcaneEnergy"); @@ -4153,8 +4156,8 @@ let KDEventMapSpell = { } } }, - "ArrowFireSpell": (e, spell, data) => { - if (data.bulletfired && data.bulletfired.bullet?.spell?.tags?.some((t) => {return e.tags.includes(t);}) && KDGameData.AncientEnergyLevel > (e.energyCost || 0)) { + "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)) { KinkyDungeonChangeCharge((-e.energyCost || 0)); data.bulletfired.bullet.spell = KinkyDungeonFindSpell(e.spell, true); data.bulletfired.bullet.name = e.spell; @@ -4187,8 +4190,8 @@ let KDEventMapSpell = { } }, - "ArrowVineSpell": (e, spell, data) => { - if (data.bulletfired && data.bulletfired.bullet?.spell?.tags?.some((t) => {return e.tags.includes(t);}) && KDGameData.AncientEnergyLevel > (e.energyCost || 0)) { + "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)) { KinkyDungeonChangeCharge((-e.energyCost || 0)); data.bulletfired.bullet.spell = KinkyDungeonFindSpell(e.spell, true); data.bulletfired.bullet.name = e.spell; @@ -4215,14 +4218,14 @@ let KDEventMapSpell = { } }, - "DistractionCast": (e, spell, data) => { + "DistractionCast": (_e, _spell, data) => { if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.99 || KinkyDungeonPlayerBuffs.DistractionCast) { let tb = KinkyDungeonGetManaCost(data.spell) * 0.6; KinkyDungeonTeaseLevelBypass += tb; KDGameData.OrgasmStage = Math.min((KDGameData.OrgasmStage + Math.ceil(tb)) || tb, KinkyDungeonMaxOrgasmStage); } }, - "LightningRod": (e, spell, data) => { + "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; @@ -4232,7 +4235,7 @@ let KDEventMapSpell = { }); } }, - "LeatherBurst": (e, spell, data) => { + "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) { @@ -4246,7 +4249,7 @@ let KDEventMapSpell = { } } }, - "SagittaAssault": (e, spell, data) => { + "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) { @@ -4262,7 +4265,7 @@ let KDEventMapSpell = { }, }, "calcPlayerEvasionEvent": { - "EvasiveManeuvers": (e, spell, data) => { + "EvasiveManeuvers": (_e, _spell, data) => { if (KinkyDungeonStatStamina >= KDEvasiveManeuversCost()) { if (data.val > -2) data.val = -2; } @@ -4270,34 +4273,34 @@ let KDEventMapSpell = { }, }, "calcEvasion": { - "AccuracyBuff": (e, outfit, data) => { + "AccuracyBuff": (e, _outfit, data) => { if (data.enemy && data.enemy.Enemy) { data.hitmult *= e.power; } }, - "HandsFree": (e, spell, data) => { + "HandsFree": (_e, spell, data) => { if (!data.IsSpell && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && data.flags.KDEvasionHands) { data.flags.KDEvasionHands = false; } }, - "ArmsFree": (e, spell, data) => { + "ArmsFree": (_e, spell, data) => { if (!data.IsSpell && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && data.flags.KDEvasionArms) { data.flags.KDEvasionArms = false; } }, }, "calcManaPool": { - "EdgeRegenBoost": (e, spell, data) => { + "EdgeRegenBoost": (e, _spell, data) => { if (KDIsEdged(KinkyDungeonPlayerEntity)) { data.manaPoolRegen += e.power; } }, }, "tick": { - "ZeroResistance": (e, spell, data) => { + "ZeroResistance": (_e, _spell, _data) => { KinkyDungeonSetFlag("ZeroResistance", 2); }, - "ArcaneBarrier": (e, spell, data) => { + "ArcaneBarrier": (e, _spell, data) => { if (data.delta > 0) { let player = KinkyDungeonPlayerEntity; let buff = KDEntityGetBuff(player, "ArcaneEnergy"); @@ -4331,7 +4334,7 @@ let KDEventMapSpell = { }, - "BattleTrance": (e, weapon, data) => { + "BattleTrance": (e, _weapon, _data) => { if (!KinkyDungeonAttackTwiceFlag && (!e.chance || KDRandom() < e.chance) && KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "BattleRhythm") >= 0.395) { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "BattleTrance", @@ -4343,7 +4346,7 @@ let KDEventMapSpell = { }); } }, - "WizardOffhand": (e, spell, data) => { + "WizardOffhand": (_e, _spell, _data) => { if (!KDHasSpell("BattleRhythm")) { if (KDGameData.Offhand && KinkyDungeonInventoryGetWeapon(KDGameData.Offhand)) { let weapon = KDWeapon(KinkyDungeonInventoryGetWeapon(KDGameData.Offhand)); @@ -4357,7 +4360,7 @@ let KDEventMapSpell = { } } }, - "CombatTrainingSlowResist": (e, spell, data) => { + "CombatTrainingSlowResist": (_e, _spell, _data) => { if (KinkyDungeonStatWill >= 0.1) { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "CombatTraining", @@ -4367,7 +4370,7 @@ let KDEventMapSpell = { }); } }, - "Offhand": (e, spell, data) => { + "Offhand": (_e, _spell, _data) => { if (KDGameData.Offhand && ( !KinkyDungeonInventoryGetWeapon(KDGameData.Offhand) || !KinkyDungeonCanUseWeapon(false, undefined, KDWeapon(KinkyDungeonInventoryGetWeapon(KDGameData.Offhand))) @@ -4377,7 +4380,7 @@ let KDEventMapSpell = { KDGameData.Offhand = ""; } }, - "ArcaneEnergyBondageResist": (e, spell, data) => { + "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")); @@ -4390,7 +4393,7 @@ let KDEventMapSpell = { buff.duration = 2; } }, - "BREvasionBlock": (e, spell, data) => { + "BREvasionBlock": (e, spell, _data) => { let player = KinkyDungeonPlayerEntity; if (KDEntityBuffedStat(player, "BattleRhythm") > e.mult) { KinkyDungeonApplyBuffToEntity(player, @@ -4401,7 +4404,7 @@ let KDEventMapSpell = { ); } }, - "BRDecay": (e, spell, data) => { + "BRDecay": (e, _spell, data) => { let player = KinkyDungeonPlayerEntity; if (KDEntityBuffedStat(player, "BattleRhythm") > 0 && !KinkyDungeonFlags.get("PlayerCombat") && !KinkyDungeonFlags.get("BRCombat")) { let buff = KDEntityGetBuff(player, "BattleRhythm"); @@ -4413,7 +4416,7 @@ let KDEventMapSpell = { } } }, - "OrgasmResistBuff": (e, spell, data) => { + "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, @@ -4421,7 +4424,7 @@ let KDEventMapSpell = { player: true, enemies: true} ); }, - "ManaRegenOld": (e, spell, data) => { + "ManaRegenOld": (e, _spell, _data) => { if (KinkyDungeonStatMana + KinkyDungeonStatManaPool < KinkyDungeonStatManaMax * e.mult && !KinkyDungeonPlayerBuffs.ManaRegenSuspend) { KinkyDungeonChangeMana(e.power, false, 0, false, false); @@ -4433,7 +4436,7 @@ let KDEventMapSpell = { ); } }, - "SatisfiedDamageBuff": (e, spell, data) => { + "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", @@ -4442,7 +4445,7 @@ let KDEventMapSpell = { duration: 2 }); }, - "RestoreEdgeMana": (e, spell, data) => { + "RestoreEdgeMana": (e, _spell, data) => { if (KDIsEdged(KinkyDungeonPlayerEntity) && data.delta > 0) { KinkyDungeonChangeMana(e.power, true, 0, false, KinkyDungeonStatWill > 0); if (KinkyDungeonStatWill > 0) { @@ -4450,35 +4453,35 @@ let KDEventMapSpell = { } } }, - "Parry": (e, spell, data) => { + "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) => { + "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) => { + "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) => { + "GuardBoost": (_e, spell, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: spell.name + "Block", type: "Block", power: .15 + 0.15 * KinkyDungeonStatWill/KinkyDungeonStatWillMax, duration: 2,}); }, - "DaggerParry": (e, spell, data) => { + "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) => { + "ClaymoreParry": (e, spell, _data) => { if (KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.noHands && KinkyDungeonPlayerDamage.heavy) { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: spell.name + "Block", type: "Block", power: e.power, duration: 2,}); } }, - "DistractionCast": (e, spell, data) => { + "DistractionCast": (_e, _spell, _data) => { if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax * 0.99) KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "DistractionCast", type: "sfx", power: 1, duration: 3, sfxApply: "PowerMagic", aura: "#ff8888", aurasprite: "Heart" @@ -4496,7 +4499,7 @@ let KDEventMapSpell = { duration: 2 }); }, - "SlimeMimic": (e, spell, data) => { + "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")) @@ -4520,7 +4523,7 @@ let KDEventMapSpell = { ); } }, - "AccuracyBuff": (e, spell, data) => { + "AccuracyBuff": (e, spell, _data) => { if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, true))) { //KDBlindnessCap = Math.min(KDBlindnessCap, e.power); KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { @@ -4531,7 +4534,7 @@ let KDEventMapSpell = { }); } }, - "Analyze": (e, spell, data) => { + "Analyze": (e, spell, _data) => { let activate = false; if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, false, false)) && !KinkyDungeonPlayerBuffs.Analyze) { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "Analyze", buffSprite: true, aura:"#ff5555", type: "MagicalSight", power: e.power, duration: e.time}); @@ -4547,7 +4550,7 @@ let KDEventMapSpell = { }, }, "calcStats": { - "Blindness": (e, spell, data) => { + "Blindness": (e, spell, _data) => { if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, true))) { //KDBlindnessCap = Math.min(KDBlindnessCap, e.power); KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { @@ -4576,7 +4579,7 @@ let KDEventMapSpell = { }, }, "afterMove": { - "FleetFooted": (e, spell, data) => { + "FleetFooted": (e, _spell, data) => { if (e.prevSlowLevel && !data.IsSpell && KinkyDungeonSlowLevel < e.prevSlowLevel) { KinkyDungeonSlowLevel = e.prevSlowLevel; e.prevSlowLevel = undefined; @@ -4597,7 +4600,7 @@ let KDEventMapSpell = { }, }, "afterDamageEnemy": { - "IcePrison": (e, spell, data) => { + "IcePrison": (e, _spell, data) => { if (data.enemy && data.froze) { if ((!e.chance || KDRandom() < e.chance) && KDHostile(data.enemy)) { KinkyDungeonDamageEnemy(data.enemy, { @@ -4613,7 +4616,7 @@ let KDEventMapSpell = { }, }, "duringCrit": { - "RogueTargets": (e, spell, data) => { + "RogueTargets": (e, _spell, data) => { if (data.dmg > 0 && data.critical && data.enemy && !data.customCrit && KDHostile(data.enemy) && !KDEnemyHasFlag(data.enemy, "RogueTarget")) { data.crit *= e.mult; data.bindcrit *= e.mult; @@ -4622,7 +4625,7 @@ let KDEventMapSpell = { data.customCrit = true; } }, - "RogueBind": (e, spell, data) => { + "RogueBind": (_e, _spell, data) => { if (data.dmg > 0 && data.critical && data.enemy && !data.customCrit && KDHostile(data.enemy)) { if (data.bind || KinkyDungeonBindingDamageTypes.includes(data.type)) { KDDamageQueue.push({floater: TextGet("KDBindCritical"), Entity: data.enemy, Color: "#ff55aa", Delay: data.Delay}); @@ -4642,7 +4645,7 @@ let KDEventMapSpell = { } } }, - "Peasant": (e, spell, data) => { + "Peasant": (e, _spell, data) => { if (data.dmg > 0 && data.enemy && data.enemy.Enemy.tags.plant) { data.dmg = Math.max(data.dmg * e.mult, 0); } @@ -4655,7 +4658,7 @@ let KDEventMapSpell = { } } }, - "TemperaturePlay": (e, spell, data) => { + "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); @@ -4663,7 +4666,7 @@ let KDEventMapSpell = { } } }, - "Burning": (e, spell, data) => { + "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); @@ -4672,18 +4675,18 @@ let KDEventMapSpell = { }, }, "calcDamage": { - "HandsFree": (e, spell, data) => { + "HandsFree": (_e, spell, data) => { if (!data.IsSpell && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, false, true)) && data.flags.KDDamageHands) { data.flags.KDDamageHands = false; } }, - "ArmsFree": (e, spell, data) => { + "ArmsFree": (_e, spell, data) => { if (!data.IsSpell && KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, false, true)) && data.flags.KDDamageArms) { data.flags.KDDamageArms = false; } }, - "UnconventionalWarfare": (e, spell, data) => { + "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 @@ -4698,7 +4701,7 @@ let KDEventMapSpell = { } } }, - "GuerillaFighting": (e, spell, data) => { + "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) @@ -4716,7 +4719,7 @@ let KDEventMapSpell = { }, "calcDamage2": { - "FloatingWeapon": (e, spell, data) => { + "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) @@ -4730,18 +4733,18 @@ let KDEventMapSpell = { }, }, "getWeapon": { - "HandsFree": (e, spell, data) => { + "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) => { + "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) => { + "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; @@ -4790,7 +4793,7 @@ let KDEventMapSpell = { },*/ }, "calcBindCrit": { - "RogueBind": (e, spell, data) => { + "RogueBind": (e, _spell, data) => { if (!e.prereq || KDCheckPrereq(null, e.prereq, e, data)) { data.critboost += e.power; } @@ -4798,26 +4801,26 @@ let KDEventMapSpell = { }, "calcCrit": { - "BattleCrit": (e, spell, data) => { + "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) => { + "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) => { + "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) => { + "EvasiveManeuvers": (_e, spell, data) => { let cost = KDEvasiveManeuversCost(); if (KinkyDungeonStatStamina >= cost) { if (data.delta > 0) @@ -4834,7 +4837,7 @@ let KDEventMapSpell = { } }, - "CombatTrainingSlowRecovery": (e, spell, data) => { + "CombatTrainingSlowRecovery": (_e, _spell, data) => { if (data.delta > 0) { if (KDGameData.MovePoints < 0) { if (!KinkyDungeonFlags.get("CombatTrainingRecov")) { @@ -4846,7 +4849,7 @@ let KDEventMapSpell = { } } }, - "Frustration": (e, spell, data) => { + "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)) { @@ -4870,12 +4873,12 @@ let KDEventMapSpell = { }, }, "beforePlayerLaunchAttack": { - "BattleCost": (e, spell, data) => { + "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) => { + "BattleRhythmStore": (_e, _spell, data) => { if (data.target && -data.attackCost > 0 && !KinkyDungeonFlags.get("BRStore" + data.target.id)) { let player = KinkyDungeonPlayerEntity; let buff = KDEntityGetBuff(player, "BattleRhythm"); @@ -4913,14 +4916,14 @@ let KDEventMapSpell = { }, }, "playerAttack": { - "FlameBlade": (e, spell, data) => { + "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))) { KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell, false, true)); KinkyDungeonCastSpell(data.targetX, data.targetY, KinkyDungeonFindSpell("FlameStrike", true), undefined, undefined, undefined); KDTriggerSpell(spell, data, false, true); } }, - "ManaRegenSuspend": (e, spell, data) => { + "ManaRegenSuspend": (e, _spell, data) => { if (((!data.bullet || e.bullet) || e.bullet) && !KDHasSpell("ManaRegenPlus")) { let time = e.time; if (KDHasSpell("ManaRegenFast2")) time *= 0.375; @@ -4965,7 +4968,7 @@ let KDEventMapSpell = { }, e.variance, e.aoe); } }, - "FloatingWeapon": (e, spell, data) => { + "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; @@ -4998,7 +5001,7 @@ let KDEventMapSpell = { } } }, - "WillStruggle": (e, spell, data) => { + "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; @@ -5009,7 +5012,7 @@ let KDEventMapSpell = { } } }, - "ProblemSolving": (e, spell, data) => { + "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; @@ -5024,7 +5027,7 @@ let KDEventMapSpell = { }, "vision": { - "TrueSight": (e, spell, data) => { + "TrueSight": (_e, spell, data) => { if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell, false, true)) && data.flags) { if (data.update > 0 || !KinkyDungeonFlags.get("truesight")) { KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell, false, true)); @@ -5037,20 +5040,20 @@ let KDEventMapSpell = { }, }, "calcVision": { - "Multiply": (e, spell, data) => { + "Multiply": (e, _spell, data) => { data.visionMult *= e.mult; }, - "Add": (e, spell, data) => { + "Add": (e, _spell, data) => { data.max += e.power; }, }, "calcHearing": { - "Multiply": (e, spell, data) => { + "Multiply": (e, _spell, data) => { data.hearingMult *= e.mult; }, }, "draw": { - "Offhand": (e, spell, data) => { + "Offhand": (_e, _spell, _data) => { if (KDGameData.Offhand || KDGameData.OffhandOld) { // Draw the offhand weapon /*KDDraw(kdcanvas, kdpixisprites, "kdoffhand", KinkyDungeonRootDirectory + `Items/${KDGameData.Offhand}.png`, @@ -5059,7 +5062,7 @@ let KDEventMapSpell = { 100, 100, undefined, { zIndex: 5, });*/ - if (DrawButtonKDEx("offhandswitch", (b) => { + if (DrawButtonKDEx("offhandswitch", (_b) => { /*let dat = {}; if (KinkyDungeonPlayerDamage) { if (KDCanOffhand(KinkyDungeonPlayerDamage)) { @@ -5104,7 +5107,7 @@ let KDEventMapSpell = { ); }*/ } else { - if (DrawButtonKDEx("offhandreminder", (b) => { + if (DrawButtonKDEx("offhandreminder", (_b) => { return true; }, true, @@ -5121,7 +5124,7 @@ let KDEventMapSpell = { } } }, - "FloatingWeapon": (e, spell, data) => { + "FloatingWeapon": (_e, _spell, _data) => { if (KinkyDungeonPlayerWeapon // && !KinkyDungeonCanUseWeapon(true, undefined, KDWeapon({name: KinkyDungeonPlayerWeapon}) && (!KDWeapon({name: KinkyDungeonPlayerWeapon})?.noHands || KDWeapon({name: KinkyDungeonPlayerWeapon}).telekinetic) && !KDWeapon({name: KinkyDungeonPlayerWeapon})?.unarmed) { @@ -5133,33 +5136,7 @@ let KDEventMapSpell = { }, true); } }, - /*"EnemySense": (e, spell, data) => { - let activate = false; - if (KinkyDungeonHasMana(KinkyDungeonGetManaCost(spell)) && !KinkyDungeonPlayerBuffs.EnemySense) { - KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell) * data.update); - KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: "EnemySense", type: "EnemySense", duration: 13}); - activate = true; - } - if (KinkyDungeonPlayerBuffs.EnemySense && KinkyDungeonPlayerBuffs.EnemySense.duration > 1) - for (let enemy of KDMapData.Entities) { - 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) => { @@ -5180,7 +5157,7 @@ let KDEventMapSpell = { }, }, "toggleSpell": { - "EvasiveManeuvers": (e, spell, data) => { + "EvasiveManeuvers": (_e, spell, data) => { if (data.spell?.name == spell?.name) { let cost = KDEvasiveManeuversCost(); if (KinkyDungeonStatStamina >= cost) { @@ -5191,13 +5168,13 @@ let KDEventMapSpell = { } } }, - "TrueSight": (e, spell, data) => { + "TrueSight": (_e, spell, data) => { if (data.spell?.name == spell?.name) { KinkyDungeonUpdateLightGrid = true; } }, - "BladeDance": (e, b, data) => { + "BladeDance": (e, _b, data) => { // Deals damage to nearby enemies if (!e.prereq || KDCheckPrereq(null, e.prereq, e, data)) { let player = KinkyDungeonPlayerEntity; @@ -5487,11 +5464,7 @@ let KDEventMapSpell = { for (let inv of KinkyDungeonAllRestraintDynamic()) { let item = inv.item; if (!KDGetCurse(item) && item.struggleProgress > 0 && (item.struggleProgress < 0.9 || item.tightness > 0)) { - /** - * @type {KDStruggleData} - */ - // @ts-ignore - let struggleData = {}; + let struggleData: KDStruggleData = {} as KDStruggleData; KinkyDungeonStruggle(KDRestraint(item).Group, "Struggle", KDGetItemLinkIndex(item), true, struggleData); if (struggleData.escapeChance > 0) { @@ -5664,14 +5637,14 @@ let KDEventMapSpell = { } }, - "ToolsOfTheTrade": (e, spell, data) => { + "ToolsOfTheTrade": (_e, spell, data) => { if (data.spell?.name == spell?.name) { KinkyDungeonSpellChoicesToggle[data.index] = false; KDStartDialog("ToolsOfTheTrade"); } }, - "AllyOnMe": (e, spell, data) => { + "AllyOnMe": (_e, spell, data) => { if (data.spell?.name == spell?.name) { KinkyDungeonSpellChoicesToggle[data.index] = false; @@ -5684,7 +5657,7 @@ let KDEventMapSpell = { } } }, - "AllyDisperse": (e, spell, data) => { + "AllyDisperse": (_e, spell, data) => { if (data.spell?.name == spell?.name) { KinkyDungeonSpellChoicesToggle[data.index] = false; @@ -5697,7 +5670,7 @@ let KDEventMapSpell = { } } }, - "AllyDefensive": (e, spell, data) => { + "AllyDefensive": (_e, spell, data) => { if (data.spell?.name == spell?.name) { KinkyDungeonSpellChoicesToggle[data.index] = false; @@ -5710,7 +5683,7 @@ let KDEventMapSpell = { } } }, - "AllyAggressive": (e, spell, data) => { + "AllyAggressive": (_e, spell, data) => { if (data.spell?.name == spell?.name) { KinkyDungeonSpellChoicesToggle[data.index] = false; @@ -5723,7 +5696,7 @@ let KDEventMapSpell = { } } }, - "AllyHold": (e, spell, data) => { + "AllyHold": (_e, spell, data) => { if (data.spell?.name == spell?.name) { KinkyDungeonSpellChoicesToggle[data.index] = false; @@ -5736,7 +5709,7 @@ let KDEventMapSpell = { } } }, - "AllyCancelHold": (e, spell, data) => { + "AllyCancelHold": (_e, spell, data) => { if (data.spell?.name == spell?.name) { KinkyDungeonSpellChoicesToggle[data.index] = false; @@ -5749,7 +5722,7 @@ let KDEventMapSpell = { } } }, - "AllyDeselectAll": (e, spell, data) => { + "AllyDeselectAll": (_e, spell, data) => { if (data.spell?.name == spell?.name) { KinkyDungeonSpellChoicesToggle[data.index] = false; @@ -5762,7 +5735,7 @@ let KDEventMapSpell = { } } }, - "Offhand": (e, spell, data) => { + "Offhand": (_e, spell, data) => { if (data.spell?.name == spell?.name) { KinkyDungeonSpellChoicesToggle[data.index] = false; @@ -5773,7 +5746,7 @@ let KDEventMapSpell = { KinkyDungeonCurrentFilter = Weapon; } }, - "UnconventionalWarfare": (e, spell, data) => { + "UnconventionalWarfare": (_e, spell, data) => { if (data.spell?.name == spell?.name) { KinkyDungeonSpellChoicesToggle[data.index] = false; @@ -5988,7 +5961,7 @@ let KDEventMapSpell = { } }, - "Light": (e, spell, data) => { + "Light": (_e, spell, data) => { if (data.spell?.name == spell?.name) { KinkyDungeonUpdateLightGrid = true; @@ -6009,7 +5982,7 @@ let KDEventMapSpell = { } } }, - "Analyze": (e, spell, data) => { + "Analyze": (_e, spell, data) => { if (data.spell?.name == spell?.name) { if (KinkyDungeonPlayerBuffs.Analyze && KinkyDungeonPlayerBuffs.Analyze.duration > 1) { KinkyDungeonExpireBuff(KinkyDungeonPlayerEntity, "Analyze"); @@ -6035,7 +6008,7 @@ let KDEventMapSpell = { }, }, "enemyStatusEnd": { - "Shatter": (e, spell, data) => { + "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) { KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell, false, true)); KinkyDungeonCastSpell(data.enemy.x, data.enemy.y, KinkyDungeonFindSpell("ShatterStrike", true), undefined, undefined, undefined); @@ -6044,7 +6017,7 @@ let KDEventMapSpell = { } }, "kill": { - "Sowing": (e, spell, data) => { + "Sowing": (_e, _spell, data) => { if (data.enemy && !KDIsHumanoid(data.enemy) && data.enemy.playerdmg > 0) { KDCreateEffectTile(data.enemy.x, data.enemy.y, { name: "Vines", @@ -6052,14 +6025,14 @@ let KDEventMapSpell = { }, 10); } }, - "Shatter": (e, spell, data) => { + "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) { KinkyDungeonChangeMana(-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) => { + "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; @@ -6075,13 +6048,12 @@ let KDEventMapSpell = { }; /** - * - * @param {string} Event - * @param {KinkyDungeonEvent} e - * @param {any} spell - * @param {*} data + * @param Event + * @param e + * @param spell + * @param data */ -function KinkyDungeonHandleMagicEvent(Event, e, spell, 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); @@ -6089,17 +6061,14 @@ function KinkyDungeonHandleMagicEvent(Event, e, spell, data) { } -/** - * @type {Object.>} - */ -let KDEventMapWeapon = { +let KDEventMapWeapon: Record void>> = { "calcEvasion": { - "IsMagic": (e, weapon, data) => { + "IsMagic": (_e, _weapon, data) => { data.flags.isMagic = true; }, }, "draw": { - "Float": (e, weapon, data) => { + "Float": (_e, _weapon, _data) => { if (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, @@ -6125,7 +6094,7 @@ let KDEventMapWeapon = { }, }, "beforePlayerDamage": { - "StormBreakerCharge": (e, weapon, data) => { + "StormBreakerCharge": (e, _weapon, data) => { if (data.dmg > 0 && (!e.damageTrigger || e.damageTrigger == data.type)) { let turns = data.dmg * e.power; if (KinkyDungeonPlayerBuffs.StormCharge) { @@ -6175,7 +6144,7 @@ let KDEventMapWeapon = { }, }, "afterPlayerAttack": { - "ShadowBleed": (e, weapon, data) => { + "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, { @@ -6192,7 +6161,7 @@ let KDEventMapWeapon = { } } }, - "DoubleStrike": (e, weapon, data) => { + "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; @@ -6202,7 +6171,7 @@ let KDEventMapWeapon = { } } }, - "ConvertBindingToDamage": (e, weapon, data) => { + "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); @@ -6220,11 +6189,11 @@ let KDEventMapWeapon = { }, }, "getLights": { - "WeaponLight": (e, weapon, data) => { + "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) => { + "WeaponLightDirectional": (e, _weapon, data) => { let x = KinkyDungeonPlayerEntity.x; let y = KinkyDungeonPlayerEntity.y; let size = e.power - e.dist/2; @@ -6246,7 +6215,7 @@ let KDEventMapWeapon = { }, "tick": { - "AccuracyBuff": (e, weapon, data) => { + "AccuracyBuff": (e, weapon, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: (e.original || "") + weapon.name + e.type + e.trigger, type: "Accuracy", @@ -6254,31 +6223,31 @@ let KDEventMapWeapon = { power: e.power }); }, - "blockBuff": (e, weapon, data) => { + "blockBuff": (e, weapon, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: (e.kind || weapon.name) + "Block", type: "Block", power: e.power, duration: 2,}); }, - "slowLevel": (e, weapon, data) => { + "slowLevel": (e, weapon, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: (e.kind || weapon.name) + "SlowLevel", type: "SlowLevel", power: e.power, duration: 2,}); }, - "spellWardBuff": (e, weapon, data) => { + "spellWardBuff": (e, weapon, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: (e.kind || weapon.name) + "SpellResist", type: "SpellResist", power: e.power, duration: 2,}); }, - "sneakBuff": (e, weapon, data) => { + "sneakBuff": (e, weapon, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: (e.kind || weapon.name) + "Sneak", type: "SlowDetection", power: e.power, duration: 2,}); }, - "evasionBuff": (e, weapon, data) => { + "evasionBuff": (e, weapon, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: (e.kind || weapon.name) + "Evasion", type: "Evasion", power: e.power, duration: 2,}); }, - "critBoost": (e, weapon, data) => { + "critBoost": (e, weapon, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: (e.kind || weapon.name) + "CritBoost", type: "CritBoost", power: e.power, duration: 2,}); }, - "critMult": (e, weapon, data) => { + "critMult": (e, weapon, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: (e.kind || weapon.name) + "CritMult", type: "CritMult", power: e.power, duration: 2,}); }, - "armorBuff": (e, weapon, data) => { + "armorBuff": (e, weapon, _data) => { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, {id: (e.kind || weapon.name) + "Armor", type: "Armor", power: e.power, duration: 2,}); }, - "Charge": (e, weapon, data) => { + "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, { @@ -6295,7 +6264,7 @@ let KDEventMapWeapon = { } } }, - "Patience": (e, weapon, data) => { + "Patience": (e, weapon, _data) => { if (KDGameData.SlowMoveTurns < 1) { let currentCharge = KinkyDungeonPlayerBuffs[weapon.name + "Charge"] ? KinkyDungeonPlayerBuffs[weapon.name + "Charge"].duration : 0; KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { @@ -6388,7 +6357,7 @@ let KDEventMapWeapon = { }); }, - "AoEDamageFrozen": (e, weapon, data) => { + "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) { @@ -6411,7 +6380,7 @@ let KDEventMapWeapon = { if (e.energyCost) KinkyDungeonChangeCharge(- e.energyCost); } }, - "AoEDamageBurning": (e, weapon, data) => { + "AoEDamageBurning": (e, _weapon, _data) => { let trigger = false; for (let enemy of KDMapData.Entities) { if (KDHostile(enemy) @@ -6439,7 +6408,7 @@ let KDEventMapWeapon = { if (e.energyCost) KinkyDungeonChangeCharge(- e.energyCost); } }, - "AoEDamage": (e, weapon, data) => { + "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) { @@ -6464,19 +6433,19 @@ let KDEventMapWeapon = { }, }, "calcCrit": { - "buffMagicCrit": (e, weapon, data) => { + "buffMagicCrit": (e, _weapon, data) => { if (!KinkyDungeonMeleeDamageTypes.includes(data.Damage?.type)) { data.critboost += e.power; } }, - "buffWeaponCrit": (e, weapon, data) => { + "buffWeaponCrit": (e, _weapon, data) => { if (data.Damage?.name == KinkyDungeonPlayerDamage?.name) { data.critboost += e.power; } }, }, "beforePlayerAttack": { - "ApplyBuff": (e, weapon, data) => { + "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 = {}; @@ -6500,7 +6469,7 @@ let KDEventMapWeapon = { } } }, - "DamageMultInShadow": (e, weapon, data) => { + "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)) { @@ -6513,7 +6482,7 @@ let KDEventMapWeapon = { } } }, - "ChangeDamageUnaware": (e, weapon, data) => { + "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) { @@ -6525,7 +6494,7 @@ let KDEventMapWeapon = { } } }, - "ChangeDamageVulnerable": (e, weapon, data) => { + "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) { @@ -6539,7 +6508,7 @@ let KDEventMapWeapon = { }, }, "playerMove": { - "DealDamageToTaped": (e, weapon, data) => { + "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")) { @@ -6558,7 +6527,7 @@ let KDEventMapWeapon = { }, }, "playerAttack": { - "ApplyTaped": (e, weapon, data) => { + "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); @@ -6570,7 +6539,7 @@ let KDEventMapWeapon = { } } }, - "ApplyToy": (e, weapon, data) => { + "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); @@ -6582,7 +6551,7 @@ let KDEventMapWeapon = { } } }, - "ActivateVibration": (e, weapon, data) => { + "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); @@ -6591,7 +6560,7 @@ let KDEventMapWeapon = { }, - "ElementalEffectOnDisarm": (e, weapon, data) => { + "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)) { @@ -6613,7 +6582,7 @@ let KDEventMapWeapon = { } } }, - "ElementalEffectCrit": (e, weapon, data) => { + "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, { @@ -6634,7 +6603,7 @@ let KDEventMapWeapon = { } } }, - "ElementalEffect": (e, weapon, data) => { + "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, { @@ -6655,7 +6624,7 @@ let KDEventMapWeapon = { } } }, - "ElementalEffectStamCost": (e, weapon, data) => { + "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, { @@ -6677,7 +6646,7 @@ let KDEventMapWeapon = { } } }, - "MagicRope": (e, weapon, data) => { + "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)) { @@ -6702,7 +6671,7 @@ let KDEventMapWeapon = { } } }, - "StormBreakerDamage": (e, weapon, data) => { + "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) { @@ -6730,7 +6699,7 @@ let KDEventMapWeapon = { if (e.sfx) KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/" + e.sfx + ".ogg"); } }, - "ApplyBuff": (e, weapon, data) => { + "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 = {}; @@ -6738,7 +6707,7 @@ let KDEventMapWeapon = { } } }, - "Cleave": (e, weapon, data) => { + "Cleave": (e, _weapon, data) => { if (data.enemy && !data.disarm) { let nearby = KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5); for (let enemy of nearby) { @@ -6761,7 +6730,7 @@ let KDEventMapWeapon = { } } }, - "MagicFlail": (e, weapon, data) => { + "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) { @@ -6782,7 +6751,7 @@ let KDEventMapWeapon = { } } }, - "CastSpell": (e, weapon, data) => { + "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, { @@ -6792,7 +6761,7 @@ let KDEventMapWeapon = { if (e.energyCost) KinkyDungeonChangeCharge(- e.energyCost); } }, - "Pierce": (e, weapon, data) => { + "Pierce": (e, _weapon, data) => { if (data.enemy && !data.disarm) { let dist = e.dist ? e.dist : 1; // Does not apply to ranged attacks @@ -6813,7 +6782,7 @@ let KDEventMapWeapon = { } } }, - "DamageToTag": (e, weapon, data) => { + "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, { @@ -6827,7 +6796,7 @@ let KDEventMapWeapon = { } } }, - "DamageToSummons": (e, weapon, data) => { + "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, { @@ -6841,7 +6810,7 @@ let KDEventMapWeapon = { } } }, - "ElementalOnVulnerable": (e, weapon, data) => { + "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) { @@ -6857,7 +6826,7 @@ let KDEventMapWeapon = { } } }, - "ElementalOnUnaware": (e, weapon, data) => { + "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) { @@ -6873,7 +6842,7 @@ let KDEventMapWeapon = { } } }, - "ElementalDreamcatcher": (e, weapon, data) => { + "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) { @@ -6898,7 +6867,7 @@ let KDEventMapWeapon = { } } }, - "ElementalUnaware": (e, weapon, data) => { + "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) { @@ -6914,7 +6883,7 @@ let KDEventMapWeapon = { } } }, - "ElementalVulnerable": (e, weapon, data) => { + "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) { @@ -6930,7 +6899,7 @@ let KDEventMapWeapon = { } } }, - "Dreamcatcher": (e, weapon, data) => { + "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) { @@ -6956,7 +6925,7 @@ let KDEventMapWeapon = { } } }, - "Knockback": (e, weapon, data) => { + "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)); @@ -6970,7 +6939,7 @@ let KDEventMapWeapon = { }, }, "beforeDamageEnemy": { - "MultiplyTime": (e, weapon, data) => { + "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); @@ -6978,7 +6947,7 @@ let KDEventMapWeapon = { } } }, - "MultiplyDamageFrozen": (e, weapon, data) => { + "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); @@ -6986,7 +6955,7 @@ let KDEventMapWeapon = { } } }, - "EchoDamage": (e, weapon, data) => { + "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; @@ -7009,11 +6978,11 @@ let KDEventMapWeapon = { }, }, "capture": { - "Dollmaker": (e, weapon, data) => { + "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 = { + let doll: entity = { summoned: true, rage: Enemy.summonRage ? 9999 : undefined, Enemy: Enemy, @@ -7044,13 +7013,12 @@ let KDEventMapWeapon = { }; /** - * - * @param {string} Event - * @param {KinkyDungeonEvent} e - * @param {weapon} weapon - * @param {*} data + * @param Event + * @param e + * @param weapon + * @param data */ -function KinkyDungeonHandleWeaponEvent(Event, e, weapon, 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); @@ -7058,18 +7026,9 @@ function KinkyDungeonHandleWeaponEvent(Event, e, weapon, data) { } -/** - * @type {Object.>} - */ -let KDEventMapBullet = { +let KDEventMapBullet: Record void>> = { "countRune": { - /** - * - * @param {KinkyDungeonEvent} e - * @param {*} b - * @param {KDRuneCountData} data - */ - "rune": (e, b, data) => { + "rune": (_e, b, data: KDRuneCountData) => { if (!b.source || !KinkyDungeonFindID(b.source)) { data.runes += 1; data.runeList.push(b); @@ -7077,7 +7036,7 @@ let KDEventMapBullet = { } }, "beforeBulletHit": { - "DropKnife": (e, b, data) => { + "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) { @@ -7178,7 +7137,7 @@ let KDEventMapBullet = { } } }, - "KineticLance": (e, b, data) => { + "KineticLance": (_e, b, _data) => { if (!KinkyDungeonPlayerWeapon) return; let point = {x: b.x, y: b.y}; if (!KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(point.x, point.y))) { @@ -7326,7 +7285,7 @@ let KDEventMapBullet = { KinkyDungeonAttackEnemy(data.enemy, dd.attackData, Math.max(1, KinkyDungeonGetEvasion(undefined, false, true, false)), b); } }, - "ShadowSlash": (e, b, data) => { + "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; @@ -7358,7 +7317,7 @@ let KDEventMapBullet = { } } }, - "GreaterRage": (e, b, data) => { + "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; @@ -7545,7 +7504,7 @@ let KDEventMapBullet = { } }, - "EnchantRope": (e, b, data) => { + "EnchantRope": (_e, b, data) => { if (b && data.enemy) { if (data.enemy.specialBoundLevel?.Rope) { KDTieUpEnemy(data.enemy, data.enemy.specialBoundLevel.Rope, "MagicRope", "arcane", true); @@ -7608,19 +7567,19 @@ let KDEventMapBullet = { }, "bulletTick": { - "EndChance": (e, b, data) => { + "EndChance": (e, b, _data) => { if (b.time < e.count) if (KDRandom() < e.chance) { b.time = 0; } }, - "CreateSmoke": (e, b, data) => { + "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) => { + "MagicMissileChannel": (_e, b, _data) => { if (b.bullet?.source) { let enemy = KinkyDungeonFindID(b.bullet.source); if (enemy) { @@ -7642,7 +7601,7 @@ let KDEventMapBullet = { KinkyDungeonUpdateSingleBulletVisual(b, true, 0); KinkyDungeonSendEvent("bulletDestroy", {bullet: b, target: undefined, outOfRange:false, outOfTime: false}); }, - "FlashPortal": (e, b, data) => { + "FlashPortal": (e, _b, _data) => { let player = KinkyDungeonPlayerEntity; if (player) { let enemies = KDNearbyEnemies(player.x, player.y, e.dist); @@ -7661,7 +7620,7 @@ let KDEventMapBullet = { } } }, - "TransportationPortal": (e, b, data) => { + "TransportationPortal": (e, _b, _data) => { let player = KinkyDungeonPlayerEntity; if (player) { let enemies = KDNearbyEnemies(player.x, player.y, e.dist); @@ -7680,7 +7639,7 @@ let KDEventMapBullet = { } } }, - "BanishPortal": (e, b, data) => { + "BanishPortal": (e, _b, _data) => { let player = KinkyDungeonPlayerEntity; if (player) { let enemies = KDNearbyEnemies(player.x, player.y, e.dist); @@ -7699,7 +7658,7 @@ let KDEventMapBullet = { } } }, - "ZoneOfPurity": (e, b, data) => { + "ZoneOfPurity": (e, b, _data) => { let enemies = KDNearbyEnemies(b.x, b.y, e.aoe); if (enemies.length > 0) { for (let en of enemies) { @@ -7716,7 +7675,7 @@ let KDEventMapBullet = { } } }, - "ZoneOfExcitement": (e, b, data) => { + "ZoneOfExcitement": (e, b, _data) => { let enemies = KDNearbyEnemies(b.x, b.y, e.aoe); if (enemies.length > 0) { for (let en of enemies) { @@ -7750,7 +7709,7 @@ let KDEventMapBullet = { }, }, "afterBulletHit": { - "ShadowShroudTele": (e, b, data) => { + "ShadowShroudTele": (e, b, _data) => { let enemy = b.bullet?.source > 0 ? KinkyDungeonFindID(b.bullet.source) : null; if (!enemy) return; if (enemy.attackPoints > 0) return; @@ -7800,14 +7759,24 @@ let KDEventMapBullet = { } if (nearest) { - KDMoveEntity(enemy, nearest.x, nearest.y, true); + 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); + } KinkyDungeonSendTextMessage(5, TextGet("KDDragonTeleport"), "#814fb8", 1); KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Teleport.ogg", enemy); } }, - "DarkTele": (e, b, data) => { + "DarkTele": (e, b, _data) => { let enemy = b.bullet?.source > 0 ? KinkyDungeonFindID(b.bullet.source) : null; if (!enemy) return; if (enemy.attackPoints > 0) return; @@ -7849,26 +7818,36 @@ let KDEventMapBullet = { && KinkyDungeonBrightnessGet(point.x, point.y) <= KDShadowThreshold*2 && KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(point.x, point.y)) && !KinkyDungeonEntityAt(point.x, point.y)) { - KDMoveEntity(enemy, point.x, point.y, true); - //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); + 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); + //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) => { + "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) { @@ -7894,7 +7873,7 @@ let KDEventMapBullet = { } }, - "CrystalShockBolt": (e, b, data) => { + "CrystalShockBolt": (e, b, _data) => { // Create the shockwave let rad = e.dist; let conductionPoints = {}; @@ -7950,7 +7929,7 @@ let KDEventMapBullet = { } } }, - "Phase": (e, b, data) => { + "Phase": (_e, _b, _data) => { let player = KinkyDungeonPlayerEntity; if (player) { KinkyDungeonApplyBuffToEntity(player, { @@ -7962,23 +7941,10 @@ let KDEventMapBullet = { }); } }, - "Crack": (e, b, data) => { - data.origTile = KinkyDungeonMapGet(b.x, b.y); - KinkyDungeonSendEvent("beforeCrackTile", data); - if (data.allowCrack || KDCrackableTiles.includes(data.origTile)) { - - let Mend = KDMendableTiles.includes(data.origTile); - KinkyDungeonMapSet(b.x, b.y, '0'); - KDCreateEffectTile(b.x, b.y, { - name: Mend ? "Rubble" : "RubbleNoMend", - duration: 9999, - }, 0); - KinkyDungeonUpdateLightGrid = true; - - KinkyDungeonSendEvent("crackTile", data); - } + "Crack": (_e, b, data) => { + KDCrackTile(b.x, b.y, data.allowCrack, data); }, - "BladeDance": (e, b, data) => { + "BladeDance": (e, _b, data) => { // Deals damage to nearby enemies if (!e.prereq || KDCheckPrereq(null, e.prereq, e, data)) { let player = KinkyDungeonPlayerEntity; @@ -8024,7 +7990,7 @@ let KDEventMapBullet = { } } }, - "FlashPortal": (e, b, data) => { + "FlashPortal": (_e, _b, _data) => { let player = KinkyDungeonPlayerEntity; if (player) { let enemies = KDMapData.Entities.filter((en) => { @@ -8035,13 +8001,24 @@ let KDEventMapBullet = { let en = enemies[Math.floor(KDRandom() * enemies.length)]; let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true, undefined, false, true); if (point) { - KDMoveEntity(en, point.x, point.y, false, false, true); + 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); + } } enemies.splice(enemies.indexOf(en), 1); } } }, - "TransportationPortal": (e, b, data) => { + "TransportationPortal": (_e, _b, _data) => { let player = KinkyDungeonPlayerEntity; if (player) { let enemies = KDMapData.Entities.filter((en) => { @@ -8052,15 +8029,25 @@ let KDEventMapBullet = { let en = enemies[Math.floor(KDRandom() * enemies.length)]; let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true, undefined, false, true); if (point) { - 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); + 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); + } } enemies.splice(enemies.indexOf(en), 1); } } }, - "BanishPortal": (e, b, data) => { + "BanishPortal": (_e, b, _data) => { let player = b; if (player) { let enemies = KDMapData.Entities.filter((en) => { @@ -8071,9 +8058,19 @@ let KDEventMapBullet = { let en = enemies[Math.floor(KDRandom() * enemies.length)]; let point = KinkyDungeonGetNearbyPoint(player.x, player.y, true, undefined, false, true); if (point) { - 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); + 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); + } } enemies.splice(enemies.indexOf(en), 1); } @@ -8152,13 +8149,12 @@ let KDEventMapBullet = { }; /** - * - * @param {string} Event - * @param {KinkyDungeonEvent} e - * @param {any} b - * @param {*} data + * @param Event + * @param e + * @param b + * @param data */ -function KinkyDungeonHandleBulletEvent(Event, e, b, 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); @@ -8168,12 +8164,9 @@ function KinkyDungeonHandleBulletEvent(Event, e, b, data) { -/** - * @type {Object.>} - */ -let KDEventMapEnemy = { +let KDEventMapEnemy: Record void>> = { "orgasm": { - "HolyOrbPunish": (e, enemy, data) => { + "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, ""); @@ -8201,20 +8194,20 @@ let KDEventMapEnemy = { 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) => { + "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) => { + "delete": (e, enemy, _data) => { if (!e.chance || KDRandom() < e.chance) enemy.hp = 0; } }, "defeat": { - "delete": (e, enemy, data) => { + "delete": (e, enemy, _data) => { if (!e.chance || KDRandom() < e.chance) enemy.hp = 0; } @@ -8239,11 +8232,11 @@ let KDEventMapEnemy = { }, "tick": { - "FuukaManagement": (e, enemy, data) => { + "FuukaManagement": (e, enemy, _data) => { if (enemy.hostile && !KDEnemyHasFlag(enemy, "fuukaPillars")) { KinkyDungeonSetEnemyFlag(enemy, "fuukaPillars", -1); for (let i = 0; i < e.count; i++) { - let point = KinkyDungeonGetRandomEnemyPointCriteria((x, y) => { + let point = KinkyDungeonGetRandomEnemyPointCriteria((x: number, y: number) => { return KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(x, y)); }, true, false, undefined, undefined, 6, false); if (point) { @@ -8252,7 +8245,7 @@ let KDEventMapEnemy = { } } }, - "WardenManagement": (e, enemy, data) => { + "WardenManagement": (e, enemy, _data) => { if (enemy.hostile) { KDMakeHostile(enemy, KDMaxAlertTimerAggro); @@ -8312,7 +8305,7 @@ let KDEventMapEnemy = { } } }, - "EpicenterAssignHP": (e, enemy, data) => { + "EpicenterAssignHP": (_e, enemy, _data) => { if (!KDEnemyHasFlag(enemy, "assignedHP")) { let factor = 0.1 + 0.1*Math.round(19*(KDGameData.EpicenterLevel || 1)**0.75) / (KinkyDungeonMaxLevel - 1); @@ -8333,7 +8326,7 @@ let KDEventMapEnemy = { enemy.hp -= data.delta * e.power; } }, - "AdventurerAssignFaction": (e, enemy, data) => { + "AdventurerAssignFaction": (e, enemy, _data) => { if (!enemy.faction) { let nearbyEnemies = KDNearbyEnemies(enemy.x, enemy.y, e.dist); for (let en of nearbyEnemies) { @@ -8345,7 +8338,7 @@ let KDEventMapEnemy = { if (!enemy.faction) enemy.faction = "Adventurer"; } }, - "BossAssignFaction": (e, enemy, data) => { + "BossAssignFaction": (e, enemy, _data) => { if (!enemy.faction && !KinkyDungeonIsDisabled(enemy) && KDBoundEffects(enemy) < 4) { if (enemy.hostile || KDMapData.Entities.some((en) => {return en.Enemy.tags?.stageBoss && en.hostile;})) enemy.faction = e.kind; } @@ -8364,7 +8357,7 @@ let KDEventMapEnemy = { } }, - "LeashWolfgirls": (e, enemy, data) => { + "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; @@ -8392,19 +8385,19 @@ let KDEventMapEnemy = { KinkyDungeonSetEnemyFlag(enemy, "tooManyLeash"); } }, - "DisplayAura": (e, enemy, data) => { + "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) => { + "suicideWhenBound": (_e, enemy, _data) => { if (KDHelpless(enemy)) { enemy.hp = 0; } }, - "secretToy": (e, enemy, data) => { + "secretToy": (_e, enemy, _data) => { if (enemy.hp > 0) { KinkyDungeonApplyBuffToEntity(enemy, KDToySecret); } @@ -8419,10 +8412,10 @@ let KDEventMapEnemy = { }, }, "beforeDamage": { - "shadowEngulf": (e, enemy, data) => { + "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) => { + KDTripleBuffKill("ShadowEngulf", KinkyDungeonPlayerEntity, 9, (_tt) => { if (KDGameData.RoomType != "DemonTransition") { AIData.defeat = true; KDCustomDefeat = "DemonTransition"; @@ -8430,7 +8423,7 @@ let KDEventMapEnemy = { } else KinkyDungeonPassOut(); }, "Blindness", - (target) => { + (_target) => { // Create a portal let point = KinkyDungeonGetNearbyPoint(enemy.x, enemy.y, true); if (point) { @@ -8443,11 +8436,11 @@ let KDEventMapEnemy = { } } }, - "shadowDomme": (e, enemy, data) => { + "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, 9, (tt) => { + KDTripleBuffKill("ShadowEngulf", player, 15, (_tt) => { // Passes out the player, but does NOT teleport KinkyDungeonPassOut(true); KDBreakTether(player); @@ -8520,17 +8513,17 @@ let KDEventMapEnemy = { }, }, "spellCast": { - "ropeKrakenSummonTentacle": (e, enemy, data) => { + "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) => { + "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) => { + "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)); } @@ -8551,7 +8544,7 @@ let KDEventMapEnemy = { } } }, - "FreeWardenPrisoners": (e, enemy, data) => { + "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") { @@ -8871,7 +8864,7 @@ let KDEventMapEnemy = { } }, - "shadowDebuff": (e, enemy, data) => { + "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); @@ -8883,7 +8876,7 @@ let KDEventMapEnemy = { } } }, - "shadowDommeRefresh": (e, enemy, data) => { + "shadowDommeRefresh": (_e, enemy, _data) => { if (KinkyDungeonFlags.get("ShadowDommed")) { KinkyDungeonSetEnemyFlag(enemy, "wander", 0); } @@ -9186,13 +9179,12 @@ let KDEventMapEnemy = { }; /** - * - * @param {string} Event - * @param {KinkyDungeonEvent} e - * @param {entity} enemy - * @param {*} data + * @param Event + * @param e + * @param enemy + * @param data */ -function KinkyDungeonHandleEnemyEvent(Event, e, enemy, 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); @@ -9201,12 +9193,9 @@ function KinkyDungeonHandleEnemyEvent(Event, e, enemy, data) { -/** - * @type {Object.>} - */ -let KDEventMapGeneric = { +let KDEventMapGeneric: Record void>> = { "perkOrb": { - "Cursed": (e, data) => { + "Cursed": (_e, data) => { if (data?.perks?.includes("Cursed")) { for (let rep of Object.keys(KinkyDungeonShrineBaseCosts)) { KinkyDungeonChangeRep(rep, 0); @@ -9216,24 +9205,121 @@ let KDEventMapGeneric = { }, "stun": { /** Unstoppable, unflinching, relentless */ - "unstp": (e, data) => { + "unstp": (_e, data) => { KDStunResist(data); }, }, "freeze": { /** Unstoppable, unflinching, relentless */ - "unstp": (e, data) => { + "unstp": (_e, data) => { KDStunResist(data); }, }, "bind": { /** Unstoppable, unflinching, relentless */ - "unstp": (e, data) => { + "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) { + KinkyDungeonChangeMana(-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, data) => { + "ReplacePerks": (_e, data) => { if (KinkyDungeonPlayerDamage.unarmed && KDIsHumanoid(data.target)) { if (!KinkyDungeonIsArmsBound()) { if (KinkyDungeonStatsChoice.get("UnarmedGrope")) {data.attackData.type = "grope"; data.attackData.sfx = "Damage";} @@ -9250,7 +9336,7 @@ let KDEventMapGeneric = { }, }, "calcEnemyTags": { - "perkTags": (e, data) => { + "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"); @@ -9261,34 +9347,34 @@ let KDEventMapGeneric = { } }, "postMapgen": { - "resetDollRoom": (e, data) => { + "resetDollRoom": (_e, _data) => { //if (!KDGameData.RoomType || !(alts[KDGameData.RoomType].data?.dollroom)) { //KDGameData.DollRoomCount = 0; //} } }, "orgasm": { - "tickNeeds": (e, data) => { + "tickNeeds": (_e, data) => { KDNeedsOrgasm(data); } }, "playSelf": { - "tickNeeds": (e, data) => { + "tickNeeds": (_e, data) => { KDNeedsPlaySelf(data); } }, "edge": { - "tickNeeds": (e, data) => { + "tickNeeds": (_e, data) => { KDNeedsEdge(data); } }, "deny": { - "tickNeeds": (e, data) => { + "tickNeeds": (_e, data) => { KDNeedsDeny(data); } }, "defeat": { - "dollRoomRemove": (e, enemy, data) => { + "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) { @@ -9302,12 +9388,12 @@ let KDEventMapGeneric = { } }, "beforeStairCancelFilter": { - "PerkRoom": (e, data) => { + "PerkRoom": (_e, data) => { if (!data.cancelfilter && data.altRoom?.requireJourneyTarget) data.cancelfilter = "JourneyChoice"; }, }, "beforeHandleStairs": { - "resetDollRoom": (e, data) => { + "resetDollRoom": (_e, data) => { if (KDGameData.RoomType && KinkyDungeonAltFloor(KDGameData.RoomType).data?.dollroom) { KDGameData.DollRoomCount += 1; if (KDGameData.DollRoomCount >= 3) { @@ -9333,7 +9419,7 @@ let KDEventMapGeneric = { } }, - "NoRepeatTunnels": (e, data) => { + "NoRepeatTunnels": (_e, data) => { // The player can never backtrack to a tunnel if (data.toTile == 'S' && data.tile?.RoomType == "PerkRoom") { data.overrideRoomType = true; @@ -9345,20 +9431,20 @@ let KDEventMapGeneric = { } } }, - "endfloorfix": (e, data) => { + "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) => { + "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"; } }, - "SkipOldPerkRooms": (e, data) => { + "SkipOldPerkRooms": (_e, data) => { // The player can never backtrack to old perk rooms if (data.toTile != 'S' && !data.tile?.RoomType && MiniGameKinkyDungeonLevel < KDGameData.HighestLevelCurrent) { data.overrideRoomType = true; @@ -9368,7 +9454,7 @@ let KDEventMapGeneric = { }, }, "drawSGTooltip": { - "goddessBonus": (e, data) => { + "goddessBonus": (_e, data) => { if (data.item && KDRestraint(data.item)?.shrine) { let bonus = KDGetItemGoddessBonus(data.item); @@ -9380,14 +9466,14 @@ let KDEventMapGeneric = { }, }, "playerMove": { - "Conveyor": (e, data) => { + "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) => { + "noisyTerrain": (_e, data) => { if (data.sprint && !data.cancelmove) { let moves = [ {x: data.moveX, y: data.moveY, str: data.moveX + "," + data.moveY}, @@ -9409,7 +9495,7 @@ let KDEventMapGeneric = { * 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) => { + "resetVars": (_e, _data) => { KDEventData.SlimeLevel = 0; }, }, @@ -9418,7 +9504,7 @@ let KDEventMapGeneric = { * 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) => { + "resetVars": (_e, data) => { KDEventData.ActivationsThisTurn = 0; KDEventData.CurseHintTick = false; if (KDEventData.SlimeLevel < 0) @@ -9433,7 +9519,7 @@ let KDEventMapGeneric = { }, }, "draw": { - "HighProfile": (e, data) => { + "HighProfile": (_e, data) => { if (!KinkyDungeonStatsChoice.get("HighProfile")) return; let altType = KDGetAltType(MiniGameKinkyDungeonLevel); if (altType && altType.spawns === false) return; @@ -9452,7 +9538,7 @@ let KDEventMapGeneric = { } }, - "QuestMarker": (e, data) => { + "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", @@ -9465,7 +9551,7 @@ let KDEventMapGeneric = { } } }, - "EscapeKillMarker": (e, data) => { + "EscapeKillMarker": (_e, data) => { let escapeMethod = KDGetEscapeMethod(MiniGameKinkyDungeonLevel); if (escapeMethod != "Kill" && escapeMethod != "Miniboss") return; for (let enemy of KDMapData.Entities) { @@ -9483,7 +9569,7 @@ let KDEventMapGeneric = { }, "drawminimap": { - "QuestMarker": (e, data) => { + "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 @@ -9505,7 +9591,7 @@ let KDEventMapGeneric = { } }, - "EscapeKillMarker": (e, data) => { + "EscapeKillMarker": (_e, data) => { let escapeMethod = KDGetEscapeMethod(MiniGameKinkyDungeonLevel); if (escapeMethod != "Kill" && escapeMethod != "Miniboss") return; for (let enemy of KDMapData.Entities) { @@ -9530,11 +9616,11 @@ let KDEventMapGeneric = { * 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) => { + "resetFlags": (_e, _data) => { KinkyDungeonSetFlag("slept", 0); }, /** Updates gold locks */ - "lockStart": (e, data) => { + "lockStart": (_e, _data) => { for (let tuple of KinkyDungeonAllRestraintDynamic()) { let inv = tuple.item; if (inv.lock && KDLocks[inv.lock] && KDLocks[inv.lock].levelStart) { @@ -9545,7 +9631,7 @@ let KDEventMapGeneric = { /** High Profile perk */ - "HighProfile": (e, data) => { + "HighProfile": (_e, _data) => { if (!KinkyDungeonStatsChoice.get("HighProfile")) return; let altType = KDGetAltType(MiniGameKinkyDungeonLevel); if (altType && altType.spawns === false) return; @@ -9581,7 +9667,7 @@ let KDEventMapGeneric = { } }, /** For new game plus, we make the game harder by replacing basic enemies with harder ones */ - "NGPlusReplace": (ev, data) => { + "NGPlusReplace": (_ev, _data) => { if (!KinkyDungeonNewGame) return; let chance = 1 - (0.8**KinkyDungeonNewGame); let bosschance = 1 - (0.9**KinkyDungeonNewGame); @@ -9636,7 +9722,7 @@ let KDEventMapGeneric = { } }, - "HardModeReplace": (ev, data) => { + "HardModeReplace": (_ev, _data) => { if (!KinkyDungeonStatsChoice.get("hardMode")) return; let multiplier = 0.05 + 0.95 * Math.min(1.5, KDGetEffLevel()/(KinkyDungeonMaxLevel - 1)); @@ -9710,14 +9796,14 @@ let KDEventMapGeneric = { }, }, "hit": { - "StunBondage": (e, data) => { + "StunBondage": (_e, data) => { if (data.player == KinkyDungeonPlayerEntity && data.restraintsAdded?.length > 0 && KinkyDungeonStatsChoice.has("StunBondage")) { KDStunTurns(data.restraintsAdded.length, false); } }, }, "boundBySpell": { - "StunBondage": (e, data) => { + "StunBondage": (_e, data) => { if (data.player == KinkyDungeonPlayerEntity && data.restraintsAdded?.length > 0 && KinkyDungeonStatsChoice.has("StunBondage")) { KDStunTurns(data.restraintsAdded.length, false); } @@ -9727,12 +9813,12 @@ let KDEventMapGeneric = { /** * Updates NPC escape */ - "updateNPCEscape": (e, data) => { + "updateNPCEscape": (_e, _data) => { KDCollectionNPCEscapeTicks(12 + Math.floor(KDRandom() * 24)); }, }, "tickFlags": { - "TempFlagFloorTicks": (e, data) => { + "TempFlagFloorTicks": (_e, data) => { if (KDGameData.TempFlagFloorTicks) for (let f of Object.entries(KDGameData.TempFlagFloorTicks)) { if (!KinkyDungeonFlags.get(f[0])) delete KDGameData.TempFlagFloorTicks[f[0]]; @@ -9748,19 +9834,19 @@ let KDEventMapGeneric = { /** * Updates failities */ - "updateFac": (e, data) => { + "updateFac": (_e, _data) => { KDUpdateFacilities(1); }, /** * Updates NPC escape */ - "updateNPCEscape": (e, data) => { + "updateNPCEscape": (_e, _data) => { KDCollectionNPCEscapeTicks(24 + Math.floor(KDRandom() * 36)); }, /** * Resets the flags for playing with an NPC */ - "updateNPCOpinionFlags": (e, data) => { + "updateNPCOpinionFlags": (_e, _data) => { let setIDs = {}; for (let value of Object.values(KDGameData.Collection)) { @@ -9780,7 +9866,7 @@ let KDEventMapGeneric = { } }, /** Reduce tightness by 1 per floor */ - "reduceTightness": (e, data) => { + "reduceTightness": (_e, data) => { if (MiniGameKinkyDungeonLevel > 0 && data?.altType?.tickFlags) for (let tuple of KinkyDungeonAllRestraintDynamic()) { let inv = tuple.item; @@ -9801,12 +9887,12 @@ let KDEventMapGeneric = { }, },*/ "playerAttack": { - "trainHeels": (e, data) => { + "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) => { + "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, { @@ -9818,7 +9904,7 @@ let KDEventMapGeneric = { }, }, "calcMultMana": { - "ImmovableObject": (e, data) => { + "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; @@ -9826,7 +9912,7 @@ let KDEventMapGeneric = { }, }, "canSprint": { - "NovicePet": (e, data) => { + "NovicePet": (_e, data) => { if (KinkyDungeonStatsChoice.has("NovicePet")) { if (KinkyDungeonPlayerTags.get("Petsuits")) { data.mustStand = false; @@ -9837,7 +9923,7 @@ let KDEventMapGeneric = { } }, "tick": { - "trainHeels": (e, data) => { + "trainHeels": (_e, _data) => { if (KinkyDungeonLastAction == "Move" && !(KDGameData.KneelTurns > 0)) { let danger = KinkyDungeonInDanger(); let amt = 0.01; @@ -9850,10 +9936,9 @@ let KDEventMapGeneric = { KDGameData.HeelPower <= 0 && !danger, amt, mult); } }, - "runes": (e, data) => { + "runes": (_e, data) => { if (data.delta > 0) { - /** @type {KDRuneCountData} */ - let dd = { + let dd: KDRuneCountData = { explodeChance: 0.15, maxRunes: 10, runes: 0, @@ -9867,7 +9952,7 @@ let KDEventMapGeneric = { } } }, - "HighProfile": (e, data) => { + "HighProfile": (_e, _data) => { if (!KinkyDungeonStatsChoice.get("HighProfile")) return; let altType = KDGetAltType(MiniGameKinkyDungeonLevel); if (altType && altType.spawns === false) return; @@ -9883,7 +9968,7 @@ let KDEventMapGeneric = { } } }, - "DollRoomUpdate": (e, data) => { + "DollRoomUpdate": (_e, _data) => { if (KDGameData.RoomType && KinkyDungeonAltFloor(KDGameData.RoomType).data?.dollroom) { // Spawn shopkeeper @@ -9915,7 +10000,7 @@ let KDEventMapGeneric = { } } }, - "DollStorageUpdate": (e, data) => { + "DollStorageUpdate": (_e, _data) => { if (KDGameData.RoomType && KinkyDungeonAltFloor(KDGameData.RoomType).data?.dollstorage) { // Spawn shopkeeper @@ -9925,7 +10010,7 @@ let KDEventMapGeneric = { } }, - "SecondWind": (e, data) => { + "SecondWind": (_e, _data) => { if (KinkyDungeonStatsChoice.has("SecondWind")) { let amount = 0.1; @@ -9951,7 +10036,7 @@ let KDEventMapGeneric = { } } }, - "NovicePet": (e, data) => { + "NovicePet": (_e, _data) => { if (KinkyDungeonStatsChoice.has("NovicePet")) { let amount = 0; @@ -10041,7 +10126,7 @@ let KDEventMapGeneric = { } } }, - "BurningDesire": (e, data) => { + "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()); @@ -10059,7 +10144,7 @@ let KDEventMapGeneric = { } }, - "Needs": (e, data) => { + "Needs": (_e, data) => { if (KinkyDungeonStatsChoice.get("Needs")) { if (data.delta > 0 && !(KDGameData.OrgasmStamina > 0)) { if (KinkyDungeonStatDistractionLower < KinkyDungeonStatDistractionLowerCap * KinkyDungeonStatDistractionMax) { @@ -10068,7 +10153,7 @@ let KDEventMapGeneric = { } } }, - "LikeTheWind": (e, data) => { + "LikeTheWind": (_e, _data) => { if (KinkyDungeonStatStamina >= KinkyDungeonStatStaminaMax * 0.95 && KinkyDungeonStatsChoice.has("LikeTheWind")) { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "LikeTheWind", @@ -10085,7 +10170,7 @@ let KDEventMapGeneric = { } }, - "ImmovableObject": (e, data) => { + "ImmovableObject": (_e, _data) => { if (KinkyDungeonStatWill >= KinkyDungeonStatWillMax * 0.90 && KinkyDungeonStatsChoice.has("ImmovableObject")) { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "ImmovableObject", @@ -10096,7 +10181,7 @@ let KDEventMapGeneric = { } }, - "LeastResistance": (e, data) => { + "LeastResistance": (_e, _data) => { if (KinkyDungeonStatWill < KinkyDungeonStatWillMax * 0.01 && KinkyDungeonStatsChoice.has("LeastResistance")) { KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, { id: "LeastResistance", @@ -10107,7 +10192,7 @@ let KDEventMapGeneric = { } }, - "FrigidPersonality": (e, data) => { + "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()); @@ -10134,19 +10219,19 @@ let KDEventMapGeneric = { }, }, "playerCast": { - "ArousingMagic": (e, data) => { + "ArousingMagic": (_e, data) => { if (KinkyDungeonStatsChoice.get("ArousingMagic")) { KinkyDungeonChangeDistraction(KinkyDungeonGetManaCost(data.spell), false, 0.1); } }, - "Clearheaded": (e, data) => { + "Clearheaded": (_e, data) => { if (KinkyDungeonStatsChoice.get("Clearheaded")) { KinkyDungeonChangeDistraction(-KinkyDungeonGetManaCost(data.spell), false, 0.1); } }, }, "beforeDamage": { - "LeastResistance": (e, data) => { + "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) { @@ -10159,7 +10244,7 @@ let KDEventMapGeneric = { }, }, "perksStruggleCalc": { - "CursedLocks": (e, data) => { + "CursedLocks": (_e, data) => { if (KinkyDungeonStatsChoice.get("CursedLocks") && data.struggleType == "Cut" && data.restraint.lock) { data.escapeChance = -100; if (data.Msg) { @@ -10169,14 +10254,14 @@ let KDEventMapGeneric = { }, }, "beforeChest": { - "shadowChest": (e, data) => { + "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) => { + "lessergoldChest": (_e, data) => { if ((data.chestType == "lessergold") && KDCanCurse(["ChestCollar"])) { // Shadow chests spawn cursed epicenter KDSummonCurseTrap(data.x, data.y); @@ -10184,34 +10269,34 @@ let KDEventMapGeneric = { }, }, "kill": { - "HighProfile": (e, data) => { + "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) => { + "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) => { + "demontransition": (_e, data) => { if (data.altType?.name == "DemonTransition") data.specialChests.lessershadow = 10; }, - "bluechest": (e, data) => { + "bluechest": (_e, data) => { if (!data.altType) data.specialChests.blue = (data.specialChests.blue || 0) + 1; }, }, "genSpecialChest": { - "blue": (e, data) => { + "blue": (_e, data) => { if (data.type == "blue") { data.lock = "Blue"; data.guaranteedTrap = true; } }, - "shadow": (e, data) => { + "shadow": (_e, data) => { if (data.type == "shadow" || data.type == "lessershadow") { data.lock = undefined; data.guaranteedTrap = true; @@ -10219,7 +10304,7 @@ let KDEventMapGeneric = { }, }, "addEntity": { - "EnemyResist": (e, data) => { + "EnemyResist": (_e, data) => { if (KinkyDungeonStatsChoice.get("EnemyResist") && KDGetFaction(data.enemy) != "Player") { if (!KDEnemyHasFlag(data.enemy, "EnemyResist")) { KinkyDungeonSetEnemyFlag(data.enemy, "EnemyResist", -1); @@ -10231,7 +10316,7 @@ let KDEventMapGeneric = { } } }, - "ResilientFoes": (e, data) => { + "ResilientFoes": (_e, data) => { if (KinkyDungeonStatsChoice.get("ResilientFoes") && KDGetFaction(data.enemy) != "Player") { if (!KDEnemyHasFlag(data.enemy, "ResilientFoes")) { KinkyDungeonSetEnemyFlag(data.enemy, "ResilientFoes", -1); @@ -10243,7 +10328,7 @@ let KDEventMapGeneric = { } } }, - "Stealthy": (e, data) => { + "Stealthy": (_e, data) => { if (KinkyDungeonStatsChoice.get("Stealthy") && KDGetFaction(data.enemy) != "Player") { if (!KDEnemyHasFlag(data.enemy, "Stealthy")) { KinkyDungeonSetEnemyFlag(data.enemy, "Stealthy", -1); @@ -10257,36 +10342,36 @@ let KDEventMapGeneric = { }, }, "calcVision": { - "ArchersEye": (e, data) => { + "ArchersEye": (_e, data) => { if (KinkyDungeonStatsChoice.get("ArchersEye")) { data.max += Math.max(0, 2 - Math.max(0, KinkyDungeonBlindLevel || 0)); } }, - "Nearsighted": (e, data) => { + "Nearsighted": (_e, data) => { if (KinkyDungeonStatsChoice.get("Nearsighted")) { data.max *= 0.5; } }, }, "vision": { - "NightOwl": (e, data) => { + "NightOwl": (_e, data) => { if (KinkyDungeonStatsChoice.get("NightOwl")) { data.flags.nightVision *= 2; } }, - "NightBlindness": (e, data) => { + "NightBlindness": (_e, data) => { if (KinkyDungeonStatsChoice.get("NightBlindness")) { data.flags.nightVision *= 0.7; } }, - "Nearsighted": (e, data) => { + "Nearsighted": (_e, data) => { if (KinkyDungeonStatsChoice.get("Nearsighted")) { data.flags.nightVision *= 0.85; } }, }, "calcHearing": { - "KeenHearing": (e, data) => { + "KeenHearing": (_e, data) => { if (KinkyDungeonStatsChoice.get("KeenHearing")) { data.hearingMult *= 2; } @@ -10294,7 +10379,7 @@ let KDEventMapGeneric = { }, "afterNoise": { // Shockwave rendering code - "shockwave": (e, data) => { + "shockwave": (_e, data) => { if (data.particle) { if (!KDEventData.shockwaves) KDEventData.shockwaves = []; KDEventData.shockwaves.push(data); @@ -10303,7 +10388,7 @@ let KDEventMapGeneric = { }, "afterDrawFrame": { // Shockwave rendering code - "shockwave": (e, data) => { + "shockwave": (_e, data) => { if (KDEventData.shockwaves) { if (KDToggles.ParticlesFX) for (let s of KDEventData.shockwaves) { @@ -10335,11 +10420,10 @@ let KDEventMapGeneric = { }; /** - * - * @param {string} Event - * @param {*} data + * @param Event + * @param data */ -function KinkyDungeonHandleGenericEvent(Event, 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])) @@ -10349,7 +10433,8 @@ function KinkyDungeonHandleGenericEvent(Event, data) { -function KDEventPrereq(e, item, tags) { +/* TODO: Utilize item and tags parameter in future :) */ +function KDEventPrereq(_e: string, item?: item, tags?: any) { if (tags) { if (!tags.length) { tags = [tags]; @@ -10364,22 +10449,20 @@ function KDEventPrereq(e, item, tags) { } /** - * - * @param {entity} enemy - * @returns {boolean} + * @param enemy */ -function KDIsHumanoid(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} spell - * @param {*} data - * @param {boolean} Passive - * @param {boolean} Toggle + * @param spell + * @param data + * @param Passive + * @param Toggle */ -function KDTriggerSpell(spell, data, Passive, 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; @@ -10395,7 +10478,7 @@ function KDTriggerSpell(spell, data, Passive, Toggle) { } } -function KDAddArcaneEnergy(player, powerAdded) { +function KDAddArcaneEnergy(player: entity, powerAdded: number) { let max = KinkyDungeonStatManaMax + KDEntityBuffedStat(player, "MaxArcaneEnergy"); let buff = KDEntityGetBuff(player, "ArcaneEnergy"); if (!buff) { @@ -10470,7 +10553,7 @@ let KDHardModeReplace = { -function KinkyDungeonSendAltEvent(Event, data) { +function KinkyDungeonSendAltEvent(Event: string, data: any) { if (!KDMapHasEvent(KDEventMapAlt, Event)) return; let alt = KDGetAltType(MiniGameKinkyDungeonLevel); if (alt?.events) { @@ -10482,25 +10565,21 @@ function KinkyDungeonSendAltEvent(Event, data) { /** - * - * @param {string} Event - * @param {KinkyDungeonEvent} e - * @param {any} alt - * @param {*} data + * @param Event + * @param e + * @param alt + * @param data */ -function KinkyDungeonHandleAltEvent(Event, e, alt, 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); } } -/** - * @type {Object.>} - */ -let KDEventMapAlt = { +let KDEventMapAlt: Record void>> = { "tick": { - "PerkRoom": (e, alt, data) => { + "PerkRoom": (_e, _alt, _data) => { if (KinkyDungeonStatsChoice.get("perksmandatory")) { if (KinkyDungeonFlags.get("choseperk")) { KinkyDungeonMapSet(KDMapData.EndPosition.x, KDMapData.EndPosition.y, 's'); @@ -10514,7 +10593,7 @@ let KDEventMapAlt = { -function KinkyDungeonSendFacilityEvent(Event, data) { +function KinkyDungeonSendFacilityEvent(Event: string, data: any) { if (!KDMapHasEvent(KDEventMapFacility, Event)) return; let listUpdate = Object.entries(KDFacilityTypes).filter((entry) => { return entry[1].prereq(); @@ -10530,28 +10609,24 @@ function KinkyDungeonSendFacilityEvent(Event, data) { /** - * - * @param {string} Event - * @param {KinkyDungeonEvent} e - * @param {string} fac - * @param {*} data + * @param Event + * @param e + * @param fac + * @param data */ -function KinkyDungeonHandleFacilityEvent(Event, e, fac, 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); } } -/** - * @type {Object.>} - */ -let KDEventMapFacility = { +let KDEventMapFacility: Record void>> = { }; -function KDStunResist(data) { +function KDStunResist(data: any) { let amount = 0; let time = 0; if (data.enemy?.Enemy?.tags.unstoppable) { @@ -10576,7 +10651,7 @@ function KDStunResist(data) { } } -function KDAddEvent(map, trigger, type, code) { +function KDAddEvent(map: any, trigger: any, type: any, code: any) { if (!map) { console.log("Error adding " + trigger + ", " + type); } @@ -10584,4 +10659,4 @@ function KDAddEvent(map, trigger, type, code) { map[trigger] = {}; } map[trigger][type] = code; -} \ No newline at end of file +} diff --git a/Game/src/enemy/KDCommander.js b/Game/src/enemy/KDCommander.js index b44c3f586..c3ab3376b 100644 --- a/Game/src/enemy/KDCommander.js +++ b/Game/src/enemy/KDCommander.js @@ -642,7 +642,8 @@ let KDCommanderOrders = { 6, 8, false, true); if (KDEnemyCanTalk(enemy) && (KDHelpless(enemy) || KDBoundEffects(enemy) > 3)) { if (!KDEnemyHasFlag(enemy, "shoutforhelp")) { - KinkyDungeonMakeNoise(5 + KDEnemyRank(enemy), enemy.x, enemy.y); + //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"); diff --git a/Game/src/enemy/KDPathConditions.ts b/Game/src/enemy/KDPathConditions.ts new file mode 100644 index 000000000..0f0acd604 --- /dev/null +++ b/Game/src/enemy/KDPathConditions.ts @@ -0,0 +1,91 @@ + +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)) { + 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)) { + 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)) { + 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 index 93282507d..7504520b1 100644 --- a/Game/src/enemy/KDPersistence.ts +++ b/Game/src/enemy/KDPersistence.ts @@ -23,6 +23,7 @@ interface KDPersistentNPC { bodystyle?: string, facestyle?: string, cosplaystyle?: string, + Palette?: string, } interface WorldCoord { @@ -105,7 +106,7 @@ function KDGetPersistentNPC(id: number, entity?: entity): KDPersistentNPC { let enemy = entity || KinkyDungeonFindID(id); if (enemy) { let entry = { - Name: enemy.CustomName || KDGetEnemyName(enemy), + Name: enemy.CustomName || KDGenEnemyName(enemy), id: enemy.id, entity: enemy, mapX: KDCurrentWorldSlot.x, diff --git a/Game/src/enemy/KinkyDungeonEnemies.js b/Game/src/enemy/KinkyDungeonEnemies.js index 202f81ccc..d010c33c2 100644 --- a/Game/src/enemy/KinkyDungeonEnemies.js +++ b/Game/src/enemy/KinkyDungeonEnemies.js @@ -277,9 +277,22 @@ function KDIsHopeless(enemy) { return enemy && !enemy.player && (enemy.boundLevel > KDNPCStruggleThreshMult(enemy) * enemy.Enemy.maxhp) && KDBoundEffects(enemy) > 3; } +function KDEnemyVisionRadius(enemy) { + 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, requireVision, decoy, visionRadius, AI_Data) { if (enemy && enemy.Enemy && !visionRadius) { - visionRadius = enemy.Enemy.visionRadius; + visionRadius = KDEnemyVisionRadius(enemy); if (enemy.blind && !enemy.aware) visionRadius = 1.5; } if (decoy) { @@ -889,6 +902,9 @@ function KinkyDungeonSetEnemyFlag(enemy, flag, duration) { * @param {number} duration */ function KDSetIDFlag(id, flag, duration) { + if (id == -1) { + KinkyDungeonSetFlag(flag, duration); + } let enemy = KDGetGlobalEntity(id); if (!enemy) { KDSetCollFlag(id, flag, duration); @@ -923,6 +939,9 @@ function KDEnemyHasFlag(enemy, flag) { * @returns {boolean} */ function KDIDHasFlag(id, flag) { + 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)) @@ -1773,11 +1792,11 @@ function KinkyDungeonDrawEnemiesHP(delta, canvasOffsetX, canvasOffsetY, CamX, Ca let ttCJKcheck1 = CJKcheck(tt,1); let ttCJKcheck2 = CJKcheck(tt); - if (ttCJKcheck1){ + if (ttCJKcheck1 && typeof (ttCJKcheck1) != 'boolean'){ let i; for (i in ttCJKcheck1){ttlength += ttCJKcheck1[i].length * 8;} } - if (ttCJKcheck2){ + if (ttCJKcheck2 && typeof (ttCJKcheck2) != 'boolean'){ let i; for (i in ttCJKcheck2){ttlength += ttCJKcheck2[i].length * 16;} } @@ -1794,11 +1813,11 @@ function KinkyDungeonDrawEnemiesHP(delta, canvasOffsetX, canvasOffsetY, CamX, Ca let nameCJKcheck1 = CJKcheck(name,1); let nameCJKcheck2 = CJKcheck(name); - if (nameCJKcheck1){ + if (nameCJKcheck1 && typeof (nameCJKcheck1) != 'boolean'){ let i; for (i in nameCJKcheck1){namelength += nameCJKcheck1[i].length * 8;} } - if (nameCJKcheck2){ + if (nameCJKcheck2 && typeof (nameCJKcheck2) != 'boolean'){ let i; for (i in nameCJKcheck2){namelength += nameCJKcheck2[i].length * 16;} } @@ -1828,11 +1847,11 @@ function KinkyDungeonDrawEnemiesHP(delta, canvasOffsetX, canvasOffsetY, CamX, Ca let dialougeCJKcheck1 = CJKcheck(enemy.dialogue,1); let dialougeCJKcheck2 = CJKcheck(enemy.dialogue); - if (dialougeCJKcheck1){ + if (dialougeCJKcheck1 && typeof (dialougeCJKcheck1) != 'boolean'){ let i; for (i in dialougeCJKcheck1){dialougelenth += dialougeCJKcheck1[i].length * 8;} } - if (dialougeCJKcheck2){ + if (dialougeCJKcheck2 && typeof (dialougeCJKcheck2) != 'boolean'){ let i; for (i in dialougeCJKcheck2){dialougelenth += dialougeCJKcheck2[i].length * 16;} } @@ -2482,6 +2501,7 @@ function KinkyDungeonCapture(enemy) { //let goddessCapture = false; msg = "KinkyDungeonCaptureBasic"; KDDropStolenItems(enemy); + KinkyDungeonSetEnemyFlag(enemy, "questtarget", 0); if (KDIsImprisoned(enemy)) KDFreeNPC(enemy); if (KDIsNPCPersistent(enemy.id)) { KDGetPersistentNPC(enemy.id).collect = true; @@ -2863,14 +2883,15 @@ function KDNearbyNeutrals(x, y, dist, neutralEnemy) { /** * * @param {*} avoidPlayer - * @param {*} onlyPlayer - * @param {*} Enemy - * @param {*} playerDist - * @param {*} minDist + * @param {*} [onlyPlayer] + * @param {entity} [Enemy] + * @param {*} [playerDist] + * @param {*} [minDist] + * @param {number} [maxDist] * @returns {{x: number, y: number}} */ -function KinkyDungeonGetRandomEnemyPoint(avoidPlayer, onlyPlayer, Enemy, playerDist = 6, minDist = 6, ignoreOL = false) { - return KinkyDungeonGetRandomEnemyPointCriteria(undefined, avoidPlayer, onlyPlayer, Enemy, playerDist, minDist, ignoreOL); +function KinkyDungeonGetRandomEnemyPoint(avoidPlayer, onlyPlayer, Enemy, playerDist = 6, minDist = 6, ignoreOL = false, maxDist = 100) { + return KinkyDungeonGetRandomEnemyPointCriteria(undefined, avoidPlayer, onlyPlayer, Enemy, playerDist, minDist, ignoreOL, maxDist); } /** @@ -2978,28 +2999,33 @@ function KDGetNearestGuardLabel(x, y, entity, ignoreID, ignoreEntity, typeFilter return label; } +let RandomPathList = []; + /** * * @param {*} criteria * @param {*} avoidPlayer * @param {*} onlyPlayer - * @param {*} Enemy - * @param {*} playerDist - * @param {*} minDist + * @param {*} [Enemy] + * @param {*} [playerDist] + * @param {*} [minDist] + * @param {number} [maxDist] * @returns {{x: number, y: number}} */ -function KinkyDungeonGetRandomEnemyPointCriteria(criteria, avoidPlayer, onlyPlayer, Enemy, playerDist = 6, minDist = 6, ignoreOL = false) { +function KinkyDungeonGetRandomEnemyPointCriteria(criteria, avoidPlayer, onlyPlayer, Enemy, playerDist = 6, minDist = 6, ignoreOL = false, maxDist = 100) { let tries = 0; + let points = RandomPathList; while (tries < 100) { - let points = Object.values(KDMapData.RandomPathablePoints); 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 (((!avoidPlayer || Math.sqrt((X - PlayerEntity.x) * (X - PlayerEntity.x) + (Y - PlayerEntity.y) * (Y - PlayerEntity.y)) > minDist) + 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)) @@ -3538,7 +3564,7 @@ function KinkyDungeonUpdateEnemies(maindelta, Allied) { // 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; + 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) { if (player.player) KinkyDungeonSetEnemyFlag(enemy, "targ_player", 1); else if (KDGetFaction(player) == "Player") KinkyDungeonSetEnemyFlag(enemy, "targ_ally", 1); @@ -3619,8 +3645,9 @@ function KinkyDungeonUpdateEnemies(maindelta, Allied) { if (idle && enemy.hp > 0) { if (KDCanIdleFidget(enemy)) { - let checkX = enemy.flip ? enemy.x + 3 : enemy.x - 3; - if (KinkyDungeonCheckPath(enemy.x, enemy.y, checkX, enemy.y, true, true, 1)) { + 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); } @@ -3699,7 +3726,9 @@ function KinkyDungeonUpdateEnemies(maindelta, Allied) { KDUpdatePersistentNPC(enemy.id, KDGameData.Collection[enemy.id + ""] != undefined); // Delete the enemy - if (KinkyDungeonEnemyCheckHP(enemy, E)) { E -= 1;} else if (KDGetFaction(enemy) != "Player") { + if (KinkyDungeonEnemyCheckHP(enemy, E)) + { 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) && KDEnemyCanSignalOthers(enemy)) { @@ -3977,7 +4006,7 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { 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; + 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); @@ -4064,8 +4093,8 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { if (enemy.Enemy.ethereal) { AIData.AvoidTiles = ""; AIData.MovableTiles = AIData.MovableTiles + "1X"; - } else if (enemy.Enemy.squeeze && KinkyDungeonLeashingEnemy()?.id != enemy.id) { - AIData.MovableTiles = AIData.MovableTiles + 'b'; + } 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 = ""; } @@ -4255,7 +4284,7 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { if (AIData.playerDist < 1.5) AIData.playChance += 0.1; - if (AIData.playerDist < enemy.Enemy.visionRadius / 2) 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 @@ -4437,6 +4466,8 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { 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; @@ -4491,7 +4522,7 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { } } if (sneakPerc > 0.99 && (AIData.canSensePlayer || AIData.canSeePlayer || AIData.canShootPlayer)) { - if (!enemy.aware && AIData.aggressive) { + if (!enemy.aware && AIData.aggressive && !KDHelpless(enemy)) { KDAddThought(enemy.id, "Aware", 3, 3); if (KDRandom() < actionDialogueChanceIntense) KinkyDungeonSendDialogue(enemy, @@ -4500,34 +4531,48 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { 4, 5, false, true); } if (!enemy.aware) KDEnemyAddSound(enemy, enemy.Enemy.Sound?.alertAmount != undefined ? enemy.Enemy.Sound?.alertAmount : KDDefaultEnemyAlertSound); + let wasAware = enemy.aware; enemy.aware = true; // Share aggro - if (!AIData.ignore && player.player && KDHostile(enemy) && AIData.aggressive && !enemy.rage && KDEnemyCanSignalOthers(enemy) && !enemy.Enemy.tags.minor && (!(enemy.silence > 0 || enemy.Enemy.tags.gagged) || enemy.Enemy.tags.alwaysAlert)) { - 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; + if (!AIData.ignore + && player.player + && KDHostile(enemy) + && AIData.aggressive + && KDEnemyCanSignalOthers(enemy) && !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); - } - } 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); - if (!enemy.aware) KDEnemyAddSound(enemy, enemy.Enemy.Sound?.alertAmount != undefined ? enemy.Enemy.Sound?.alertAmount : KDDefaultEnemyAlertSound); + e.aware = true; + } - e.aware = true; } - } } } @@ -4585,8 +4630,19 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { // Whether or not the enemy should hold when nearby // Summons are mainly the ones who should behave like this - AIData.holdStillWhenNear = 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")); + 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 ( @@ -4730,7 +4786,7 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { } } enemy.path = KinkyDungeonFindPath(enemy.x, enemy.y, player.x, player.y, - KDEnemyHasFlag(enemy, "blocked") && enemy != KinkyDungeonLeashingEnemy(), KDEnemyHasFlag(enemy, "blocked") && enemy != KinkyDungeonLeashingEnemy(), + KDEnemyHasFlag(enemy, "blocked"), KDEnemyHasFlag(enemy, "blocked") && enemy != KinkyDungeonLeashingEnemy(), AIData.ignoreLocks, AIData.MovableTiles, undefined, undefined, undefined, enemy, !enemy.CurrentAction && enemy != KinkyDungeonJailGuard() && !KDEnemyHasFlag(enemy, "longPath")); // Give up and pathfind @@ -4834,7 +4890,7 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { if (!enemy.path && !KDEnemyHasFlag(enemy, "genpath")) { enemy.path = KinkyDungeonFindPath( enemy.x, enemy.y, enemy.gx, enemy.gy, - KDEnemyHasFlag(enemy, "blocked") && enemy != KinkyDungeonLeashingEnemy(), + KDEnemyHasFlag(enemy, "blocked"), KDEnemyHasFlag(enemy, "blocked") && enemy != KinkyDungeonLeashingEnemy(), AIData.ignoreLocks, AIData.MovableTiles, undefined, undefined, undefined, enemy, enemy != KinkyDungeonJailGuard() && enemy != KinkyDungeonLeashingEnemy() && !KDEnemyHasFlag(enemy, "longPath")); // Give up and pathfind @@ -4929,7 +4985,7 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { if (!AIType.wanderfar_func || !AIType.wanderfar_func(enemy, player, AIData)) { // long distance hunt let newPoint = KinkyDungeonGetRandomEnemyPointCriteria((X, Y) => { - return KDistChebyshev(enemy.x - X && enemy.y - Y) < 24; + return KDistChebyshev(enemy.x - X, enemy.y - Y) < 24; }, false, enemy.tracking && KinkyDungeonHuntDownPlayer && KDGameData.PrisonerState != "parole" && KDGameData.PrisonerState != "jail"); if (newPoint) { @@ -5411,6 +5467,7 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { { //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, { @@ -5432,7 +5489,7 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { maxPower: rThresh + 0.01, looseLimit: true, onlyUnlimited: true, - ignore: enemy.items, + ignore: [...(enemy.items || []), ...restraintAdd.map((rst) => {return rst.r.name;})], }, enemy, undefined, true, undefined, { allowLowPower: KDRandom() < 0.5 }); @@ -5489,7 +5546,7 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { 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, false, false, true, KinkyDungeonMovableTilesSmartEnemy, undefined, undefined, undefined, enemy); + 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); @@ -5899,6 +5956,7 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { 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))) 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; @@ -5913,7 +5971,8 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { 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)) + && ((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; @@ -6043,24 +6102,31 @@ function KinkyDungeonEnemyLoop(enemy, player, delta, visionMod, playerItems) { } // 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 +// Dont want to pass object handles around function KinkyDungeonGetEnemyID() { - if (KinkyDungeonEnemyID > 100000000) KinkyDungeonEnemyID = 0; + if (KinkyDungeonEnemyID > 100000000) KinkyDungeonEnemyID = 1; return KinkyDungeonEnemyID++; } // 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 +// Dont want to pass object handles around function KinkyDungeonGetSpellID() { - if (KinkyDungeonSpellID > 100000000) KinkyDungeonSpellID = 0; + if (KinkyDungeonSpellID > 100000000) KinkyDungeonSpellID = 1; return KinkyDungeonSpellID++; } // Unique ID for items for identification reasons -// Dont want to pass object handles around in case we ever allow saving a room +// Dont want to pass object handles around function KinkyDungeonGetItemID() { - if (KDGameData.ItemID > 100000000 || KDGameData.ItemID == undefined) KDGameData.ItemID = 0; + 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; @@ -6076,6 +6142,7 @@ function KinkyDungeonNoEnemy(x, y, Player) { /** * * @param {entity} enemy + * @param {boolean} [strict] * @returns {boolean} */ function KDIsImmobile(enemy, strict) { @@ -6091,12 +6158,20 @@ function KDIsImmobile(enemy, strict) { * @returns */ function KinkyDungeonCanSwapWith(e, Enemy) { - if (KDIsImmobile(e) && (e.Enemy.immobile)) return false; // Definition of noSwap + 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; // 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 && Enemy.Enemy && (Enemy.Enemy.squeeze && KinkyDungeonMapGet(Enemy.x, Enemy.y) == 'b') && e && e.Enemy && !e.Enemy.squeeze) return false; // Squeeze enemies NEVER have seniority, this can teleport other enemies into walls + if (Enemy && Enemy.Enemy && (Enemy.Enemy.earthmove && KinkyDungeonMapGet(Enemy.x, Enemy.y) == '4') && e && e.Enemy && !e.Enemy.earthmove) return false; // Squeeze enemies NEVER have seniority, this can teleport other enemies into walls if (!e.Enemy.tags || (e.Enemy.tags.scenery && !Enemy.Enemy.tags.scenery)) return true; @@ -6177,8 +6252,8 @@ function KinkyDungeonEnemyAt(x, y) { * @param {number} x * @param {number} y * @param {boolean} requireVision - * @param {number} [vx] - * @param {number} [vy] + * @param {number} [vx] - vision x, usually player x + * @param {number} [vy] - vision y, usually player y * @param {boolean} player * @returns {entity} */ @@ -6249,13 +6324,24 @@ function KinkyDungeonEnemyTryMove(enemy, Direction, delta, x, y, canSprint) { } if (ee && KinkyDungeonCanSwapWith(ee, enemy)) { - 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); + 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) { KDMovePlayer(enemy.x, enemy.y, false, false, false, true); } @@ -6470,12 +6556,19 @@ function KinkyDungeonEnemyCanMove(enemy, dir, MovableTiles, AvoidTiles, ignoreLo /** * * @param {number} id + * @param {KDMapDataType} [mapData] * @returns {entity} */ -function KinkyDungeonFindID(id) { - if (KDIDCache.get(id)) return KDIDCache.get(id); - for (let e of KDMapData.Entities) { - if (e.id == id) return e; +function KinkyDungeonFindID(id, mapData) { + 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; } @@ -6637,14 +6730,16 @@ function KDPushModifier(power, enemy, allowNeg = false) { * @param {entity} enemy * @param {number} amount * @param {string} type - * @param {any} Damage + * @param {any} [Damage] + * @param {any} [Msg] + * @param {any} [Delay] * @returns {*} */ function KDTieUpEnemy(enemy, amount, type = "Leather", Damage, Msg, Delay) { if (!enemy) return 0; let data = { amount: amount, - specialAmount: amount, + specialAmount: amount, // FIXME: This field is never used anywhere else. type: type, // Type of BONDAGE, e.g. leather, rope, etc Damage: Damage, Msg: Msg, @@ -6678,6 +6773,7 @@ function KDTieUpEnemy(enemy, amount, type = "Leather", Damage, Msg, Delay) { * @param {entity} enemy * @param {number} struggleMod * @param {number} delta + * @param {number} [allowStruggleAlwaysThresh] * @returns {any} */ function KDPredictStruggle(enemy, struggleMod, delta, allowStruggleAlwaysThresh) { @@ -7177,7 +7273,7 @@ function KDAddLostItemSingle(item, quantity = 1) { } else if (KDRestraint({name: item}) && ( KinkyDungeonRestraintVariants[item] || (KDRestraint({name: item}).armor && !KDRestraint({name: item})?.noRecover) - || KDRestraintSpecial(item))) { + || KDRestraintSpecial({name: item}))) { KinkyDungeonAddLostItems([{name: item, type: LooseRestraint, events: KDGetEventsForRestraint(item), quantity: 1, id: KinkyDungeonGetItemID()}], false); return true; } else if (KDConsumable({name: item})) { @@ -7306,9 +7402,10 @@ function KDGetTags(enemy, removeSpecial) { * * @param {entity} enemy * @param {boolean} useSpecial - * @returns {Record} + * @returns {Record} */ function KDGetExtraTags(enemy, useSpecial) { + /* @type {Record} */ let addOn = enemy.Enemy.bound ? Object.assign({}, KDExtraEnemyTags) : undefined; if (addOn) { /*let effLevel = KDGetEffLevel(); @@ -7385,15 +7482,27 @@ function KDRunBondageResist(enemy, faction, restraintsToAdd, blockFunction, rest if (protection >= multiPower) { for (let r of protectRestraints) { if (count < multiPower) { - KinkyDungeonRemoveRestraintSpecific(r, false, undefined, undefined, undefined, undefined, undefined, true); // @ts-ignore - KinkyDungeonDropItem({name: r.inventoryVariant || r.inventoryAs || r.name}, KinkyDungeonPlayerEntity, false, true, true); - KinkyDungeonSendTextMessage( - 5, TextGet("KDArmorBlock") - .replace("ArmorName", KDGetItemName(r)) - .replace("EnemyName", name), - "#ff8933", 1, - false, false, undefined, "Combat"); + 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; } @@ -8131,9 +8240,11 @@ function KDAddToParty(enemy) { // Add a copy to the party enemy.faction = "Player"; KDGameData.Party.push(JSON.parse(JSON.stringify(enemy))); - if (!KDGameData.Collection[enemy.id + ""]) - KDAddCollection(enemy, undefined, "Guest"); - KDGetPersistentNPC(enemy.id).collect = true; // Collect them + if (KDCapturable(enemy)) { + if (!KDGameData.Collection[enemy.id + ""]) + KDAddCollection(enemy, undefined, "Guest"); + KDGetPersistentNPC(enemy.id).collect = true; // Collect them + } return true; } @@ -8162,7 +8273,8 @@ function KDRemoveFromParty(enemy, capture) { for (let pm of (KDGameData.Party)) { if (pm.id == enemy.id) { KDGameData.Party.splice(KDGameData.Party.indexOf(pm), 1); - if (capture) { + 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); //} @@ -8179,11 +8291,13 @@ function KDRemoveFromParty(enemy, capture) { * @param {entity} entity * @param {boolean} [makepersistent] - If true, the game will update the npc to be persistent * @param {boolean} [dontteleportpersistent] - If true, the game will create a new NPC not a persistent one - * @param {boolean} [noLoadout] + * @param {boolean} [noLoadout] - if true, will not restock the NPC + * @param {KDMapDataType} [mapData] - map data to update * @returns {entity} */ -function KDAddEntity(entity, makepersistent, dontteleportpersistent, noLoadout) { +function KDAddEntity(entity, makepersistent, dontteleportpersistent, noLoadout, mapData) { + if (!mapData) mapData = KDMapData; let data = { enemy: entity, x: entity.x, @@ -8193,15 +8307,18 @@ function KDAddEntity(entity, makepersistent, dontteleportpersistent, noLoadout) data: undefined, loadout: undefined, persistent: makepersistent, + mapData: mapData, }; - KDUpdateEnemyCache = true; - KDGetEnemyCache(); + if (mapData == KDMapData) { + KDUpdateEnemyCache = true; + KDGetEnemyCache(); + } if (!dontteleportpersistent && KDIsNPCPersistent(data.enemy.id) && KinkyDungeonFindID(data.enemy.id)) { // Move the enemy instead of creating - let npc = KinkyDungeonFindID(data.enemy.id); + let npc = KinkyDungeonFindID(data.enemy.id, mapData); KDUnPackEnemy(data.enemy); npc.x = data.x; @@ -8211,7 +8328,8 @@ function KDAddEntity(entity, makepersistent, dontteleportpersistent, noLoadout) if (data.enemy.hp <= 0.5) data.enemy.hp = 0.51; - KDUpdateEnemyCache = true; + if (mapData == KDMapData) + KDUpdateEnemyCache = true; return npc; } else if (!dontteleportpersistent && KDDeletedIDs[data.enemy.id]) { @@ -8237,7 +8355,7 @@ function KDAddEntity(entity, makepersistent, dontteleportpersistent, noLoadout) } } KinkyDungeonSendEvent("addEntity", data); - KDMapData.Entities.push(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; @@ -8252,12 +8370,15 @@ function KDAddEntity(entity, makepersistent, dontteleportpersistent, noLoadout) for (let b of buffs) data.enemy.buffs[b.id] = b; } - KDUpdateEnemyCache = true; + if (mapData == KDMapData) + KDUpdateEnemyCache = true; // In case it wasnt made already if (createpersistent) KDGetPersistentNPC(data.enemy.id); - if (KDIsNPCPersistent(data.enemy.id) && !KDGetAltType(MiniGameKinkyDungeonLevel)?.keepPrisoners) + + // 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; return data.enemy; } @@ -8618,7 +8739,9 @@ function KDGetUnassignedGuardTiles(type = "Patrol", ignoreNegative = false) { * @returns {boolean} */ function KDCanIdleFidget(enemy) { - return enemy?.idle && !enemy.Enemy?.nonDirectional && !enemy.Enemy?.tags?.nofidget && !KDEnemyHasFlag(enemy, "fidget") && !KDEnemyHasFlag(enemy, "nofidget"); + return enemy?.idle && !enemy.Enemy?.nonDirectional && !enemy.Enemy?.tags?.nofidget + && (!KDEnemyHasFlag(enemy, "fidget") || KDEntityHasBuffTags(enemy, "adren")) + && !KDEnemyHasFlag(enemy, "nofidget"); } function KDRescueRepGain(en) { @@ -8689,7 +8812,7 @@ function KDGateAttack(enemy, AID) { * @returns {boolean} */ function KDAcceptsLeash(enemy, leash) { - return enemy.Enemy?.tags?.submissive || (KDGetPersonality(enemy) && KDLoosePersonalities.includes(KDGetPersonality(enemy))); + return enemy.Enemy?.tags?.submissive || (enemy.personality && KDLoosePersonalities.includes(enemy.personality)); } /** @@ -8902,7 +9025,7 @@ function KDQuickGenNPC(enemy, force) { if (!enemyType.style) return; // Dont make one for enemies without styles let NPC = null; if (!KDNPCChar.get(id)) { - NPC = suppressCanvasUpdate(() => CharacterLoadNPC("coll" + id)); + NPC = suppressCanvasUpdate(() => CharacterLoadNPC(id, KDEnemyName(enemy), value?.Palette)); KDNPCChar.set(id, NPC); KDNPCChar_ID.set(NPC, id); value = value || KDGetPersistentNPC(enemy.id); diff --git a/Game/src/enemy/KinkyDungeonEnemiesList.js b/Game/src/enemy/KinkyDungeonEnemiesList.js index 1397e7903..05d589ee9 100644 --- a/Game/src/enemy/KinkyDungeonEnemiesList.js +++ b/Game/src/enemy/KinkyDungeonEnemiesList.js @@ -73,24 +73,29 @@ let KinkyDungeonEnemies = [ {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", @@ -182,8 +187,8 @@ let KinkyDungeonEnemies = [ // End Quest NPC - {name: "DirtPile", tags: KDMapInit(["poisonmmune", "soulimmune", "dirt", "noknockback", "melee", "notalk", "nonvulnerable", "nobrain", "nosignal", "immobile", "acidweakness", "soapsevereweakness"]), - faction: "Door", immobile: true, spellResist: -3, lowpriority: true, evasion: -100, armor: -1, followRange: 100, AI: "wander", + {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"} @@ -197,6 +202,7 @@ let KinkyDungeonEnemies = [ {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: { @@ -608,7 +614,9 @@ let KinkyDungeonEnemies = [ 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"]), + {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, @@ -2547,6 +2555,7 @@ let KinkyDungeonEnemies = [ GFX: { lighting: true, }, + pathcondition: "barricade", tags: KDMapInit(["obstacledoor", "scenery", "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, @@ -2630,7 +2639,8 @@ let KinkyDungeonEnemies = [ 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: 0, sneakthreshold: 0.6, immobile: true, + ]), 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: [], @@ -2934,6 +2944,7 @@ let KinkyDungeonEnemies = [ Resist: "Clang", Damage: "ArmorHit", }, + pathcondition: "stonedoor", Sound: { baseAmount: 0, }, @@ -2941,9 +2952,9 @@ let KinkyDungeonEnemies = [ lighting: true, }, tags: KDMapInit(["obstacledoor", "scenery", "minor", "inactive", "nonvulnerable", "unstoppable", "immobile", "nobrain", "nosignal", "poisonimmune", "harmless", - "soulimmune", "slashresist", "pierceresist", "electricresist", "crushweakness", "unarmedresist", "chainimmune", "glueresist", "soapresist", "tickleresist", "groperesist", "painresist", "charmimmune", + "soulimmune", "slashresist", "electricresist", "crushweakness", "unarmedresist", "chainimmune", "glueresist", "soapresist", "tickleresist", "groperesist", "painresist", "charmimmune", "bulwark", - ]), spellResist: 0, sneakthreshold: 0.6, + ]), spellResist: 2, sneakthreshold: 0.6, 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: [], @@ -2953,6 +2964,7 @@ let KinkyDungeonEnemies = [ }, {name: "SteelDoor", faction: "Door", blockVision: true, lowpriority: true, + pathcondition: "stonedoor", cueSfx: { Block: "Clang", Resist: "Clang", @@ -2967,7 +2979,7 @@ let KinkyDungeonEnemies = [ 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: 1, sneakthreshold: 0.6, + ]), 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: [], @@ -3000,9 +3012,9 @@ let KinkyDungeonEnemies = [ ], }, - {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.6, + {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, - evasion: -9, ignorechance: 1.0, armor: 0, followRange: 1, AI: "ambush", ambushRadius: 0, difficulty: -0.05, immobile: 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: { @@ -3199,6 +3211,7 @@ let KinkyDungeonEnemies = [ 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, count: 1, strict: false}], @@ -3225,7 +3238,7 @@ let KinkyDungeonEnemies = [ 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: "Purple", maxdodge: 0, + attackLock: "Crystal", maxdodge: 0, stamina: 7, preferBlock: true, dropTable: [{name: "EarthRune", weight: 3}]}, @@ -3669,6 +3682,8 @@ let KinkyDungeonEnemies = [ {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", @@ -3687,6 +3702,8 @@ let KinkyDungeonEnemies = [ {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"}, }, @@ -3882,8 +3899,115 @@ let KinkyDungeonEnemies = [ 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}, 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: ["CrystalBolt"], spellCooldownMult: 1, spellCooldownMod: 5, + 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, + 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"} @@ -3897,8 +4021,9 @@ let KinkyDungeonEnemies = [ 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, + 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"} ], @@ -4439,18 +4564,25 @@ let KinkyDungeonEnemies = [ ], 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"]), + {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, attackPoints: 3, attack: "MeleeBindSuicideWill", suicideOnAdd: true, attackWidth: 3, attackRange: 1, power: 5, multiBind: 6, dmgType: "chain", fullBoundBonus: 6, + 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}, @@ -5055,7 +5187,7 @@ let KinkyDungeonEnemies = [ 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", faction: "Jail", bound: "Jailer", tags: KDMapInit(["leashing", "ignoregagged", "opendoors", "closedoors", "melee", "ballGagRestraintsMagic"]), followRange: 1, AI: "hunt", + {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, @@ -5367,7 +5499,8 @@ let KinkyDungeonEnemies = [ 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}]}, + ondeath: [{type: "dialogue", dialogue:"DollmakerStage2", click: true}], + }, {name: "DollmakerBoss2", outfit: "DollSuit", playLine: "Dollmaker", bound: "DollmakerBoss", faction: "Boss", clusterWith: "dollsmith", applyFaction: "Dollsmith", @@ -5506,6 +5639,9 @@ let KDOndeath = { "dialogue": (enemy, o) => { KDStartDialog(o.dialogue, enemy.Enemy.name, o.click, enemy.personality, enemy); }, + "murder": (enemy, o) => { + KDMurderShopkeeper(1); + }, "spellOnSelf": (enemy, o) => { let spell = KinkyDungeonFindSpell(o.spell, true); if (spell) KinkyDungeonCastSpell(enemy.x, enemy.y, spell, undefined, undefined, undefined, KDGetFaction(enemy)); @@ -5867,9 +6003,34 @@ let KDEnemyAction = { 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 - return !(enemy.idle || (KinkyDungeonAggressive(enemy) && enemy.aware) || enemy.attackPoints || KDistChebyshev(enemy.x - enemy.gx, enemy.y - enemy.gy) <= 1.5); + // 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, }, diff --git a/Game/src/enemy/KinkyDungeonEnemyEventList.js b/Game/src/enemy/KinkyDungeonEnemyEventList.js index 884cc5850..19c7c0f9b 100644 --- a/Game/src/enemy/KinkyDungeonEnemyEventList.js +++ b/Game/src/enemy/KinkyDungeonEnemyEventList.js @@ -852,7 +852,7 @@ let KDIntentEvents = { /** * * @param {entity} enemy - * @param {any} AIData + * @param {any} [AIData] */ function KDResetIntent(enemy, AIData) { enemy.IntentLeashPoint = null; @@ -873,7 +873,7 @@ function KDSettlePlayerInFurniture(enemy, AIData, tags, guardDelay = 24, ftype = let ee = KinkyDungeonEnemyAt(nearestfurniture.x, nearestfurniture.y); if (ee && ee != enemy) { - KDKickEnemy(ee); + KDKickEnemy(ee, undefined, true); } if (enemy.x == nearestfurniture.x && enemy.y == nearestfurniture.y) KDMoveEntity(enemy, KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, @@ -941,4 +941,4 @@ function KDTryToLeash(enemy, player, delta) { } } -} \ No newline at end of file +} diff --git a/Game/src/enemy/KinkyDungeonEnemyTeaseAttacks.js b/Game/src/enemy/KinkyDungeonEnemyTeaseAttacks.js index f572904ee..5d17cf5f1 100644 --- a/Game/src/enemy/KinkyDungeonEnemyTeaseAttacks.js +++ b/Game/src/enemy/KinkyDungeonEnemyTeaseAttacks.js @@ -17,6 +17,7 @@ let KDTeaseAttackLists = { "VibeToy", "InsertToy", "AddStuffing", + "AddGag", "Disarm", "Pickpocket", /*, @@ -280,6 +281,55 @@ let KDTeaseAttacks = { return true; }, }, + AddGag: { + name: "AddStuffing", + priority: 4, + blockable: true, dodgeable: true, + filter: (enemy, player, AIData) => { + if (KDBasicTeaseAttack(enemy, player) + && !KinkyDungeonIsSlowed(enemy) + && !KDIsDisarmed(enemy) + && KDHasArms(enemy) + && ( + KinkyDungeonFlags.get("verbalspell") + )) { + 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) ? {dmg: "", 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, diff --git a/Game/src/enemy/KinkyDungeonPathfinding.js b/Game/src/enemy/KinkyDungeonPathfinding.js index c09b449d2..c6278e767 100644 --- a/Game/src/enemy/KinkyDungeonPathfinding.js +++ b/Game/src/enemy/KinkyDungeonPathfinding.js @@ -209,16 +209,16 @@ function KinkyDungeonFindPath(startx, starty, endx, endy, blockEnemy, blockPlaye && (!needDoorMemory || tile != "d" || KDOpenDoorTiles.includes(KDMapData.TilesMemory[xx + "," + yy]))) { costBonus = 0; if (!ignoreTrafficLaws) { - if (tile == "V" && !(MapTile?.Sfty)) costBonus = 7; - else if (tile == "N") costBonus = 15; - else if (tile == "D") costBonus = 2; + 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 = 2; - else if (tile == "L") costBonus = 4; - else if (tile == "T") 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 + 8 : costBonus; - costBonus = (KDMapData.Traffic?.length > 0) ? costBonus + KDMapData.Traffic[yy][xx] : 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, diff --git a/Game/src/enemy/KinkyDungeonPersonality.js b/Game/src/enemy/KinkyDungeonPersonality.js index 255ca758d..419a6dfa2 100644 --- a/Game/src/enemy/KinkyDungeonPersonality.js +++ b/Game/src/enemy/KinkyDungeonPersonality.js @@ -98,7 +98,7 @@ let KDEnemyPersonalities = { }; /** - * + * Do NOT call this during UI loop, as can lead to desyncs in future w/ replay system or possible netcode * @param {entity} enemy * @returns {string} */ diff --git a/Game/src/faction/KinkyDungeonFactions.js b/Game/src/faction/KinkyDungeonFactions.ts similarity index 71% rename from Game/src/faction/KinkyDungeonFactions.js rename to Game/src/faction/KinkyDungeonFactions.ts index 26993eb8f..d6abdf216 100644 --- a/Game/src/faction/KinkyDungeonFactions.js +++ b/Game/src/faction/KinkyDungeonFactions.ts @@ -2,11 +2,10 @@ /** * Determines if the enemy (which can be hostile) is aggressive, i.e. will pursue the player or ignore - * @param {entity} [enemy] - * @param {entity} [player] - * @returns {boolean} + * @param [enemy] + * @param [player] */ -function KinkyDungeonAggressive(enemy, player) { +function KinkyDungeonAggressive(enemy?: entity, player?: entity): boolean { if (!player || player.player) { // Player mode if (enemy && enemy.hostile > 0) return true; @@ -24,21 +23,20 @@ function KinkyDungeonAggressive(enemy, player) { /** * Returns whether or not the enemy is ALLIED, i.e it will follow the player - * @param {entity} enemy + * @param enemy * @returns {boolean} */ -function KDAllied(enemy) { +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 {entity} enemy - * @param {entity} [enemy2] - * @returns {boolean} + * @param enemy + * @param [enemy2] */ -function KDHostile(enemy, enemy2) { +function KDHostile(enemy: entity, enemy2?: entity): boolean { if (enemy == enemy2) return false; return (enemy.rage > 0) || ( @@ -53,12 +51,11 @@ function KDHostile(enemy, enemy2) { } /** - * - * @param {entity} enemy - * @param {player} enemy - * @returns {number} The modifier to reputation based on the NPC's opinion + * @param enemy + * @param player + * @returns The modifier to reputation based on the NPC's opinion */ -function KDOpinionRepMod(enemy, player) { +function KDOpinionRepMod(enemy: entity, player: entity): number { if (!player?.player) return 0; let op = KDGetModifiedOpinionID(enemy.id, true, true, true, 0); if (op) { @@ -68,20 +65,17 @@ function KDOpinionRepMod(enemy, player) { } /** - * - * @param {KDCollectionEntry} value - * @returns {boolean} + * @param value */ -function KDIsServant(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 {entity} enemy - * @returns {string} + * @param enemy */ -function KDGetFaction(enemy) { +function KDGetFaction(enemy: entity): string { if (!enemy) return undefined; if (enemy.player) return "Player"; if (enemy.rage > 0) return "Rage"; @@ -95,10 +89,9 @@ function KDGetFaction(enemy) { /** * Gets the faction of the enemy, returning "Player" if its an ally, or "Enemy" if no faction - * @param {entity} enemy - * @returns {string} + * @param enemy */ -function KDGetFactionOriginal(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"; @@ -109,13 +102,12 @@ function KDGetFactionOriginal(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 - * @param {number} mod - modifier to faction rep - constrained to positive - * @param {number} modfree - modifier to faction rep - free - * @returns {boolean} + * @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, b, mod = 0, modfree = 0) { +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; @@ -130,13 +122,12 @@ function KDFactionHostile(a, b, mod = 0, modfree = 0) { /** * 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 - * @param {number} mod - * @returns {boolean} + * @param a - Faction 1 + * @param b - Faction 2 + * @param [threshold] - Faction 2 + * @param [mod] */ -function KDFactionAllied(a, b, threshold = 0.7, mod = 0) { +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; @@ -151,32 +142,28 @@ function KDFactionAllied(a, b, threshold = 0.7, mod = 0) { /** * 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} + * @param a - Faction 1 + * @param b - Faction 2 */ -function KDFactionFavorable(a, b) { +function KDFactionFavorable(a: string, b: string | entity): boolean { return KDFactionAllied(a, b, 0.099); } /** - * - * @param {string[]} list - * @param {number} Floor - * @param {string} Checkpoint - * @param {string[]} tags - * @param {any} bonustags - * @param {number} [X] - * @param {number} [Y] - * @returns {Record} + * @param list + * @param Floor + * @param Checkpoint + * @param tags + * @param bonustags + * @param [X] + * @param [Y] */ -function KDGetFactionProps(list, Floor, Checkpoint, tags, bonustags, X = 0, Y = 0) { - /** @type {Record} */ - let mp = {}; +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, X, Y); + mp[faction] = KDFactionProperties[faction].weight(Floor, Checkpoint, tags, bonustags, X, Y); } } return mp; @@ -184,11 +171,10 @@ function KDGetFactionProps(list, Floor, Checkpoint, tags, bonustags, X = 0, Y = /** * Gets the honor from faction a toward faction b - * @param {string} a - * @param {string} b - * @returns {number} + * @param a + * @param b */ -function KDGetHonor(a, b) { +function KDGetHonor(a: string, b: string): number { if (KDFactionProperties[a]) { if (KDFactionProperties[a].honor_specific[b]) { return KDFactionProperties[a].honor_specific[b]; @@ -196,4 +182,4 @@ function KDGetHonor(a, b) { return KDFactionProperties[a].honor; } return -1; -} \ No newline at end of file +} diff --git a/Game/src/faction/KinkyDungeonFactionsList.js b/Game/src/faction/KinkyDungeonFactionsList.ts similarity index 93% rename from Game/src/faction/KinkyDungeonFactionsList.js rename to Game/src/faction/KinkyDungeonFactionsList.ts index 95a4ec6a8..513f8a72e 100644 --- a/Game/src/faction/KinkyDungeonFactionsList.js +++ b/Game/src/faction/KinkyDungeonFactionsList.ts @@ -17,10 +17,7 @@ let KinkyDungeonFactionColors = { let KDFactionNoCollection = ["Ambush"]; -/** - * @type {Record>} - */ -let KinkyDungeonFactionFilters = { +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}, @@ -160,16 +157,15 @@ let KinkyDungeonFactionFilters = { }; /** - * @type {Record} */ -let KDFactionProperties = { +let KDFactionProperties: Record = { Dressmaker: { honor: -1, jailBackupFaction: "Apprentice", honor_specific: { Witch: 1, }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { let w = 5; if (tags.includes("dressmaker")) w += 40; if (tags.includes("magical")) w += 5; @@ -186,7 +182,7 @@ let KDFactionProperties = { honor: 1, honor_specific: { }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { let w = 10; if (tags.includes("bountyhunter")) w += 40; if (tags.includes("ninja")) w += 20; @@ -218,7 +214,7 @@ let KDFactionProperties = { } return ""; }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { let w = 0; if (tags.includes("robot")) w += 100; if (tags.includes("oldrobot")) w += 10; @@ -237,7 +233,7 @@ let KDFactionProperties = { Plant: 0, Nature: 0, }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { let w = 0; if (tags.includes("elf")) w += 50; if (tags.includes("nature")) w += 40; @@ -251,7 +247,7 @@ let KDFactionProperties = { honor: 0, honor_specific: { }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { let w = 0; if (tags.includes("bast")) w += 100; if (tags.includes("mummy")) w += 50; @@ -265,7 +261,7 @@ let KDFactionProperties = { jailBackupFaction: "Bountyhunter", honor_specific: { }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { let w = 5; if (tags.includes("maid")) w += 100; if (tags.includes("slime")) w += 20; @@ -281,7 +277,7 @@ let KDFactionProperties = { jailBackupFaction: "Bountyhunter", honor_specific: { }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { let w = 5; if (tags.includes("dragon")) w += 40; if (tags.includes("elemental")) w += 15; @@ -297,7 +293,7 @@ let KDFactionProperties = { jailBackupFaction: "Witch", honor_specific: { }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { let w = 0; if (tags.includes("elemental")) w += 40; if (tags.includes("magical")) w += 20; @@ -317,7 +313,7 @@ let KDFactionProperties = { Witch: 0, Wizard: -1, }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { let w = 5; if (tags.includes("apprentice")) w += 40; if (tags.includes("witch")) w += 25; @@ -333,7 +329,7 @@ let KDFactionProperties = { jailBackupFaction: "Dressmaker", honor_specific: { }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { let w = 5; if (tags.includes("nevermere")) w += 40; if (tags.includes("metal")) w += 15; @@ -349,7 +345,7 @@ let KDFactionProperties = { jailBackupFaction: "Apprentice", honor_specific: { }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { let w = 5; if (tags.includes("alchemist")) w += 40; if (tags.includes("latex")) w += 25; @@ -365,7 +361,7 @@ let KDFactionProperties = { honor: -1, honor_specific: { }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, tags, _bonustags, _X, _Y) => { let w = 20; if (tags.includes("bandit")) w += 40; if (tags.includes("cavern")) w += 15; @@ -376,6 +372,37 @@ let KDFactionProperties = { 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", @@ -383,7 +410,7 @@ let KDFactionProperties = { honor: 1, honor_specific: { }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, _tags, _bonustags, _X, _Y) => { return 0; }, jailOutfit: "Obsidian", @@ -395,7 +422,7 @@ let KDFactionProperties = { honor: 1, honor_specific: { }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, _tags, _bonustags, _X, _Y) => { return 0; }, jailOutfit: "Nevermere", @@ -407,7 +434,7 @@ let KDFactionProperties = { honor: 1, honor_specific: { }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, _tags, _bonustags, _X, _Y) => { return 0; }, jailOutfit: "Lingerie", @@ -419,7 +446,7 @@ let KDFactionProperties = { honor: 1, honor_specific: { }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, _tags, _bonustags, _X, _Y) => { return 0; }, jailOutfit: "Bikini", @@ -431,7 +458,7 @@ let KDFactionProperties = { honor: -1, honor_specific: { }, - weight: (Floor, Checkpoint, tags, bonustags, X, Y) => { + weight: (_Floor, _Checkpoint, _tags, _bonustags, _X, _Y) => { return 0; }, jailOutfit: "BindingDress", @@ -483,12 +510,12 @@ let KDHiddenFactions = [ "Adventurer", ]; -let KinkyDungeonHiddenFactions = new Map(); +let KinkyDungeonHiddenFactions: Map = new Map(); for (let f of KDHiddenFactions) { KinkyDungeonHiddenFactions.set(f, true); } -function KinkyDungeonHiddenFactionsPush(str) { +function KinkyDungeonHiddenFactionsPush(str: any) { KinkyDungeonHiddenFactions.set(str, true); } @@ -1079,7 +1106,7 @@ let KinkyDungeonFactionRelationsBase = { let KinkyDungeonFactionRelations = Object.assign({}, KinkyDungeonFactionRelationsBase); -function KDFactionRelation(a, b) { +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)) { @@ -1088,12 +1115,9 @@ function KDFactionRelation(a, b) { return 0.0; } -/** - * @type {Map>}; - */ -let KDFactionRelations = new Map(); +let KDFactionRelations: Map> = new Map(); -function KDInitFactions(Reset) { +function KDInitFactions(Reset?: boolean) { if (Reset) { KinkyDungeonFactionRelations = Object.assign({}, KinkyDungeonFactionRelationsBase); for (let relation of Object.entries(KinkyDungeonFactionRelationsBase)) { @@ -1131,11 +1155,11 @@ function KDInitFactions(Reset) { /** * Sets faction relation and refreshes the map - * @param {string} a - * @param {string} b - * @param {number} relation + * @param a + * @param b + * @param relation */ -function KDSetFactionRelation(a, b, 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)); @@ -1146,11 +1170,12 @@ function KDSetFactionRelation(a, b, relation) { /** * Changes faction relation and refreshes the map - * @param {string} a - * @param {string} b - * @param {number} amount + * @param a + * @param b + * @param amount + * @param [AffectRivals] */ -function KDChangeFactionRelation(a, b, amount, 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; diff --git a/Game/src/faction/KinkyDungeonQuest.js b/Game/src/faction/KinkyDungeonQuest.ts similarity index 91% rename from Game/src/faction/KinkyDungeonQuest.js rename to Game/src/faction/KinkyDungeonQuest.ts index 4238cbae7..846b229c8 100644 --- a/Game/src/faction/KinkyDungeonQuest.js +++ b/Game/src/faction/KinkyDungeonQuest.ts @@ -3,10 +3,7 @@ let QuestCompleteWeight = 1000; let KDDefaultGoddessQuestRep = 5; -/** - * @type {Record} - */ -let KDQuests = { +let KDQuests: Record = { "DressmakerQuest": { name: "DressmakerQuest", npc: "DressmakerQuest", @@ -21,7 +18,7 @@ let KDQuests = { } } }, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (RoomType, _MapMod, _data, _currentQuestList) => { if (RoomType == "PerkRoom") { let weight = 15; if (KinkyDungeonPlayerTags.has("BindingDress")) { @@ -31,7 +28,7 @@ let KDQuests = { } return 0; }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { //if (KinkyDungeonFlags.has("DressmakerQuest") && KinkyDungeonPlayerTags.has("BindingDress")) { //return false; //} @@ -55,7 +52,7 @@ let KDQuests = { } }, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (RoomType, _MapMod, _data, _currentQuestList) => { if (RoomType == "PerkRoom") { let weight = 30; if ( @@ -70,10 +67,10 @@ let KDQuests = { } return 0; }, - accept: (data) => { + accept: () => { KinkyDungeonSetFlag("ApprenticeQuestSpawn", 0); }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { if (KDHasQuest("ApprenticeQuest") && !(KinkyDungeonInventoryGet("ScrollLegs") || KinkyDungeonInventoryGet("ScrollArms") || KinkyDungeonInventoryGet("ScrollVerbal") @@ -91,7 +88,7 @@ let KDQuests = { name: "DragonheartQuest", npc: "DragonheartQuest", visible: true, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (RoomType, _MapMod, _data, _currentQuestList) => { if (RoomType == "PerkRoom") { let weight = 20; return weight; @@ -111,7 +108,7 @@ let KDQuests = { } }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { if (KDHasQuest("DragonheartQuest")) { return false; } @@ -126,7 +123,7 @@ let KDQuests = { name: "MaidforceQuest", npc: "MaidforceQuest", visible: true, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (RoomType, _MapMod, _data, _currentQuestList) => { if (RoomType == "PerkRoom") { let weight = 20; return weight; @@ -174,7 +171,7 @@ let KDQuests = { KinkyDungeonSetFlag("MaidforceQuest", -1, 1); } }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { if (KDHasQuest("MaidforceQuest")) { return false; } @@ -190,7 +187,7 @@ let KDQuests = { npc: "Wolfgirl", visible: true, nocancel: true, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { return 0; }, worldgenstart: () => { @@ -223,7 +220,7 @@ let KDQuests = { } } }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (_RoomType, _MapMod, _data, _currentQuestList) => { return false; } }, @@ -233,7 +230,7 @@ let KDQuests = { npc: "Dressmaker", visible: true, nocancel: true, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { return 0; }, worldgenstart: () => { @@ -266,7 +263,7 @@ let KDQuests = { } } }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (_RoomType, _MapMod, _data, _currentQuestList) => { return false; } }, @@ -277,7 +274,7 @@ let KDQuests = { npc: "DirtPile", visible: true, nocancel: true, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { return 0; }, worldgenstart: () => { @@ -340,7 +337,7 @@ let KDQuests = { } } }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (_RoomType, _MapMod, _data, _currentQuestList) => { return false; } }, @@ -350,13 +347,13 @@ let KDQuests = { npc: "ElementalFire", visible: true, nocancel: true, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { return 0; }, worldgenstart: () => { KinkyDungeonSetFlag("ElementalSlaveTeleport", -1); }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (_RoomType, _MapMod, _data, _currentQuestList) => { return false; }, tick: (delta) => { @@ -417,7 +414,7 @@ let KDQuests = { npc: "DollmakerBoss1", visible: true, nocancel: true, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { return 0; }, worldgenstart: () => { @@ -450,7 +447,7 @@ let KDQuests = { } } }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (_RoomType, _MapMod, _data, _currentQuestList) => { return false; } }, @@ -461,7 +458,7 @@ let KDQuests = { npc: "Nawashi", visible: true, nocancel: true, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { return 0; }, worldgenstart: () => { @@ -479,7 +476,7 @@ let KDQuests = { } } }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (_RoomType, _MapMod, _data, _currentQuestList) => { return false; } }, @@ -488,7 +485,7 @@ let KDQuests = { npc: "BanditQuest", visible: true, nocancel: true, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (RoomType, _MapMod, _data, _currentQuestList) => { if (RoomType == "PerkRoom") { let weight = 20; return weight; @@ -510,7 +507,7 @@ let KDQuests = { KinkyDungeonSetFlag("BanditPrisoner", -1, 1); } }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { if (KDHasQuest("BanditPrisoner")) { return false; } @@ -525,10 +522,10 @@ let KDQuests = { name: "BlacksmithQuest", npc: "BlacksmithQuest", visible: false, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { return 100; }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { if (RoomType == "PerkRoom") { return true; } @@ -539,10 +536,10 @@ let KDQuests = { name: "BowyerQuest", npc: "BowyerQuest", visible: false, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { return 100; }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { if (RoomType == "PerkRoom") { return true; } @@ -553,10 +550,10 @@ let KDQuests = { name: "ShadyQuest", npc: "ShadyQuest", visible: false, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { return 100; }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { if (RoomType == "PerkRoom") { return true; } @@ -567,10 +564,10 @@ let KDQuests = { name: "ArmorerQuest", npc: "ArmorerQuest", visible: false, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { return 100; }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (RoomType, _MapMod, _data, _currentQuestList) => { if (RoomType == "PerkRoom") { return true; } @@ -579,7 +576,7 @@ let KDQuests = { }, - "LatexQuest": KDGenQuestTemplate("LatexQuest", "PinkAlchemist", "Latex", (goddess, flag) => { + "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); @@ -636,7 +633,7 @@ let KDQuests = { } }, 1, ["latexRestraints", "latexRestraintsHeavy"]), - "WillQuest": KDGenQuestTemplate("WillQuest", "Elf", "Will", (goddess, flag) => { + "WillQuest": KDGenQuestTemplate("WillQuest", "Elf", "Will", (_goddess, _flag) => { let point = KinkyDungeonGetRandomEnemyPoint(true); if (point) { let count = 4 + KDRandom() * Math.min(8, KDGetEffLevel()/3); @@ -685,7 +682,7 @@ let KDQuests = { } }, 1.5, ["mithrilCuffs", "leatherRestraints", "leatherRestraintsHeavy"]), - "RopeQuest": KDGenQuestTemplate("RopeQuest", "RopeKraken", "Rope", (goddess, flag) => { + "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); @@ -701,7 +698,7 @@ let KDQuests = { } }, 2, ["dressRestraints", "leatherRestraints", "leatherRestraintsHeavy"]), - "LeatherQuest": KDGenQuestTemplate("LeatherQuest", "ChainBeing", "Leather", (goddess, flag) => { + "LeatherQuest": KDGenQuestTemplate("LeatherQuest", "ChainBeing", "Leather", (_goddess, _flag) => { let point = KinkyDungeonGetRandomEnemyPoint(true); if (point) { let beings = ["ChainBeing", "CorruptedAdventurer", "ShadowGhast"]; @@ -760,7 +757,7 @@ let KDQuests = { } }, 1, ["dragonRestraints", "leatherRestraints", "leatherRestraintsHeavy"]), - "MetalQuest": KDGenQuestTemplate("MetalQuest", "Drone", "Metal", (goddess, flag) => { + "MetalQuest": KDGenQuestTemplate("MetalQuest", "Drone", "Metal", (_goddess, _flag) => { let point = KinkyDungeonGetRandomEnemyPoint(true); if (point) { let count = 1 + KDRandom() * Math.min(3, KDGetEffLevel()/3); @@ -812,7 +809,7 @@ let KDQuests = { } }, 0.7, ["cyberdollrestraints", "cyberdollheavy", "controlharness"]), - "ConjureQuest": KDGenQuestTemplate("ConjureQuest", "WitchShock", "Conjure", (goddess, flag) => { + "ConjureQuest": KDGenQuestTemplate("ConjureQuest", "WitchShock", "Conjure", (_goddess, _flag) => { let point = KinkyDungeonGetRandomEnemyPoint(true); if (point) { let count = 1 + KDRandom() * Math.min(3, KDGetEffLevel()/3); @@ -864,7 +861,7 @@ let KDQuests = { } }, 1, ["dressRestraints", "latexRestraints"]), - "ElementsQuest": KDGenQuestTemplate("ElementsQuest", "DemonStar", "Elements", (goddess, flag) => { + "ElementsQuest": KDGenQuestTemplate("ElementsQuest", "DemonStar", "Elements", (_goddess, _flag) => { let point = KinkyDungeonGetRandomEnemyPoint(true); if (point) { let count = 1 + KDRandom() * Math.min(3, KDGetEffLevel()/3); @@ -916,7 +913,7 @@ let KDQuests = { } }, 1, ["steelbondage", "crystalRestraints", "leatherRestraints", "leatherRestraintsHeavy"]), - "IllusionQuest": KDGenQuestTemplate("IllusionQuest", "DragonShadow", "Illusion", (goddess, flag) => { + "IllusionQuest": KDGenQuestTemplate("IllusionQuest", "DragonShadow", "Illusion", (_goddess, _flag) => { let point = KinkyDungeonGetRandomEnemyPoint(true); if (point) { let count = 1 + KDRandom() * Math.min(3, KDGetEffLevel()/3); @@ -970,8 +967,8 @@ let KDQuests = { -function KDQuestList(count, mods, RoomType, MapMod, data) { - let ret = []; +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 = []; @@ -995,7 +992,7 @@ function KDQuestList(count, mods, RoomType, MapMod, data) { return ret; } -function KDQuestWorldgenStart(quests) { +function KDQuestWorldgenStart(quests: string[]) { if (quests) { for (let q of quests) { if (KDQuests[q] && KDQuests[q].worldgenstart) { @@ -1005,7 +1002,7 @@ function KDQuestWorldgenStart(quests) { } } -function KDQuestTick(quests, delta) { +function KDQuestTick(quests: string[], delta: number) { if (quests) { for (let q of quests) { if (KDQuests[q] && KDQuests[q].tick) { @@ -1014,13 +1011,15 @@ function KDQuestTick(quests, delta) { } } } -function KDRemoveQuest(quest) { + +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) { + +function KDAddQuest(quest: string) { if (!KDGameData.Quests) KDGameData.Quests = []; if (!KDGameData.Quests.includes(quest)) { if (KDQuests[quest]?.accept) { @@ -1031,7 +1030,7 @@ function KDAddQuest(quest) { } } -function KDHasQuest(quest) { +function KDHasQuest(quest: string): boolean { if (!KDGameData.Quests) return false; return KDGameData.Quests.includes(quest); } @@ -1079,7 +1078,7 @@ function KinkyDungeonDrawQuest() { 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 (DrawButtonKDEx("kdquestquit" + q, (_b) => { if (!KDQuests[q]?.nocancel) KDRemoveQuest(q); return true; @@ -1106,11 +1105,11 @@ function KinkyDungeonDrawQuest() { } if (KDQuestsVisible > KDMaxQuests) { - DrawButtonKDEx("questUp", (b) => { + DrawButtonKDEx("questUp", (_b) => { KDQuestsIndex -= 2; return true; }, true, xStart, yStart - spacing, 90, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Up.png"); - DrawButtonKDEx("questDown", (b) => { + DrawButtonKDEx("questDown", (_b) => { KDQuestsIndex += 2; return true; }, true, xStart, yStart + KDMaxQuests*spacing, 90, 40, "", "#ffffff", KinkyDungeonRootDirectory + "Down.png"); @@ -1125,29 +1124,29 @@ function KinkyDungeonDrawQuest() { KDDrawLoreRepTabs(xOffset); } -function KDGetQuestData(quest) { +function KDGetQuestData(quest: string): any { if (KDGameData.QuestData) return KDGameData.QuestData[quest] || {}; return {}; } -function KDSetQuestData(quest, data) { + +function KDSetQuestData(quest: string, data: any) { if (!KDGameData.QuestData) KDGameData.QuestData = {}; KDGameData.QuestData[quest] = data; } /** - * - * @param {string} Name - * @param {string} Icon - * @param {string} Goddess - * @param {(Goddess, Flag) => void} spawnFunction - * @param {number} Rep - * @param {number} restraintsCountMult - * @param {string[]} restraintsTags - * @returns {KDQuest} + * @param Name + * @param Icon + * @param Goddess + * @param spawnFunction + * @param restraintsCountMult + * @param restraintsTags + * @param [Loot] + * @param [Rep] */ -function KDGenQuestTemplate(Name, Icon, Goddess, spawnFunction, restraintsCountMult, restraintsTags, Loot, Rep = KDDefaultGoddessQuestRep) { +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 = { + let quest: KDQuest = { name: Name, npc: Icon, visible: true, @@ -1215,14 +1214,14 @@ function KDGenQuestTemplate(Name, Icon, Goddess, spawnFunction, restraintsCountM } } }, - weight: (RoomType, MapMod, data, currentQuestList) => { + weight: (_RoomType, _MapMod, _data, _currentQuestList) => { return 10; }, - prerequisite: (RoomType, MapMod, data, currentQuestList) => { + prerequisite: (_RoomType, _MapMod, _data, _currentQuestList) => { return false; }, tags: [Goddess], }; return quest; -} \ No newline at end of file +} diff --git a/Game/src/faction/KinkyDungeonReputation.js b/Game/src/faction/KinkyDungeonReputation.ts similarity index 88% rename from Game/src/faction/KinkyDungeonReputation.js rename to Game/src/faction/KinkyDungeonReputation.ts index 661a9b2bf..ee61c04cd 100644 --- a/Game/src/faction/KinkyDungeonReputation.js +++ b/Game/src/faction/KinkyDungeonReputation.ts @@ -95,28 +95,14 @@ let KDFactionGoddess = { }, }; -/** - * @type {Record} - */ -let KinkyDungeonGoddessRep = { -}; +let KinkyDungeonGoddessRep: Record = {}; -/** - * @type {Record} - */ -let KinkyDungeonRescued = {}; -/** - * @type {Record} - */ -let KinkyDungeonAid = {}; +let KinkyDungeonRescued: Record = {}; +let KinkyDungeonAid: Record = {}; let KDRepSelectionMode = ""; -/** - * - * @type {Object.} - */ -let KDBlessedRewards = { +let KDBlessedRewards: Record = { "Latex": ["TheEncaser"], "Rope": ["MoiraiScissors"], "Metal": ["BondageBuster"], @@ -129,9 +115,8 @@ let KDBlessedRewards = { /** * Returns whether or not the player meets a requirement for a pearl reward chest - * @returns {boolean} */ -function KDPearlRequirement() { +function KDPearlRequirement(): boolean { let has = false; for (let rep of Object.entries(KinkyDungeonGoddessRep)) { let rewards = KDBlessedRewards[rep[0]]; @@ -153,6 +138,24 @@ function KDPearlRequirement() { 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) { @@ -173,11 +176,9 @@ function KinkyDungeonInitReputation() { } /** - * - * @param {number} Amount - * @returns {string} + * @param Amount */ -function KinkyDungeonRepName(Amount) { +function KinkyDungeonRepName(Amount: number): string { let name = ""; if (Amount >= 10) name = "Thankful"; @@ -192,11 +193,9 @@ function KinkyDungeonRepName(Amount) { /** - * - * @param {number} Amount - * @returns {string} + * @param Amount */ -function KinkyDungeonRepNameFaction(Amount) { +function KinkyDungeonRepNameFaction(Amount: number): string { let name = ""; if (Amount > 0.2) name = "Thankful"; @@ -210,12 +209,10 @@ function KinkyDungeonRepNameFaction(Amount) { } /** - * - * @param {string} Rep - * @param {number} Amount - * @returns {boolean} + * @param Rep + * @param Amount */ -function KinkyDungeonChangeFactionRep(Rep, Amount) { +function KinkyDungeonChangeFactionRep(Rep: string, Amount: number): boolean { let last = KDFactionRelation("Player", Rep); KDChangeFactionRelation("Player", Rep, Amount); let curr = KDFactionRelation("Player", Rep); @@ -230,12 +227,10 @@ function KinkyDungeonChangeFactionRep(Rep, Amount) { } /** - * - * @param {string} Rep - * @param {number} Amount - * @returns {boolean} + * @param Rep + * @param Amount */ -function KinkyDungeonChangeRep(Rep, Amount) { +function KinkyDungeonChangeRep(Rep: string, Amount: number): boolean { if (KinkyDungeonGoddessRep[Rep] != undefined) { let last = KinkyDungeonGoddessRep[Rep]; let minimum = (Rep == "Ghost" && KinkyDungeonStatsChoice.get("Submissive")) || (Rep == "Prisoner" && KinkyDungeonStatsChoice.get("Wanted")) ? 20: -50; @@ -257,17 +252,19 @@ function KinkyDungeonChangeRep(Rep, Amount) { } if (KDFactionGoddess[Rep]) { - for (let f of Object.entries(KDFactionGoddess[Rep])) { + for (const [k, v] of Object.entries(KDFactionGoddess[Rep]) as [string, number][]) { 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; + /* FIXME: Check I refactored this correctly. */ + 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", f[0], f[1] * mult * Amount); + KDChangeFactionRelation("Player", k, v * mult * Amount); } } @@ -277,7 +274,7 @@ function KinkyDungeonChangeRep(Rep, Amount) { return false; } -function KinkyDungeonHandleReputation() { +function KinkyDungeonHandleReputation(): boolean { return true; } @@ -362,7 +359,7 @@ function KinkyDungeonDrawReputation() { return true; }, true, 900, 800, 250, 50, TextGet("KinkyDungeonAskChampion"), "white");*/ } else { - DrawButtonKDEx("backtorep", (bdata) => { + DrawButtonKDEx("backtorep", (_bdata) => { KDRepSelectionMode = ""; return true; }, true, 600, 800, 550, 50, TextGet("KinkyDungeonBack"), "white"); @@ -371,7 +368,7 @@ function KinkyDungeonDrawReputation() { 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) => { + DrawButtonKDEx("rep_rescue" + rep, (_bdata) => { if (KinkyDungeonCanRescue(rep, value)) { if (KDSendInput("rescue", {rep: rep, value: value}) != "FailRescue") { KinkyDungeonDrawState = "Game"; @@ -387,7 +384,7 @@ function KinkyDungeonDrawReputation() { } if (KDRepSelectionMode == "Champion") { let isChampion = KDGameData.Champion == rep; - DrawButtonKDEx("rep_champ" + rep, (bdata) => { + 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"), @@ -560,20 +557,17 @@ function KinkyDungeonDrawFactionRep() { /** * Current costs multipliers for shrines - * @type {Record} */ -let KinkyDungeonPenanceCosts = {}; +let KinkyDungeonPenanceCosts: Record = {}; let KinkyDungeonPenanceRepBonus = 5; let KinkyDungeonPenanceRepBonusFail = 1; let KinkyDungeonPenanceCostGrowth = 50; let KinkyDungeonPenanceCostDefault = 200; /** - * - * @param {string} rep - * @returns {number} + * @param rep */ -function KinkyDungeonPenanceCost(rep) { +function KinkyDungeonPenanceCost(rep: string): number { if (KinkyDungeonGoddessRep[rep]) { if (KinkyDungeonPenanceCosts[rep]) { return KinkyDungeonPenanceCosts[rep]; @@ -583,47 +577,40 @@ function KinkyDungeonPenanceCost(rep) { } /** - * - * @param {string} rep - * @param {number} value - * @returns {boolean} + * @param rep + * @param value */ -function KinkyDungeonCanPenance(rep, value) { +function KinkyDungeonCanPenance(_rep: string, value: number): boolean { return value < 40 && !KDGameData.KinkyDungeonPenance && KDMapData.Bullets.length < 1; } /** - * - * @param {string} rep - * @returns {number} + * @param rep + * @param value */ -function KinkyDungeonAidManaCost(rep, 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 {string} rep - * @param {number} value - * @returns {number} + * @param rep + * @param value */ -function KinkyDungeonAidManaAmount(rep, value) { +function KinkyDungeonAidManaAmount(_rep: string, _value: number): number { return KinkyDungeonStatManaMax - KinkyDungeonStatMana;//1 + Math.floor(19 * (value + 50) / 100); } /** - * - * @param {string} rep - * @param {number} value - * @returns {boolean} + * @param rep + * @param value */ -function KinkyDungeonCanAidMana(rep, value) { +function KinkyDungeonCanAidMana(_rep: string, value: number): boolean { return value > -30 && KinkyDungeonStatMana < KinkyDungeonStatManaMax; } -function KinkyDungeonRescueTiles() { - let tiles = []; +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) { @@ -636,20 +623,17 @@ function KinkyDungeonRescueTiles() { } /** - * - * @param {string} rep - * @param {number} value - * @returns {boolean} + * @param rep + * @param value */ -function KinkyDungeonCanRescue(rep, value) { +function KinkyDungeonCanRescue(rep: string, value: number): boolean { return KinkyDungeonAllRestraint().length > 0 && value > KDRAGE && !KinkyDungeonRescued[rep] && KinkyDungeonRescueTiles().length > 0; } /** - * - * @param {number} delta + * @param delta */ -function KinkyDungeonUpdateAngel(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)) { @@ -670,11 +654,10 @@ function KinkyDungeonUpdateAngel(delta) { } /** - * - * @param {number} x - * @param {number} y + * @param x + * @param y */ -function KinkyDungeonCreateAngel(x, y) { +function KinkyDungeonCreateAngel(x: number, y: number) { let point = KinkyDungeonGetNearbyPoint(x, y, true, undefined, true); if (point) { let Enemy = KinkyDungeonGetEnemyByName("Angel"); diff --git a/Game/src/fight/KinkyDungeonFight.js b/Game/src/fight/KinkyDungeonFight.ts similarity index 90% rename from Game/src/fight/KinkyDungeonFight.js rename to Game/src/fight/KinkyDungeonFight.ts index b88f5e5b8..64c1f8d88 100644 --- a/Game/src/fight/KinkyDungeonFight.js +++ b/Game/src/fight/KinkyDungeonFight.ts @@ -15,15 +15,34 @@ let KDUnfocusedParams = { 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 -/** - * @type {Map} - */ -let KinkyDungeonBulletsVisual = new Map(); // Bullet sprites 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; @@ -117,10 +136,8 @@ let KinkyDungeonMasochistDamageTypes = ["crush", "pain", "unarmed", "electric", // Weapons let KinkyDungeonPlayerWeapon = ""; 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 KinkyDungeonPlayerDamageDefault: weapon = {name: "", dmg: 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}, @@ -157,24 +174,22 @@ let KinkyDungeonDamageTypes = { }; /** - * - * @param {Named} item - * @returns {weapon} + * @param item */ -function KDWeapon(item) { +function KDWeapon(item: Named): weapon { if (!item) return null; return KinkyDungeonWeapons[KinkyDungeonWeaponVariants[item.name]?.template || item.name]; } -function KinkyDungeonFindWeapon(Name) { +function KinkyDungeonFindWeapon(Name: string) { for (let con of Object.values(KinkyDungeonWeapons)) { if (con.name == Name) return con; } return undefined; } -function KinkyDungeonWeaponCanCut(RequireInteract, MagicOnly) { +function KinkyDungeonWeaponCanCut(RequireInteract: boolean, MagicOnly?: boolean): boolean { if (KinkyDungeonPlayerWeapon && KDWeapon({name: KinkyDungeonPlayerWeapon})?.cutBonus != undefined && (!MagicOnly || KDWeaponIsMagic({name: KinkyDungeonPlayerWeapon})) @@ -187,19 +202,19 @@ function KinkyDungeonWeaponCanCut(RequireInteract, MagicOnly) { return false; } -// We reset the pity timer on weapon switch to prevent issues /** - * - * @param {string} Weapon - * @param {boolean} [forced] + * We reset the pity timer on weapon switch to prevent issues + * @param Weapon + * @param [forced] */ -function KDSetWeapon(Weapon, 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 = { @@ -218,7 +233,7 @@ function KDCanWieldWeapon(weapon, HandsFree, NoOverride) { return true; }*/ -function KinkyDungeonGetPlayerWeaponDamage(HandsFree, NoOverride) { +function KinkyDungeonGetPlayerWeaponDamage(HandsFree?: boolean, NoOverride?: boolean): weapon { let flags = { KDDamageHands: true.valueOf, KDDamageArms: true.valueOf, @@ -304,10 +319,10 @@ function KinkyDungeonGetPlayerWeaponDamage(HandsFree, NoOverride) { return KinkyDungeonPlayerDamage; } /** - * @param {weapon} weapon + * @param weapon * @returns true if the weapon represents Unarmed */ -function isUnarmed(weapon) { +function isUnarmed(weapon: weapon): boolean { return !weapon || !weapon.name || weapon.name == "Unarmed" || weapon.unarmed; } @@ -317,7 +332,7 @@ let KinkyDungeonEvasionPityModifierIncrementPercentage = 0.5; // Percent of the let KDDefaultCrit = 1.3; let KDDefaultBindCrit = 1.5; -function KinkyDungeonGetCrit(accuracy, Damage, Enemy) { +function KinkyDungeonGetCrit(accuracy?: number, Damage?: weapon, Enemy?: entity) { if (accuracy == undefined) accuracy = KinkyDungeonGetEvasion(); let data = { Damage: Damage, @@ -331,7 +346,7 @@ function KinkyDungeonGetCrit(accuracy, Damage, Enemy) { return (data.basecrit + data.critboost) * data.critmult; } -function KinkyDungeonGetBindCrit(accuracy, Damage, Enemy) { +function KinkyDungeonGetBindCrit(accuracy?: number, Damage?: weapon, Enemy?: entity) { if (accuracy == undefined) accuracy = KinkyDungeonGetEvasion(); let data = { Damage: Damage, @@ -356,22 +371,22 @@ function KDGetSpellAccuracy() { return (data.accuracy + data.accuracyBonus) * data.accuracyMult; } -function KDGetSlowMult(Enemy) { +function KDGetSlowMult(Enemy: entity): number { let mult = 1; - if (Enemy && Enemy.bind > 0) mult *= 3; - else if (Enemy && Enemy.slow > 0) mult *= 2; + 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.25 * KDBoundEffects(Enemy); + if (Enemy) mult *= 1 + 0.125 * KDBoundEffects(Enemy); } return mult; } -function KinkyDungeonGetEvasion(Enemy, NoOverride, IsSpell, IsMagic, cost) { +function KinkyDungeonGetEvasion(Enemy?: entity, NoOverride?: boolean, IsSpell?: boolean, IsMagic?: boolean, cost?: boolean): number { let flags = { KDEvasionHands: true, KDEvasionSight: true, @@ -424,8 +439,13 @@ function KinkyDungeonGetEvasion(Enemy, NoOverride, IsSpell, IsMagic, cost) { } -function KinkyDungeonAggro(Enemy, Spell, Attacker, Faction) { - if (Enemy && Enemy.Enemy && (!Spell || !Spell.enemySpell) && (!Spell || !Spell.noAggro) && (!Faction || Faction == "Player") && !(Enemy.rage > 0) && (!Attacker || Attacker.player || Attacker.Enemy.allied)) { +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 || Attacker.player || Attacker.Enemy.allied)) { if (Enemy.playWithPlayer && (KDCanDom(Enemy) || !KDHostile(Enemy))) { KDAddThought(Enemy.id, "Embarrassed", 5, 1); Enemy.distraction = (Enemy.distraction || 0) + Enemy.Enemy.maxhp * 0.1; @@ -436,6 +456,14 @@ function KinkyDungeonAggro(Enemy, Spell, Attacker, Faction) { } } } 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); @@ -494,7 +522,7 @@ function KDCalcRestraintBlock() { return val; } -function KinkyDungeonPlayerEvasion(Event) { +function KinkyDungeonPlayerEvasion(Event?: boolean): number { let data = { playerEvasionMult: 1.0, penalty: KDPlayerEvasionPenalty(), @@ -515,7 +543,7 @@ function KinkyDungeonPlayerEvasion(Event) { return data.val; } -function KinkyDungeonPlayerBlock(Event) { +function KinkyDungeonPlayerBlock(_Event?: boolean): number { let playerBlockMult = 1.0; let blk = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Block"); let playerBlockPenalty = blk > 0 ? Math.min(1, KDPlayerBlockPenalty()) : 0; @@ -535,7 +563,7 @@ function KinkyDungeonPlayerBlockLinear() { return val; } -function KinkyDungeonGetPlayerStat(stat, mult) { +function KinkyDungeonGetPlayerStat(stat: any, mult?: number) { let data = { mult: mult, stat: !mult ? KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, stat) : KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, stat)), @@ -545,11 +573,11 @@ function KinkyDungeonGetPlayerStat(stat, mult) { return data.stat; } -function KDRestraintBlockPower(block, power) { +function KDRestraintBlockPower(block: any, power: number): number { return KinkyDungeonMultiplicativeStat(block / Math.max(1, power)); } -function KinkyDungeonEvasion(Enemy, IsSpell, IsMagic, Attacker, chance) { +function KinkyDungeonEvasion(Enemy: entity, IsSpell?: boolean, IsMagic?: boolean, Attacker?: entity, chance?: number) { let hitChance = chance != undefined ? chance : KinkyDungeonGetEvasion(Enemy, undefined, IsSpell, IsMagic, true); @@ -565,7 +593,7 @@ function KinkyDungeonEvasion(Enemy, IsSpell, IsMagic, Attacker, chance) { 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.Enemy.hp < 0.9 * Enemy.Enemy.maxhp ? true : KDRandom() < 0.33))) { + 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: @@ -585,7 +613,7 @@ function KinkyDungeonEvasion(Enemy, IsSpell, IsMagic, Attacker, chance) { if (point) { KDMoveEntity(Enemy, point.x, point.y, true, true, true, false); Enemy.movePoints = 0; - if (!Enemy.Enemy.attackWhileMoving && !Enemy.Enemy.attackWhileDodging) { + if (!Enemy.Enemy.attackWhileMoving) { Enemy.attackPoints = 0; Enemy.warningTiles = []; } @@ -616,34 +644,47 @@ function KinkyDungeonEvasion(Enemy, IsSpell, IsMagic, Attacker, chance) { * @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) { +function KinkyDungeonGetImmunity(tags, profile, type, resist, mode = 0) { 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; - if (profile) { - for (let pp of profile) { - let p = KDResistanceProfiles[pp]; - if (p && (p[t + resist] - || ((KinkyDungeonMeleeDamageTypes.includes(t) && (type != "unarmed" || !resist.includes("weakness"))) && p["melee" + resist]) - || (!KinkyDungeonMeleeDamageTypes.includes(t) && p["magic"+resist]))) - return true; + 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; + } } } + return false; } let KDDamageQueue = []; -function KDArmorFormula(DamageAmount, Armor) { +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); @@ -651,22 +692,20 @@ function KDArmorFormula(DamageAmount, Armor) { /** - * - * @param {entity} Enemy - * @param {*} Damage - * @param {*} Ranged - * @param {*} NoMsg - * @param {*} Spell - * @param {*} bullet - * @param {*} attacker - * @param {*} Delay - * @param {*} noAlreadyHit - * @param {*} noVuln - * @param {*} Critical - * @param {boolean} [Attack] - * @returns + * @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, Damage, Ranged, NoMsg, Spell, bullet, attacker, Delay, noAlreadyHit, noVuln, Critical, Attack) { +function KinkyDungeonDamageEnemy(Enemy: entity, Damage: any, Ranged: boolean, NoMsg: boolean, Spell: any, 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 @@ -721,6 +760,7 @@ function KinkyDungeonDamageEnemy(Enemy, Damage, Ranged, NoMsg, Spell, bullet, at shield_vuln: Damage?.shield_vuln, // Vuln thru shield tease: Damage?.tease, stunResist: 0, + distractMult: undefined, }; if (KDDamageEquivalencies[predata.type]) predata.bufftype = KDDamageEquivalencies[predata.type]; @@ -840,10 +880,15 @@ function KinkyDungeonDamageEnemy(Enemy, Damage, Ranged, NoMsg, Spell, bullet, at if (Enemy.Enemy.tags) { - if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, Enemy.Enemy.Resistance?.profile, predata.type, "severeweakness")) resistDamage = -2; - else if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, Enemy.Enemy.Resistance?.profile, predata.type, "weakness")) resistDamage = -1; - else if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, Enemy.Enemy.Resistance?.profile, predata.type, "immune")) resistDamage = 2; - else if (KinkyDungeonGetImmunity(Enemy.Enemy.tags, Enemy.Enemy.Resistance?.profile, predata.type, "resist")) resistDamage = 1; + 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; @@ -1265,8 +1310,16 @@ function KinkyDungeonDamageEnemy(Enemy, Damage, Ranged, NoMsg, Spell, bullet, at 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)); + 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)); KinkyDungeonSendEvent("afterDamageEnemy", predata); @@ -1356,7 +1409,7 @@ function KinkyDungeonDamageEnemy(Enemy, Damage, Ranged, NoMsg, Spell, bullet, at return predata.dmgDealt + predata.dmgShieldDealt; } -function KinkyDungeonDisarm(Enemy, suff) { +function KinkyDungeonDisarm(Enemy: entity, suff?: string): boolean { if (!KinkyDungeonPlayerDamage || KinkyDungeonPlayerDamage.unarmed) return false; if (!Enemy) { @@ -1413,14 +1466,12 @@ function KinkyDungeonDisarm(Enemy, suff) { } /** - * - * @param {entity} Enemy - * @param {*} Damage - * @param {number} [chance] - * @param {any} [bullet] - * @returns {boolean} + * @param Enemy + * @param Damage + * @param [chance] + * @param [bullet] */ -function KinkyDungeonAttackEnemy(Enemy, Damage, chance, bullet) { +function KinkyDungeonAttackEnemy(Enemy: entity, Damage: any, 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; @@ -1549,7 +1600,7 @@ let KDBulletWarnings = []; let KDUniqueBulletHits = new Map(); -function KDUpdateBulletEffects(b, d) { +function KDUpdateBulletEffects(b: any, d: number) { // At the start we guarantee interactions if (!b.bullet.noInteractTiles) { let rad = b.bullet.aoe || 0.5; @@ -1562,7 +1613,7 @@ function KDUpdateBulletEffects(b, d) { } } -function KinkyDungeonUpdateBullets(delta, Allied) { +function KinkyDungeonUpdateBullets(delta: number, Allied?: boolean): void { if (delta > 0) { if (Allied) KDUniqueBulletHits = new Map(); @@ -1795,7 +1846,7 @@ function KinkyDungeonUpdateBullets(delta, Allied) { } } -function KinkyDungeonUpdateSingleBulletVisual(b, end, delay) { +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; @@ -1814,7 +1865,7 @@ function KinkyDungeonUpdateSingleBulletVisual(b, end, delay) { } } -function KinkyDungeonUpdateBulletVisuals(delta) { +function KinkyDungeonUpdateBulletVisuals(delta: number) { if (delta > 0) for (let b of KinkyDungeonBulletsVisual.entries()) { if (b[1].updated) { @@ -1825,7 +1876,7 @@ function KinkyDungeonUpdateBulletVisuals(delta) { let KinkyDungeonCurrentTick = 0; -function KinkyDungeonUpdateBulletsCollisions(delta, Catchup) { +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)) { @@ -1849,20 +1900,24 @@ function KinkyDungeonUpdateBulletsCollisions(delta, Catchup) { } -function KDCheckCollideableBullets(entity, force) { +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); - //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); + 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; @@ -1876,16 +1931,15 @@ function KDCheckCollideableBullets(entity, force) { } /** - * - * @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 + * @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, born, outOfTime, outOfRange, d, dt, end) { +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)) { @@ -2193,15 +2247,43 @@ function KinkyDungeonBulletHit(b, born, outOfTime, outOfRange, d, dt, end) { let point = KinkyDungeonGetNearbyPoint(b.x, b.y, true, undefined, false, false); if (point) { KinkyDungeonSetFlag("teleported", 1); - KDMovePlayer(point.x, point.y, false); - KinkyDungeonSendTextMessage(10, TextGet("KDTeleportNearby"), "#e7cf1a", 2, undefined, undefined, undefined, "Combat"); + 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); - KDMovePlayer(b.x, b.y, true); + 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"); + } } @@ -2260,32 +2342,54 @@ function KinkyDungeonBulletHit(b, born, outOfTime, outOfRange, d, dt, end) { /** - * - * @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] - * @returns {entity[]} + * @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, y, summonType, count, rad, strict, lifetime, hidden, goToTarget, faction, hostile, minrad, startAware, noBullet, hideTimer, pathfind, mod, boundTo, weakBinding, teleportTime, ox, 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 +): 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++) { @@ -2313,7 +2417,7 @@ function KinkyDungeonSummonEnemy(x, y, summonType, count, rad, strict, lifetime, ) : 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, + let e: entity = {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, 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); @@ -2341,11 +2445,11 @@ function KinkyDungeonSummonEnemy(x, y, summonType, count, rad, strict, lifetime, return created; } -function KinkyDungeonBulletDoT(b) { +function KinkyDungeonBulletDoT(b: any) { KinkyDungeonBulletHit(b, 1.1); } -function KinkyDungeonBulletTrail(b) { +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) { @@ -2403,7 +2507,7 @@ function KinkyDungeonBulletTrail(b) { return trail; } -function KinkyDungeonBulletsCheckCollision(bullet, AoE, force, d, inWarningOnly, delta) { +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; @@ -2426,7 +2530,7 @@ function KinkyDungeonBulletsCheckCollision(bullet, AoE, force, d, inWarningOnly, } let nomsg = bullet.bullet && bullet.bullet.spell && bullet.bullet.spell.enemyspell && !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) => {return enemy.Enemy.tags[tag];})); + 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); @@ -2465,7 +2569,7 @@ function KinkyDungeonBulletsCheckCollision(bullet, AoE, force, d, inWarningOnly, return true; } -function KDBulletAoECanHitEntity(bullet, enemy) { +function KDBulletAoECanHitEntity(bullet: any, enemy: entity): boolean { 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))) @@ -2480,7 +2584,7 @@ function KDBulletAoECanHitEntity(bullet, enemy) { && (!bullet.bullet.spell || !bullet.bullet.spell.noUniqueHits || !KDUniqueBulletHits.get(KDBulletID(bullet, enemy))); } } -function KDBulletCanHitEntity(bullet, enemy, inWarningOnly, overrideCollide) { +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"))) @@ -2499,11 +2603,7 @@ function KDBulletCanHitEntity(bullet, enemy, inWarningOnly, overrideCollide) { } } -/** - * - * @param {any} bullet - */ -function KDBulletEffectTiles(bullet) { +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, @@ -2522,7 +2622,7 @@ function KDBulletEffectTiles(bullet) { } } -function KDBulletHitPlayer(bullet, player) { +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); @@ -2531,13 +2631,12 @@ function KDBulletHitPlayer(bullet, player) { } /** - * - * @param {any} bullet - * @param {entity} enemy - * @param {number} d - * @param {boolean} nomsg + * @param bullet + * @param enemy + * @param d + * @param nomsg */ -function KDBulletHitEnemy(bullet, enemy, d, 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") { @@ -2547,7 +2646,7 @@ function KDBulletHitEnemy(bullet, enemy, d, nomsg) { 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) + } 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") @@ -2556,14 +2655,14 @@ function KDBulletHitEnemy(bullet, enemy, d, nomsg) { } // Gets ID for unique bullet hits -function KDBulletID(bullet, enemy) { +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, y, targetx, targety, speed, bullet, miscast, ox, oy) { +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; @@ -2584,7 +2683,7 @@ function KinkyDungeonLaunchBullet(x, y, targetx, targety, speed, bullet, miscast let KDLastFightDelta = 0; -function KinkyDungeonDrawFight(canvasOffsetX, canvasOffsetY, CamX, CamY) { +function KinkyDungeonDrawFight(_canvasOffsetX: number, _canvasOffsetY: number, CamX: number, CamY: number) { let delta = CommonTime() - KDLastFightDelta; KDLastFightDelta = CommonTime(); for (let damage of KDDamageQueue) { @@ -2677,7 +2776,7 @@ function KinkyDungeonDrawFight(canvasOffsetX, canvasOffsetY, CamX, CamY) { } } -function KinkyDungeonSendWeaponEvent(Event, data) { +function KinkyDungeonSendWeaponEvent(Event: string, data: any) { if (!KDMapHasEvent(KDEventMapWeapon, Event)) return; if (KinkyDungeonPlayerDamage && KinkyDungeonPlayerDamage.events) { for (let e of KinkyDungeonPlayerDamage.events) { @@ -2704,7 +2803,7 @@ function KinkyDungeonSendWeaponEvent(Event, data) { } } -function KinkyDungeonSendBulletEvent(Event, b, data) { +function KinkyDungeonSendBulletEvent(Event: string, b: any, data: any) { if (!KDMapHasEvent(KDEventMapBullet, Event)) return; if (b && b.bullet) { if (b.bullet.events) @@ -2741,7 +2840,7 @@ function KinkyDungeonSendBulletEvent(Event, b, data) { } -function KDHealRepChange(enemy, amount) { +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) { @@ -2765,7 +2864,7 @@ function KDHealRepChange(enemy, amount) { } } -function KDApplyGenBuffs(entity, buff, time) { +function KDApplyGenBuffs(entity: entity, buff: string, time: number) { let buffs = KDBuffReference[buff]; if (buffs && entity) { for (let b of buffs) { @@ -2776,7 +2875,7 @@ function KDApplyGenBuffs(entity, buff, time) { } } -function KDSilenceEnemy(enemy, time) { +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; @@ -2784,7 +2883,7 @@ function KDSilenceEnemy(enemy, time) { enemy.silence = Math.max(time, enemy.silence); } } -function KDBlindEnemy(enemy, time) { +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; @@ -2793,7 +2892,7 @@ function KDBlindEnemy(enemy, time) { } } -function KDDisarmEnemy(enemy, time) { +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; @@ -2802,11 +2901,8 @@ function KDDisarmEnemy(enemy, time) { } } -/** - * @type {Record boolean>} - */ -let KDConditions = { - "DamageTypeTeasing": (e, data) => { +let KDConditions: Record boolean> = { + "DamageTypeTeasing": (_e, data) => { return data.damage && KDIsTeasing(data.damage); }, "DamageType": (e, data) => { @@ -2816,22 +2912,23 @@ let KDConditions = { return data.spell?.tags?.includes(e.kind); }, }; -function KDCheckCondition(e, data) { + +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 = { - "HasWill": (enemy, e, data) => { +let KDPrereqs: Record boolean> = { + "HasWill": (_enemy, _e, _data) => { return KinkyDungeonStatWill >= 0.1; }, - "noCorruption": (enemy, e, data) => { + "noCorruption": (_enemy, _e, _data) => { return !KinkyDungeonFlags.get("CurseTypeCorruption") || (KinkyDungeonFlags.get("CurseTypeLight") && KinkyDungeonFlags.get("CurseTypeCorruption") && KinkyDungeonFlags.get("CurseTypeLight") > KinkyDungeonFlags.get("CurseTypeCorruption")); }, - "AlreadyCursed": (enemy, e, data) => { + "AlreadyCursed": (_enemy, e, _data) => { if (KinkyDungeonPlayerTags.get("CursedSet")) return false; if (e.tags && !KinkyDungeonGetRestraint({tags: [...e.tags],}, MiniGameKinkyDungeonLevel, @@ -2842,40 +2939,40 @@ let KDPrereqs = { } 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) => { + "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) => { + "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) => { + "afterAmbush": (enemy, _e, _data) => { return !enemy?.ambushtrigger; }, - "HaveDildoBatPlus": (enemy, e, data) => { + "HaveDildoBatPlus": (_enemy, _e, _data) => { return KinkyDungeonPlayerWeapon == "DildoBatPlus"; }, - "LightLoad": (enemy, e, data) => { + "LightLoad": (_enemy, e, _data) => { if (e.requireEnergy && KDGameData.AncientEnergyLevel < e.energyCost) return false; return !( KinkyDungeonLastAction == "Attack" || KinkyDungeonLastAction == "Cast" || KinkyDungeonLastAction == "Struggle"); }, - "HeavyLoad": (enemy, e, data) => { + "HeavyLoad": (_enemy, e, _data) => { if (e.requireEnergy && KDGameData.AncientEnergyLevel < e.energyCost) return false; return !( KinkyDungeonLastAction == "Attack" @@ -2883,37 +2980,36 @@ let KDPrereqs = { || KinkyDungeonLastAction == "Cast" || KinkyDungeonLastAction == "Struggle"); }, - "Loaded": (enemy, e, data) => { // Really crude code + "Loaded": (_enemy, _e, _data) => { // Really crude code return KinkyDungeonPlayerBuffs && KinkyDungeonPlayerBuffs[KinkyDungeonPlayerDamage.name + "Load"] && KinkyDungeonPlayerBuffs[KinkyDungeonPlayerDamage.name + "Load"].aura == undefined; }, }; -function KDCheckPrereq(enemy, prereq, e, data) { +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) { +function KDBulletAoEMod(b: any) { return b?.bullet?.aoetype || b?.bullet?.spell?.aoetype; } -function KDBulletTrailAoEMod(b) { +function KDBulletTrailAoEMod(b: any) { 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 - * @param {originx} xx - * @param {originy} yy + * @param bx + * @param by + * @param xx + * @param yy + * @param rad + * @param [modifier] + * @param [originx] + * @param [originy] */ -function AOECondition(bx, by, xx, yy, rad, modifier = "", originx, 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) { @@ -2934,12 +3030,11 @@ function AOECondition(bx, by, xx, yy, rad, modifier = "", originx, originy) { } /** - * - * @param {number} xx - * @param {number} yy - * @param {string} name + * @param xx + * @param yy + * @param name */ -function KDCreateParticle(xx, yy, 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}}; @@ -2947,19 +3042,18 @@ function KDCreateParticle(xx, yy, name) { KinkyDungeonUpdateSingleBulletVisual(newB, false); } -function KDIsTeasing(Damage) { +function KDIsTeasing(Damage: any): boolean { return Damage && (Damage.tease || KinkyDungeonTeaseDamageTypes.includes(Damage.type)); } /** - * - * @param {number} x - * @param {number} y - * @param {number} aoe - * @param {any} Damage - * @param {entity} Damage + * @param x + * @param y + * @param aoe + * @param Damage + * @param [Attacker] */ -function KDDealEnvironmentalDamage(x, y, aoe, Damage, 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); } @@ -2970,7 +3064,7 @@ function KDDealEnvironmentalDamage(x, y, aoe, Damage, Attacker) { -function KDCanOffhand(item) { +function KDCanOffhand(item: item): boolean { let data = { item: item, is2handed: KDWeapon(item)?.clumsy, @@ -2988,10 +3082,9 @@ function KDCanOffhand(item) { /** * Returns whether or not a weapon takes a damage penalty from not being wielded properly * e.g. staffs - * @param {Named} weapon - * @returns {boolean} + * @param weapon */ -function KDWeaponNoDamagePenalty(weapon) { +function KDWeaponNoDamagePenalty(weapon: Named): boolean { if (KDWeapon({name: weapon.name})?.noDamagePenalty) return true; // Quik n dirty if (KinkyDungeonWeaponVariants[weapon.name]?.events?.some((e) => { @@ -3001,10 +3094,9 @@ function KDWeaponNoDamagePenalty(weapon) { /** - * @param {Named} weapon - * @returns {boolean} + * @param weapon */ -function KDWeaponIsMagic(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; @@ -3017,10 +3109,28 @@ function KDEvasiveManeuversCost() { } /** - * - * @param {entity} entity - * @returns {boolean} + * @param entity */ -function KDEntityBlocksExp(entity) { +function KDEntityBlocksExp(entity: entity): boolean { return entity.Enemy?.tags?.bulwark || KDEntityBuffedStat(entity, "Bulwark") > 0; -} \ No newline at end of file +} + +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); + } +} diff --git a/Game/src/fight/KinkyDungeonWeaponList.js b/Game/src/fight/KinkyDungeonWeaponList.ts similarity index 98% rename from Game/src/fight/KinkyDungeonWeaponList.js rename to Game/src/fight/KinkyDungeonWeaponList.ts index f3909a542..119bf310d 100644 --- a/Game/src/fight/KinkyDungeonWeaponList.js +++ b/Game/src/fight/KinkyDungeonWeaponList.ts @@ -2,8 +2,7 @@ let KinkyDungeonStatStaminaCostAttack = -1.0; // Cost to attack -/** @type {Record>} */ -let KDWeaponLootList = { +let KDWeaponLootList: Record> = { "CommonWeapon": { "Sword": 1, "Spear": 1, @@ -29,9 +28,8 @@ let KDWeaponLootList = { }; /** - * @type {Record} */ -let KinkyDungeonWeapons = { +let KinkyDungeonWeapons: Record = { "Unarmed": {name: "Unarmed", dmg: 2, chance: 0.9, type: "unarmed", unarmed: true, rarity: 0, shop: false, noequip: true, sfx: "Unarmed", tags: ["unarmed"], events: [ @@ -288,20 +286,26 @@ let KinkyDungeonWeapons = { {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: "arcane", noHands: true, unarmed: false, novulnerable: true, magic: true, rarity: 2, shop: true, sfx: "Laser", + "ArcaneCrystal": {name: "ArcaneCrystal", dmg: 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, 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", dmg: 1.0, chance: 1.0, staminacost: 1.5, crit: 1.5, + "ArcaneTome": {name: "ArcaneTome", dmg: 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, 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", dmg: 1.0, chance: 1.0, staminacost: 1.5, crit: 1.25, + "BondageTome": {name: "BondageTome", dmg: 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, bindType: "Magic", bindEff: 1.5, bindcrit: 2.0, special: {type: "spell", selfCast: true, spell: "TomeBondage", prereq: "HasWill"}, events: [ @@ -312,6 +316,7 @@ let KinkyDungeonWeapons = { "Slimethrower": {name: "Slimethrower", dmg: 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", dmg: 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, @@ -328,14 +333,17 @@ let KinkyDungeonWeapons = { "Pickaxe": {name: "Pickaxe", dmg: 3, chance: 1.0, staminacost: 3.0, type: "pierce", unarmed: false, rarity: 3, shop: true, sfx: "LightSwing", tags: ["utility"], crit: 1.4, + 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", dmg: 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", dmg: 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"}], }, @@ -383,6 +391,7 @@ let KinkyDungeonWeapons = { "VibeWand": {name: "VibeWand", dmg: 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", diff --git a/Game/src/item/KDEnchant.js b/Game/src/item/KDEnchant.ts similarity index 91% rename from Game/src/item/KDEnchant.js rename to Game/src/item/KDEnchant.ts index a3e1c1486..68e418b15 100644 --- a/Game/src/item/KDEnchant.js +++ b/Game/src/item/KDEnchant.ts @@ -59,15 +59,13 @@ let KDEnchantVariantList = { }; /** - * - * @param {number} amt - * @param {string} item - * @param {any} Loot - * @param {string} curse - * @param {string} primaryEnchantment - * @returns {number} + * @param amt + * @param item + * @param Loot + * @param curse + * @param primaryEnchantment */ -function KDGenericMultEnchantmentAmount(amt, item, Loot, curse, 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 @@ -77,14 +75,13 @@ function KDGenericMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchantme /** * Normalized for stats that are multiplicative, E.G mana costs * Only works for stuff normalized to a range of (0-100) - * @param {number} amt - * @param {string} item - * @param {any} Loot - * @param {string} curse - * @param {string} primaryEnchantment - * @returns {number} + * @param amt + * @param item + * @param Loot + * @param curse + * @param primaryEnchantment */ -function KDNormalizedMultEnchantmentAmount(amt, item, Loot, curse, 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; @@ -93,18 +90,17 @@ function KDNormalizedMultEnchantmentAmount(amt, item, Loot, curse, primaryEnchan return 100 * (1 - (1 - original) * Math.pow(1 - original, (amt / (100 * original)))); } -/** @type {Record} */ -let KDEventEnchantmentModular = { +let KDEventEnchantmentModular: Record = { "CommonPair": { tags: ["condition"], types: { 2: null, //consumable 1: null, //weapon 0: /*restraint*/{level: 1, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, - weight: (item, allEnchant) => { + weight: (_item, allEnchant) => { if (allEnchant.includes("condition")) return 0; return 5; }, @@ -116,7 +112,7 @@ let KDEventEnchantmentModular = { enchantments: enchantments, }; return [ - ...KDGenerateEffectConditionPair("Common", "Common", KDModifierEnum.restraint, item, 0, 10, 1, data) + ...KDGenerateEffectConditionPair("Common", "Common", ModifierEnum.restraint, item, 0, 10, 1, data) ];}}, }}, @@ -127,7 +123,7 @@ let KDEventEnchantmentModular = { 2: null, //consumable 1: null, //weapon 0: /*restraint*/{level: 1, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -138,7 +134,7 @@ let KDEventEnchantmentModular = { if (KDRestraint({name: item})?.hobble) return 20; return 3; }, - events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + 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); @@ -154,7 +150,7 @@ let KDEventEnchantmentModular = { types: { 2: null, //consumable 1: /*weapon*/{level: 1, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -163,7 +159,7 @@ let KDEventEnchantmentModular = { if (KDWeapon({name: item})?.crit > KDDefaultCrit) return 10; return 4; }, - events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + 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); @@ -174,7 +170,7 @@ let KDEventEnchantmentModular = { {original: "Accuracy", trigger: "icon", type: "tintIcon", power: 1, color: "#ffffff"}, ];}}, 0: /*restraint*/{level: 1, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -184,7 +180,7 @@ let KDEventEnchantmentModular = { if (KDRestraint({name: item})?.bindarms) return 1; return 24; }, - events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + 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); @@ -201,7 +197,7 @@ let KDEventEnchantmentModular = { 2: null, //consumable 1: null, //weapon 0: /*restraint*/{level: 2, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -212,7 +208,7 @@ let KDEventEnchantmentModular = { if (!KDRestraint({name: item})?.armor) return 15; return 4; }, - events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + 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); @@ -229,7 +225,7 @@ let KDEventEnchantmentModular = { types: { 2: null, //consumable 1: /*weapon*/{level: 1, - filter: (item, allEnchant) => { + filter: (item, _allEnchant) => { return (KinkyDungeonWeapons[item]?.type == 'ice' || KinkyDungeonWeapons[item]?.type == 'frost'); }, weight: (item, allEnchant) => { @@ -237,7 +233,7 @@ let KDEventEnchantmentModular = { if (KDWeapon({name: item})?.type == "ice" || KDWeapon({name: item})?.type == "frost") return 100; return 15; }, - events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + 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); @@ -256,7 +252,7 @@ let KDEventEnchantmentModular = { types: { 2: null, //consumable 1: /*weapon*/{level: 1, - filter: (item, allEnchant) => { + filter: (item, _allEnchant) => { return (KinkyDungeonWeapons[item]?.type == 'cold' || KinkyDungeonWeapons[item]?.light); }, weight: (item, allEnchant) => { @@ -267,7 +263,7 @@ let KDEventEnchantmentModular = { if (KDWeapon({name: item})?.type == "cold") return 100; return 20; }, - events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + 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); @@ -286,14 +282,14 @@ let KDEventEnchantmentModular = { types: { 2: null, //consumable 1: /*weapon*/{level: 1, - filter: (item, allEnchant) => { + 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) => { + 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); @@ -304,7 +300,7 @@ let KDEventEnchantmentModular = { {original: "SpellWard", trigger: "icon", type: "tintIcon", power: 2, color: "#4444ff"}, ];}}, 0: /*restraint*/{level: 2, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -312,7 +308,7 @@ let KDEventEnchantmentModular = { if (KDRestraint({name: item})?.magic) return 40; return 5; }, - events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + 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); @@ -329,7 +325,7 @@ let KDEventEnchantmentModular = { 2: null, //consumable 1: null, //weapon 0: /*restraint*/{level: 2, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -337,7 +333,7 @@ let KDEventEnchantmentModular = { if (KDRestraint({name: item})?.armor || KDRestraint({name: item})?.good) return 10; return 0; }, - events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + 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); @@ -353,7 +349,7 @@ let KDEventEnchantmentModular = { types: { 2: null, //consumable 1: /*weapon*/{level: 3, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -372,7 +368,7 @@ let KDEventEnchantmentModular = { {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) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -400,7 +396,7 @@ let KDEventEnchantmentModular = { 2: null, //consumable 1: null, //weapon 0: /*restraint*/{level: 4, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -429,7 +425,7 @@ let KDEventEnchantmentModular = { 2: null, //consumable 1: null, //weapon 0: /*restraint*/{level: 5, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -442,7 +438,7 @@ let KDEventEnchantmentModular = { if (KDRestraint({name: item})?.armor) return 8; return 3; }, - events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + 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); @@ -459,7 +455,7 @@ let KDEventEnchantmentModular = { 2: null, //consumable 1: null, //weapon 0: /*restraint*/{level: 5, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -493,7 +489,7 @@ let KDEventEnchantmentModular = { 2: null, //consumable 1: null, //weapon 0: /*restraint*/{level: 5, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -501,7 +497,7 @@ let KDEventEnchantmentModular = { if (KDRestraint({name: item})?.magic) return 12; return 6; }, - events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + 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); @@ -518,7 +514,7 @@ let KDEventEnchantmentModular = { 2: null, //consumable 1: null, // weapon 0: /*restraint*/{level: 5, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -548,7 +544,7 @@ let KDEventEnchantmentModular = { types: { 2: null, //consumable 1: /*weapon*/{level: 5, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -571,10 +567,10 @@ let KDEventEnchantmentModular = { {original: "ElementalDmg", trigger: "icon", type: "tintIcon", power: 5, color: "#e7cf1a", bgcolor: KinkyDungeonDamageTypes[type].color}, ];}}, 0: /*restraint*/{level: 5, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, - weight: (item, allEnchant, data) => { + weight: (item, allEnchant, _data) => { if (allEnchant.includes("ElementalDmg")) return 0; if (KDRestraint({name: item})?.armor) return 11; return 8; @@ -599,7 +595,7 @@ let KDEventEnchantmentModular = { 2: null, //consumable 1: null, //weapon 0: /*restraint*/{level: 2, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -607,7 +603,7 @@ let KDEventEnchantmentModular = { if (KDRestraint({name: item})?.gag) return 20; return 12; }, - events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + 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); @@ -624,7 +620,7 @@ let KDEventEnchantmentModular = { 2: null, //consumable 1: null, //weapon 0: /*restraint*/{level: 4, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -633,7 +629,7 @@ let KDEventEnchantmentModular = { if (KDRestraint({name: item})?.bindhands) return 1; return 18; }, - events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + 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); @@ -651,7 +647,7 @@ let KDEventEnchantmentModular = { 2: null, //consumable 1: null, //weapon 0: /*restraint*/{level: 5, - filter: (item, allEnchant) => { + filter: (_item, _allEnchant) => { return true; }, weight: (item, allEnchant) => { @@ -662,7 +658,7 @@ let KDEventEnchantmentModular = { if (KDRestraint({name: item})?.heelpower) return 5; return 3; }, - events: (item, Loot, curse, primaryEnchantment, enchantments, data) => { + 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); @@ -675,26 +671,24 @@ let KDEventEnchantmentModular = { }}, }; -function KDGetItemPower(item) { +function KDGetItemPower(item: string): number { return KinkyDungeonGetRestraintByName(item)?.displayPower || KinkyDungeonGetRestraintByName(item)?.power || 0; } -function KDGetItemRarity(item) { +function KDGetItemRarity(item: string): number { return KinkyDungeonFindWeapon(item)?.rarity || KinkyDungeonFindConsumable(item)?.rarity || 0; } /** - * - * @param {string} item - * @param {*} Loot - * @param {string} curse - * @param {string} primaryEnchantment - * @param {string[]} enchantments - * @param {KDHexEnchantEventsData} data - * @param {string[]} types - * @returns {string} + * @param item + * @param Loot + * @param curse + * @param primaryEnchantment + * @param enchantments + * @param data + * @param types */ -function KDEnchantDetermineKind(item, Loot, curse, primaryEnchantment, enchantments, data, 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) { @@ -749,4 +743,4 @@ function KDEnchantDetermineKind(item, Loot, curse, primaryEnchantment, enchantme } } return type; -} \ No newline at end of file +} diff --git a/Game/src/item/KDHex.js b/Game/src/item/KDHex.ts similarity index 90% rename from Game/src/item/KDHex.js rename to Game/src/item/KDHex.ts index a20012f6e..1a9c336c7 100644 --- a/Game/src/item/KDHex.js +++ b/Game/src/item/KDHex.ts @@ -38,13 +38,12 @@ let KDHexVariantList = { ], }; -/** @type {Record number, events: (data: KDHexEnchantEventsData) => KinkyDungeonEvent[]}>} */ -let KDEventHexModular = { +let KDEventHexModular: Record number, events: (data: KDHexEnchantEventsData) => KinkyDungeonEvent[]}> = { "AntiMagic": {level: 1, - weight: (item, allHex, data) => { + weight: (_item, _allHex, _data) => { return 10; }, - events: (data) => [ + events: (_data) => [ {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}, @@ -55,10 +54,10 @@ let KDEventHexModular = { {original: "AntiMagic", trigger: "icon", type: "tintIcon", power: 8, bgcolor: "#ff5277", color: "#ff5277"}, ]}, "Light": {level: 1, - weight: (item, allHex, data) => { + weight: (_item, _allHex, _data) => { return 8; }, - events: (data) => [ + 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"}, @@ -68,10 +67,10 @@ let KDEventHexModular = { {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, ]}, "Attraction": {level: 4, - weight: (item, allHex, data) => { + weight: (_item, allHex, _data) => { return (!allHex?.includes("Attraction")) ? 2 : 0; }, - events: (data) => [ + 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"}, @@ -80,10 +79,10 @@ let KDEventHexModular = { {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, ]}, "Sensitivity": {level: 1, - weight: (item, allHex, data) => { + weight: (_item, _allHex, _data) => { return 8; }, - events: (data) => [ + 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"}, @@ -92,10 +91,10 @@ let KDEventHexModular = { {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, ]}, "Submission": {level: 1, - weight: (item, allHex, data) => { + weight: (_item, _allHex, _data) => { return 8; }, - events: (data) => [ + 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"}, @@ -104,10 +103,10 @@ let KDEventHexModular = { {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, ]}, "Distraction": {level: 1, - weight: (item, allHex, data) => { + weight: (_item, _allHex, _data) => { return 8; }, - events: (data) => [ + 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"}, @@ -116,10 +115,10 @@ let KDEventHexModular = { {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, ]}, "Breathlessness": {level: 1, - weight: (item, allHex, data) => { + weight: (_item, _allHex, _data) => { return 8; }, - events: (data) => [ + 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"}, @@ -128,10 +127,10 @@ let KDEventHexModular = { {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, ]}, "Futility": {level: 1, - weight: (item, allHex, data) => { + weight: (_item, _allHex, _data) => { return 8; }, - events: (data) => [ + 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"}, @@ -140,10 +139,10 @@ let KDEventHexModular = { {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, ]}, "Tickle": {level: 1, - weight: (item, allHex, data) => { + weight: (_item, _allHex, _data) => { return 8; }, - events: (data) => [ + 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"}, @@ -152,10 +151,10 @@ let KDEventHexModular = { {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, ]}, "Punish": {level: 2, - weight: (item, allHex, data) => { + weight: (_item, _allHex, _data) => { return 8; }, - events: (data) => [ + 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"}, @@ -167,10 +166,10 @@ let KDEventHexModular = { //region Cursed "CursedHeal": {level: 5, - weight: (item, allHex, data) => { + weight: (_item, _allHex, _data) => { return 30; }, - events: (data) => [ + 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"}, @@ -178,50 +177,50 @@ let KDEventHexModular = { {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, ]}, "CursedCorruption": {level: 6, - weight: (item, allHex, data) => { + weight: (_item, _allHex, _data) => { return 40; }, - events: (data) => [ + 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) => { + weight: (_item, _allHex, _data) => { return 80; }, - events: (data) => [ + 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) => { + weight: (_item, _allHex, _data) => { return 80; }, - events: (data) => [ + 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) => { + weight: (_item, _allHex, _data) => { return 80; }, - events: (data) => [ + 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) => { + weight: (_item, _allHex, _data) => { return KinkyDungeonStatsChoice.get("arousalMode") ? 35 : 0; }, - events: (data) => [ + 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"}, @@ -230,4 +229,4 @@ let KDEventHexModular = { {trigger: "postApply", inheritLinked: true, type: "cursePrefix"}, ]}, //endregion -}; \ No newline at end of file +}; diff --git a/Game/src/item/KDInventoryActions.js b/Game/src/item/KDInventoryActions.ts similarity index 83% rename from Game/src/item/KDInventoryActions.js rename to Game/src/item/KDInventoryActions.ts index 06f74ccd3..49d308123 100644 --- a/Game/src/item/KDInventoryActions.js +++ b/Game/src/item/KDInventoryActions.ts @@ -2,15 +2,14 @@ let KDMarketRateDecay = 0.95; -/** - * @type {Record} - */ -let KDInventoryAction = { +let KDInventoryAction: Record = { "Equip": { - text: (player, item) => { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[0]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[0];}, + text: (_player, item) => { return TextGet("KDInventoryAction" + (KinkyDungeonPlayerWeapon != item.name ? "Equip" : "Unequip")); }, - icon: (player, item) => { + icon: (_player, item) => { if (item.type == LooseRestraint) { let newItem = null; let currentItem = null; @@ -23,7 +22,9 @@ let KDInventoryAction = { linkable = KDCanAddRestraint(KDRestraint(newItem), true, "", false, currentItem, true, true); } else { if (!currentItem) return "InventoryAction/Equip"; - linkable = KDCurrentItemLinkable(currentItem, newItem); + linkable = KDCanAddRestraint(KDRestraint(newItem), false, "", false, currentItem, true, true); + + //linkable = KDCurrentItemLinkable(currentItem, newItem); } if (linkable) { return "InventoryAction/Equip"; @@ -32,7 +33,7 @@ let KDInventoryAction = { } return KinkyDungeonPlayerWeapon != item.name ? "InventoryAction/Equip" : "InventoryAction/Unequip"; }, - valid: (player, item) => { + valid: (_player, item) => { if ((item?.type == Restraint)) return false; if (item.type == LooseRestraint) { let newItem = null; @@ -42,15 +43,17 @@ let KDInventoryAction = { newItem = KDRestraint(item); if (newItem) { - if (newItem.requireSingleTagToEquip && !newItem.requireSingleTagToEquip.some((tag) => {return KinkyDungeonPlayerTags.get(tag);})) return false; - if (newItem.requireAllTagsToEquip && newItem.requireAllTagsToEquip.some((tag) => {return !KinkyDungeonPlayerTags.get(tag);})) return false; + 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 = KDCurrentItemLinkable(currentItem, newItem); + linkable = KDCanAddRestraint(KDRestraint(newItem), false, "", false, currentItem, true, true); + } if (linkable) { return true; @@ -60,7 +63,7 @@ let KDInventoryAction = { } return item.type == Outfit || item.type == Weapon; }, - click: (player, item) => { + click: (_player, item) => { if (item.type == LooseRestraint) { let equipped = false; let newItem = null; @@ -75,7 +78,9 @@ let KDInventoryAction = { if (KDDebugLink) { linkable = KDCanAddRestraint(KDRestraint(newItem), true, "", false, currentItem, true, true); } else { - linkable = KDCurrentItemLinkable(currentItem, newItem); + //linkable = KDCurrentItemLinkable(currentItem, newItem); + linkable = KDCanAddRestraint(KDRestraint(newItem), false, "", false, currentItem, true, true); + } if (!currentItem || linkable) { equipped = false; @@ -112,52 +117,58 @@ let KDInventoryAction = { } } }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "Drop": { - icon: (player, item) => { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[2]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[2];}, + icon: (_player, _item) => { return "InventoryAction/Drop"; }, - valid: (player, item) => { + valid: (_player, item) => { if ((item?.type == Restraint)) return false; return true; }, - click: (player, item) => { + click: (_player, item) => { KDSendInput("drop", {item: item.name}); }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "Hotbar": { - icon: (player, item) => { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[3]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[3];}, + icon: (_player, _item) => { return "InventoryAction/Hotbar"; }, - valid: (player, item) => { + valid: (_player, _item) => { return true; }, - click: (player, item) => { + click: (_player, _item) => { KDConfigHotbar = !KDConfigHotbar; }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "Remove": { - icon: (player, item) => { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[6]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[6];}, + icon: (_player, _item) => { return "InventoryAction/Remove"; }, - show: (player, item) => { + show: (_player, item) => { return !KDGetCurse(item) && !item.lock; }, - valid: (player, item) => { + valid: (_player, item) => { let r = KDRestraint(item); let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); return !sg.blocked; }, - click: (player, item) => { + click: (_player, item) => { let itemIndex = KDGetItemLinkIndex(item, false); let r = KDRestraint(item); let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); @@ -165,23 +176,25 @@ let KDInventoryAction = { KDSendInput("struggle", {group: sg.group, index: itemIndex, type: "Remove"}); } }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "Unlock": { - icon: (player, item) => { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[4]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[4];}, + icon: (_player, item) => { return "Locks/" + item.lock; }, - show: (player, item) => { + show: (_player, item) => { return !KDGetCurse(item) && !item.lock == false; }, - valid: (player, item) => { + valid: (_player, item) => { let r = KDRestraint(item); let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); return !sg.blocked; }, - click: (player, item) => { + click: (_player, item) => { let itemIndex = KDGetItemLinkIndex(item, false); let r = KDRestraint(item); let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); @@ -189,23 +202,25 @@ let KDInventoryAction = { KDSendInput("struggle", {group: sg.group, index: itemIndex, type: "Unlock"}); } }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "Lock": { - icon: (player, item) => { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[7]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[7];}, + icon: (_player, _item) => { return "InventoryAction/Lock"; }, - show: (player, item) => { + show: (_player, item) => { return !KDGetCurse(item) && !item.lock && KinkyDungeonIsLockable(KDRestraint(item)); }, - valid: (player, item) => { + valid: (_player, item) => { let r = KDRestraint(item); let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); return !sg.blocked; }, - click: (player, item) => { + click: (_player, item) => { let itemIndex = KDGetItemLinkIndex(item, false); let r = KDRestraint(item); let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); @@ -213,23 +228,25 @@ let KDInventoryAction = { KDSendInput("lock", {group: sg.group, index: itemIndex, type: "White"}); } }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "Pick": { - icon: (player, item) => { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[5]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[5];}, + icon: (_player, _item) => { return "InventoryAction/Pick"; }, - show: (player, item) => { + show: (_player, item) => { return !KDGetCurse(item) && !item.lock == false; }, - valid: (player, item) => { + valid: (_player, item) => { let r = KDRestraint(item); let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); return KinkyDungeonLockpicks > 0 && !sg.blocked; }, - click: (player, item) => { + click: (_player, item) => { let itemIndex = KDGetItemLinkIndex(item, false); let r = KDRestraint(item); let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); @@ -237,39 +254,62 @@ let KDInventoryAction = { KDSendInput("struggle", {group: sg.group, index: itemIndex, type: "Unlock"}); } }, - cancel: (player, delta) => { + 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": { - icon: (player, item) => { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[2]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[2];}, + icon: (_player, _item) => { return "InventoryAction/CurseInfo"; }, - show: (player, item) => { + show: (_player, item) => { return !(KDGetCurse(item) || item.lock); }, - valid: (player, item) => { + valid: (_player, _item) => { return true; }, - click: (player, item) => { + click: (_player, item) => { KinkyDungeonCurseInfo(item, (KDGetCurse(item))); }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "CurseUnlock": { - icon: (player, item) => { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[4]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[4];}, + icon: (_player, _item) => { return "InventoryAction/CurseUnlock"; }, - show: (player, item) => { + show: (_player, item) => { return !KDGetCurse(item) == true; }, - valid: (player, item) => { + valid: (_player, item) => { return KinkyDungeonCurseAvailable(item, (KDGetCurse(item))); }, - click: (player, item) => { + click: (_player, item) => { let itemIndex = KDGetItemLinkIndex(item, false); if (itemIndex >= 0 && KinkyDungeonCurseAvailable(item, (KDGetCurse(item)))) { let r = KDRestraint(item); @@ -277,21 +317,23 @@ let KDInventoryAction = { KDSendInput("curseUnlock", {group: sg.group, index: KDStruggleGroupLinkIndex[sg.group], curse: (KDGetCurse(item))}); } }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "Struggle": { - icon: (player, item) => { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[2]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[2];}, + icon: (_player, _item) => { return "InventoryAction/Struggle"; }, - show: (player, item) => { + show: (_player, item) => { return !KDGetCurse(item) && !item.lock; }, - valid: (player, item) => { + valid: (_player, _item) => { return true; }, - click: (player, item) => { + click: (_player, item) => { let itemIndex = KDGetItemLinkIndex(item, false); if (itemIndex >= 0) { let r = KDRestraint(item); @@ -299,25 +341,27 @@ let KDInventoryAction = { KDSendInput(KDGetCurse(item) ? "struggleCurse" : "struggle", {group: sg.group, index: itemIndex, type: "Struggle", curse: KDGetCurse(item)}); } }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "Cut": { - icon: (player, item) => { + 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) => { + 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) => { + valid: (_player, item) => { let r = KDRestraint(item); let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); return !sg.blocked; }, - click: (player, item) => { + click: (_player, item) => { let itemIndex = KDGetItemLinkIndex(item, false); let r = KDRestraint(item); let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); @@ -325,22 +369,24 @@ let KDInventoryAction = { KDSendInput("struggle", {group: sg.group, index: itemIndex, type: "Cut"}); } }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "Favorite": { - text: (player, item) => { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[1]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[1];}, + text: (_player, item) => { return TextGet("KDInventoryAction" + (!(KDGameData.ItemPriority[item.name|| item.name] > 9) ? "Favorite" : "Unfavorite")); }, - icon: (player, item) => { + icon: (_player, item) => { return !(KDGameData.ItemPriority[item.name|| item.name] > 9) ? "InventoryAction/Favorite" : "InventoryAction/Unfavorite"; }, - valid: (player, item) => { + valid: (_player, _item) => { return true; }, - click: (player, item) => { + click: (_player, item) => { if (!KDGameData.ItemPriority) KDGameData.ItemPriority = {}; if (!(KDGameData.ItemPriority[item.name|| item.name] > 9)) KDGameData.ItemPriority[item.name|| item.name] = 10; else KDGameData.ItemPriority[item.name|| item.name] = 0; @@ -354,39 +400,39 @@ let KDInventoryAction = { } }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "Use": { - icon: (player, item) => { + icon: (_player, _item) => { return "InventoryAction/Use"; }, - valid: (player, item) => { + valid: (_player, item) => { return item.quantity > 0; }, - click: (player, item) => { + click: (_player, item) => { KDSendInput("consumable", {item: item.name, quantity: 1}); }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "QuickSlot1": { - icon: (player, item) => { + icon: (_player, _item) => { return KDGameData.PreviousWeapon[0] ? "Items/" + (KinkyDungeonWeaponVariants[KDGameData.PreviousWeapon[0]]?.template || KDGameData.PreviousWeapon[0]) : "InventoryAction/Quickslot"; }, - valid: (player, item) => { + valid: (_player, _item) => { return true;//KDGameData.PreviousWeapon[0] != item.name; }, - label: (player, item) => { + label: (_player, _item) => { if (KDGameData.PreviousWeaponLock && KDGameData.PreviousWeaponLock[0]) { return TextGet("KDLocked"); } return ""; }, - click: (player, item) => { + click: (_player, item) => { KDGameData.PreviousWeapon[0] = item.name; if (!KDGameData.PreviousWeaponLock) { KDGameData.PreviousWeaponLock = []; @@ -396,24 +442,24 @@ let KDInventoryAction = { } KDGameData.PreviousWeaponLock[0] = !KDGameData.PreviousWeaponLock[0]; }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "QuickSlot2": { - icon: (player, item) => { + icon: (_player, _item) => { return KDGameData.PreviousWeapon[1] ? "Items/" + (KinkyDungeonWeaponVariants[KDGameData.PreviousWeapon[1]]?.template || KDGameData.PreviousWeapon[1]) : "InventoryAction/Quickslot"; }, - valid: (player, item) => { + valid: (_player, _item) => { return true;//KDGameData.PreviousWeapon[0] != item.name; }, - label: (player, item) => { + label: (_player, _item) => { if (KDGameData.PreviousWeaponLock && KDGameData.PreviousWeaponLock[1]) { return TextGet("KDLocked"); } return ""; }, - click: (player, item) => { + click: (_player, item) => { KDGameData.PreviousWeapon[1] = item.name; if (!KDGameData.PreviousWeaponLock) { KDGameData.PreviousWeaponLock = []; @@ -423,24 +469,24 @@ let KDInventoryAction = { } KDGameData.PreviousWeaponLock[1] = !KDGameData.PreviousWeaponLock[1]; }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "QuickSlot3": { - icon: (player, item) => { + icon: (_player, _item) => { return KDGameData.PreviousWeapon[2] ? "Items/" + (KinkyDungeonWeaponVariants[KDGameData.PreviousWeapon[2]]?.template || KDGameData.PreviousWeapon[2]) : "InventoryAction/Quickslot"; }, - valid: (player, item) => { + valid: (_player, _item) => { return true;//KDGameData.PreviousWeapon[0] != item.name; }, - label: (player, item) => { + label: (_player, _item) => { if (KDGameData.PreviousWeaponLock && KDGameData.PreviousWeaponLock[2]) { return TextGet("KDLocked"); } return ""; }, - click: (player, item) => { + click: (_player, item) => { KDGameData.PreviousWeapon[2] = item.name; if (!KDGameData.PreviousWeaponLock) { KDGameData.PreviousWeaponLock = []; @@ -450,24 +496,24 @@ let KDInventoryAction = { } KDGameData.PreviousWeaponLock[2] = !KDGameData.PreviousWeaponLock[2]; }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "QuickSlot4": { - icon: (player, item) => { + icon: (_player, _item) => { return KDGameData.PreviousWeapon[3] ? "Items/" + (KinkyDungeonWeaponVariants[KDGameData.PreviousWeapon[3]]?.template || KDGameData.PreviousWeapon[3]) : "InventoryAction/Quickslot"; }, - valid: (player, item) => { + valid: (_player, _item) => { return true;//KDGameData.PreviousWeapon[0] != item.name; }, - label: (player, item) => { + label: (_player, _item) => { if (KDGameData.PreviousWeaponLock && KDGameData.PreviousWeaponLock[3]) { return TextGet("KDLocked"); } return ""; }, - click: (player, item) => { + click: (_player, item) => { KDGameData.PreviousWeapon[3] = item.name; if (!KDGameData.PreviousWeaponLock) { KDGameData.PreviousWeaponLock = []; @@ -477,22 +523,22 @@ let KDInventoryAction = { } KDGameData.PreviousWeaponLock[3] = !KDGameData.PreviousWeaponLock[3]; }, - cancel: (player, delta) => { + cancel: (_player, _delta) => { return false; // NA for default actions }, }, "RemoveCurseOrHex": { - icon: (player, item) => { + icon: (_player, _item) => { return "InventoryAction/Macaron"; }, - valid: (player, item) => { + 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) => { + click: (_player, item) => { if (KDHasRemovableCurse(item, KDGameData.CurseLevel) || KDHasRemovableHex(item, KDGameData.CurseLevel)) { if (KDHasRemovableCurse(item, KDGameData.CurseLevel)) { if (item.curse && KDCurses[item.curse]) { @@ -552,7 +598,7 @@ let KDInventoryAction = { } }, /** Return true to cancel it */ - cancel: (player, delta) => { + cancel: (_player, delta) => { if (delta > 0) { if (KinkyDungeonLastTurnAction || !(KinkyDungeonAllRestraintDynamic().some((r) => {return KDHasRemovableCurse(r.item, KDGameData.CurseLevel) || KDHasRemovableHex(r.item, KDGameData.CurseLevel);}))) { @@ -564,15 +610,17 @@ let KDInventoryAction = { }, }, "RemoveMagicLock": { - icon: (player, item) => { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeyEnter[0]);}, + hotkeyPress: () => {return KinkyDungeonKeyEnter[0];}, + icon: (_player, _item) => { return "InventoryAction/CommandWord"; }, - valid: (player, item) => { + valid: (_player, item) => { if (!(item?.type == Restraint)) return false; return KDMagicLocks.includes(item.lock); }, /** Happens when you click the button */ - click: (player, item) => { + click: (_player, item) => { if (KDMagicLocks.includes(item.lock)) { KinkyDungeonLock(item, ""); @@ -586,7 +634,7 @@ let KDInventoryAction = { } }, /** Return true to cancel it */ - cancel: (player, delta) => { + cancel: (_player, delta) => { if (delta > 0) { if (!KinkyDungeonHasMana(KDGameData.InventoryActionManaCost) || !(KinkyDungeonPlayerGetRestraintsWithLocks(KDMagicLocks).length > 0)) { return true; @@ -596,15 +644,15 @@ let KDInventoryAction = { }, }, "Offhand": { - icon: (player, item) => { + icon: (_player, _item) => { return "InventoryAction/Offhand"; }, - valid: (player, item) => { + valid: (_player, item) => { if (!(item?.type == Weapon && KDCanOffhand(item))) return false; return KinkyDungeonCanUseWeapon(false, undefined, KDWeapon(item)); }, /** Happens when you click the button */ - click: (player, item) => { + click: (_player, item) => { KDGameData.Offhand = item.name; KDGameData.OffhandOld = item.name; KinkyDungeonAdvanceTime(1, true, true); @@ -613,7 +661,7 @@ let KDInventoryAction = { KinkyDungeonDressPlayer(); }, /** Return true to cancel it */ - cancel: (player, delta) => { + cancel: (_player, delta) => { if (delta > 0) { if (KinkyDungeonLastTurnAction) { return true; @@ -623,25 +671,25 @@ let KDInventoryAction = { }, }, "Attach": { - icon: (player, item) => { + icon: (_player, _item) => { return "InventoryAction/Attach"; }, - valid: (player, item) => { + valid: (_player, item) => { if (!(item?.type == Weapon && !KDWeapon(item)?.noHands && !KDWeapon(item)?.unarmed)) return false; return item.name != KDGameData.AttachedWep; }, - label: (player, item) => { + label: (_player, _item) => { if (KDGameData.AttachedWep && KinkyDungeonInventoryGet(KDGameData.AttachedWep)) return KDGetItemNameString(KDGameData.AttachedWep); return ""; }, - itemlabel: (player, item) => { + itemlabel: (_player, item) => { if (KDGameData.AttachedWep == item.name) return TextGet("KDAttached"); return ""; }, /** Happens when you click the button */ - click: (player, item) => { + click: (_player, item) => { KDGameData.AttachedWep = item.name; KinkyDungeonAdvanceTime(1, true, true); KDStunTurns(4, true); @@ -651,7 +699,7 @@ let KDInventoryAction = { KinkyDungeonPlaySound(KinkyDungeonRootDirectory + "Audio/Tape.ogg"); }, /** Return true to cancel it */ - cancel: (player, delta) => { + cancel: (_player, delta) => { if (delta > 0) { if (KinkyDungeonLastTurnAction) { return true; @@ -662,10 +710,10 @@ let KDInventoryAction = { }, "Sell": { alsoShow: ["SellBulk", "SellExcess"], - icon: (player, item) => { + icon: (_player, _item) => { return "InventoryAction/Sell"; }, - label: (player, item) => { + label: (_player, item) => { if (KDWeapon(item)?.unarmed) return ""; let mult = 1; let quantity = 1; @@ -678,7 +726,7 @@ let KDInventoryAction = { let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); return TextGet("KDGP").replace("AMNT", value + ""); }, - itemlabel: (player, item) => { + itemlabel: (_player, item) => { if (KDWeapon(item)?.unarmed) return ""; let mult = 1; let quantity = 1; @@ -691,8 +739,8 @@ let KDInventoryAction = { 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) => { + itemlabelcolor: (_player, _item) => {return "#ffff44";}, + text: (_player, item) => { let mult = 1; let quantity = 1; let quantitystart = 0; @@ -704,13 +752,13 @@ let KDInventoryAction = { let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); return TextGet("KDInventoryActionSell").replace("VLU", value + ""); }, - valid: (player, item) => { + valid: (_player, item) => { if (KDGameData.ItemPriority[item.name|| 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) => { + click: (_player, item) => { let mult = 1; let quantity = 1; let quantitystart = 0; @@ -737,7 +785,7 @@ let KDInventoryAction = { , "#ffffff", 2); }, /** Return true to cancel it */ - cancel: (player, delta) => { + cancel: (_player, delta) => { if (delta > 0) { if (KinkyDungeonLastTurnAction) { return true; @@ -747,10 +795,10 @@ let KDInventoryAction = { }, }, "SellBulk": { - icon: (player, item) => { + icon: (_player, _item) => { return "InventoryAction/SellBulk"; }, - label: (player, item) => { + label: (_player, item) => { let mult = 1; let quantity = ((item.quantity) ? item.quantity : 1); let quantitystart = 0; @@ -763,7 +811,7 @@ let KDInventoryAction = { let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); return TextGet("KDGP").replace("AMNT", value + ""); }, - text: (player, item) => { + text: (_player, item) => { let mult = 1; let quantity = ((item.quantity) ? item.quantity : 1); let quantitystart = 0; @@ -776,15 +824,15 @@ let KDInventoryAction = { let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); return TextGet("KDInventoryActionSellBulk").replace("VLU", value + ""); }, - valid: (player, item) => { + valid: (_player, item) => { if (KDGameData.ItemPriority[item.name|| item.name] > 9) return false; return item?.type == LooseRestraint || item?.type == Consumable; }, - show: (player, item) => { + show: (_player, item) => { return item?.type == LooseRestraint || item?.type == Consumable; }, /** Happens when you click the button */ - click: (player, item) => { + click: (_player, item) => { let mult = 1; let quantity = ((item.quantity) ? item.quantity : 1); let quantitystart = 0; @@ -811,7 +859,7 @@ let KDInventoryAction = { , "#ffffff", 2); }, /** Return true to cancel it */ - cancel: (player, delta) => { + cancel: (_player, delta) => { if (delta > 0) { if (KinkyDungeonLastTurnAction) { return true; @@ -821,10 +869,10 @@ let KDInventoryAction = { }, }, "SellExcess": { - icon: (player, item) => { + icon: (_player, _item) => { return "InventoryAction/SellExcess"; }, - label: (player, item) => { + label: (_player, item) => { let mult = 1; let quantity = ((item.quantity) ? item.quantity : 1) - 1; let quantitystart = 0; @@ -837,7 +885,7 @@ let KDInventoryAction = { let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); return TextGet("KDGP").replace("AMNT", value + ""); }, - text: (player, item) => { + text: (_player, item) => { let mult = 1; let quantity = ((item.quantity) ? item.quantity : 1) - 1; let quantitystart = 0; @@ -850,16 +898,16 @@ let KDInventoryAction = { let value = Math.round(mult * KDGameData.SellMarkup * KinkyDungeonItemCost(item, true, true)); return TextGet("KDInventoryActionSellExcess").replace("VLU", value + ""); }, - valid: (player, item) => { + valid: (_player, item) => { if (KDGameData.ItemPriority[item.name|| item.name] > 9) return false; return item?.type == LooseRestraint || item?.type == Consumable; }, - show: (player, item) => { + 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) => { + click: (_player, item) => { let mult = 1; let quantity = ((item.quantity) ? item.quantity : 1) - 1; let quantitystart = 0; @@ -886,7 +934,7 @@ let KDInventoryAction = { , "#ffffff", 2); }, /** Return true to cancel it */ - cancel: (player, delta) => { + cancel: (_player, delta) => { if (delta > 0) { if (KinkyDungeonLastTurnAction) { return true; @@ -899,31 +947,31 @@ let KDInventoryAction = { "Recycle": { alsoShow: ["RecycleBulk", "RecycleExcess"], - icon: (player, item) => { + icon: (_player, _item) => { return "InventoryAction/Recycle"; }, - show: (player, item) => { + show: (_player, item) => { return item?.type == LooseRestraint; }, - label: (player, item) => { + label: (_player, item) => { return KDRecycleString(item, 1); }, - itemlabel: (player, item) => { + itemlabel: (_player, item) => { return KDRecycleString(item, 1); }, - itemlabelcolor: (player, item) => {return "#ffffff";}, - text: (player, item) => { + itemlabelcolor: (_player, _item) => {return "#ffffff";}, + text: (_player, _item) => { let value = Math.round(100); return TextGet("KDInventoryActionRecycle").replace("VLU", value + ""); }, - valid: (player, item) => { + valid: (_player, item) => { if (KDGameData.ItemPriority[item.name|| 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) => { + click: (_player, item) => { KDChangeRecyclerInput(KDRecycleItem(item, 1)); if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Recycle.ogg"); KinkyDungeonSendTextMessage(10, KDRecycleResourceString(false, "RecyclerInput_"), "#ffffff", 2); @@ -934,7 +982,7 @@ let KDInventoryAction = { }, /** Return true to cancel it */ - cancel: (player, delta) => { + cancel: (_player, delta) => { if (delta > 0) { if (KinkyDungeonLastTurnAction) { return true; @@ -944,24 +992,24 @@ let KDInventoryAction = { }, }, "RecycleBulk": { - icon: (player, item) => { + icon: (_player, _item) => { return "InventoryAction/RecycleBulk"; }, - label: (player, item) => { + label: (_player, item) => { return KDRecycleString(item, item.quantity || 1); }, - text: (player, item) => { + text: (_player, item) => { return KDRecycleString(item, item.quantity || 1); }, - valid: (player, item) => { + valid: (_player, item) => { if (KDGameData.ItemPriority[item.name|| item.name] > 9) return false; return item?.type == LooseRestraint; }, - show: (player, item) => { + show: (_player, item) => { return item?.type == LooseRestraint; }, /** Happens when you click the button */ - click: (player, item) => { + click: (_player, item) => { let itemInv = KinkyDungeonInventoryGetSafe(item.name); if (!itemInv) { @@ -981,7 +1029,7 @@ let KDInventoryAction = { , "#ffffff", 2); }, /** Return true to cancel it */ - cancel: (player, delta) => { + cancel: (_player, delta) => { if (delta > 0) { if (KinkyDungeonLastTurnAction) { return true; @@ -991,27 +1039,27 @@ let KDInventoryAction = { }, }, "RecycleExcess": { - icon: (player, item) => { + icon: (_player, _item) => { return "InventoryAction/RecycleExcess"; }, - label: (player, item) => { + label: (_player, item) => { if (item.quantity > 1) return KDRecycleString(item, item.quantity - 1); return ""; }, - text: (player, item) => { + text: (_player, _item) => { let value = Math.round(100); return TextGet("KDInventoryActionRecycleExcess").replace("VLU", value + ""); }, - valid: (player, item) => { + valid: (_player, item) => { if (KDGameData.ItemPriority[item.name|| item.name] > 9) return false; return (item?.type == LooseRestraint); }, - show: (player, item) => { + show: (_player, item) => { return item?.type == LooseRestraint; }, /** Happens when you click the button */ - click: (player, item) => { + click: (_player, item) => { let itemInv = KinkyDungeonInventoryGetSafe(item.name); if (!itemInv || !(itemInv.quantity > 1)) { @@ -1031,7 +1079,7 @@ let KDInventoryAction = { , "#ffffff", 2); }, /** Return true to cancel it */ - cancel: (player, delta) => { + cancel: (_player, delta) => { if (delta > 0) { if (KinkyDungeonLastTurnAction) { return true; @@ -1042,26 +1090,26 @@ let KDInventoryAction = { }, "Disassemble": { - icon: (player, item) => { + hotkey: () => {return KDHotkeyToText(KinkyDungeonKeySpell[4]);}, + hotkeyPress: () => {return KinkyDungeonKeySpell[4];}, + icon: (_player, _item) => { return "InventoryAction/Disassemble"; }, - hotkey: () => KDHotkeyToText(KinkyDungeonKeyUpcast[0]), - hotkeyPress: () => KinkyDungeonKeyUpcast[0], - show: (player, item) => { + show: (_player, item) => { return item?.type == LooseRestraint && KDRestraint(item)?.disassembleAs != undefined; }, - itemlabelcolor: (player, item) => {return "#ffffff";}, - text: (player, item) => { + itemlabelcolor: (_player, _item) => {return "#ffffff";}, + text: (_player, item) => { let one = (item.quantity || 1) == 1 ? "One" : ""; return TextGet("KDInventoryActionDisassemble" + one); }, - valid: (player, item) => { + valid: (_player, item) => { if (KDGameData.ItemPriority[item.name|| 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) => { + click: (_player, item) => { let itemInv = KinkyDungeonInventoryGetSafe(item.name); if (!itemInv || !(itemInv.quantity > 0)) { if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/BeepEngage.ogg"); @@ -1090,7 +1138,7 @@ let KDInventoryAction = { }, /** Return true to cancel it */ - cancel: (player, delta) => { + cancel: (_player, delta) => { if (delta > 0) { if (KinkyDungeonLastTurnAction) { return true; @@ -1103,7 +1151,7 @@ let KDInventoryAction = { "Bondage": { - icon: (player, item) => { + icon: (_player, _item) => { return "InventoryAction/Bondage"; }, /** Returns if the button is greyed out */ @@ -1197,7 +1245,7 @@ let KDInventoryAction = { }, }, "Food": { - icon: (player, item) => { + icon: (_player, _item) => { return "InventoryAction/Cookie"; }, /** Returns if the button is greyed out */ @@ -1255,4 +1303,4 @@ let KDInventoryAction = { return false; }, }, -}; \ No newline at end of file +}; diff --git a/Game/src/item/KDModifier.js b/Game/src/item/KDModifier.ts similarity index 79% rename from Game/src/item/KDModifier.js rename to Game/src/item/KDModifier.ts index 2790542de..ebefebc46 100644 --- a/Game/src/item/KDModifier.js +++ b/Game/src/item/KDModifier.ts @@ -34,8 +34,7 @@ let KDModifierConditionVariantList = { ], }; -/**@type {Record} */ -let KDModifierEffects = { +let KDModifierEffects: Record = { SpellDamageBuff: { tags: ['buff', 'positive', 'temp', 'magic'], types: { @@ -46,13 +45,13 @@ let KDModifierEffects = { // Restraint 0: { level: 6, - filter: (item, positive, data) => { + filter: (_item, _positive, _data) => { return true; }, - weight: (item, positive, data) => { + weight: (_item, _positive, _data) => { return 10; }, - events: (item, positive, data) => { + 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)); @@ -78,17 +77,17 @@ let KDModifierEffects = { // Restraint 0: { level: 5, - filter: (item, positive, data) => { + filter: (_item, _positive, _data) => { return true; }, - weight: (item, positive, data) => { + weight: (_item, _positive, _data) => { return 10; }, - onSelect: (item, data) => { + onSelect: (_item, data) => { if (!data.element) data.element = CommonRandomItemFromList("", KDELEMENTS); }, - events: (item, positive, data) => { + events: (item, _positive, data) => { let type = data.element; let power = Math.max(KDGetItemPower(item), 2); @@ -117,17 +116,17 @@ let KDModifierEffects = { // Restraint 0: { level: 4, - filter: (item, positive, data) => { + filter: (_item, _positive, _data) => { return true; }, - weight: (item, positive, data) => { + weight: (_item, _positive, _data) => { return 10; }, - onSelect: (item, data) => { + onSelect: (_item, data) => { if (!data.element) data.element = CommonRandomItemFromList("", KDELEMENTS); }, - events: (item, positive, data) => { + events: (item, _positive, data) => { let type = data.element; let power = Math.max(KDGetItemPower(item), 2); @@ -148,8 +147,7 @@ let KDModifierEffects = { }, }; -/**@type {Record} */ -let KDModifierConditions = { +let KDModifierConditions: Record = { OnTease: { tags: ['accessible', 'melee', 'common', 'riskmed'], types: { @@ -160,14 +158,14 @@ let KDModifierConditions = { // Restraint 0: { level: 6, - filter: (item, pos, neut, neg, data) => { + filter: (_item, _pos, _neut, _neg, _data) => { return true; }, - weight: (item, pos, neut, neg, data) => { + weight: (_item, _pos, _neut, _neg, _data) => { return 10; }, events: (item, pos, neut, neg, data) => { - let effects = KDGenericEffects(item, KDModifierEnum.restraint, 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"; @@ -194,14 +192,14 @@ let KDModifierConditions = { // Restraint 0: { level: 6, - filter: (item, pos, neut, neg, data) => { + filter: (_item, _pos, _neut, _neg, data) => { return data.element && KDELEMENTS.includes(data.element); }, - weight: (item, pos, neut, neg, data) => { + weight: (_item, _pos, _neut, _neg, _data) => { return 100; }, events: (item, pos, neut, neg, data) => { - let effects = KDGenericEffects(item, KDModifierEnum.restraint, 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"; @@ -223,25 +221,23 @@ let KDModifierConditions = { }; /** - * - * @param {string} item - * @param {ModifierEnum} type - * @param {KDModifierEffect[]} pos - * @param {KDModifierEffect[]} neut - * @param {KDModifierEffect[]} neg - * @param {KDModifierConditionData} data - * @returns {KinkyDungeonEvent[]} + * @param item + * @param type + * @param pos + * @param neut + * @param neg + * @param data */ -function KDGenericEffects(item, type, pos, neut, neg, data) { - let effects = []; +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, KDPosNeutNeg.positive, data)); + effects.push(...eff.types[type].events(item, PosNeutNeg.positive, data)); } for (let eff of [...neut]) { - effects.push(...eff.types[type].events(item, KDPosNeutNeg.neutral, data)); + effects.push(...eff.types[type].events(item, PosNeutNeg.neutral, data)); } for (let eff of [...neg]) { - effects.push(...eff.types[type].events(item, KDPosNeutNeg.negative, data)); + effects.push(...eff.types[type].events(item, PosNeutNeg.negative, data)); } return effects; -} \ No newline at end of file +} diff --git a/Game/src/item/KinkyDungeonConsumables.js b/Game/src/item/KinkyDungeonConsumables.ts similarity index 89% rename from Game/src/item/KinkyDungeonConsumables.js rename to Game/src/item/KinkyDungeonConsumables.ts index 6ca1f3094..b1df98d43 100644 --- a/Game/src/item/KinkyDungeonConsumables.js +++ b/Game/src/item/KinkyDungeonConsumables.ts @@ -1,29 +1,28 @@ "use strict"; /** - * - * @param {Named} item - * @returns {consumable} + * @param item */ -function KDConsumable(item) { +function KDConsumable(item: Named): consumable { return KinkyDungeonConsumables[item.name]; } -function KinkyDungeonFindConsumable(Name) { +function KinkyDungeonFindConsumable(Name: string): consumable { for (let con of Object.values(KinkyDungeonConsumables)) { if (con.name == Name) return con; } return undefined; } -function KinkyDungeonFindBasic(Name) { +/** 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) { +function KinkyDungeonFindConsumableOrBasic(Name: string): consumable | any { for (let con of Object.values(KinkyDungeonConsumables)) { if (con.name == Name) return con; } @@ -34,7 +33,7 @@ function KinkyDungeonFindConsumableOrBasic(Name) { return undefined; } -function KinkyDungeonGetInventoryItem(Name, Filter = Consumable) { +function KinkyDungeonGetInventoryItem(Name: string, Filter: string = Consumable): itemPreviewEntry { let Filtered = KinkyDungeonFilterInventory(Filter); for (let item of Filtered) { if (item.name == Name) return item; @@ -42,7 +41,7 @@ function KinkyDungeonGetInventoryItem(Name, Filter = Consumable) { return null; } -function KinkyDungeonItemCount(Name) { +function KinkyDungeonItemCount(Name: string): number { let item = KinkyDungeonGetInventoryItem(Name); if (item && item.item && item.item.quantity) { return item.item.quantity; @@ -50,7 +49,7 @@ function KinkyDungeonItemCount(Name) { return 0; } -function KinkyDungeonGetShopItem(Level, Rarity, Shop, ShopItems, uniqueTags = {}) { +function KinkyDungeonGetShopItem(_Level: number, Rarity: number, _Shop: boolean, ShopItems: any[], uniqueTags: Record = {}) { let Table = []; let params = KinkyDungeonMapParams[(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)]; if (params.ShopExclusives) { @@ -65,29 +64,28 @@ function KinkyDungeonGetShopItem(Level, Rarity, Shop, ShopItems, uniqueTags = {} } } } - /**@type {Record} */ - let Shopable = Object.entries(KinkyDungeonConsumables).filter(([k, v]) => (v.shop)); + 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)); + 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)); + 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)); + 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; @@ -100,7 +98,7 @@ function KinkyDungeonGetShopItem(Level, Rarity, Shop, ShopItems, uniqueTags = {} 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) => {return uniqueTags[t];}); + return !item.uniqueTags || !item.uniqueTags.some((t: string) => {return uniqueTags[t];}); }); if (available.length > 0) return available[Math.floor(KDRandom() * available.length)]; } @@ -109,12 +107,10 @@ function KinkyDungeonGetShopItem(Level, Rarity, Shop, ShopItems, uniqueTags = {} /** - * - * @param {consumable} consumable - * @param {number} Quantity - * @return {boolean} + * @param consumable + * @param Quantity */ -function KinkyDungeonChangeConsumable(consumable, Quantity) { +function KinkyDungeonChangeConsumable(consumable: consumable, Quantity: number): boolean { let item = KinkyDungeonInventoryGetConsumable(consumable.name); if (item) { item.quantity += Quantity; @@ -131,7 +127,7 @@ function KinkyDungeonChangeConsumable(consumable, Quantity) { return false; } -function KinkyDungeonConsumableEffect(Consumable, type) { +function KinkyDungeonConsumableEffect(Consumable: consumable, type?: string) { if (!type) type = Consumable.type; if (KDConsumableEffects[type]) { @@ -173,7 +169,7 @@ function KinkyDungeonPotionCollar() { return false; } -function KinkyDungeonCanDrink(byEnemy) { +function KinkyDungeonCanDrink(byEnemy?: boolean): boolean { for (let inv of KinkyDungeonAllRestraint()) { if (KDRestraint(inv).allowPotions) return true; } @@ -181,7 +177,7 @@ function KinkyDungeonCanDrink(byEnemy) { return KinkyDungeonCanTalk(true); } -function KinkyDungeonAttemptConsumable(Name, Quantity) { +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; @@ -319,7 +315,7 @@ function KinkyDungeonAttemptConsumable(Name, Quantity) { return true; } -function KinkyDungeonUseConsumable(Name, Quantity) { +function KinkyDungeonUseConsumable(Name: string, Quantity: number): boolean { let item = KinkyDungeonGetInventoryItem(Name, Consumable); if (!item || item.item.quantity < Quantity) return false; diff --git a/Game/src/item/KinkyDungeonConsumablesList.js b/Game/src/item/KinkyDungeonConsumablesList.ts similarity index 96% rename from Game/src/item/KinkyDungeonConsumablesList.js rename to Game/src/item/KinkyDungeonConsumablesList.ts index f95db0951..662cc55e9 100644 --- a/Game/src/item/KinkyDungeonConsumablesList.js +++ b/Game/src/item/KinkyDungeonConsumablesList.ts @@ -2,10 +2,7 @@ let KDMaxRarity = 10; // By normal means -/** - * @type {Record} - */ -let KinkyDungeonConsumables = { +let KinkyDungeonConsumables: Record = { "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: 1, shop: true, type: "restore", wp_instant: 2.5, wp_gradual: 0, scaleWithMaxWP: true, duration: 0, gagFloor: 0.5, sfx: "PotionDrink"}, @@ -49,10 +46,7 @@ let KinkyDungeonConsumables = { }; // Separate for organizational purposes -/** - * @type {Record} - */ -let KDCookies = { +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"}, @@ -106,9 +100,8 @@ let KinkyDungneonShopRestraints = { "Sunglasses2" : {name: "Sunglasses2", rarity: 2, shop: true, uniqueTags: ["shades"]}, }; -/** @type {Record void>} */ -let KDConsumableEffects = { - "Snuffer": (Consumable) => { +let KDConsumableEffects: Record void> = { + "Snuffer": (_Consumable) => { let tiles = KDGetEffectTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); for (let tile of Object.values(tiles)) { if (tile?.tags?.includes("snuffable")) { @@ -123,7 +116,7 @@ let KDConsumableEffects = { } KinkyDungeonSendTextMessage(10, TextGet("KDNotSnuffable"), "#ff5555", 3); }, - "SackOfSacks": (Consumable) => { + "SackOfSacks": (_Consumable) => { let tiles = KDGetEffectTiles(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); for (let tile of Object.values(tiles)) { if (tile?.tags?.includes("unsackable")) { @@ -156,7 +149,8 @@ let KDConsumableEffects = { } }, "subAdd": (Consumable) => { - let amount = Consumable.data?.subAdd || 5; + // FIXME: Check this translation is correct. + let amount = typeof Consumable.data?.subAdd === 'number' ? Consumable.data?.subAdd : 5; KinkyDungeonChangeRep("Ghost", amount); }, "restore": (Consumable) => { @@ -198,7 +192,6 @@ let KDConsumableEffects = { }, }; -/** @type {Record boolean>} */ -let KDConsumablePrereq = { +let KDConsumablePrereq: Record boolean> = { -}; \ No newline at end of file +}; diff --git a/Game/src/item/KinkyDungeonCurse.js b/Game/src/item/KinkyDungeonCurse.ts similarity index 79% rename from Game/src/item/KinkyDungeonCurse.js rename to Game/src/item/KinkyDungeonCurse.ts index 5ef63d011..a312d113a 100644 --- a/Game/src/item/KinkyDungeonCurse.js +++ b/Game/src/item/KinkyDungeonCurse.ts @@ -43,19 +43,19 @@ let KDCurseUnlockList = { * condition: required to remove it * remove: happens when removing * events: these events are added to the restraint - * @type {Record} */ -let KDCurses = { + */ +let KDCurses: Record = { "GhostLock" : { powerMult: 5, lock: true, level: 10, - weight: (item) => { + weight: (_item) => { return 1; }, - condition: (item) => { + condition: (_item) => { return KinkyDungeonItemCount("Ectoplasm") >= 25; }, - remove: (item, host) => { + remove: (_item, _host) => { KinkyDungeonChangeConsumable(KinkyDungeonConsumables.Ectoplasm, -25); } }, @@ -63,13 +63,13 @@ let KDCurses = { powerMult: 4, lock: true, level: 15, - weight: (item) => { + weight: (_item) => { return 1; }, - condition: (item) => { + condition: (_item) => { return KinkyDungeonItemCount("DollID") >= 4; }, - remove: (item, host) => { + remove: (_item, _host) => { KinkyDungeonChangeConsumable(KinkyDungeonConsumables.DollID, -4); } }, @@ -77,13 +77,13 @@ let KDCurses = { powerMult: 2.8, lock: true, level: 4, - weight: (item) => { + weight: (_item) => { return 1; }, - condition: (item) => { + condition: (_item) => { return KinkyDungeonSpellPoints > 0; }, - remove: (item, host) => { + remove: (_item, _host) => { KinkyDungeonSpellPoints -= 1; } }, @@ -91,14 +91,14 @@ let KDCurses = { powerMult: 4, lock: true, level: 12, - weight: (item) => { + weight: (_item) => { return 1; }, - condition: (item) => { + condition: (_item) => { let amount = KinkyDungeonStatsChoice.get("randomMode") ? 3 : 8; return KinkyDungeonSpellPoints >= amount; }, - remove: (item, host) => { + remove: (_item, _host) => { let amount = KinkyDungeonStatsChoice.get("randomMode") ? 3 : 8; KinkyDungeonSpellPoints -= amount; }, @@ -116,16 +116,16 @@ let KDCurses = { noShrine: true, activatecurse: true, level: 30, - weight: (item) => { + weight: (_item) => { return 1; }, - condition: (item) => { + condition: (_item) => { for (let inv of KinkyDungeonAllRestraintDynamic()) { if (KDGetCurse(inv.item) == "CursedDamage") return false; } return true; }, - remove: (item, host) => { + remove: (_item, _host) => { //KinkyDungeonChangeConsumable(KinkyDungeonConsumables.MistressKey, -1); } }, @@ -136,13 +136,13 @@ let KDCurses = { activatecurse: true, level: 9, customIcon_hud: "StarCurse", - weight: (item) => { + weight: (_item) => { return 1; }, - condition: (item) => { + condition: (_item) => { return false; }, - remove: (item, host) => {}, + remove: (_item, _host) => {}, customInfo: (item, Curse) => { KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonCurseInfo" + Curse) .replace("RestraintName", KDGetItemName(item))//TextGet("Restraint" + KDRestraint(item).name)) @@ -159,26 +159,26 @@ let KDCurses = { noShrine: true, customIcon_RemoveFailure: "Locks/Gold", level: 10, - weight: (item) => { + weight: (_item) => { return 1; }, - condition: (item) => { + condition: (_item) => { return KinkyDungeonItemCount("MistressKey") > 0; }, - remove: (item, host) => { + remove: (_item, _host) => { KinkyDungeonChangeConsumable(KinkyDungeonConsumables.MistressKey, -1); } }, "5Keys" : { lock: true, level: 3, - weight: (item) => { + weight: (_item) => { return 3; }, - condition: (item) => { + condition: (_item) => { return KinkyDungeonRedKeys >= 5; }, - remove: (item, host) => { + remove: (_item, _host) => { KinkyDungeonRedKeys -= 5; } }, @@ -186,13 +186,13 @@ let KDCurses = { powerMult: 2.1, lock: true, level: 1, - weight: (item) => { + weight: (_item) => { return 10; }, - condition: (item) => { + condition: (_item) => { return KinkyDungeonRedKeys >= 1; }, - remove: (item, host) => { + remove: (_item, _host) => { KinkyDungeonRedKeys -= 1; } }, @@ -200,13 +200,13 @@ let KDCurses = { lock: true, activatecurse: true, level: 4, - weight: (item) => { + weight: (_item) => { return 10; }, - condition: (item) => { + condition: (_item) => { return KinkyDungeonBlueKeys >= 1; }, - remove: (item, host) => { + remove: (_item, _host) => { KinkyDungeonBlueKeys -= 1; } }, @@ -214,11 +214,11 @@ let KDCurses = { powerMult: 2.2, activatecurse: true, level: 4, - weight: (item) => { + weight: (_item) => { return 10; }, - condition: (item) => {return false;}, - remove: (item, host) => {}, + 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"}, @@ -228,11 +228,11 @@ let KDCurses = { powerMult: 2.2, activatecurse: true, level: 4, - weight: (item) => { + weight: (_item) => { return 10; }, - condition: (item) => {return false;}, - remove: (item, host) => {}, + 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"}, @@ -247,11 +247,11 @@ let KDCurses = { powerMult: 2.2, activatecurse: true, level: 4, - weight: (item) => { + weight: (_item) => { return 10; }, - condition: (item) => {return false;}, - remove: (item, host) => {}, + 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"}, @@ -261,11 +261,11 @@ let KDCurses = { powerMult: 2.2, activatecurse: true, level: 4, - weight: (item) => { + weight: (_item) => { return 10; }, - condition: (item) => {return false;}, - remove: (item, host) => {}, + condition: (_item) => {return false;}, + remove: (_item, _host) => {}, events: [ {type: "RemoveOnDmg", power: 1, count: 5, damage: "glue", trigger: "beforePlayerDamage", kind: "CurseGlue"} ], @@ -274,11 +274,11 @@ let KDCurses = { powerMult: 2.2, activatecurse: true, level: 4, - weight: (item) => { + weight: (_item) => { return 10; }, - condition: (item) => {return false;}, - remove: (item, host) => {}, + condition: (_item) => {return false;}, + remove: (_item, _host) => {}, events: [ {type: "RemoveOnDmg", power: 1, count: 5, damage: "chain", trigger: "beforePlayerDamage", kind: "CurseChain"} ], @@ -287,11 +287,11 @@ let KDCurses = { powerMult: 2.5, activatecurse: true, level: 6, - weight: (item) => { + weight: (_item) => { return 10; }, - condition: (item) => {return false;}, - remove: (item, host) => {}, + condition: (_item) => {return false;}, + remove: (_item, _host) => {}, events: [ {type: "SacrificeMage", power: 1, count: 5, mult: 1, trigger: "afterCapture", kind: "SacrificeMage"} ], @@ -300,16 +300,16 @@ let KDCurses = { powerMult: 2, activatecurse: true, level: 2, - weight: (item) => { + weight: (_item) => { return 10; }, - onApply: (item, host) => { + onApply: (_item, _host) => { KinkyDungeonChangeWill(-1); }, - condition: (item) => { + condition: (_item) => { return KinkyDungeonStatWill >= KinkyDungeonStatWillMax*0.99; }, - remove: (item, host) => { + remove: (_item, _host) => { // For free! } }, @@ -317,13 +317,13 @@ let KDCurses = { powerMult: 2, activatecurse: true, level: 2, - weight: (item) => { + weight: (_item) => { return 10; }, - condition: (item) => { + condition: (_item) => { return KinkyDungeonStatMana + KinkyDungeonStatManaPool >= 20; }, - remove: (item, host) => { + remove: (_item, _host) => { KinkyDungeonChangeMana(-20, false, 0, true, true); } }, @@ -331,71 +331,71 @@ let KDCurses = { powerMult: 2.5, activatecurse: true, level: 2, - weight: (item) => { + weight: (_item) => { return 10; }, events: [ {type: "ShrineUnlockWiggle", trigger: "tick", kind: "ShrineWill"} ], - condition: (item) => { + 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! */}}, + }, remove: (_item, _host) => {/* For free! */}}, "ShrineElements" : { powerMult: 2.5, activatecurse: true, level: 2, - weight: (item) => { + weight: (_item) => { return 10; }, events: [ {type: "ShrineUnlockWiggle", trigger: "tick", kind: "ShrineElements"} ], - condition: (item) => { + 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! */}}, + }, remove: (_item, _host) => {/* For free! */}}, "ShrineConjure" : { powerMult: 2.5, activatecurse: true, level: 2, - weight: (item) => { + weight: (_item) => { return 10; }, events: [ {type: "ShrineUnlockWiggle", trigger: "tick", kind: "ShrineConjure"} ], - condition: (item) => { + 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! */}}, + }, remove: (_item, _host) => {/* For free! */}}, "ShrineIllusion" : { powerMult: 2.5, activatecurse: true, level: 2, - weight: (item) => { + weight: (_item) => { return 10; }, events: [ {type: "ShrineUnlockWiggle", trigger: "tick", kind: "ShrineIllusion"} ], - condition: (item) => { + 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! */}}, + }, remove: (_item, _host) => {/* For free! */}}, "OrgasmResist" : { powerMult: 2.9, activatecurse: true, level: 5, - weight: (item) => { + weight: (_item) => { return KinkyDungeonStatsChoice.get("arousalMode") ? 7 : 0; }, - condition: (item) => {return false;}, - remove: (item, host) => {}, + 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"}, @@ -406,11 +406,11 @@ let KDCurses = { powerMult: 2.5, activatecurse: true, level: 5, - weight: (item) => { + weight: (_item) => { return KinkyDungeonStatsChoice.get("arousalMode") ? 9 : 0; }, - condition: (item) => {return false;}, - remove: (item, host) => {}, + condition: (_item) => {return false;}, + remove: (_item, _host) => {}, events: [ {type: "IncrementRemovalVar", power: 25, count: 50, trigger: "orgasm", kind: "HaveOrgasm", msg: "KDRemoveOnOrgasmFail"}, ], @@ -426,9 +426,8 @@ curseInfoSensitivity,"Curse of Sensitivity: Makes it easier to lose control of y */ /** Cursed variants of restraints - * @type {Record} */ -let KDCursedVars = { +let KDCursedVars: Record = { "Common": { level: 1, variant: (restraint, newRestraintName) => { @@ -443,10 +442,10 @@ let KDCursedVars = { /** * Bestows an event-type curse onto an item by adding events - * @param {item} item - * @param {KinkyDungeonEvent[]} ev + * @param item + * @param ev */ -function KDBestowCurse(item, ev) { +function KDBestowCurse(item: item, ev: KinkyDungeonEvent[]): void { // Sanitize to avoid duped pointer ev = JSON.parse(JSON.stringify(ev)); if (!item.events) item.events = []; @@ -458,21 +457,19 @@ function KDBestowCurse(item, ev) { } /** - * - * @param {restraint} restraint - * @param {string} newRestraintName - * @param {KinkyDungeonEvent[]} ev - * @param {number} power - * @param {string} lock - * @param {Record} enemyTags - * @returns {any} + * @param restraint + * @param newRestraintName + * @param ev + * @param power + * @param lock + * @param enemyTags + * @param noPick */ -function KDAddEventVariant(restraint, newRestraintName, ev, power = 4, lock = undefined, enemyTags = {basicCurse: 10}, noPick = true) { +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); - /** @type {KinkyDungeonEvent[]} */ - let events = ev.concat(restraint.events); + let events: KinkyDungeonEvent[] = ev.concat(restraint.events); let escapeChance = Object.assign({}, restraint.escapeChance); Object.assign(escapeChance, { Struggle: Math.min(restraint.escapeChance.Struggle, -0.2), @@ -501,7 +498,7 @@ function KDAddEventVariant(restraint, newRestraintName, ev, power = 4, lock = un }; } -function KinkyDungeonCurseInfo(item, Curse) { +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) { @@ -511,7 +508,7 @@ function KinkyDungeonCurseInfo(item, Curse) { } } -function KinkyDungeonCurseStruggle(item, Curse) { +function KinkyDungeonCurseStruggle(item: item, Curse: string) { if (Curse == "MistressKey") { KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonCurseStruggle" + Curse + item.name), "White", 2); } else if (KDCurses[Curse].customStruggle) { @@ -519,7 +516,7 @@ function KinkyDungeonCurseStruggle(item, Curse) { } else KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonCurseStruggle" + Curse), "White", 2); } -function KinkyDungeonCurseAvailable(item, Curse) { +function KinkyDungeonCurseAvailable(item: item, Curse: string) { if (KDCurses[Curse] && KDCurses[Curse].condition(item)) { return true; } @@ -527,12 +524,11 @@ function KinkyDungeonCurseAvailable(item, Curse) { } /** - * - * @param {string} group - * @param {number} index - * @param {string} Curse + * @param group + * @param index + * @param Curse */ -function KinkyDungeonCurseUnlock(group, index, Curse) { +function KinkyDungeonCurseUnlock(group: string, index: number, Curse: string) { let unlock = true; let keep = true; let restraint = KinkyDungeonGetRestraintItem(group); @@ -566,10 +562,9 @@ function KinkyDungeonCurseUnlock(group, index, Curse) { } /** - * @param {string} curse - * @returns {number} + * @param curse */ -function KDCursePower(curse) { +function KDCursePower(curse: string): number { if (KDCurses[curse]) { return KDCurses[curse].powerBoost || 5; } @@ -577,12 +572,11 @@ function KDCursePower(curse) { } /** - * @param {string} curse - * @returns {number} + * @param curse */ -function KDCurseMult(curse) { +function KDCurseMult(curse: string): number { if (KDCurses[curse]) { return KDCurses[curse].powerMult || 3; } return 1; -} \ No newline at end of file +} diff --git a/Game/src/item/KinkyDungeonInventory.js b/Game/src/item/KinkyDungeonInventory.ts similarity index 91% rename from Game/src/item/KinkyDungeonInventory.js rename to Game/src/item/KinkyDungeonInventory.ts index 12a38672b..62127ee0a 100644 --- a/Game/src/item/KinkyDungeonInventory.js +++ b/Game/src/item/KinkyDungeonInventory.ts @@ -15,10 +15,9 @@ let KinkyDungeonFilters = [ Armor, ]; -let KDInventoryActionsDefault = { +let KDInventoryActionsDefault: Record string[]> = { restraint: (item) => { - /** @type {string[]} */ - let ret = []; + let ret: string[] = []; ret.push("Favorite"); if (!KDGetCurse(item)) { ret.push("Struggle"); @@ -32,14 +31,13 @@ let KDInventoryActionsDefault = { ret.push("Lock"); } } else { - ret.push("CurseStruggle", "CurseInfo"); + ret.push("CurseInfo", "CurseStruggle"); if (KinkyDungeonCurseAvailable(item, KDGetCurse(item))) ret.push("CurseUnlock"); } return ret; }, - looserestraint: (item) => { - /** @type {string[]} */ - let ret = []; + looserestraint: (_item) => { + let ret: string[] = []; ret.push("Equip"); ret.push("Favorite"); ret.push("Drop"); @@ -48,9 +46,8 @@ let KDInventoryActionsDefault = { return ret; }, - weapon: (item) => { - /** @type {string[]} */ - let ret = []; + weapon: (_item) => { + let ret: string[] = []; ret.push("Equip"); ret.push("Favorite"); ret.push("Drop"); @@ -61,18 +58,16 @@ let KDInventoryActionsDefault = { ret.push("Hotbar"); return ret; }, - consumable: (item) => { - /** @type {string[]} */ - let ret = []; + consumable: (_item) => { + let ret: string[] = []; ret.push("Use"); ret.push("Favorite"); ret.push("Drop"); ret.push("Hotbar"); return ret; }, - outfit: (item) => { - /** @type {string[]} */ - let ret = []; + outfit: (_item) => { + let ret: string[] = []; ret.push("Equip"); ret.push("Favorite"); ret.push("Drop"); @@ -101,48 +96,36 @@ let KDFilterTransform = { 'armor': 'looserestraint', }; -/** @type {Record} */ -let KinkyDungeonRestraintVariants = {}; +let KinkyDungeonRestraintVariants: Record = {}; -/** @type {Record} */ -let KinkyDungeonWeaponVariants = {}; +let KinkyDungeonWeaponVariants: Record = {}; -/** @type {Record} */ -let KinkyDungeonConsumableVariants = {}; +let KinkyDungeonConsumableVariants: Record = {}; /** - * - * @param {item} item - * @returns {KDRestraintVariant} + * @param item */ -function KDGetRestraintVariant(item) { +function KDGetRestraintVariant(item: item): KDRestraintVariant { // @ts-ignore return KinkyDungeonRestraintVariants[item.inventoryVariant || item.inventoryAs || item.name]; } /** - * - * @param {item} item - * @returns {KDConsumableVariant} + * @param item */ -function KDGetConsumableVariant(item) { +function KDGetConsumableVariant(item: item): KDConsumableVariant { // @ts-ignore return KinkyDungeonConsumableVariants[item.inventoryVariant || item.inventoryAs || item.name]; } /** - * - * @param {item} item - * @returns {KDWeaponVariant} + * @param item */ -function KDGetWeaponVariant(item) { +function KDGetWeaponVariant(item: item): KDWeaponVariant { // @ts-ignore return KinkyDungeonWeaponVariants[item.inventoryVariant || item.inventoryAs || item.name]; } -/** - * @type {Record} - */ -let KDInventoryUseIconConfig = {}; +let KDInventoryUseIconConfig: Record = {}; KDInventoryUseIconConfig[Weapon] = true; KDInventoryUseIconConfig[Consumable] = true; KDInventoryUseIconConfig[LooseRestraint] = true; @@ -151,17 +134,11 @@ KDInventoryUseIconConfig[Armor] = true; /** Index of current filters for each filter type */ -/** - * @type {Record} - */ -let KDFilterIndex = {}; +let KDFilterIndex: Record = {}; let KDMaxFilters = 14; /** List of current filters for each filter type */ -/** - * @type {Record>} - */ -let KDFilterFilters = {}; +let KDFilterFilters: Record> = {}; KDFilterFilters[LooseRestraint] = { Special: false, Mundane: false, @@ -256,8 +233,7 @@ KDFilterFilters[Weapon] = { }; -/** @type {Record boolean>>} */ -let KDSpecialFilters = { +let KDSpecialFilters: Record boolean>> = { looserestraint: { Special: (item, handle) => { if (handle) KDFilterFilters[LooseRestraint].Mundane = false; @@ -267,10 +243,10 @@ let KDSpecialFilters = { if (handle) KDFilterFilters[LooseRestraint].Special = false; return !(KDRestraintSpecial(item)); }, - Disassemble: (item, handle) => { + Disassemble: (item, _handle) => { return KDRestraint(item)?.disassembleAs != undefined; }, - QuickBind: (item, handle) => { + QuickBind: (item, _handle) => { return KDRestraint(item)?.quickBindCondition != undefined; }, }, @@ -284,34 +260,34 @@ let KDSpecialFilters = { return !KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]; }, - Head: (item, handle) => { + Head: (item, _handle) => { return KDRestraint(item)?.Group == "ItemHead" || KDRestraint(item)?.Group == "ItemMouth" || KDRestraint(item)?.Group == "ItemNeck"; }, - Neck: (item, handle) => { + Neck: (item, _handle) => { return KDRestraint(item)?.Group == "ItemNeck"; }, - Chest: (item, handle) => { + Chest: (item, _handle) => { return KDRestraint(item)?.Group == "ItemBreast"; }, - Arms: (item, handle) => { + Arms: (item, _handle) => { return KDRestraint(item)?.Group == "ItemArms"; }, - Gloves: (item, handle) => { + Gloves: (item, _handle) => { return KDRestraint(item)?.Group == "ItemHands"; }, - Torso: (item, handle) => { + Torso: (item, _handle) => { return KDRestraint(item)?.Group == "ItemTorso"; }, - Panties: (item, handle) => { + Panties: (item, _handle) => { return KDRestraint(item)?.Group == "ItemPelvis"; }, - Legs: (item, handle) => { + Legs: (item, _handle) => { return KDRestraint(item)?.Group == "ItemLegs"; }, - Ankles: (item, handle) => { + Ankles: (item, _handle) => { return KDRestraint(item)?.Group == "ItemFeet"; }, - Boots: (item, handle) => { + Boots: (item, _handle) => { return KDRestraint(item)?.Group == "ItemBoots"; }, }, @@ -324,7 +300,7 @@ let KDSpecialFilters = { if (handle) KDFilterFilters[Weapon].Mundane = false; return KDWeapon(item)?.magic || KinkyDungeonWeaponVariants[item.inventoryVariant || item.name] != undefined; }, - Divine: (item, handle) => { + Divine: (item, _handle) => { return KDWeapon(item)?.tags?.includes("divine"); }, Ranged: (item, handle) => { @@ -335,7 +311,7 @@ let KDSpecialFilters = { if (handle) KDFilterFilters[Weapon].Ranged = false; return !KDWeapon(item)?.tags?.includes("ranged"); }, - Ability: (item, handle) => { + Ability: (item, _handle) => { return KDWeapon(item)?.special != undefined; }, Physical: (item, handle) => { @@ -354,22 +330,22 @@ let KDSpecialFilters = { if (handle) KDFilterFilters[Weapon].Light = false; return KDWeapon(item)?.heavy || KDWeapon(item)?.clumsy || KDWeapon(item)?.massive; }, - Toy: (item, handle) => { + Toy: (item, _handle) => { return KDWeapon(item)?.tags?.includes("toy"); }, - Bondage: (item, handle) => { + Bondage: (item, _handle) => { return KDWeapon(item)?.tags?.includes("bondage"); }, - Utility: (item, handle) => { + Utility: (item, _handle) => { return KDWeapon(item)?.tags?.includes("utility"); }, - Staff: (item, handle) => { + Staff: (item, _handle) => { return KDWeapon(item)?.tags?.includes("staff"); }, - Shield: (item, handle) => { + Shield: (item, _handle) => { return KDWeapon(item)?.tags?.includes("shield"); }, - Tease: (item, handle) => { + Tease: (item, _handle) => { return KinkyDungeonTeaseDamageTypes.includes(KDWeapon(item)?.type) || KDWeapon(item)?.tease; }, }, @@ -383,7 +359,7 @@ let KDSpecialFilters = { if (handle) KDFilterFilters[Restraint].Mundane = false; return (KDRestraint(item)?.armor && KinkyDungeonRestraintVariants[item.inventoryVariant || item.name] != undefined); }, - Good: (item, handle) => { + Good: (item, _handle) => { return (KDRestraint(item)?.good); }, Mundane: (item, handle) => { @@ -417,7 +393,7 @@ let KDSpecialFilters = { if (handle) KDFilterFilters[Restraint].Armor = false; return !KDRestraint(item)?.armor; }, - Cursed: (item, handle) => { + Cursed: (item, _handle) => { return KDGetCurse(item) != undefined; }, }, @@ -440,13 +416,14 @@ function KDCloseQuickInv() { KDInventoryStatus.HideQuickInv = false; } -function KDRestraintSpecial(item) { - return KDRestraint(item)?.enchanted || KDRestraint(item)?.special || KDRestraint(item)?.showInQuickInv || item.showInQuickInv; +function KDRestraintSpecial(item: Named): boolean { + // FIXME: Check that last bit with the typecast. + return KDRestraint(item)?.enchanted || KDRestraint(item)?.special || KDRestraint(item)?.showInQuickInv || (item as item).showInQuickInv; } let KDWeaponSwitchPref = 0; -function KDSwitchWeapon(weapon, pref) { +function KDSwitchWeapon(weapon?: string, pref?: number) { if (typeof KDGameData.PreviousWeapon === 'string' || !KDGameData.PreviousWeapon) KDGameData.PreviousWeapon = []; //let previousWeapon = weapon || (KDGameData.PreviousWeapon ? KDGameData.PreviousWeapon[0] : null); @@ -494,12 +471,12 @@ function KinkyDungeonHandleInventory() { return true; } -function KinkyDungeonInventoryAddWeapon(Name) { +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, UnlockCurse, faction, quantity = 1) { +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()}); @@ -508,16 +485,14 @@ function KinkyDungeonInventoryAddLoose(Name, UnlockCurse, faction, quantity = 1) } } -function KinkyDungeonInventoryAddOutfit(Name) { +function KinkyDungeonInventoryAddOutfit(Name: string) { if (!KinkyDungeonInventoryGetOutfit(Name) && KinkyDungeonOutfitCache.has(Name)) KinkyDungeonInventoryAdd({name:Name, type:Outfit, id: KinkyDungeonGetItemID()}); } /** - * - * @param item {item} - * @return {string} + * @param item */ -function KDInventoryType(item) {return item.type;} +function KDInventoryType(item: item): string {return item.type;} function KinkyDungeonFullInventory() { let ret = []; @@ -538,10 +513,9 @@ function KinkyDungeonInventoryLength() { } /** - * - * @param item {item} + * @param item */ -function KinkyDungeonInventoryAdd(item) { +function KinkyDungeonInventoryAdd(item: item) { let type = KDInventoryType(item); if (KinkyDungeonInventory.has(type)) { KinkyDungeonInventory.get(type).set(item.name, item); @@ -549,10 +523,9 @@ function KinkyDungeonInventoryAdd(item) { } /** - * - * @param item {item} + * @param item */ -function KinkyDungeonInventoryRemove(item) { +function KinkyDungeonInventoryRemove(item: item) { if (item) { let type = KDInventoryType(item); if (KinkyDungeonInventory.has(type)) { @@ -562,9 +535,9 @@ function KinkyDungeonInventoryRemove(item) { } /** * Does not remove equipped restraints - * @param item {item} + * @param item */ -function KinkyDungeonInventoryRemoveSafe(item) { +function KinkyDungeonInventoryRemoveSafe(item: item) { if (item) { let type = KDInventoryType(item); if (type != Restraint && KinkyDungeonInventory.has(type)) { @@ -574,11 +547,9 @@ function KinkyDungeonInventoryRemoveSafe(item) { } /** - * * @param Name - * @return {null|item} */ -function KinkyDungeonInventoryGet(Name) { +function KinkyDungeonInventoryGet(Name: string): item | null { for (let m of KinkyDungeonInventory.values()) { if (m.has(Name)) return m.get(Name); } @@ -586,11 +557,9 @@ function KinkyDungeonInventoryGet(Name) { } /** - * * @param Name - * @return {null|item} */ -function KinkyDungeonInventoryGetSafe(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); } @@ -598,55 +567,45 @@ function KinkyDungeonInventoryGetSafe(Name) { } /** - * * @param Name - * @return {null|item} */ -function KinkyDungeonInventoryGetLoose(Name) { +function KinkyDungeonInventoryGetLoose(Name: string): item | null { return KinkyDungeonInventory.get(LooseRestraint).get(Name); } /** - * * @param Name - * @return {null|item} */ -function KinkyDungeonInventoryGetConsumable(Name) { +function KinkyDungeonInventoryGetConsumable(Name: string): item | null { return KinkyDungeonInventory.get(Consumable).get(Name); } /** - * * @param Name - * @return {null|item} */ -function KinkyDungeonInventoryGetWeapon(Name) { +function KinkyDungeonInventoryGetWeapon(Name: string): item | null { return KinkyDungeonInventory.get(Weapon).get(Name); } /** - * * @param Name - * @return {null|item} */ -function KinkyDungeonInventoryGetOutfit(Name) { +function KinkyDungeonInventoryGetOutfit(Name: string): item | null { return KinkyDungeonInventory.get(Outfit).get(Name); } /** * Returns list - * @return {item[]} */ -function KinkyDungeonAllRestraint() { +function KinkyDungeonAllRestraint(): item[] { 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() { +function KinkyDungeonAllRestraintDynamic(): { item: item, host: item }[] { let ret = []; for (let inv of KinkyDungeonAllRestraint()) { ret.push({item: inv, host: null}); @@ -664,30 +623,26 @@ function KinkyDungeonAllRestraintDynamic() { /** * Returns list - * @return {item[]} */ -function KinkyDungeonAllLooseRestraint() { +function KinkyDungeonAllLooseRestraint(): item[] { return KinkyDungeonInventory.get(LooseRestraint) ? Array.from(KinkyDungeonInventory.get(LooseRestraint).values()) : []; } /** * Returns list - * @return {item[]} */ -function KinkyDungeonAllConsumable() { +function KinkyDungeonAllConsumable(): item[] { return KinkyDungeonInventory.get(Consumable) ? Array.from(KinkyDungeonInventory.get(Consumable).values()) : []; } /** * Returns list - * @return {item[]} */ -function KinkyDungeonAllOutfit() { +function KinkyDungeonAllOutfit(): item[] { return KinkyDungeonInventory.get(Outfit) ? Array.from(KinkyDungeonInventory.get(Outfit).values()) : []; } /** * Returns list - * @return {item[]} */ -function KinkyDungeonAllWeapon() { +function KinkyDungeonAllWeapon(): item[] { return KinkyDungeonInventory.get(Weapon) ? Array.from(KinkyDungeonInventory.get(Weapon).values()) : []; } @@ -696,14 +651,21 @@ function KinkyDungeonAllWeapon() { } return null;*/ +type itemPreviewEntry = { + name: any; + item: any; + preview: string; + preview2?: string; + previewcolor?: string; + previewcolorbg?: string; + key?: string; +} + /** - * - * @param {NamedAndTyped} item - * @returns {{name: any; item: any; preview: string, preview2?: string, previewcolor?: string; previewcolorbg?: string; key?: string}} + * @param item */ -function KDGetItemPreview(item) { - /** @type {{name: any; item: any; preview: string, preview2?: string, previewcolor?: string; previewcolorbg?: string; key?: string}} */ - let ret = null; +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; @@ -792,11 +754,9 @@ function KDGetItemPreview(item) { /** - * - * @param {string} Group - * @returns {string} + * @param Group */ -function KDGetGroupPreviewImage(Group) { +function KDGetGroupPreviewImage(Group: string): string { try { if (KDTex(KinkyDungeonRootDirectory + `Items/Group/${Group}.png`)?.valid) return KinkyDungeonRootDirectory + `Items/Group/${Group}.png`; } catch (e) { @@ -808,11 +768,9 @@ function KDGetGroupPreviewImage(Group) { /** - * - * @param {restraint} restraint - * @returns {string} + * @param restraint */ -function KDGetRestraintPreviewImage(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`; @@ -842,16 +800,14 @@ function KDGetRestraintPreviewImage(restraint) { /** - * - * @param {string} Filter - * @param {boolean} [enchanted] - * @param {boolean} [ignoreHidden] - * @param {boolean} [ignoreFilters] - * @param {string} [click] - this filter will be handled and thus updates the filters - * @param {string} [namefilter] - * @returns {{name: any; item: any; preview: string; preview2?: string; previewcolor?: string; previewcolorbg?: string, key?: string}[]} + * @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, enchanted, ignoreHidden, ignoreFilters, click, namefilter) { +function KinkyDungeonFilterInventory(Filter: string, enchanted?: boolean, ignoreHidden?: boolean, ignoreFilters?: boolean, click?: string, namefilter?: string): itemPreviewEntry[] { let filter_orig = Filter; if (KDFilterTransform[Filter]) Filter = KDFilterTransform[Filter]; @@ -924,9 +880,8 @@ function KinkyDungeonFilterInventory(Filter, enchanted, ignoreHidden, ignoreFilt let affinity = KDGetRestraintAffinity(restraint, {StruggleType: "Unlock"}); let struggleGroup = KDRestraint(item)?.Group; /** - * @type {KDStruggleData} */ - let data = { + let data: KDStruggleData = { minSpeed: KDMinEscapeRate, handBondage: 0, handsBound: false, @@ -950,7 +905,7 @@ function KinkyDungeonFilterInventory(Filter, enchanted, ignoreHidden, ignoreFilt cost: KinkyDungeonStatStaminaCostStruggle, wcost: KinkyDungeonStatWillCostStruggle, escapePenalty: -KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StrugglePower"), - willEscapePenalty: KDGetWillPenalty(), + willEscapePenalty: KDGetWillPenalty("Unlock"), canCut: KinkyDungeonWeaponCanCut(false, false), canCutMagic: KinkyDungeonWeaponCanCut(false, true), toolBonus: 0.0, @@ -1004,14 +959,18 @@ function KinkyDungeonFilterInventory(Filter, enchanted, ignoreHidden, ignoreFilt } /** - * - * @param {{name: any, item: item, preview: string, preview2?: string, key?: string}} item - * @param {boolean} [noscroll] - * @param {boolean} [treatAsHover] - * @param {number} xOffset - * @returns {boolean} + * @param item + * @param [noscroll] + * @param [treatAsHover] + * @param [xOffset] */ -function KinkyDungeonDrawInventorySelected(item, noscroll, treatAsHover, xOffset = 0) { +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; @@ -1282,14 +1241,25 @@ function KinkyDungeonDrawInventorySelected(item, noscroll, treatAsHover, xOffset } /** - * - * @param {number} xOffset - * @param {KDFilteredInventoryItem[]} filteredInventory - * @param {(KDFilteredInventoryItem, x, y, w, h) => void} [itemcallback] - * @param {(KDFilteredInventoryItem) => string} [colorcallback] + * @param xOffset + * @param yOffset + * @param filteredInventory + * @param filter + * @param CurrentFilter + * @param [itemcallback] + * @param [colorcallback] * @returns {{selected: KDFilteredInventoryItem, tooltipitem: KDFilteredInventoryItem}} */ -function KDDrawInventoryContainer(xOffset, yOffset, filteredInventory, filter, CurrentFilter, itemcallback, colorcallback) { +function KDDrawInventoryContainer ( + xOffset: number, + yOffset: number, + filteredInventory: KDFilteredInventoryItem[], + filter: string, + CurrentFilter: string, + itemcallback?: (item: KDFilteredInventoryItem, x: number, y: number, w: number, h: number) => void, + colorcallback?: (item: KDFilteredInventoryItem) => string +): {selected: KDFilteredInventoryItem, tooltipitem: KDFilteredInventoryItem} +{ if (KinkyDungeonCurrentPageInventory >= filteredInventory.length) KinkyDungeonCurrentPageInventory = 0; let tooltipitem = null; @@ -1302,7 +1272,7 @@ function KDDrawInventoryContainer(xOffset, yOffset, filteredInventory, filter, C let TF = KDTextField("InvFilter", 1460 + xOffset, yOffset + 150, 350, 54, "text", "", "45"); if (TF.Created) { KDInvFilter = ""; - TF.Element.oninput = (event) => { + TF.Element.oninput = (_event: any) => { KDInvFilter = ElementValue("InvFilter"); }; } @@ -1330,7 +1300,7 @@ function KDDrawInventoryContainer(xOffset, yOffset, filteredInventory, filter, C KinkyDungeonClickItemChoice(I, selected.item.name); } }); - DrawButtonKDEx("KDBack", (bdata) => { + DrawButtonKDEx("KDBack", (_bdata) => { KDConfigHotbar = !KDConfigHotbar; return true; }, true, canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale + 185, yOffset + canvasOffsetY_ui + 483*KinkyDungeonBookScale - 150, 190, 55, TextGet("KDBack"), "#ffffff", ""); @@ -1371,7 +1341,7 @@ function KDDrawInventoryContainer(xOffset, yOffset, filteredInventory, filter, C if (DrawButtonKDExScroll("invchoice_" + i, (amount) => { 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) => { + }, (_bdata) => { KinkyDungeonCurrentPageInventory = index; if (itemcallback) itemcallback(filteredInventory[index], canvasOffsetX_ui + xOffset + xx * b_width + 640*KinkyDungeonBookScale + 135, @@ -1450,7 +1420,7 @@ function KDDrawInventoryContainer(xOffset, yOffset, filteredInventory, filter, C DrawButtonKDExScroll("invchoice_" + i, (amount) => { 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) => { + }, (_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, @@ -1476,7 +1446,7 @@ function KDDrawInventoryContainer(xOffset, yOffset, filteredInventory, filter, C } - DrawButtonKDEx("invScrollUp", (bdata) => { + DrawButtonKDEx("invScrollUp", (_bdata) => { if (filteredInventory.length > 0) { if (KinkyDungeonInventoryOffset > 0) { KinkyDungeonInventoryOffset = Math.max(0, KinkyDungeonInventoryOffset - numRows*3); @@ -1489,7 +1459,7 @@ function KDDrawInventoryContainer(xOffset, yOffset, filteredInventory, filter, C hotkey: KDHotkeyToText(KinkyDungeonKey[5]), hotkeyPress: KinkyDungeonKey[5], }); - DrawButtonKDEx("invScrollDown", (bdata) => { + DrawButtonKDEx("invScrollDown", (_bdata) => { if (filteredInventory.length > 0) { if (KinkyDungeonInventoryOffset + numRows*3 < filteredInventory.length + 2) { KinkyDungeonInventoryOffset += numRows*3; @@ -1523,7 +1493,7 @@ function KDDrawInventoryContainer(xOffset, yOffset, filteredInventory, filter, C activeDown = true; } } - let scroll = (amount) => { + let scroll = (amount: number) => { if (filters.length > KDMaxFilters) return Math.max(0, Math.min(Object.keys(KDFilterFilters[CurrentFilter]).length - KDMaxFilters/2, @@ -1536,7 +1506,7 @@ function KDDrawInventoryContainer(xOffset, yOffset, filteredInventory, filter, C // Draw up button DrawButtonKDExScroll("invchoice_filter_" + i, (amount) => { KDFilterIndex[CurrentFilter] = scroll(amount); - }, (bdata) => { + }, (_bdata) => { KDFilterIndex[CurrentFilter] = scroll(-1); return true; }, true, canvasOffsetX_ui + xOffset + xx * 200 + 640*KinkyDungeonBookScale + 132, yOffset + canvasOffsetY_ui + 50 + 40 * yy, 159, 36, @@ -1553,7 +1523,7 @@ function KDDrawInventoryContainer(xOffset, yOffset, filteredInventory, filter, C // Draw down button DrawButtonKDExScroll("invchoice_filter_" + i, (amount) => { KDFilterIndex[CurrentFilter] = scroll(amount); - }, (bdata) => { + }, (_bdata) => { KDFilterIndex[CurrentFilter] = scroll(1); return true; }, true, canvasOffsetX_ui + xOffset + xx * 200 + 640*KinkyDungeonBookScale + 132, yOffset + canvasOffsetY_ui + 50 + 40 * yy, 159, 36, @@ -1573,7 +1543,7 @@ function KDDrawInventoryContainer(xOffset, yOffset, filteredInventory, filter, C 3 * Math.sign(amount) + index ) ); - }, (bdata) => { + }, (_bdata) => { if (show) { KDFilterFilters[CurrentFilter][filters[i][0]] = !KDFilterFilters[CurrentFilter][filters[i][0]]; KinkyDungeonInventoryOffset = 0; @@ -1618,7 +1588,7 @@ function KinkyDungeonDrawInventory() { } if (!KDConfigHotbar) - DrawButtonKDEx("categoryfilter" + I, (bdata) => { + DrawButtonKDEx("categoryfilter" + I, (_bdata) => { KinkyDungeonCurrentFilter = KinkyDungeonFilters[I]; KinkyDungeonCurrentPageInventory = 0; return true; @@ -1633,8 +1603,7 @@ function KinkyDungeonDrawInventory() { if (KinkyDungeonDrawInventorySelected(filteredInventory[KinkyDungeonCurrentPageInventory], undefined, undefined, xOffset) && !KDConfigHotbar) { - /** @type {string[]} */ - let inventoryActions = []; + let inventoryActions: string[] = []; for (let action of Object.entries(KDInventoryActionsDefault)) { if (filter == action[0]) { @@ -1662,7 +1631,7 @@ function KinkyDungeonDrawInventory() { 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) => { + if (DrawButtonKDEx("invAction" + action, (_bdata) => { KDSendInput("inventoryAction", {action: action, player: KinkyDungeonPlayerEntity, item: filteredInventory[KinkyDungeonCurrentPageInventory].item}); return true; }, true, XX + II*KDInventoryActionSpacing, YY, 74, 74, "", "", @@ -1670,7 +1639,11 @@ function KinkyDungeonDrawInventory() { "", !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}, + 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) @@ -1692,7 +1665,7 @@ function KinkyDungeonDrawInventory() { if (filter == Restraint) { let item = filteredInventory[KinkyDungeonCurrentPageInventory].item; let itemIndex = KDGetItemLinkIndex(item, false); - DrawButtonKDEx("struggleItem", (bdata) => { + DrawButtonKDEx("struggleItem", (_bdata) => { if (itemIndex >= 0 && KDCanStruggle(item)) { let r = KDRestraint(item); let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); @@ -1701,7 +1674,7 @@ function KinkyDungeonDrawInventory() { 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) => { + DrawButtonKDEx("removeItem", (_bdata) => { if (itemIndex >= 0 && KDCanRemove(item)) { let r = KDRestraint(item); let sg = KinkyDungeonStruggleGroups.find((group) => {return r.Group == group.group;}); @@ -1712,7 +1685,7 @@ function KinkyDungeonDrawInventory() { (itemIndex >= 0 && KDCanRemove(item)) ? "#ffffff" : "#888888", "", ""); if (KDGameData.InventoryAction) { - DrawButtonKDEx("inventoryAction", (bdata) => { + 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, @@ -1731,7 +1704,7 @@ function KinkyDungeonDrawInventory() { if (KinkyDungeonCurrentPageInventory >= filteredInventory.length) KinkyDungeonCurrentPageInventory = Math.max(0, KinkyDungeonCurrentPageInventory - 1); if (KinkyDungeonCurrentPageInventory > 0) { - DrawButtonKDEx("invlastpage", (bdata) => { + DrawButtonKDEx("invlastpage", (_bdata) => { if (KinkyDungeonCurrentPageInventory > 0) { KinkyDungeonCurrentPageInventory -= 1; return true; @@ -1744,7 +1717,7 @@ function KinkyDungeonDrawInventory() { }); } if (KinkyDungeonCurrentPageInventory < filteredInventory.length-1) { - DrawButtonKDEx("invnextpage", (bdata) => { + DrawButtonKDEx("invnextpage", (_bdata) => { if (KinkyDungeonCurrentPageInventory < filteredInventory.length-1) { KinkyDungeonCurrentPageInventory += 1; return true; @@ -1759,7 +1732,7 @@ function KinkyDungeonDrawInventory() { } -function KinkyDungeonSendInventoryEvent(Event, data) { +function KinkyDungeonSendInventoryEvent(Event: string, data: any) { if (!KDMapHasEvent(KDEventMapInventory, Event)) return; let iteration = 0; let stack = true; @@ -1824,7 +1797,7 @@ function KinkyDungeonSendInventoryEvent(Event, data) { } } -function KinkyDungeonSendInventorySelectedEvent(Event, data) { +function KinkyDungeonSendInventorySelectedEvent(Event: string, data: any) { if (!KDMapHasEvent(KDEventMapInventorySelected, Event)) return; let item = data.SelectedItem; if (item?.events) { @@ -1836,7 +1809,7 @@ function KinkyDungeonSendInventorySelectedEvent(Event, data) { } } -function KinkyDungeonSendInventoryIconEvent(Event, data) { +function KinkyDungeonSendInventoryIconEvent(Event: string, data: any) { if (!KDMapHasEvent(KDEventMapInventoryIcon, Event)) return; let item = data.RenderedItem; if (item?.events) { @@ -1850,7 +1823,7 @@ function KinkyDungeonSendInventoryIconEvent(Event, data) { let KinkyDungeonInvDraw = []; -function KinkyDungeonQuickGrid(I, Width, Height, Xcount) { +function KinkyDungeonQuickGrid(I: number, Width: number, Height: number, Xcount: number): KDPoint { let i = 0; let h = 0; let v = 0; @@ -1907,7 +1880,7 @@ function KinkyDungeonDrawQuickInv() { let TF = KDTextField("QInvFilter", 75, 350, 340, 54, "text", "", "45"); if (TF.Created) { KDInvFilter = ""; - TF.Element.oninput = (event) => { + TF.Element.oninput = (_event: any) => { KDInvFilter = ElementValue("QInvFilter"); }; } @@ -1951,7 +1924,7 @@ function KinkyDungeonDrawQuickInv() { }, true, 510, 465, 120, 60, "", KDButtonColor, KinkyDungeonRootDirectory + "InvFilter.png", undefined, false, !KDInventoryStatus.FilterQuickInv); */ if (KinkyDungeonControlsEnabled()) { - DrawButtonKDEx("inventorysort", (bdata) => { + DrawButtonKDEx("inventorysort", (_bdata) => { if (!KDGameData.HiddenItems) KDGameData.HiddenItems = {}; for (let invStat of Object.keys(KDInventoryStatus)) { @@ -1962,7 +1935,7 @@ function KinkyDungeonDrawQuickInv() { return true; }, true, 630, 545, 120, 60, "", KDButtonColor, KinkyDungeonRootDirectory + "InvSort.png", undefined, false, !KDInventoryStatus.SortQuickInv); - DrawButtonKDEx("inventoryhide", (bdata) => { + DrawButtonKDEx("inventoryhide", (_bdata) => { if (!KDGameData.HiddenItems) KDGameData.HiddenItems = {}; for (let invStat of Object.keys(KDInventoryStatus)) { @@ -1973,7 +1946,7 @@ function KinkyDungeonDrawQuickInv() { return true; }, true, 630, 625, 120, 60, "", KDButtonColor, KinkyDungeonRootDirectory + "InvHide.png", undefined, false, !KDInventoryStatus.HideQuickInv); - DrawButtonKDEx("inventorydrop", (bdata) => { + DrawButtonKDEx("inventorydrop", (_bdata) => { for (let invStat of Object.keys(KDInventoryStatus)) { if (invStat == "DropQuickInv") KDInventoryStatus[invStat] = !KDInventoryStatus[invStat]; else KDInventoryStatus[invStat] = false; @@ -1985,25 +1958,25 @@ function KinkyDungeonDrawQuickInv() { // Quick loadouts let QL_y = 260; - DrawButtonKDEx("quickLoadout_save", (bdata) => { + 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) => { + 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) => { + 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) => { + DrawButtonKDEx("quickLoadout_num_" + i, (_bdata) => { if (KDQuickLoadoutSave) { // Save the loadout KDGameData.CurrentLoadout = i; @@ -2033,7 +2006,7 @@ function KinkyDungeonDrawQuickInv() { } // Dummy button for BG - DrawButtonKDEx("quickinvbg2_button", (bdata) => { + DrawButtonKDEx("quickinvbg2_button", (_bdata) => { return true; }, true, 620, 250, 140, 520, "", KDButtonColor, undefined, undefined, false, true, "#000000", undefined, undefined, {zIndex: -1, alpha: 0.9}); @@ -2068,7 +2041,7 @@ function KinkyDungeonDrawQuickInv() { KDScrollOffset.Consumable = Math.max(0, KDScrollOffset.Consumable - Math.ceil(0.5*-amount/80) * KDScrollAmount); }, - (bdata)=> { + (_bdata)=> { if (!KinkyDungeonControlsEnabled()) return true; if (KDInventoryStatus.HideQuickInv) { KDGameData.HiddenItems[item.name] = !KDGameData.HiddenItems[item.name]; @@ -2139,7 +2112,7 @@ function KinkyDungeonDrawQuickInv() { }); 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) => { + 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; @@ -2184,7 +2157,7 @@ function KinkyDungeonDrawQuickInv() { KDScrollOffset.Weapon = Math.max(0, KDScrollOffset.Weapon - Math.ceil(0.5*-amount/80) * KDScrollAmount); }, - (bdata)=> { + (_bdata)=> { if (!KinkyDungeonControlsEnabled()) return true; if (KDInventoryStatus.HideQuickInv) { KDGameData.HiddenItems[item.name] = !KDGameData.HiddenItems[item.name]; @@ -2255,7 +2228,7 @@ function KinkyDungeonDrawQuickInv() { }); 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) => { + 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; @@ -2297,7 +2270,7 @@ function KinkyDungeonDrawQuickInv() { KDScrollOffset.Restraint = Math.max(0, KDScrollOffset.Restraint - Math.ceil(0.5*-amount/80) * KDScrollAmount); }, - (bdata)=> { + (_bdata)=> { if (!KinkyDungeonControlsEnabled()) return true; if (KDInventoryStatus.HideQuickInv) { KDGameData.HiddenItems[item.item.name] = !KDGameData.HiddenItems[item.item.name]; @@ -2332,7 +2305,9 @@ function KinkyDungeonDrawQuickInv() { if (KDDebugLink) { linkable = KDCanAddRestraint(KDRestraint(newItem), true, "", false, currentItem, true, true); } else { - linkable = KDCurrentItemLinkable(currentItem, newItem); + //linkable = KDCurrentItemLinkable(currentItem, newItem); + linkable = KDCanAddRestraint(KDRestraint(newItem), false, "", false, currentItem, true, true); + } if (linkable) { equipped = false; @@ -2405,7 +2380,7 @@ function KinkyDungeonDrawQuickInv() { }); 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) => { + 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; @@ -2423,7 +2398,7 @@ function KinkyDungeonDrawQuickInv() { } } -function KinkyDungeonhandleQuickInv(NoUse) { +function KinkyDungeonhandleQuickInv(NoUse?: boolean): boolean { //let H = 80; @@ -2483,12 +2458,11 @@ function KinkyDungeonhandleQuickInv(NoUse) { } /** - * - * @param {string} name - * @param {entity} [player] - * @param {boolean} playerDropped + * @param name + * @param [player] + * @param [playerDropped] */ -function KDDropItemInv(name, player, playerDropped = true) { +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) { // We cant drop equipped items @@ -2506,10 +2480,9 @@ function KDDropItemInv(name, player, playerDropped = true) { } /** - * - * @param {entity} player + * @param player */ -function KDSortInventory(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) => ( @@ -2528,7 +2501,7 @@ function KDSortInventory(player) { ))); } -function KDLoadQuickLoadout(num, clearFirst) { +function KDLoadQuickLoadout(num: number, clearFirst: boolean) { if (clearFirst) { // Remove all armor that can be removed // TODO @@ -2573,7 +2546,7 @@ function KDLoadQuickLoadout(num, clearFirst) { } } -function KDSaveQuickLoadout(num) { +function KDSaveQuickLoadout(num: number) { if (!KDGameData.QuickLoadouts) KDGameData.QuickLoadouts = {}; let currentLoadout = KDGameData.QuickLoadouts[num + ""]; @@ -2612,31 +2585,34 @@ function KDSaveQuickLoadout(num) { } /** - * @param {string} Name + * @param Name */ -function KDRemoveInventoryVariant(Name, Prefix="Restraint") { +function KDRemoveInventoryVariant(Name: string, _Prefix: string = "Restraint") { delete KinkyDungeonRestraintVariants[Name]; } /** - * @param {string} Name + * @param Name */ -function KDRemoveWeaponVariant(Name, Prefix="KinkyDungeonInventoryItem") { +function KDRemoveWeaponVariant(Name: string, _Prefix: string = "KinkyDungeonInventoryItem") { delete KinkyDungeonWeaponVariants[Name]; } /** - * @param {string} Name + * @param Name */ -function KDRemoveConsumableVariant(Name, Prefix="KinkyDungeonInventoryItem") { +function KDRemoveConsumableVariant(Name: string, _Prefix: string = "KinkyDungeonInventoryItem") { delete KinkyDungeonConsumableVariants[Name]; } /** - * - * @param {boolean} worn - * @param {boolean} loose - * @param {boolean} lost + * @param [worn] + * @param [loose] + * @param [lost] + * @param [ground] + * @param [hotbar] + * @param [entities] + * @param [npcrestraints] */ -function KDPruneInventoryVariants(worn = true, loose = true, lost = true, ground = true, hotbar = true, entities = true, npcrestraints = true) { +function KDPruneInventoryVariants(worn: boolean = true, loose: boolean = true, lost: boolean = true, ground: boolean = true, hotbar: boolean = true, entities: boolean = true, npcrestraints: boolean = true) { let entries = Object.entries(KinkyDungeonRestraintVariants); let entrieswep = Object.entries(KinkyDungeonWeaponVariants); let entriescon = Object.entries(KinkyDungeonConsumableVariants); @@ -2742,6 +2718,20 @@ function KDPruneInventoryVariants(worn = true, loose = true, lost = true, ground } } + 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; @@ -2790,12 +2780,12 @@ function KDPruneInventoryVariants(worn = true, loose = true, lost = true, ground /** * Changes an inventory variant of an item - * @param {item} item - * @param {KDRestraintVariant} variant - * @param {string} prefix - * @param {string} curse + * @param item + * @param variant + * @param [prefix] + * @param [curse] */ -function KDMorphToInventoryVariant(item, variant, prefix = "", 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 : ""); @@ -2826,10 +2816,12 @@ function KDMorphToInventoryVariant(item, variant, prefix = "", curse) { /** * Adds an weapon variant to the player's inventory - * @param {KDWeaponVariant} variant - * @param {string} prefix + * @param variant + * @param [prefix] + * @param [forceName] + * @param [suffix] */ -function KDGiveWeaponVariant(variant, prefix = "", forceName, suffix = "") { +function KDGiveWeaponVariant(variant: KDWeaponVariant, prefix: string = "", forceName?: string, suffix: string = "") { let origWeapon = KinkyDungeonFindWeapon(variant.template); let events = origWeapon.events ? JSON.parse(JSON.stringify(origWeapon.events)) : []; let newname = forceName ? forceName : (prefix + variant.template + KinkyDungeonGetItemID()); @@ -2846,10 +2838,13 @@ function KDGiveWeaponVariant(variant, prefix = "", forceName, suffix = "") { /** * Adds an Consumable variant to the player's inventory - * @param {KDConsumableVariant} variant - * @param {string} prefix + * @param variant + * @param [prefix] + * @param [forceName] + * @param [suffix] + * @param [Quantity] */ -function KDGiveConsumableVariant(variant, prefix = "", forceName, suffix = "", Quantity = 1) { +function KDGiveConsumableVariant(variant: KDConsumableVariant, prefix: string = "", forceName?: string, suffix: string = "", Quantity: number = 1) { //let origConsumable = KinkyDungeonFindConsumable(variant.template); let events = [];//TODO//origConsumable.events ? JSON.parse(JSON.stringify(origConsumable.events)) : []; let newname = forceName ? forceName : (prefix + variant.template + KinkyDungeonGetItemID()); @@ -2865,15 +2860,17 @@ function KDGiveConsumableVariant(variant, prefix = "", forceName, suffix = "", Q } /** * Adds an inventory variant to the player's inventory - * @param {KDRestraintVariant} variant - * @param {string} prefix - * @param {string} curse - * @param {string} ID - * @param {string} [forceName] - * @param {number} [powerBonus] - * @param {number} [quantity] + * @param variant + * @param [prefix] + * @param [curse] + * @param [ID] + * @param [forceName] + * @param [suffix] + * @param [faction] + * @param [powerBonus] + * @param [quantity] */ -function KDGiveInventoryVariant(variant, prefix = "", curse = undefined, ID="", forceName, suffix = "", faction = "", powerBonus, quantity = 1) { +function KDGiveInventoryVariant(variant: KDRestraintVariant, prefix: string = "", curse: string = undefined, ID: string = "", forceName?: string, suffix: string = "", faction: string = "", powerBonus?: number, quantity: number = 1) { 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 : "")); @@ -2894,23 +2891,42 @@ function KDGiveInventoryVariant(variant, prefix = "", curse = undefined, ID="", } /** * Adds an inventory variant to the player's inventory - * @param {KDRestraintVariant} variant - * @param {number} [Tightness] - * @param {boolean} [Bypass] - * @param {string} [Lock] - * @param {boolean} [Keep] - * @param {boolean} [Trapped] - * @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 - * @param {boolean} [useAugmentedPower] - Augment power to keep consistency - * @param {string} [inventoryAs] - inventoryAs for the item - * @param {string} prefix - * @param {string} ID - * @param {number} [powerBonus] + * @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, prefix = "", Tightness, Bypass, Lock, Keep, Trapped, faction, Deep, curse, securityEnemy, useAugmentedPower, inventoryAs, ID = "", suffix = "", powerBonus = 0) { +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 +) +{ KDUpdateItemEventCache = true; let origRestraint = KinkyDungeonGetRestraintByName(variant.template); let events = origRestraint.events ? JSON.parse(JSON.stringify(origRestraint.events)) : []; @@ -2932,28 +2948,23 @@ function KDEquipInventoryVariant(variant, prefix = "", Tightness, Bypass, Lock, } /** - * - * @param {Named} item - * @returns {weapon | restraint | outfit | consumable} + * @param item */ -function KDItem(item) { +function KDItem(item: Named): weapon | restraint | outfit | consumable { return KDRestraint(item) || KDConsumable(item) || KDWeapon(item) || KDOutfit(item) || KinkyDungneonBasic[item?.name]; } /** - * - * @param {Named} item - * @returns {weapon | outfit | consumable} + * @param item */ -function KDItemNoRestraint(item) { +function KDItemNoRestraint(item: Named): weapon | outfit | consumable { return KDConsumable(item) || KDWeapon(item) || KDOutfit(item) || KinkyDungneonBasic[item?.name]; } /** - * - * @param {string} name - * @returns {boolean} + * @param name + * @param [quantity] */ -function KDGiveItem(name, quantity = 1) { +function KDGiveItem(name: string, quantity: number = 1): boolean { if (KinkyDungeonWeaponVariants[name]) { KDGiveWeaponVariant(KinkyDungeonWeaponVariants[name], undefined, name); @@ -2995,7 +3006,7 @@ function KDGiveItem(name, quantity = 1) { return false; } -function KDDrawHotbarBottom(selected, spells, selectSpell, xshift = 0, allowOverflow = 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; @@ -3190,7 +3201,7 @@ function KDDrawHotbarBottom(selected, spells, selectSpell, xshift = 0, allowOver if (MouseIn(buttonDim.x, buttonDim.y, buttonDim.w, buttonDim.h)) { DrawTextFitKD(TextGet((arm ? "Restraint" : ("KinkyDungeonInventoryItem")) + name), - buttonDim.x, buttonDim.y - 140, 300, 300, + buttonDim.x, buttonDim.y - 140, 300, "#ffffff", "#333333", undefined, "center"); } // Render number @@ -3405,7 +3416,7 @@ function KDDrawHotbarBottom(selected, spells, selectSpell, xshift = 0, allowOver -function KinkyDungeonAttemptQuickRestraint(Name) { +function KinkyDungeonAttemptQuickRestraint(Name: string): boolean { if (KDGameData.SleepTurns > 0 || KDGameData.SlowMoveTurns > 0) return false; let item = KinkyDungeonInventoryGetLoose(Name); if (!item) return false; @@ -3419,4 +3430,4 @@ function KinkyDungeonAttemptQuickRestraint(Name) { } return true; -} \ No newline at end of file +} diff --git a/Game/src/item/KinkyDungeonItem.js b/Game/src/item/KinkyDungeonItem.ts similarity index 88% rename from Game/src/item/KinkyDungeonItem.js rename to Game/src/item/KinkyDungeonItem.ts index 1b6f8a276..0fb170eb0 100644 --- a/Game/src/item/KinkyDungeonItem.js +++ b/Game/src/item/KinkyDungeonItem.ts @@ -1,9 +1,8 @@ "use strict"; /** Certain items, when dropped, have specific properties - * @type {Record} */ -let KDDroppedItemProperties = { +let KDDroppedItemProperties: Record = { "RedKey": { tinyness: 2, }, @@ -35,7 +34,14 @@ let KDDroppedItemProperties = { }; -function KinkyDungeonItemDrop(x, y, dropTable, summoned) { +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 = []; @@ -53,7 +59,7 @@ function KinkyDungeonItemDrop(x, y, dropTable, summoned) { 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 ? (dropWeights[L].drop.amountMin + Math.floor(KDRandom()*dropWeights[L].drop.amountMax)) : dropWeights[L].drop.amount}; + 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) { @@ -74,7 +80,7 @@ function KinkyDungeonItemDrop(x, y, dropTable, summoned) { return false; } -function KinkyDungeonDropItem(Item, Origin, PreferOrigin, noMsg, allowEnemies) { +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++) { @@ -83,24 +89,26 @@ function KinkyDungeonDropItem(Item, Origin, PreferOrigin, noMsg, allowEnemies) { } let foundslot = PreferOrigin ? {x:Origin.x, y:Origin.y} : null; - if (!(Origin == KinkyDungeonPlayerEntity && PreferOrigin && KinkyDungeonPlayer.IsEnclose())) { - if (!foundslot || !(KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(foundslot.x, foundslot.y)) + + // 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); - } - } + 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}; + 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) { @@ -117,7 +125,7 @@ function KinkyDungeonDropItem(Item, Origin, PreferOrigin, noMsg, allowEnemies) { return false; } -function KinkyDungeonItemEvent(Item, nomsg) { +function KinkyDungeonItemEvent(Item: any, nomsg?: boolean) { let color = "white"; let priority = 1; let sfx = "Coins"; @@ -256,7 +264,7 @@ function KinkyDungeonItemEvent(Item, nomsg) { } -function KDAllowUseItems(Message,x, y) { +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;} @@ -266,7 +274,7 @@ function KDAllowUseItems(Message,x, y) { return ret; } -function KinkyDungeonItemCheck(x, y, Index, autoEquip) { +function KinkyDungeonItemCheck(x: number, y: number, _Index: number, autoEquip?: boolean) { let allowManip = KDAllowUseItems(false, x, y); let msg = false; let pickedone = false; @@ -308,17 +316,15 @@ function KinkyDungeonItemCheck(x, y, Index, autoEquip) { } } -function KDCanSeeDroppedItem(item) { +function KDCanSeeDroppedItem(item: GroundItem): boolean { if (KDDroppedItemProperties[item.name]?.tinyness <= KinkyDungeonBlindLevel) return false; return true; } /** - * - * @param {Named} item - * @returns {string}; + * @param item */ -function KDGetItemType(item) { +function KDGetItemType(item: Named): string { if (KDWeapon(item)) return Weapon; if (KDRestraint(item)) return LooseRestraint; if (KDConsumable(item)) return Consumable; @@ -326,7 +332,7 @@ function KDGetItemType(item) { return Misc; } -function KinkyDungeonDrawItems(canvasOffsetX, canvasOffsetY, CamX, CamY) { +function KinkyDungeonDrawItems(_canvasOffsetX: number, _canvasOffsetY: number, CamX: number, CamY: number) { let sprite = null; let counts = {}; let max = 10; @@ -376,7 +382,7 @@ function KinkyDungeonDrawHeart() { 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) => { + DrawButtonKDEx("discardheart", (_bdata) => { KinkyDungeonDrawState = "Game"; return true; }, CommonTime() > KinkyDungeonDialogueTimer, 1000, 850, 450, 60, TextGet("KinkyDungeonHeartDiscard"), KinkyDungeonStatWillMax < KDMaxStat ? "#ffffff" : "#999999"); @@ -416,12 +422,10 @@ let KDCustomItems = { }; /** - * - * @param {any[]} items - * @param {number} offset - * @returns {number} + * @param items + * @param offset */ -function KDDrawItemsTooltip(items, offset) { +function KDDrawItemsTooltip(items: any[], offset: number): number { let TooltipList = []; TooltipList.push({ str: TextGet("KDTooltipItems"), @@ -452,4 +456,4 @@ function KDDrawItemsTooltip(items, offset) { } return KDDrawTooltip(TooltipList, offset); -} \ No newline at end of file +} diff --git a/Game/src/item/KinkyDungeonLoot.js b/Game/src/item/KinkyDungeonLoot.ts similarity index 93% rename from Game/src/item/KinkyDungeonLoot.js rename to Game/src/item/KinkyDungeonLoot.ts index 6e78397c3..2ec756379 100644 --- a/Game/src/item/KinkyDungeonLoot.js +++ b/Game/src/item/KinkyDungeonLoot.ts @@ -1,17 +1,16 @@ "use strict"; -/** @type {item[]} */ -let KinkyDungeonLostItems = []; +let KinkyDungeonLostItems: item[] = []; let KDTightRestraintsMod = 6; let KDTightRestraintsMult = 2; let KDPartialLootRecoveryChance = 0.25; /** - * @param {item[]} list - * @param {boolean} excludeBound - "bound weapons", i.e. magic knives and weapons in really old nomenclature back when there were like 4 weapons + * @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, excludeBound) { +function KinkyDungeonAddLostItems(list: item[], excludeBound: boolean) { for (let item of list) { let unique = true; if (item.type && item.name == "Knife") unique = false; @@ -53,9 +52,19 @@ let cursedRestraintCache = { let KinkyDungeonSpecialLoot = false; let KinkyDungeonLockedLoot = false; -function KinkyDungeonLoot(Level, Index, Type, roll, tile, returnOnly, noTrap, minWeight = 0.1, minWeightFallback = true) { +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): boolean | any { let lootWeightTotal = 0; - let lootWeights = []; + let lootWeights: { loot: any; weight: number; }[] = []; let lootType = KinkyDungeonLootTable[Type]; for (let loot of lootType) { @@ -69,8 +78,8 @@ function KinkyDungeonLoot(Level, Index, Type, roll, tile, returnOnly, noTrap, mi if (loot.arousalMode && !KinkyDungeonStatsChoice.get("arousalMode")) prereqs = false; - if (loot.noflag?.some((flag) => {return KinkyDungeonFlags.get(flag) != undefined;})) prereqs = false; - if (loot.notag?.some((flag) => {return KinkyDungeonPlayerTags.get(flag) != undefined;})) 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) { @@ -221,10 +230,13 @@ function KinkyDungeonLoot(Level, Index, Type, roll, tile, returnOnly, noTrap, mi 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); + 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); - 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); + 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; } @@ -250,13 +262,15 @@ As for why there are so many restraints in general rather than your typical sort */ -function KinkyDungeonLootEvent(Loot, Floor, Replacemsg, Lock) { +function KinkyDungeonLootEvent(Loot: any, Floor: number, Replacemsg: string, Lock?: string): string { let data = { loot: Loot, replacemsg: Replacemsg, lock: Lock, }; KinkyDungeonSendEvent("loot", data); + + Loot = data.loot; Replacemsg = data.replacemsg; Lock = data.lock; @@ -277,7 +291,7 @@ function KinkyDungeonLootEvent(Loot, Floor, Replacemsg, Lock) { if (Loot.enchantlist && (Loot.enchantchance == undefined || KDRandom() < Loot.enchantchance + (Loot.enchantscale|| 0) * levelPercent)) { while (enchants > 0) { let ench = KDGetByWeight( - KinkyDungeonGetEnchantmentsByListWeighted(Loot.enchantlist, KDModifierEnum.weapon, weapon, false, Loot.enchantlevelmin, Loot.enchantlevelmax, [enchantVariant, ...enchant_extra]) + KinkyDungeonGetEnchantmentsByListWeighted(Loot.enchantlist, ModifierEnum.weapon, weapon, false, Loot.enchantlevelmin, Loot.enchantlevelmax, [enchantVariant, ...enchant_extra]) ); if (!enchantVariant) { enchantVariant = ench; @@ -296,8 +310,7 @@ function KinkyDungeonLootEvent(Loot, Floor, Replacemsg, Lock) { for (let e of enchant_extra) { events.push(...KDEventEnchantmentModular[e].types[KDModifierEnum.weapon].events(weapon, Loot, "", enchantVariant, enchant_extra)); } - /** @type {KDWeaponVariant} */ - let variant = { + let variant: KDWeaponVariant = { template: weapon, events: events, }; @@ -374,7 +387,7 @@ function KinkyDungeonLootEvent(Loot, Floor, Replacemsg, Lock) { 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, KDModifierEnum.restraint, armor, false, Loot.enchantlevelmin, Loot.enchantlevelmax, [enchantVariant, ...enchant_extra]) + KinkyDungeonGetEnchantmentsByListWeighted(Loot.enchantlist, ModifierEnum.restraint, armor, false, Loot.enchantlevelmin, Loot.enchantlevelmax, [enchantVariant, ...enchant_extra]) ); if (!enchantVariant) { enchantVariant = ench; @@ -392,10 +405,8 @@ function KinkyDungeonLootEvent(Loot, Floor, Replacemsg, Lock) { unlockcurse = KDGetByWeight(KinkyDungeonGetCurseByListWeighted(curselist, armor, false, Loot.hexlevelmin, Loot.hexlevelmax)); } if (hexVariant || enchantVariant) { - /** @type {KinkyDungeonEvent[]} */ - let events = JSON.parse(JSON.stringify(KDRestraint({name: armor}).events || [])); - /** @type {KDRestraintVariant} */ - let variant = { + let events: KinkyDungeonEvent[] = JSON.parse(JSON.stringify(KDRestraint({name: armor}).events || [])); + let variant: KDRestraintVariant = { template: armor, events: events, }; @@ -851,15 +862,15 @@ function KinkyDungeonLootEvent(Loot, Floor, Replacemsg, Lock) { else KinkyDungeonSendTextMessage(4, TextGet("KinkyDungeonMistressKeysTakenAway"), "orange", 2); remove = true; - } if (lostitem.type == Weapon && KDWeapon(lostitem) && !KinkyDungeonInventoryGet(lostitem)) { + } 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)) { + } 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)) { + } 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); @@ -876,7 +887,8 @@ function KinkyDungeonLootEvent(Loot, Floor, Replacemsg, Lock) { recovOne = true; //KinkyDungeonInventoryAdd(lostitem); - KinkyDungeonItemEvent(lostitem, KDRestraint(lostitem)?.armor || KinkyDungeonRestraintVariants[lostitem.name]); + // FIXME: Check that `!!KinkyDungeonRestraintVariants[]` is the right thing to do here. + KinkyDungeonItemEvent(lostitem, KDRestraint(lostitem)?.armor || !!KinkyDungeonRestraintVariants[lostitem.name]); } //KinkyDungeonLostItems.splice(I, 1); //I -= 1; @@ -911,7 +923,7 @@ function KinkyDungeonLootEvent(Loot, Floor, Replacemsg, Lock) { } -function KinkyDungeonAddGold(value) { +function KinkyDungeonAddGold(value: number) { if (!isNaN(value)) { KinkyDungeonGold += value; //if (ArcadeDeviousChallenge && KinkyDungeonDeviousDungeonAvailable()) CharacterChangeMoney(Player, Math.round(value/10)); @@ -922,7 +934,7 @@ function KinkyDungeonAddGold(value) { } -function KDSpawnLootTrap(x, y, trap, mult, duration) { +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; @@ -993,7 +1005,7 @@ function KDSpawnLootTrap(x, y, trap, mult, duration) { } } -function KDGenChestTrap(guaranteed, x, y, chestType, lock, noTrap) { +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; @@ -1047,26 +1059,27 @@ let KDChestTrapWeights = { }, }; -let KDTrapChestType = { - "default" : (guaranteed, x, y, chestType, lock, noTrap) => { +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) => { + "shadow" : (_guaranteed, _x, _y, _chestType, _lock, _noTrap) => { return {trap: "shadowTrap", mult: 2.5, duration: 300, time: 3}; }, }; -function KDTriggerLoot(Loot, Type) { +function KDTriggerLoot(Loot: string, Type: string) { let lootobj = KinkyDungeonLootTable[Type].find((element) => {return element.name == Loot;}); - console.log(KinkyDungeonLootEvent(lootobj, KinkyDungeonMapIndex, lootobj.message)); + console.log(KinkyDungeonLootEvent(lootobj, MiniGameKinkyDungeonLevel, lootobj.message)); } /** - * - * @param {Record} WeightList - contains values that have a weight param + * @param WeightList - contains values that have a weight param */ -function KDGetWeightedString(WeightList, params) { +function KDGetWeightedString(WeightList: Record, params?: any): any { let WeightTotal = 0; let Weights = []; @@ -1086,19 +1099,18 @@ function KDGetWeightedString(WeightList, params) { } /** - * @param {string[]} tags - Type of restraint - * @returns {boolean} + * @param tags - Type of restraint */ -function KDCanCurse(tags) { - return KDCheckPrereq(undefined, "AlreadyCursed", {tags: [tags]}, {}); +function KDCanCurse(tags: string[]): boolean { + return KDCheckPrereq(undefined, "AlreadyCursed", {tags: tags, type: undefined, trigger: undefined}, {}); } /** * Helper function used to summon cursed epicenters - * @param {number} x - * @param {number} y + * @param x + * @param y */ -function KDSummonCurseTrap(x, 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); @@ -1111,4 +1123,4 @@ function KDSummonCurseTrap(x, y) { KinkyDungeonSendTextMessage(8, TextGet("KDSummonCurse"), "#9074ab", 5); } } -} \ No newline at end of file +} diff --git a/Game/src/item/KinkyDungeonLootList.js b/Game/src/item/KinkyDungeonLootList.ts similarity index 97% rename from Game/src/item/KinkyDungeonLootList.js rename to Game/src/item/KinkyDungeonLootList.ts index 7624f6e96..e3040e38f 100644 --- a/Game/src/item/KinkyDungeonLootList.js +++ b/Game/src/item/KinkyDungeonLootList.ts @@ -277,19 +277,25 @@ let KinkyDungeonLootTable = { {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:2, message:"LootChestWeapon", messageColor:"lightblue", messageTime: 3, allFloors: true, noweapon: ["ArcaneTome"]}, + {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"]}, @@ -333,6 +339,9 @@ let KinkyDungeonLootTable = { {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"],}, @@ -348,6 +357,21 @@ let KinkyDungeonLootTable = { {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}, ], @@ -472,6 +496,11 @@ let KinkyDungeonLootTable = { ...KDEnchantedRestraints, ], "wizard": [ + + {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 @@ -1283,14 +1312,16 @@ let KinkyDungeonLootTable = { }; -let KDLootEvents = { - "Armor": (Loot, Floor, Replacemsg, Lock) => { +type lootEventFunc = (Loot: any, Floor: number, Replacemsg: string, Lock: string) => { value: number; Replacemsg: string }; + +let KDLootEvents: Record = { + "Armor": (_Loot, _Floor, Replacemsg, _Lock) => { return { value: 0, Replacemsg: Replacemsg, }; }, - "archerykit": (Loot, Floor, Replacemsg, Lock) => { + "archerykit": (_Loot, _Floor, Replacemsg, _Lock) => { KinkyDungeonInventoryAddWeapon("Bow"); KinkyDungeonChangeConsumable(KinkyDungeonConsumables.AncientPowerSource, 1); return { @@ -1298,4 +1329,4 @@ let KDLootEvents = { Replacemsg: Replacemsg, }; }, -}; \ No newline at end of file +}; diff --git a/Game/src/magic/KinkyDungeonMagic.js b/Game/src/magic/KinkyDungeonMagic.ts similarity index 91% rename from Game/src/magic/KinkyDungeonMagic.js rename to Game/src/magic/KinkyDungeonMagic.ts index b7e2e152d..83597ef91 100644 --- a/Game/src/magic/KinkyDungeonMagic.js +++ b/Game/src/magic/KinkyDungeonMagic.ts @@ -28,12 +28,9 @@ let KinkyDungeonPreviewSpell = null; let KinkyDungeonDisplayLore = false; let KinkyDungeonSpellChoices = [0, 1, 2]; -/** @type {string[]} */ -let KinkyDungeonWeaponChoices = []; -/** @type {string[]} */ -let KinkyDungeonArmorChoices = []; -/** @type {string[]} */ -let KinkyDungeonConsumableChoices = []; +let KinkyDungeonWeaponChoices: string[] = []; +let KinkyDungeonArmorChoices: string[] = []; +let KinkyDungeonConsumableChoices: string[] = []; let KinkyDungeonSpellChoicesToggle = [true, true]; let KinkyDungeonSpellChoiceCount = 50; @@ -54,46 +51,45 @@ let KDSchoolColors = { let KinkyDungeonMiscastPityModifier = 0; // Current value let KinkyDungeonMiscastPityModifierIncrementPercentage = 0.5; // Percent of the base hit chance to add -/** @type {Record} */ -let KDSpellComponentTypes = { +let KDSpellComponentTypes: Record = { "Verbal": { - stringShort: (ret) => { + stringShort: (_ret) => { return TextGet("KDShortCompVerbal"); }, - stringLong: (spell) => { + stringLong: (_spell) => { return TextGet("KinkyDungeonComponentsVerbal"); }, - check: (spell, x, y) => { + 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) => { + ignore: (_spell, _x, _y) => { return (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoVerbalComp") > 0); }, - partialMiscastChance: (spell, x, y) => { + 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) => { + partialMiscastType: (_spell, _x, _y) => { return "Gagged"; }, - cast: (spell, data) => { + cast: (_spell, data) => { KinkyDungeonSetFlag("verbalspell", 1); if (data.originX && data.originY) KinkyDungeonMakeNoise(4, data.originX, data.originY, false, true); } }, "Arms": { - stringShort: (ret) => { + stringShort: (_ret) => { return TextGet("KDShortCompArms"); }, - stringLong: (spell) => { + stringLong: (_spell) => { return TextGet("KinkyDungeonComponentsArms"); }, - check: (spell, x, y) => { + 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; @@ -101,55 +97,55 @@ let KDSpellComponentTypes = { } return true; }, - ignore: (spell, x, y) => { + ignore: (_spell, _x, _y) => { return (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoArmsComp") > 0); }, - partialMiscastChance: (spell, x, y) => { + 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) => { + partialMiscastType: (_spell, _x, _y) => { if (KinkyDungeonStatsChoice.get("SomaticMinus")) return "Arms"; if (KinkyDungeonStatsChoice.get("SomaticPlus")) return "Fingers"; return "Bug"; }, - cast: (spell, data) => { + cast: (_spell, _data) => { KinkyDungeonSetFlag("armspell", 1); } }, "Legs": { - stringShort: (ret) => { + stringShort: (_ret) => { return TextGet("KDShortCompLegs"); }, - stringLong: (spell) => { + stringLong: (_spell) => { return TextGet("KinkyDungeonComponentsLegs"); }, - check: (spell, x, y) => { + 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) => { + ignore: (_spell, _x, _y) => { return (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "NoLegsComp") > 0); }, - partialMiscastChance: (spell, x, y) => { + 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) => { + partialMiscastType: (_spell, _x, _y) => { if (KinkyDungeonStatsChoice.get("PoorForm")) return "PoorForm"; return "Legs"; }, - cast: (spell, data) => { + cast: (_spell, _data) => { KinkyDungeonSetFlag("legspell", 1); } }, }; -function KinkyDungeonSearchSpell(list, name) { +function KinkyDungeonSearchSpell(list: spell[], name: string): spell { for (let spell of list) { if (spell.name == name) { return spell; @@ -161,12 +157,10 @@ function KinkyDungeonSearchSpell(list, name) { let KDSpellMemo = {}; /** - * - * @param {string} name - * @param {boolean} SearchEnemies - * @returns {spell} + * @param name + * @param SearchEnemies */ -function KinkyDungeonFindSpell(name, SearchEnemies = false) { +function KinkyDungeonFindSpell(name: string, SearchEnemies: boolean = false): spell { if (KDSpellMemo[name]) return KDSpellMemo[name]; if (SearchEnemies) { let spell = KinkyDungeonSearchSpell(KinkyDungeonSpellListEnemies, name); @@ -191,7 +185,7 @@ function KinkyDungeonFindSpell(name, SearchEnemies = false) { return KinkyDungeonSearchSpell(KinkyDungeonSpells, name); } -function KinkyDungeonDisableSpell(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; @@ -222,7 +216,7 @@ function KinkyDungeonResetMagic() { } let KDRefreshSpellCache = true; -function KDPushSpell(spell) { +function KDPushSpell(spell: spell) { KinkyDungeonSpells.push(JSON.parse(JSON.stringify(spell))); KDRefreshSpellCache = true; } @@ -254,11 +248,9 @@ function KDUpdateSpellCache() { } /** - * - * @param {string} name - * @returns {boolean} + * @param name */ -function KDHasSpell(name) { +function KDHasSpell(name: string): boolean { for (let s of KinkyDungeonSpells) { if (s.name == name) return true; } @@ -266,12 +258,10 @@ function KDHasSpell(name) { } /** - * - * @param {string} name - * @param {number} Level - Spell level. Set to -1 to allow any level - * @returns {spell} + * @param name + * @param Level - Spell level. Set to -1 to allow any level */ -function KDGetUpcast(name, Level) { +function KDGetUpcast(name: string, Level: number): spell { if (Level < 0) { KDUpdateSpellCache(); return KDUpcastFromCache.get(name) ? KDUpcastFromCache.get(name)[0] : null; @@ -295,18 +285,13 @@ function KDGetUpcast(name, Level) { } /** - * - * @param {string} name - * @returns {boolean} + * @param name */ -function KDHasUpcast(name) { +function KDHasUpcast(name: string): boolean { return KDUpcastFromCache.get(name); } -/** - * - * @returns {boolean} - */ -function KDCanUpcast() { + +function KDCanUpcast(): boolean { for (let i of KinkyDungeonSpellChoices) { let spell = KinkyDungeonSpells[i]; if (spell) { @@ -320,7 +305,7 @@ function KDCanUpcast() { return false; } -function KDEmpower(data, entity) { +function KDEmpower(_data: any, _entity: any) { let Level = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellEmpower"); if (!KDCanUpcast()) { KinkyDungeonSendActionMessage(10, TextGet("KDSpellEmpowerFail"), "#ffffff", 1); @@ -345,10 +330,10 @@ function KDEmpower(data, entity) { } } -function KinkyDungeoCheckComponentsPartial(spell, x, y, includeFull, noOverride) { +function KinkyDungeoCheckComponentsPartial(spell: spell, x: number, y: number, includeFull: boolean, noOverride?: boolean): string[] { - let failedcomp = []; - let failedcompFull = []; + let failedcomp: string[] = []; + let failedcompFull: string[] = []; if (spell.components) for (let comp of spell.components) { @@ -373,8 +358,8 @@ function KinkyDungeoCheckComponentsPartial(spell, x, y, includeFull, noOverride) return data.partial; } -function KinkyDungeoCheckComponents(spell, x, y, noOverride) { - let failedcomp = []; +function KinkyDungeoCheckComponents(spell: spell, x?: number, y?: number, noOverride?: boolean): string[] { + let failedcomp: string[] = []; let data = { spell: spell, @@ -398,20 +383,18 @@ function KinkyDungeoCheckComponents(spell, x, y, noOverride) { return data.failed; } -function KinkyDungeonHandleSpellChoice(SpellChoice) { +function KinkyDungeonHandleSpellChoice(SpellChoice: number): spell { let spell = KinkyDungeonHandleSpellCast(KDGetUpcast(KinkyDungeonSpells[SpellChoice].name, KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "SpellEmpower")) || KinkyDungeonSpells[SpellChoice]); return spell; } /** - * - * @param {spell} spell - * @param {number} [x] - * @param {number} [y] - * @returns {boolean} + * @param spell + * @param [x] + * @param [y] */ -function KDSpellIgnoreComp(spell, x, y) { +function KDSpellIgnoreComp(spell: spell, x?: number, y?: number): boolean { let ignore = true; if (spell?.components) { for (let c of spell.components) { @@ -425,7 +408,7 @@ function KDSpellIgnoreComp(spell, x, y) { || (KinkyDungeonStatsChoice.get("Magician") && spell.school == "Illusion"); } -function KinkyDungeonHandleSpellCast(spell) { +function KinkyDungeonHandleSpellCast(spell: spell) { if (KinkyDungeoCheckComponents(spell).length == 0 || ( KDSpellIgnoreComp(spell) )) { @@ -445,7 +428,7 @@ function KinkyDungeonHandleSpellCast(spell) { return null; } -function KinkyDungeonClickSpell(i) { +function KinkyDungeonClickSpell(i: number) { let spell = null; let clicked = false; if (KinkyDungeonSpells[KinkyDungeonSpellChoices[i]]) { @@ -507,7 +490,7 @@ function KinkyDungeonClickSpell(i) { let KDSwapSpell = -1; -function KinkyDungeonHandleSpell(ind) { +function KinkyDungeonHandleSpell(ind?: number): boolean { let clicked = false; let spell = null; if (!ind) { @@ -549,13 +532,11 @@ function KinkyDungeonHandleSpell(ind) { } /** - * - * @param {spell} Spell - * @param {boolean} [Passive] - * @param {boolean} [Toggle] - * @returns {number} + * @param Spell + * @param [Passive] + * @param [Toggle] */ -function KinkyDungeonGetStaminaCost(Spell, Passive, Toggle) { +function KinkyDungeonGetStaminaCost(Spell: spell, Passive?: boolean, Toggle?: boolean): number { let data = { passive: Passive, toggle: Toggle, @@ -566,7 +547,6 @@ function KinkyDungeonGetStaminaCost(Spell, Passive, Toggle) { 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 - if (data.lvlcostscale && Spell.level && Spell.staminacost) data.cost += Spell.level * data.lvlcostscale; KinkyDungeonSendEvent("beforeMultStamina", data); KinkyDungeonSendEvent("calcMultStamina", data); KinkyDungeonSendEvent("afterMultStamina", data); @@ -576,13 +556,11 @@ function KinkyDungeonGetStaminaCost(Spell, Passive, Toggle) { } /** - * - * @param {spell} Spell - * @param {boolean} [Passive] - * @param {boolean} [Toggle] - * @returns {number} + * @param Spell + * @param [Passive] + * @param [Toggle] */ -function KinkyDungeonGetManaCost(Spell, Passive, Toggle) { +function KinkyDungeonGetManaCost(Spell: spell, Passive?: boolean, Toggle?: boolean): number { let data = { passive: Passive, toggle: Toggle, @@ -611,13 +589,11 @@ function KinkyDungeonGetManaCost(Spell, Passive, Toggle) { } /** - * - * @param {spell} Spell - * @param {boolean} [Passive] - * @param {boolean} [Toggle] - * @returns {number} + * @param Spell + * @param [Passive] + * @param [Toggle] */ -function KinkyDungeonGetChargeCost(Spell, Passive, Toggle) { +function KinkyDungeonGetChargeCost(Spell: spell, Passive?: boolean, Toggle?: boolean): number { let data = { passive: Passive, toggle: Toggle, @@ -636,11 +612,9 @@ function KinkyDungeonGetChargeCost(Spell, Passive, Toggle) { } /** - * - * @param {spell} Spell - * @returns {number} + * @param Spell */ -function KinkyDungeonGetCost(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; @@ -656,15 +630,65 @@ function KinkyDungeonGetCost(Spell) { return Math.max(0, cost + bonus); } + + /** - * - * @param {number} radius - Magnitude of the noise - * @param {number} noiseX - Location of noise - * @param {number} noiseY - Location of noise - * @param {boolean} [hideShockwave] - Whether it shows a ping - * @param {boolean} [attachToEntity] - Whether it adds to the entity's sound or not + * @param enemy - Origin + * @param [mult] - Radius multiplier + * @param [hideShockwave] */ -function KinkyDungeonMakeNoise(radius, noiseX, noiseY, hideShockwave, attachToEntity) { +function KinkyDungeonMakeNoiseSignal(enemy: entity, mult: number = 1, hideShockwave?: boolean) { + 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); +} + +/** + * @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 + */ +function KinkyDungeonMakeNoise(radius: number, noiseX: number, noiseY: number, hideShockwave?: boolean, attachToEntity?: boolean) { let data = { radius: radius, x: noiseX, @@ -688,8 +712,10 @@ function KinkyDungeonMakeNoise(radius, noiseX, noiseY, hideShockwave, attachToEn && (KDHostile(e) || KDRandom() < 0.33) && (!e.Enemy.tags.peaceful || KDRandom() < 0.15) && !e.Enemy.tags.deaf + && KDEnemyAction.investigatesound.filter(e) && !KDAmbushAI(e) - && KDistEuclidean(e.x - data.x, e.y - data.y) <= data.radius) { + && KDCanHearSound(e, data.radius, data.x, data.y)) + { e.gx = data.x; e.gy = data.y; e.action = "investigatesound"; @@ -702,7 +728,7 @@ function KinkyDungeonMakeNoise(radius, noiseX, noiseY, hideShockwave, attachToEn /** * - * @param {object} data + * @param data * @param {spell} data.spell * @param {string} data.gaggedMiscastType * @param {number} data.targetX @@ -710,7 +736,7 @@ function KinkyDungeonMakeNoise(radius, noiseX, noiseY, hideShockwave, attachToEn * @param {object} data.flags * @param {boolean} data.gaggedMiscastFlag */ -function KDDoGaggedMiscastFlag(data) { +function KDDoGaggedMiscastFlag(data: any) { let lastPartialChance = 0; @@ -733,18 +759,16 @@ function KDDoGaggedMiscastFlag(data) { } /** - * - * @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}} + * @param targetX + * @param targetY + * @param spell + * @param enemy + * @param player + * @param bullet + * @param [forceFaction] + * @param [castData] */ -function KinkyDungeonCastSpell(targetX, targetY, spell, enemy, player, bullet, forceFaction, 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 = { @@ -1084,13 +1108,16 @@ function KinkyDungeonCastSpell(targetX, targetY, spell, enemy, player, bullet, f volatilehit: spell.volatilehit, width:sz, height:sz, summon:spell.summon, targetX: tX, targetY: tY, + aoe: spell.type == "dot" ? spell.bulletAoE : undefined, source: (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, + (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, + 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 @@ -1127,7 +1154,8 @@ function KinkyDungeonCastSpell(targetX, targetY, spell, enemy, player, bullet, f targetX: tX, targetY: tY, followPlayer: (!enemy && player && spell.followCaster) ? true : undefined, followCaster: (enemy && spell.followCaster) ? enemy.id : undefined, - source: (entity?.player ? -1 : entity?.id) || bullet?.bullet?.source, lifetime:spell.lifetime, cast: cast, dot: spell.dot, events: spell.events, aoe: spell.aoe, + source: (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 @@ -1315,7 +1343,7 @@ function KinkyDungeonCastSpell(targetX, targetY, spell, enemy, player, bullet, f return {result: "Cast", data: data}; } -function KinkyDungeonClickSpellChoice(I, CurrentSpell) { +function KinkyDungeonClickSpellChoice(I: number, CurrentSpell: number) { // Set spell choice KDSendInput("spellChoice", {I:I, CurrentSpell: CurrentSpell}); //if (KinkyDungeonTextMessageTime > 0 && KinkyDungeonTextMessagePriority > 3) @@ -1326,11 +1354,11 @@ function KinkyDungeonClickSpellChoice(I, CurrentSpell) { } } -function KinkyDungeonClickItemChoice(I, name) { +function KinkyDungeonClickItemChoice(I: number, name: string) { KDSendInput("itemChoice", {I:I, name: name}); } -function KinkyDungeonHandleMagic() { +function KinkyDungeonHandleMagic(): boolean { //if (KinkyDungeonPlayer.CanInteract()) { // Allow turning pages let xOffset = -125; @@ -1358,7 +1386,7 @@ function KinkyDungeonHandleMagic() { return true; } -function KDGetPrerequisite(spell) { +function KDGetPrerequisite(spell: spell): string { if (!spell.prerequisite) return ""; if (typeof spell.prerequisite === "string") { return TextGet("KinkyDungeonSpell" + spell.prerequisite); @@ -1375,11 +1403,9 @@ function KDGetPrerequisite(spell) { } /** - * - * @param {spell} spell - * @returns {boolean} + * @param spell */ -function KinkyDungeonCheckSpellPrerequisite(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; @@ -1406,7 +1432,7 @@ function KinkyDungeonCheckSpellPrerequisite(spell) { // 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) { +function KinkyDungeonDetectLanguageForMaxWidth(str: string, maxWidthTranslate: number, maxWidthEnglish: number): number { try { if (KDBigLanguages.includes(TranslationLanguage) && guessLanguage) { let languageName = guessLanguage.name(str); @@ -1430,7 +1456,7 @@ function KinkyDungeonDetectLanguageForMaxWidth(str, maxWidthTranslate, maxWidthE } // https://stackoverflow.com/questions/14484787/wrap-text-in-javascript -function KinkyDungeonWordWrap(str, maxWidthTranslate, maxWidthEnglish) { +function KinkyDungeonWordWrap(str: string, maxWidthTranslate: number, maxWidthEnglish: number): string { let newLineStr = "\n"; let res = ''; // console.log('KinkyDungeonDetectLanguageForMaxWidth before', str, maxWidth); @@ -1507,13 +1533,14 @@ function KinkyDungeonWordWrap(str, maxWidthTranslate, maxWidthEnglish) { return res + str; } -function KinkyDungeonTestWhite(x,language) { +function KinkyDungeonTestWhite(x: string, language: string): boolean { if (language == "English") { let white = new RegExp(/^\s$/); return white.test(x.charAt(0)); } if (language == "CJKP") { - return CJKcheck(x.charAt(0),3,"test"); + /* 'test' option returns a boolean. */ + return CJKcheck(x.charAt(0),3,"test") as boolean; } if (language == "Num") { let white = new RegExp(/^[0-9.]$/); @@ -1521,7 +1548,7 @@ function KinkyDungeonTestWhite(x,language) { } } -function KDSchoolColor(school) { +function KDSchoolColor(school: string): string { return KDSchoolColors[school] || KDTextTan; } @@ -1623,7 +1650,7 @@ function KinkyDungeonDrawMagic() { 12*mult, 28*mult).split('\n'); if (TextGet("KinkyDungeonSpellDescription2" + spell.name) != `KinkyDungeonSpellDescription2${spell.name}`) { - DrawButtonKDEx("KinkyDungeonDisplayLoreButton", (bdata) => { + 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); @@ -1657,7 +1684,7 @@ function KinkyDungeonDrawMagic() { if (!spell.passive && !spell.upcastFrom) { KDDrawHotbarBottom(undefined, true, spell, 0, true); - KDDrawHotbar(canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale - 15, canvasOffsetY_ui + 50, spell.name, (I) => { + KDDrawHotbar(canvasOffsetX_ui + xOffset + 640*KinkyDungeonBookScale - 15, canvasOffsetY_ui + 50, spell.name, (I: number) => { if (KinkyDungeonSpells[KinkyDungeonSpellChoices[I]] == spell) { KDSendInput("spellRemove", {I:I}); } else { @@ -1682,7 +1709,7 @@ function KinkyDungeonDrawMagic() { } if (KinkyDungeonCurrentPage > 0) { - DrawButtonKDEx("magiclastpage", (bdata) => { + DrawButtonKDEx("magiclastpage", (_bdata) => { if (KinkyDungeonCurrentPage > 0) { if (KinkyDungeonPreviewSpell) KinkyDungeonPreviewSpell = undefined; else { @@ -1700,7 +1727,7 @@ function KinkyDungeonDrawMagic() { }); } if (KinkyDungeonCurrentPage < KinkyDungeonSpells.length-1) { - DrawButtonKDEx("magicnextpage", (bdata) => { + DrawButtonKDEx("magicnextpage", (_bdata) => { if (KinkyDungeonCurrentPage < KinkyDungeonSpells.length-1) { if (KinkyDungeonPreviewSpell) KinkyDungeonPreviewSpell = undefined; else { @@ -1758,7 +1785,8 @@ function KDFilterSpellPageNames() { return pages; } -function KDCorrectCurrentSpellPage(pages) { +/* FIXME: `pages` is probably actually a number... */ +function KDCorrectCurrentSpellPage(_pages: any): number { let ret = 0; for (let i = 0; i < KinkyDungeonCurrentSpellsPage; i++) { if (!KDGameData.AllowedSpellPages[KinkyDungeonSpellPages[i]]) { @@ -1771,11 +1799,9 @@ function KDCorrectCurrentSpellPage(pages) { let KDMagicFilter = ""; /** - * - * @param {spell} spell - * @returns {boolean} + * @param spell */ -function KDFilterSpell(spell) { +function KDFilterSpell(spell: spell): boolean { let prereq = spell ? KinkyDungeonCheckSpellPrerequisite(spell) : false; let prereqHost = spell ? prereq || (spell.upcastFrom && KinkyDungeonCheckSpellPrerequisite(KinkyDungeonFindSpell(spell.upcastFrom))) || @@ -1804,7 +1830,7 @@ function KDFilterSpell(spell) { || spell.tags?.some((tag) => {return tag.toLocaleLowerCase().includes(KDMagicFilter.toLocaleLowerCase());})); } -function KinkyDungeonListSpells(Mode) { +function KinkyDungeonListSpells(Mode: string): spell { let xOffset = -125; FillRectKD(kdcanvas, kdpixisprites, "mainmagicspellsbg", { @@ -1881,7 +1907,7 @@ function KinkyDungeonListSpells(Mode) { // Now we have our total filters, time to draw for (let f of filterlist) { let ticked = selectedFilters.includes(f); - DrawButtonKDEx("filter" + f, (bdata) => { + DrawButtonKDEx("filter" + f, (_bdata) => { if (selectedFilters.includes(f)) selectedFilters.splice(selectedFilters.indexOf(f), 1); else @@ -1904,7 +1930,7 @@ function KinkyDungeonListSpells(Mode) { let longestList = 0; for (let pg of spellPages) { longestList = Math.max(longestList, pg.filter( - (sp) => { + (sp: string) => { return KDFilterSpell(KinkyDungeonFindSpell(sp)); } ).length); @@ -1918,7 +1944,7 @@ function KinkyDungeonListSpells(Mode) { let TF = KDTextField("MagicFilter", 1720 + xOffset, 120, 200, 45, "text", "", "45"); if (TF.Created) { KDMagicFilter = ""; - TF.Element.oninput = (event) => { + TF.Element.oninput = (_event: any) => { KDMagicFilter = ElementValue("MagicFilter"); }; @@ -1998,7 +2024,7 @@ function KinkyDungeonListSpells(Mode) { KDSpellListIndex = Math.max(0, Math.min(longestList - KDMaxSpellPerColumn + 1, KDSpellListIndex + Math.round(amount/h))); }, - (bdata) => { + (_bdata) => { if (spell) { if (KDSwapSpell == -1) { KinkyDungeonSetPreviewSpell(spell); @@ -2028,11 +2054,11 @@ function KinkyDungeonListSpells(Mode) { 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); + 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 : "#ff5555", undefined, 20, "right", undefined, undefined, false); + h, KinkyDungeonSpellPoints >= cost ? color : "#ff5555", undefined, 20, "right", undefined, undefined, undefined); } else if (Mode == "Click") { if (MouseIn(xx, yy, @@ -2047,12 +2073,12 @@ function KinkyDungeonListSpells(Mode) { } if ( KDSpellListIndex > 0) - DrawButtonKDEx("spellsUp", (bdata) => { + 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) => { + 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"); @@ -2079,13 +2105,13 @@ function KinkyDungeonListSpells(Mode) { "#ffffff", "", undefined, undefined, false, KDButtonColor); drawHorizList(right, center + tabWidth + 1, 40, 200, tabHeight, 3 + Math.max(0, 3 - left.length), 24, (data) => { - return (bdata) => { + 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) => { + return (_bdata) => { KinkyDungeonCurrentSpellsPage = procList.indexOf(data.name); return true; }; @@ -2180,21 +2206,21 @@ function KinkyDungeonHandleMagicSpells() { return true; } -function KinkyDungeonSpellIndex(Name) { +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) { +function KinkyDungeonSetPreviewSpell(spell: spell) { let index = KinkyDungeonSpellIndex(spell.name); KinkyDungeonPreviewSpell = index >= 0 ? null : spell; if (!KinkyDungeonPreviewSpell) KinkyDungeonCurrentPage = index; KinkyDungeonDrawState = "Magic"; } -function KinkyDungeonGetCompList(spell) { +function KinkyDungeonGetCompList(spell: spell): string { let ret = ""; if (spell.components) for (let c of spell.components) { @@ -2208,7 +2234,7 @@ function KinkyDungeonGetCompList(spell) { return ret; } -function KinkyDungeonSendMagicEvent(Event, data, forceSpell) { +function KinkyDungeonSendMagicEvent(Event: string, data: any, forceSpell?: spell) { if (!KDMapHasEvent(KDEventMapSpell, Event)) return; KDUpdateSpellCache(); let iteration = 0; @@ -2254,7 +2280,7 @@ function KinkyDungeonSendMagicEvent(Event, data, forceSpell) { } -function KDCastSpellToEnemies(fn, tX, tY, spell) { +function KDCastSpellToEnemies(fn: (en: entity) => boolean, tX: number, tY: number, spell: spell): boolean { let enList = KDNearbyEnemies(tX, tY, spell.aoe); let cast = false; @@ -2269,11 +2295,10 @@ function KDCastSpellToEnemies(fn, tX, tY, spell) { /** * Returns true if the enemy matches one of the tags - * @param {string[]} tags - * @param {entity} entity - * @returns {boolean} + * @param tags + * @param entity */ -function KDMatchTags(tags, entity) { +function KDMatchTags(tags: string[], entity: entity): boolean { if (tags) { for (let tag of tags) { if (entity?.Enemy?.tags[tag]) return true; @@ -2328,7 +2353,7 @@ function KinkyDungeonSaveSpellsConfig() { localStorage.setItem('KinkyDungeonSpellsChoice' + KinkyDungeonSpellsConfig, JSON.stringify(list)); } -function KDDrawHotbar(xLoc, yLoc, name, fn) { +function KDDrawHotbar(xLoc: number, _yLoc: number, _name: string, _fn: (I: number) => void) { let w = 225; let h = 50; /*let x_start = xLoc; @@ -2378,7 +2403,7 @@ function KDDrawHotbar(xLoc, yLoc, name, fn) { DrawTextFitKD(s, x, yy + II++*32, 675, "#ffffff", KDTextGray0, 24); } - DrawButtonKDEx("KDSpellsClear", (bdata) => { + DrawButtonKDEx("KDSpellsClear", (_bdata) => { if (!KDConfirmClearSpells) { KDConfirmClearSpells = true; KinkyDungeonSendTextMessage(10, TextGet("KDConfirmSpellsClear"), "#ffffff", 2, true); @@ -2388,40 +2413,40 @@ function KDDrawHotbar(xLoc, yLoc, name, fn) { return true; }, true, 1800, 940, 190, 50, TextGet("KinkyDungeonClearConfig"), "#ffffff", ""); - DrawButtonKDEx("KDSpellsConfig1", (bdata) => { + 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) => { + 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) => { + DrawButtonKDEx("KDSpellsConfig3", (_bdata) => { KinkyDungeonSpellsConfig = "3"; KinkyDungeonLoadSpellsConfig(); return true; }, true, xLoc + 450, 640, w - 25 - h, 54, localStorage.getItem('KinkyDungeonSpellsChoice' + 2) ? TextGet("KinkyDungeonLoadConfig") + "3" : "x", KinkyDungeonSpellsConfig == "3" ? "#ffffff" : "#888888", ""); - DrawButtonKDEx("KDSaveSpellsConfig1", (bdata) => { + 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) => { + 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) => { + DrawButtonKDEx("KDSaveSpellsConfig3", (_bdata) => { KinkyDungeonSpellsConfig = "3"; KinkyDungeonSaveSpellsConfig(); return true; @@ -2464,8 +2489,8 @@ function KDGetRandomSpell(maxSpellLevel = 4) { } -function KinkyDungeonGetUnlearnedSpells(minlevel, maxlevel, SpellList) { - let SpellsUnlearned = []; +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)) { @@ -2485,9 +2510,9 @@ function KinkyDungeonGetUnlearnedSpells(minlevel, maxlevel, SpellList) { return SpellsUnlearned; } -function KinkyDungeonSpellChoiceAssign(spell, hotbarslot = undefined) { +function KinkyDungeonSpellChoiceAssign(spell: spell | string, hotbarslot: number = undefined) { // Determine if the spell passed to us is a string or not - let spellname; + let spellname: string; if (typeof spell == "string") { spellname = spell; } @@ -2526,10 +2551,12 @@ function KinkyDungeonSpellChoiceAssign(spell, hotbarslot = undefined) { } } -// Removes a spell with either a spell object or a spell name as a string to the player's hotbar -function KinkyDungeonSpellChoiceUnassign(spell) { +/** + * 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; + let spellname: string; if (typeof spell == "string") { spellname = spell; } @@ -2558,12 +2585,14 @@ function KinkyDungeonSpellChoiceUnassign(spell) { } } -// 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, index = undefined) { +/** + * 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; + let spell: spell; if (typeof spellobject == "string") { spell = KinkyDungeonFindSpell(spellobject); } @@ -2598,13 +2627,16 @@ function KinkyDungeonSpellAdd(spellobject, index = undefined) { else { KinkyDungeonSpells.push(newspell); } + KDRefreshSpellCache = true; } } -// Removes a spell from the player's spellbook if they have it. -function KinkyDungeonSpellRemove(spellobject) { +/** + * 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; + let spellname: string; if (typeof spellobject == "string") { spellname = spellobject; } @@ -2630,4 +2662,5 @@ function KinkyDungeonSpellRemove(spellobject) { } // Finally, splice this from the list. KinkyDungeonSpells.splice(spellloc, 1); -} \ No newline at end of file + KDRefreshSpellCache = true; +} diff --git a/Game/src/magic/KinkyDungeonMagicCode.js b/Game/src/magic/KinkyDungeonMagicCode.ts similarity index 87% rename from Game/src/magic/KinkyDungeonMagicCode.js rename to Game/src/magic/KinkyDungeonMagicCode.ts index b62731352..35e6c4675 100644 --- a/Game/src/magic/KinkyDungeonMagicCode.js +++ b/Game/src/magic/KinkyDungeonMagicCode.ts @@ -1,10 +1,8 @@ "use strict"; -/** - * @type {Record void | string>} - */ -let KinkyDungeonSpellSpecials = { - "analyze": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { +/* FIXME: Type signature changed; please check. */ +let KinkyDungeonSpellSpecials: Record void | string> = { + "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) { @@ -24,7 +22,7 @@ let KinkyDungeonSpellSpecials = { } else return "Fail"; } }, - "LeashSpell": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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)) { @@ -62,7 +60,7 @@ let KinkyDungeonSpellSpecials = { return "Fail"; } }, - "BoulderKick": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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) { @@ -105,10 +103,10 @@ let KinkyDungeonSpellSpecials = { } else return "Fail"; } else return "Fail"; }, - "Volcanism": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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) => {return e.Enemy.tags[tag];}) && KDistEuclidean(targetX - e.x, targetY - e.y) <= spell.aoe + 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); } @@ -119,10 +117,10 @@ let KinkyDungeonSpellSpecials = { rock.hostile = 9999; } }, - "dress": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "dress": (spell, _data, _targetX, _targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { KinkyDungeonSetDress(spell.outfit); }, - "MoiraiScissors": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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) { @@ -172,7 +170,7 @@ let KinkyDungeonSpellSpecials = { KinkyDungeonSendActionMessage(3, TextGet("KDMoiraiFail"), "#ff5555", 2); return "Fail"; }, - "Charge": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "Charge": (spell, _data, targetX, targetY, _tX, _tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { let cost = KDAttackCost() + KDSprintCost(); let en = KinkyDungeonEntityAt(targetX, targetY); let space = false; @@ -246,7 +244,8 @@ let KinkyDungeonSpellSpecials = { } return "Fail"; }, - "Bondage": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + + "Bondage": (spell, _data, targetX, targetY, _tX, _tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { let en = KinkyDungeonEntityAt(targetX, targetY); if (en?.Enemy) { let fail = KinkyDungeoCheckComponents(spell, entity.x, entity.y, false).length > 0; @@ -272,7 +271,7 @@ let KinkyDungeonSpellSpecials = { let canApply = KDCanApplyBondage(en, entity, KinkyDungeonTargetingSpellItem ? ( KDRestraint(KinkyDungeonTargetingSpellItem)?.quickBindCondition ? - (t, p) => (KDQuickBindConditions[KDRestraint(KinkyDungeonTargetingSpellItem)?.quickBindCondition]( + (t: entity, p: entity) => (KDQuickBindConditions[KDRestraint(KinkyDungeonTargetingSpellItem)?.quickBindCondition]( t, p, KDRestraint(KinkyDungeonTargetingSpellItem), KinkyDungeonTargetingSpellItem)) : @@ -439,7 +438,45 @@ let KinkyDungeonSpellSpecials = { KinkyDungeonSendTextMessage(8, TextGet("KDBondageFailNoTarget"), "#ff5555", 1, true); return "Fail"; }, - "CommandWord": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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)) { + KinkyDungeonChangeStamina(-3, false, true); + 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"), "#ff5555", 1, true); + return "Fail"; + } + KinkyDungeonSendTextMessage(8, TextGet("KDPickaxeFailNoTarget"), "#ff5555", 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"), "#ff5555", 1); if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/SoftShield.ogg"); @@ -509,7 +546,7 @@ let KinkyDungeonSpellSpecials = { KinkyDungeonSendTextMessage(8, TextGet("KDCommandWordFail_NoTarget"), "#ff5555", 1, true); return "Fail"; }, - "Windup": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "Windup": (spell, _data, _targetX, _targetY, _tX, _tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { if (!KDEnemyHasFlag(entity, "winding")) { KinkyDungeonSetEnemyFlag(entity, "winding", spell.time); KinkyDungeonSetEnemyFlag(entity, "winding2", spell.time - 1); @@ -522,7 +559,7 @@ let KinkyDungeonSpellSpecials = { KinkyDungeonSendTextMessage(4, TextGet("KDWindup"), "#888888", 2); return "Cast"; }, - "Lockdown": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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) { KinkyDungeonApplyBuffToEntity(en, { @@ -550,7 +587,7 @@ let KinkyDungeonSpellSpecials = { return "Fail"; }, - "Wall": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "Wall": (spell, _data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { let en = KinkyDungeonEnemyAt(targetX, targetY); if (!en) { let tile = KinkyDungeonMapGet(targetX, targetY); @@ -567,7 +604,7 @@ let KinkyDungeonSpellSpecials = { } } else return "Fail"; }, - "Enemy_CM1": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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, "CM1", 1); @@ -583,7 +620,7 @@ let KinkyDungeonSpellSpecials = { } return "Fail"; }, - "Chastity": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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) { KDTieUpEnemy(en, spell.power, "Metal"); @@ -616,7 +653,7 @@ let KinkyDungeonSpellSpecials = { return "Fail"; } }, - "DisplayStand": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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)); @@ -662,7 +699,7 @@ let KinkyDungeonSpellSpecials = { return "Fail"; } else return "Fail"; }, - "Petsuit": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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)); @@ -707,7 +744,7 @@ let KinkyDungeonSpellSpecials = { return "Fail"; } else return "Fail"; }, - "CommandCapture": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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 @@ -747,7 +784,7 @@ let KinkyDungeonSpellSpecials = { } else return "Fail"; } else return "Fail"; }, - "AnimatePuppet": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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++) @@ -789,7 +826,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "Animate": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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++) @@ -822,7 +859,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "AnimateLarge": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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++) @@ -853,7 +890,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "ElasticGrip": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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"; @@ -902,7 +939,7 @@ let KinkyDungeonSpellSpecials = { } else return "Fail"; } else return "Fail"; }, - "RecoverObject": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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), "#ff5555", 1); return "Fail"; @@ -956,7 +993,7 @@ let KinkyDungeonSpellSpecials = { if (spell.aoe) KinkyDungeonChestConfirm = true; success = KDMoveObjectFunctions[tile](tt.x, tt.y); KinkyDungeonChestConfirm = false; - } { + } else { locked = true; success = false; } @@ -979,7 +1016,7 @@ let KinkyDungeonSpellSpecials = { } else if (!found) KinkyDungeonSendActionMessage(8, TextGet("KinkyDungeonSpellCastFail"+spell.name), "#ff5555", 1); return "Fail"; }, - "TelekineticSlash": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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++) { @@ -1050,7 +1087,7 @@ let KinkyDungeonSpellSpecials = { }, - "Swap": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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), "#ff5555", 1); return "Fail"; @@ -1058,9 +1095,27 @@ let KinkyDungeonSpellSpecials = { let en = KinkyDungeonEntityAt(targetX, targetY); if (en && !en.player) { if (!KDIsImmobile(en)) { + + 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)); @@ -1083,7 +1138,7 @@ let KinkyDungeonSpellSpecials = { } else return "Fail"; }, - "UniversalSolvent": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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"), "#ff5555", 1); return "Fail"; @@ -1110,7 +1165,7 @@ let KinkyDungeonSpellSpecials = { } KinkyDungeonSendActionMessage(3, TextGet("KDUniversalSolventSucceedEnemy") - .replace("ENMY", KDGetEnemyName(en)), + .replace("ENMY", KDGenEnemyName(en)), "#88FFAA", 2 + (spell.channel ? spell.channel - 1 : 0)); @@ -1165,7 +1220,7 @@ let KinkyDungeonSpellSpecials = { } return "Fail"; }, - "Awaken": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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++) { @@ -1190,7 +1245,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "Spread": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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++) { @@ -1222,7 +1277,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "CommandBind": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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++) { @@ -1249,7 +1304,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "Coalesce": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "Coalesce": (spell, _data, _targetX, _targetY, tX, tY, entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { let count = 0; let finalTile = "Slime"; let finalTilePri = -1; @@ -1305,7 +1360,7 @@ let KinkyDungeonSpellSpecials = { KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)/2); return "Cast"; }, - "SlimeToLatex": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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++) { @@ -1331,7 +1386,7 @@ let KinkyDungeonSpellSpecials = { KinkyDungeonChangeMana(-KinkyDungeonGetManaCost(spell)); return "Cast"; }, - "LiquidMetal": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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++) { @@ -1358,7 +1413,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; }, - "CommandDisenchant": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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) { @@ -1387,7 +1442,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "NegateRune": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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"); }); @@ -1426,7 +1481,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "DollConvert": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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) { @@ -1459,7 +1514,7 @@ let KinkyDungeonSpellSpecials = { return "Fail"; }, - "CommandVibrate": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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 || "") && (KinkyDungeonPlayerTags.get("ItemVulvaFull") || KinkyDungeonPlayerTags.get("ItemButtFull") @@ -1491,7 +1546,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "CommandVibrateLV2": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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") @@ -1519,7 +1574,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "CommandVibrateLV3": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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") @@ -1547,7 +1602,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "CommandOrgasm": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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"))) { @@ -1577,7 +1632,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "CommandSlime": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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; @@ -1639,7 +1694,7 @@ let KinkyDungeonSpellSpecials = { return "Fail"; } }, - "CommandRelease": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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; @@ -1665,7 +1720,7 @@ let KinkyDungeonSpellSpecials = { let restraints = KinkyDungeonAllRestraint(); if (restraints.length > 0) tried = true; for (let r of restraints) { - if (!r.lock && !KDGetCurse(r) && KDGetEscapeChance(KDRestraint(r), "Remove", undefined, undefined, false, false).escapeChance > 0 && !KDGroupBlocked(KDRestraint(r).Group)) { + if (!r.lock && !KDGetCurse(r) && KDGetEscapeChance(r, "Remove", undefined, undefined, false, false).escapeChance > 0 && !KDGroupBlocked(KDRestraint(r).Group)) { KinkyDungeonRemoveRestraint(KDRestraint(r).Group); active = true; } @@ -1684,7 +1739,7 @@ let KinkyDungeonSpellSpecials = { return "Fail"; } }, - "AllyToggle": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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) en.buffs.AllySelect.duration = 0; @@ -1699,7 +1754,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "AllyAttention": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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) @@ -1717,7 +1772,7 @@ let KinkyDungeonSpellSpecials = { if (succeed) return "Cast"; return "Fail"; }, - "AllyDeselect": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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) @@ -1728,7 +1783,7 @@ let KinkyDungeonSpellSpecials = { if (succeed) return "Cast"; return "Fail"; }, - "AllyMove": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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); }); @@ -1743,7 +1798,7 @@ let KinkyDungeonSpellSpecials = { if (succeed) return "Cast"; return "Fail"; }, - "Disarm": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "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 @@ -1755,7 +1810,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "weaponAttack": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "weaponAttack": (_spell, _data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { KinkyDungeonTargetingSpellWeapon = null; let en = KinkyDungeonEnemyAt(targetX, targetY); if (en) { @@ -1763,7 +1818,7 @@ let KinkyDungeonSpellSpecials = { return "Cast"; } else return "Fail"; }, - "weaponAttackOrSpell": (spell, data, targetX, targetY, tX, tY, entity, enemy, moveDirection, bullet, miscast, faction, cast, selfCast) => { + "weaponAttackOrSpell": (_spell, _data, targetX, targetY, _tX, _tY, _entity, _enemy, _moveDirection, _bullet, _miscast, _faction, _cast, _selfCast) => { KinkyDungeonTargetingSpellWeapon = null; let en = KinkyDungeonEnemyAt(targetX, targetY); if (en) { @@ -1775,8 +1830,8 @@ let KinkyDungeonSpellSpecials = { } }; -let KDCommandCaptureBindings = { - "vine": (spell, entity, faction, bullet, miscast, attacker, counter) => { +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)); @@ -1793,7 +1848,7 @@ let KDCommandCaptureBindings = { if (!(entity.slow)) entity.slow = spell.level * 5; } }, - "rope": (spell, entity, faction, bullet, miscast, attacker, counter) => { + "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)); @@ -1817,7 +1872,7 @@ let KDCommandCaptureBindings = { }, false, false, undefined, undefined, attacker); } }, - "fabric": (spell, entity, faction, bullet, miscast, attacker, counter) => { + "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)); @@ -1841,7 +1896,7 @@ let KDCommandCaptureBindings = { }, false, false, undefined, undefined, attacker); } }, - "belt": (spell, entity, faction, bullet, miscast, attacker, counter) => { + "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)); @@ -1863,7 +1918,7 @@ let KDCommandCaptureBindings = { }, false, true, undefined, undefined, attacker); } }, - "chain": (spell, entity, faction, bullet, miscast, attacker, counter) => { + "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)); @@ -1888,20 +1943,20 @@ let KDCommandCaptureBindings = { }; -let KDCommandBindBindings = { - "vine": (spell, x, y, faction, bullet, miscast, attacker, counter) => { +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) => { + "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) => { + "fabric": (_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) => { + "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) => { + "belt": (_spell, x, y, _faction, _bullet, _miscast, _attacker, _counter) => { KinkyDungeonCastSpell(x, y, KinkyDungeonFindSpell("BindBelt", true), undefined, undefined, undefined, "Player"); }, }; diff --git a/Game/src/magic/KinkyDungeonMagicList.js b/Game/src/magic/KinkyDungeonMagicList.ts similarity index 98% rename from Game/src/magic/KinkyDungeonMagicList.js rename to Game/src/magic/KinkyDungeonMagicList.ts index b2832f6d8..bb1a5c273 100644 --- a/Game/src/magic/KinkyDungeonMagicList.js +++ b/Game/src/magic/KinkyDungeonMagicList.ts @@ -13,11 +13,11 @@ // 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 = {name: "CommandWord", tags: ["command", "binding", "utility", "defense"], sfx: "Magic", school: "Conjure", manacost: 6, components: ["Verbal"], level:1, type:"special", special: "CommandWord", noMiscast: true, +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 = {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, +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 = {name: "ZeroResistance", tags: ["utility", "defense"], quick: true, school: "Any", manacost: 0, components: [], level:1, spellPointCost: 0, type:"passive", noMiscast: true, +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", }, ], @@ -26,7 +26,7 @@ let KDZeroResistanceSpell = {name: "ZeroResistance", tags: ["utility", "defense" /** * These are starting spells */ -let KinkyDungeonSpellsStart = [ +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}]}, ]; @@ -78,7 +78,7 @@ let KDSpellColumns = { }; -function KDAddSpellPage(page, columnLabels = []) { +function KDAddSpellPage(page: string, columnLabels: string[] = []) { if (!KDGameData.AllowedSpellPages) KDGameData.AllowedSpellPages = {}; KDGameData.AllowedSpellPages[page] = columnLabels; } @@ -187,11 +187,10 @@ let KinkyDungeonLearnableSpells = [ ]; /** - * - * @param {string} page - * @param {string[][]} list + * @param page + * @param list */ -function KDDefineSpellPage(page, list) { +function KDDefineSpellPage(page: string, list: string[][]) { KinkyDungeonSpellPages.push(page); KinkyDungeonLearnableSpells.push(list); } @@ -199,9 +198,8 @@ function KDDefineSpellPage(page, list) { /** * 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. +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, @@ -476,7 +474,7 @@ let KinkyDungeonSpellList = { // List of spells you can unlock in the 3 books. W 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.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, @@ -1030,15 +1028,15 @@ let KinkyDungeonSpellList = { // List of spells you can unlock in the 3 books. W {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: 5}, + 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: 5}, + 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: 5}, + 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"}, @@ -1163,7 +1161,7 @@ let KinkyDungeonSpellList = { // List of spells you can unlock in the 3 books. W 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: 5}, + spellcast: {spell: "RopeRuneStrike", target: "onhit", directional:false, offset: false}, channel: 2}, {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}]}, @@ -1697,9 +1695,8 @@ let KinkyDungeonSpellList = { // List of spells you can unlock in the 3 books. W }; /** * Spells that are not in the base spell lists - * @type {spell[]} */ -let KinkyDungeonSpellListEnemies = [ +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"}, @@ -2065,14 +2062,16 @@ let KinkyDungeonSpellListEnemies = [ 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"}, + 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"], level:1, type:"dot", noTerrainHit: true, onhit:"", delay: 3000, power: 5.5, range: 2, size: 3, aoe: 1.5, lifetime: 1, damage: "fire"}, + 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, @@ -2085,7 +2084,8 @@ let KinkyDungeonSpellListEnemies = [ ], 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: 3000, power: 2.5, range: 2, time: 8, size: 3, aoe: 1.5, lifetime: 1, bind: 8, damage: "chain"}, + 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, @@ -2152,6 +2152,13 @@ let KinkyDungeonSpellListEnemies = [ + {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", @@ -2888,6 +2895,7 @@ let KinkyDungeonSpellListEnemies = [ 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, @@ -3536,8 +3544,7 @@ KDDefineSpellPage("Command", [ ]); -/** @type {Record} */ -let KDSpecialBondage = { +let KDSpecialBondage: Record = { "Energy": { priority: 25, color: "#e7cf1a", @@ -3664,9 +3671,8 @@ let KDMagicDefs = { SlimeKraken_TentacleCountShare: 0.1, //1 slime max per this much hp }; -/** @type {Record boolean>} */ -let KDCastConditions = { - "latexLegbinderSpell": (enemy, target) => { +let KDCastConditions: Record boolean> = { + "latexLegbinderSpell": (_enemy, target) => { if (target.player) { let restraint = KinkyDungeonGetRestraint({tags: ["latexlegbinderSpell"]}, 100, "tmb"); if (!restraint) return false; @@ -3677,7 +3683,7 @@ let KDCastConditions = { "iceWallMelee": (enemy, target) => { return enemy.hp < enemy.Enemy.maxhp/2 && KDistEuclidean(enemy.x-target.x, enemy.y - target.y) < 3; }, - "latexGagSpell": (enemy, target) => { + "latexGagSpell": (_enemy, target) => { if (target.player) { let restraint = KinkyDungeonGetRestraint({tags: ["latexgagSpell"]}, 100, "tmb"); if (!restraint) return false; @@ -3685,7 +3691,7 @@ let KDCastConditions = { } return true; }, - "latexArmbinderSpell": (enemy, target) => { + "latexArmbinderSpell": (_enemy, target) => { if (target.player) { let restraint = KinkyDungeonGetRestraint({tags: ["latexarmbinderSpell"]}, 100, "tmb"); if (!restraint) return false; @@ -3693,15 +3699,15 @@ let KDCastConditions = { } return true; }, - "notImmobile": (enemy, target) => { + "notImmobile": (_enemy, _target) => { if (KinkyDungeonSlowLevel < 10) return true; return false; }, - "Windup_Start": (enemy, target) => { + "Windup_Start": (enemy, _target) => { if (!KDEnemyHasFlag(enemy, "windup")) return true; return false; }, - "Windup_Ready": (enemy, target) => { + "Windup_Ready": (enemy, _target) => { if (KDEnemyHasFlag(enemy, "windup")) return true; return false; }, @@ -3709,33 +3715,33 @@ let KDCastConditions = { if (KDEnemyHasFlag(enemy, "commandword")) return false; return KDEntityHasBuffTags(target, "commandword"); }, - "dollConvert": (enemy, target, spell) => { + "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) => { + "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) => { + "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) => { + "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) => { + "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) => { + "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) => { + "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; @@ -3753,7 +3759,7 @@ let KDCastConditions = { > 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) => { + "sarcoEngulf": (_enemy, target) => { if (target.player && !KinkyDungeonPlayerTags.get("Sarcophagus")) { let restraint = KinkyDungeonGetRestraint({tags: ["mummyRestraints"]}, 100, "tmb"); if (!restraint) return false; @@ -3761,7 +3767,7 @@ let KDCastConditions = { } return false; }, - "sarcoHex": (enemy, target) => { + "sarcoHex": (_enemy, target) => { if (target.player && !KinkyDungeonPlayerTags.get("Sarcophagus")) { let restraint = KinkyDungeonGetRestraint({tags: ["mummyRestraints"]}, 100, "tmb"); if (!restraint) return true; @@ -3769,37 +3775,37 @@ let KDCastConditions = { } return false; }, - "NoGag": (enemy, target) => { + "NoGag": (_enemy, target) => { if (target.player && !KinkyDungeonPlayerTags.get("ItemMouthFull")) { return true; } return false; }, - "EnemyEnchantRope": (enemy, target) => { + "EnemyEnchantRope": (_enemy, target) => { if (target.player && KinkyDungeonPlayerTags.get("RopeSnake")) { return true; } else if (target?.specialBoundLevel?.Rope > 0) return true; return false; }, - "EnemyEnchantRope2": (enemy, target) => { + "EnemyEnchantRope2": (_enemy, target) => { if (target.player && (KinkyDungeonPlayerTags.get("RopeSnake") || KinkyDungeonPlayerTags.get("WeakMagicRopes"))) { return true; } else if (target?.specialBoundLevel?.Rope > 0) return true; return false; }, - "MagicMissileChannel": (enemy, target) => { + "MagicMissileChannel": (enemy, _target) => { return !KDEnemyHasFlag(enemy, "MagicMissileChannelFinished"); }, - "NotDragonChanneled": (enemy, target) => { + "NotDragonChanneled": (enemy, _target) => { return !KDEnemyHasFlag(enemy, "dragonChannel") && !KDEnemyHasFlag(enemy, "dragonChannelCD"); }, - "DragonChanneled": (enemy, target) => { + "DragonChanneled": (enemy, _target) => { return KDEnemyHasFlag(enemy, "dragonChannel"); }, - "WardenCageDrop": (enemy, target) => { + "WardenCageDrop": (_enemy, target) => { if (target.player && KinkyDungeonPlayerTags.get("OneBar")) { return true; } @@ -3807,9 +3813,8 @@ let KDCastConditions = { }, }; -/** @type {Record boolean>} */ -let KDPlayerCastConditions = { - "hasArcaneEnergy": (player, x, y) => { +let KDPlayerCastConditions: Record boolean> = { + "hasArcaneEnergy": (_player, _x, _y) => { return KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "ArcaneEnergy") > 0; }, "noStationaryBullet": (player, x, y) => { @@ -3821,14 +3826,14 @@ let KDPlayerCastConditions = { 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) => { + "LiquidMetalBurst": (_player, x, y) => { return KDEffectTileTags(x, y).liquidmetal; }, - "weapon": (player, x, y) => { + "weapon": (_player, _x, _y) => { return KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed; }, - "FloatingWeapon": (player, x, y) => { + "FloatingWeapon": (_player, _x, _y) => { return KinkyDungeonPlayerDamage && !KinkyDungeonPlayerDamage.unarmed && (!KinkyDungeonPlayerDamage.noHands || KinkyDungeonPlayerDamage.telekinetic); }, @@ -3837,7 +3842,7 @@ let KDPlayerCastConditions = { -let KDCustomCost = { +let KDCustomCost: Record void> = { "SprintPlusAttack": (data) => { data.cost = Math.round(10 * -(KDAttackCost() + KDSprintCost())) + "SP"; data.color = "#88ff88"; @@ -3876,4 +3881,4 @@ let KDCustomCost = { data.color = "#ffffff"; } }, -}; \ No newline at end of file +}; diff --git a/Game/src/magic/KinkyDungeonPlayerEffects.js b/Game/src/magic/KinkyDungeonPlayerEffects.ts similarity index 90% rename from Game/src/magic/KinkyDungeonPlayerEffects.js rename to Game/src/magic/KinkyDungeonPlayerEffects.ts index 617f00d7c..dc5de7a84 100644 --- a/Game/src/magic/KinkyDungeonPlayerEffects.js +++ b/Game/src/magic/KinkyDungeonPlayerEffects.ts @@ -1,11 +1,8 @@ 'use strict'; -/** - * @type {Record {sfx: string, effect: boolean}>} - */ -let KDPlayerEffects = { - "MagicRope": (target, damage, playerEffect, spell, faction, bullet, entity) => { +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); @@ -18,17 +15,17 @@ let KDPlayerEffects = { } return {sfx: "Shield", effect: false}; }, - "Disrobe": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "Disrobe": (_target, _damage, _playerEffect, _spell, _faction, _bullet, entity) => { let RopeDresses = ["Leotard", "Bikini", "Lingerie"]; if (!RopeDresses.includes(KinkyDungeonCurrentDress) && !KinkyDungeonStatsChoice.get("KeepOutfit")) { KinkyDungeonSetDress(RopeDresses[Math.floor(Math.random() * RopeDresses.length)], ""); KinkyDungeonDressPlayer(); - KinkyDungeonSendTextMessage(1, TextGet("KDWitchShibariDisrobe").replace("ENMY", TextGet("Name" + entity?.name)), "#e7cf1a", 3); + 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) => { + "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); @@ -37,7 +34,7 @@ let KDPlayerEffects = { return {sfx: undefined, effect: false}; }, - "GhostHaunt": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "GhostHaunt": (target, _damage, _playerEffect, _spell, _faction, _bullet, _entity) => { let count = 1; if (target?.player && KDEntityBuffedStat(target, "Haunting")) { count = KDEntityBuffedStat(target, "Haunting") + 1; @@ -55,7 +52,7 @@ let KDPlayerEffects = { duration: 9999, infinite: true,}); return {sfx: "Evil", effect: true}; }, - "ObserverBeam": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "ObserverBeam": (target, _damage, _playerEffect, spell, _faction, bullet, _entity) => { if (!KDBulletAlreadyHit(bullet, target, true)) { let dmg = KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); if (dmg.happened) { @@ -82,7 +79,7 @@ let KDPlayerEffects = { return {sfx: "Shield", effect: false}; }, - "TheShadowCurse": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "TheShadowCurse": (_target, _damage, playerEffect, _spell, _faction, _bullet, entity) => { let applied = ""; for (let i = 0; i < playerEffect.count; i++) { @@ -106,7 +103,7 @@ let KDPlayerEffects = { return {sfx: "Evil", effect: true}; }, - "CursingCircle": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "CursingCircle": (_target, _damage, playerEffect, spell, _faction, bullet, _entity) => { let dmg = KinkyDungeonDealDamage({damage: spell.power, type: spell.damage}, bullet); if (dmg.happened) { @@ -147,7 +144,7 @@ let KDPlayerEffects = { return {sfx: "Shield", effect: false}; }, - "MaidChastity": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "MaidChastity": (_target, _damage, playerEffect, spell, faction, _bullet, _entity) => { if (KinkyDungeonFlags.get("ChastityBelts")) { // Tease the player @@ -174,7 +171,7 @@ let KDPlayerEffects = { } return {sfx: undefined, effect: false}; }, - "ShadowBolt": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -184,7 +181,7 @@ let KDPlayerEffects = { } return {sfx: "Evil", effect: true}; }, - "BearTrapStun": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -192,7 +189,7 @@ let KDPlayerEffects = { return {sfx: "Clang", effect: true}; }, - "LatexSpray": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -225,7 +222,7 @@ let KDPlayerEffects = { } return {sfx: "Fwoosh", effect: true}; }, - "RubberBolt": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -236,7 +233,7 @@ let KDPlayerEffects = { } return {sfx: "Dollify", effect: true}; }, - "RestrainingBolt": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -274,7 +271,7 @@ let KDPlayerEffects = { } return {sfx: "Miss", effect: false}; }, - "MagicMissile": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -295,7 +292,7 @@ let KDPlayerEffects = { } return {sfx: "Miss", effect: false}; }, - "EncaseBolt": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -306,7 +303,7 @@ let KDPlayerEffects = { } return {sfx: "Dollify", effect: true}; }, - "EnemyWindBlast": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -324,7 +321,7 @@ let KDPlayerEffects = { } return {sfx: "Fwosh", effect: true}; }, - "PushAway": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -344,7 +341,7 @@ let KDPlayerEffects = { } return {sfx: "Fwosh", effect: true}; }, - "GravityPull": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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++) { @@ -366,7 +363,7 @@ let KDPlayerEffects = { } return {sfx: "Evil", effect: true}; }, - "LatexBubble": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -405,7 +402,7 @@ let KDPlayerEffects = { } return {sfx: "Fwosh", effect: true}; }, - "LatexBall": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -444,7 +441,7 @@ let KDPlayerEffects = { } return {sfx: "Fwosh", effect: true}; }, - "WaterBubble": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -463,7 +460,7 @@ let KDPlayerEffects = { } return {sfx: "Fwosh", effect: true}; }, - "EncaseBoltDrone": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -478,7 +475,7 @@ let KDPlayerEffects = { } return {sfx: "Dollify", effect: true}; }, - "RubberMissile": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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"); @@ -487,7 +484,7 @@ let KDPlayerEffects = { return {sfx: "Lightning", effect: true}; }, - "ObsidianBolt": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -498,7 +495,7 @@ let KDPlayerEffects = { } return {sfx: "Evil", effect: true}; }, - "MithrilBolt": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -509,7 +506,7 @@ let KDPlayerEffects = { } return {sfx: "Evil", effect: true}; }, - "LockBullet": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -545,7 +542,7 @@ let KDPlayerEffects = { } return {sfx: "LockHeavy", effect: true}; }, - "CelestialBolt": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -556,7 +553,7 @@ let KDPlayerEffects = { } return {sfx: "Evil", effect: true}; }, - "BoundByFate": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "BoundByFate": (_target, _damage, playerEffect, _spell, _faction, bullet, _entity) => { KDCreateAoEEffectTiles( bullet.x, bullet.y, @@ -572,7 +569,7 @@ let KDPlayerEffects = { return {sfx: "Evil", effect: true}; }, - "StarBondage": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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"); @@ -581,7 +578,7 @@ let KDPlayerEffects = { return {sfx: "Evil", effect: true}; }, - "Taunted": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "Taunted": (_target, _damage, playerEffect, _spell, _faction, bullet, _entity) => { let ent = (bullet?.bullet?.source ? KinkyDungeonFindID(bullet.bullet.source) : null) || bullet; KDCreateAoEEffectTiles( ent.x, @@ -598,7 +595,7 @@ let KDPlayerEffects = { return {sfx: "Evil", effect: true}; }, - "TauntShame": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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), "#ff5555", 1); @@ -608,7 +605,7 @@ let KDPlayerEffects = { return {sfx: "Tickle", effect: true}; }, - "MoonBondage": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -618,8 +615,8 @@ let KDPlayerEffects = { } return {sfx: "Evil", effect: true}; }, - "FuukaOrb": (target, damage, playerEffect, spell, faction, bullet, entity) => { - KDTripleBuffKill("FuukaOrb", KinkyDungeonPlayerEntity, 300, (tt) => { + "FuukaOrb": (_target, _damage, _playerEffect, _spell, _faction, _bullet, _entity) => { + KDTripleBuffKill("FuukaOrb", KinkyDungeonPlayerEntity, 300, (_tt) => { // Nothing! }, "Sealing", (tt) => { if (tt?.player) { @@ -660,7 +657,7 @@ let KDPlayerEffects = { }, ); return {sfx: "Evil", effect: true}; }, - "ShadowSeal": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "ShadowSeal": (target, _damage, _playerEffect, _spell, _faction, _bullet, _entity) => { KinkyDungeonApplyBuffToEntity(target, { id: "ShadowSeal", duration: 10, @@ -675,10 +672,10 @@ let KDPlayerEffects = { KinkyDungeonSendTextMessage(8, TextGet("KDShadowSeal"), "#aa55ff", 4); return {sfx: "Evil", effect: true}; }, - "SlimeEngulf": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "SlimeEngulf": (_target, _damage, playerEffect, _spell, faction, _bullet, _entity) => { let restraintAdd = KinkyDungeonGetRestraint({tags: ["slimeRestraintsRandom"]}, MiniGameKinkyDungeonLevel + playerEffect.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); if (!restraintAdd) { - KDTripleBuffKill("SlimeEngulfEnd", KinkyDungeonPlayerEntity, 6, (tt) => { + KDTripleBuffKill("SlimeEngulfEnd", KinkyDungeonPlayerEntity, 6, (_tt) => { // Remove the nearby slime kraken let kraken = KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 10); @@ -713,7 +710,7 @@ let KDPlayerEffects = { } return {sfx: "RubberBolt", effect: false}; }, - "SarcoEngulf": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -734,10 +731,10 @@ let KDPlayerEffects = { return {sfx: "MagicSlash", effect: effect}; }, - "SarcoHex": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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) => { + 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) { @@ -766,7 +763,7 @@ let KDPlayerEffects = { } return {sfx: "Struggle", effect: false}; }, - "Bind": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -791,7 +788,7 @@ let KDPlayerEffects = { } return {sfx: "Miss", effect: effect}; }, - "AmpuleBlue": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -832,7 +829,7 @@ let KDPlayerEffects = { return {sfx: "Miss", effect: effect}; }, - "Hairpin": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -845,7 +842,7 @@ let KDPlayerEffects = { return {sfx: "Miss", effect: effect}; }, - "Blind": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "Blind": (_target, _damage, playerEffect, _spell, _faction, _bullet, _entity) => { let effect = false; if (Math.round( playerEffect.time * KinkyDungeonMultiplicativeStat(KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "lightDamageResist")) @@ -862,13 +859,13 @@ let KDPlayerEffects = { return {sfx: "Damage", effect: effect}; }, - "DamageNoMsg": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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) => { + "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}; @@ -876,7 +873,7 @@ let KDPlayerEffects = { KinkyDungeonSendTextMessage(playerEffect.power, TextGet("KinkyDungeonBuffIgniteDamage").KDReplaceOrAddDmg(dmg.string), "#ff5277", 1); return {sfx: "FireSpell", effect: effect}; }, - "IceBolt": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -890,7 +887,7 @@ let KDPlayerEffects = { } return {sfx: "Bones", effect: effect}; }, - "WitchBoulder": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -904,7 +901,7 @@ let KDPlayerEffects = { } return {sfx: "Miss", effect: effect}; }, - "Damage": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -913,7 +910,7 @@ let KDPlayerEffects = { return {sfx: undefined, effect: effect}; }, - "SingleChain": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -934,7 +931,7 @@ let KDPlayerEffects = { } return {sfx: "ArmorHit", effect: effect}; }, - "SingleMagicBind": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -953,7 +950,7 @@ let KDPlayerEffects = { return {sfx: "ArmorHit", effect: effect}; }, - "RubberBullets": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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"}; @@ -972,7 +969,7 @@ let KDPlayerEffects = { } return {sfx: "Miss", effect: effect}; }, - "HeatBlast": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -986,7 +983,7 @@ let KDPlayerEffects = { } return {sfx: "MetalBang", effect: effect}; }, - "RobotShock": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1004,7 +1001,7 @@ let KDPlayerEffects = { } return {sfx: "Shield", effect: effect}; }, - "MysticShock": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1018,7 +1015,7 @@ let KDPlayerEffects = { } return {sfx: "Shield", effect: effect}; }, - CageDrop: (target, damage, playerEffect, spell, faction, bullet, entity) => { + CageDrop: (_target, _damage, _playerEffect, spell, faction, _bullet, _entity) => { let restraintAdd = KinkyDungeonGetRestraint({tags: ["cage"]}, MiniGameKinkyDungeonLevel + spell.power, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); if (restraintAdd) { KDPlayerEffectRestrain(spell, 1, ["cage"], faction, false, true, false, false); @@ -1028,7 +1025,7 @@ let KDPlayerEffects = { return {sfx: "MetalHit", effect: true}; }, - "CrystalBind": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1050,7 +1047,7 @@ let KDPlayerEffects = { } return {sfx: "MetalHit", effect: effect}; }, - "CrystalEncase": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "CrystalEncase": (_target, _damage, _playerEffect, spell, faction, _bullet, _entity) => { let effect = false; let restraintAdd = KinkyDungeonGetRestraint({tags: ["crystalRestraints"]}, MiniGameKinkyDungeonLevel, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); if (!restraintAdd) { @@ -1067,7 +1064,7 @@ let KDPlayerEffects = { return {sfx: "Freeze", effect: effect}; }, - "IceEncase": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "IceEncase": (_target, _damage, _playerEffect, spell, faction, _bullet, _entity) => { let effect = false; let restraintAdd = KinkyDungeonGetRestraint({tags: ["iceRestraints"]}, MiniGameKinkyDungeonLevel, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); if (!restraintAdd) { @@ -1084,7 +1081,7 @@ let KDPlayerEffects = { return {sfx: "Freeze", effect: effect}; }, - "ShadowEncase": (target, damage, playerEffect, spell, faction, bullet, enemy) => { + "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( @@ -1138,7 +1135,7 @@ let KDPlayerEffects = { return {sfx: "Freeze", effect: effect}; }, - "VineSuspend": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "VineSuspend": (_target, _damage, _playerEffect, spell, faction, _bullet, _entity) => { let effect = false; let restraintAdd = KinkyDungeonGetRestraint({tags: ["vineRestraints"]}, MiniGameKinkyDungeonLevel, (KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint)); if (!restraintAdd) { @@ -1155,7 +1152,7 @@ let KDPlayerEffects = { return {sfx: "Freeze", effect: effect}; }, - "CoronaShock": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1177,7 +1174,7 @@ let KDPlayerEffects = { } return {sfx: "Shield", effect: effect}; }, - "RemoveLowLevelRope": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "RemoveLowLevelRope": (_target, _damage, _playerEffect, spell, _faction, _bullet, _entity) => { let effect = false; let restraints = []; for (let inv of KinkyDungeonAllRestraint()) { @@ -1193,7 +1190,7 @@ let KDPlayerEffects = { return {sfx: "", effect: effect}; }, - "MiniSlime": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1208,7 +1205,7 @@ let KDPlayerEffects = { return {sfx: "RubberBolt", effect: effect}; }, - "EnchantRope": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "EnchantRope": (_target, _damage, playerEffect, spell, _faction, _bullet, _entity) => { let effect = false; let transmuteLevel = 0; if (KinkyDungeonPlayerTags.get("RopeSnake")) { @@ -1264,7 +1261,7 @@ let KDPlayerEffects = { return {sfx: "MagicSlash", effect: effect}; }, - "SlimeBubble": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1290,7 +1287,7 @@ let KDPlayerEffects = { } return {sfx: "RubberBolt", effect: effect}; }, - "Slime": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1310,7 +1307,7 @@ let KDPlayerEffects = { } return {sfx: "RubberBolt", effect: effect}; }, - "LiquidMetalPatch": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1329,7 +1326,7 @@ let KDPlayerEffects = { } return {sfx: "RubberBolt", effect: effect}; }, - "LiquidMetalEngulf": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1355,7 +1352,7 @@ let KDPlayerEffects = { return {sfx: "RubberBolt", effect: effect}; }, - "SporesHappy": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -1363,7 +1360,7 @@ let KDPlayerEffects = { effect = true; return {sfx: "Damage", effect: effect}; }, - "Flummox": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1376,7 +1373,7 @@ let KDPlayerEffects = { return {sfx: "Shield", effect: effect}; }, - "SporesSick": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -1385,7 +1382,7 @@ let KDPlayerEffects = { effect = true; return {sfx: "Damage", effect: effect}; }, - "PoisonDagger": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1399,7 +1396,7 @@ let KDPlayerEffects = { return {sfx: "ClangLight", effect: effect}; }, - "Spores": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -1409,7 +1406,7 @@ let KDPlayerEffects = { return {sfx: "Damage", effect: effect}; }, - "PoisonBreath": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -1422,7 +1419,7 @@ let KDPlayerEffects = { return {sfx: "Damage", effect: effect}; }, - "DragonFlowerSpores": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -1435,7 +1432,7 @@ let KDPlayerEffects = { return {sfx: "Damage", effect: effect}; }, - "PoisonSlash": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -1449,7 +1446,7 @@ let KDPlayerEffects = { }, - "SlimeTrap": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "SlimeTrap": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { let effect = false; let slimeWalker = false; for (let inv of KinkyDungeonAllRestraint()) { @@ -1477,7 +1474,7 @@ let KDPlayerEffects = { } return {sfx: "RubberBolt", effect: effect}; }, - "NurseBola": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1494,7 +1491,7 @@ let KDPlayerEffects = { return {sfx: "WoodBlock", effect: effect}; }, - "BanditBola": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1517,7 +1514,7 @@ let KDPlayerEffects = { return {sfx: "Miss", effect: effect}; }, - "SingleRope": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1539,7 +1536,7 @@ let KDPlayerEffects = { return {sfx: "Miss", effect: effect}; }, - "RestrainingDevice": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1568,7 +1565,7 @@ let KDPlayerEffects = { return {sfx: "Clang", effect: effect}; }, - "Glue": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1599,7 +1596,7 @@ let KDPlayerEffects = { } return {sfx: "RubberHit", effect: effect}; }, - "RopeEngulf": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "RopeEngulf": (_target, _damage, playerEffect, spell, faction, _bullet, _entity) => { let effect = false; @@ -1663,7 +1660,18 @@ let KDPlayerEffects = { return {sfx: "Miss", effect: effect}; }, - "RopeEngulfWeak": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "Hogtie": (_target, _damage, playerEffect, spell, faction, _bullet, _entity) => { + let restraintAdd = KinkyDungeonGetRestraint({tags: ["ropeRestraintsHogtie"]}, + MiniGameKinkyDungeonLevel + (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); @@ -1700,7 +1708,7 @@ let KDPlayerEffects = { return {sfx: "Miss", effect: effect}; }, - "VineEngulf": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1737,7 +1745,7 @@ let KDPlayerEffects = { return {sfx: "Miss", effect: effect}; }, - "ObsidianEngulf": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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}; @@ -1763,7 +1771,7 @@ let KDPlayerEffects = { effect = true; return {sfx: "Evil", effect: effect}; }, - "CharmWraps": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1801,7 +1809,7 @@ let KDPlayerEffects = { return {sfx: "Shield", effect: effect}; }, - "EnchantedArrow": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "EnchantedArrow": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { let effect = false; @@ -1836,7 +1844,7 @@ let KDPlayerEffects = { return {sfx: "Miss", effect: effect}; }, - "TrapBindings": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "TrapBindings": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { let effect = false; if (KDTestSpellHits(spell, 0.5, 0.5)) { @@ -1873,7 +1881,7 @@ let KDPlayerEffects = { return {sfx: "Miss", effect: effect}; }, - "NurseSyringe": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1885,7 +1893,7 @@ let KDPlayerEffects = { } return {sfx: "Miss", effect: effect}; }, - "TrapSleepDart": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "TrapSleepDart": (_target, _damage, _playerEffect, _spell, _faction, _bullet, _entity) => { let effect = false; KinkyDungeonSendTextMessage(10, TextGet("KinkyDungeonTrapSleepDart"), "#ff5277", 8); KDStunTurns(Math.round(8 * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "poisonDamageResist")))); @@ -1895,7 +1903,7 @@ let KDPlayerEffects = { effect = true; return {sfx: "Damage", effect: effect}; }, - "Drench": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "Drench": (_target, _damage, playerEffect, spell, _faction, bullet, _entity) => { let effect = false; let dmg = (spell.power > 0 && spell.damage != 'inert') ? @@ -1911,7 +1919,7 @@ let KDPlayerEffects = { } return {sfx: "Damage", effect: effect}; }, - "LustBomb": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1924,7 +1932,7 @@ let KDPlayerEffects = { return {sfx: "Damage", effect: effect}; }, - "TrapLustCloud": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1937,7 +1945,7 @@ let KDPlayerEffects = { return {sfx: "Damage", effect: effect}; }, - "TrapSPCloud": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1955,7 +1963,7 @@ let KDPlayerEffects = { - "ShadowBind": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -1967,7 +1975,7 @@ let KDPlayerEffects = { } return {sfx: "Miss", effect: effect}; }, - "DamageIfChill": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "DamageIfChill": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { let effect = false; let sfx = ""; let dmg = {happened: 1, string: TextGet("KDNoDamage")}; @@ -1980,7 +1988,7 @@ let KDPlayerEffects = { } return {sfx: sfx, effect: effect}; }, - "Chill": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "Chill": (_target, damage, playerEffect, spell, _faction, bullet, _entity) => { let effect = false; let sfx = ""; let dmg = {happened: 1, string: TextGet("KDNoDamage")}; @@ -2001,7 +2009,7 @@ let KDPlayerEffects = { effect = true; return {sfx: sfx, effect: effect}; }, - "Freeze": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -2016,7 +2024,7 @@ let KDPlayerEffects = { return {sfx: "Shield", effect: effect}; }, - "ShadowStrike": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "ShadowStrike": (_target, damage, playerEffect, spell, faction, bullet, _entity) => { let effect = false; @@ -2034,7 +2042,7 @@ let KDPlayerEffects = { } return {sfx: "Miss", effect: effect}; }, - "Shock": (target, damage, playerEffect, spell, faction, bullet, entity) => { + "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); @@ -2062,23 +2070,37 @@ let KDPlayerEffects = { }; /** - * - * @param {any} spell - * @param {number} count - * @param {string[]} tags - * @param {string} faction - * @param {boolean} [noDeep] - * @param {boolean} [bypass] - Bypass inaccessible things - * @param {string} [Lock] - * @param {object} [options] - * @param {boolean} [options.Progressive] - * @param {boolean} [options.ProgressiveSkip] - Will skip over stuff already equipped - * @param {boolean} [options.DontPreferWill] - * @param {boolean} [options.Keep] - * @param {boolean} [options.RequireWill] - * @returns {{r:restraint, v: ApplyVariant}[]} + * @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, count, tags, faction, noDeep, bypass, allowEvade = false, allowBlock = false, allowBondageResist = true, Lock, options) { +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 }[] +{ let restraintsToAdd = []; let player = KinkyDungeonPlayerEntity; /*if (allowBlock || allowBondageResist) { @@ -2159,7 +2181,7 @@ function KDPlayerEffectRestrain(spell, count, tags, faction, noDeep, bypass, all } -function KDTestSpellHits(spell, allowEvade = 0, allowBlock = 1) { +function KDTestSpellHits(spell: spell, allowEvade: number = 0, allowBlock: number = 1): boolean { let player = KinkyDungeonPlayerEntity; let playerEvasion = allowEvade ? KinkyDungeonPlayerEvasion() : 0; let playerBlock = allowBlock ? KinkyDungeonPlayerBlock() : 0; @@ -2185,7 +2207,7 @@ function KDTestSpellHits(spell, allowEvade = 0, allowBlock = 1) { } } -function KinkyDungeonPlayerEffect(target, damage, playerEffect, spell, faction, bullet, entity) { +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; @@ -2209,13 +2231,26 @@ function KinkyDungeonPlayerEffect(target, damage, playerEffect, spell, faction, /** * 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 + * @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, Target, time, FinalEffect = (target) => KinkyDungeonPassOut(), buffType = "Blindness", FirstEffect = (target) => {}, SecondEffect = (target) => {}, ThirdEffect = (target) => {},) { +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"]}; @@ -2240,11 +2275,10 @@ function KDTripleBuffKill(Name, Target, time, FinalEffect = (target) => KinkyDun } /** - * - * @param {boolean} resetSlimeLevel - * @param {string} restraint + * @param resetSlimeLevel + * @param restraint */ -function KDAdvanceSlime(resetSlimeLevel, restraint = "") { +function KDAdvanceSlime(resetSlimeLevel: boolean, restraint: string = ""): boolean { let slimedParts = []; let potentialSlimeParts = []; for (let item of KinkyDungeonAllRestraintDynamic()) { @@ -2341,12 +2375,11 @@ if (!String.prototype.KDReplaceOrAddDmg) { } /** - * - * @param {entity} entity - * @param {number} time - * @param {number} damage + * @param entity + * @param time + * @param damage */ -function KDApplyBubble(entity, time, damage = 0) { +function KDApplyBubble(entity: entity, time: number, damage: number = 0) { KinkyDungeonApplyBuffToEntity(entity, { id: "WaterBubble", aura: "#2789cd", @@ -2377,20 +2410,17 @@ function KDApplyBubble(entity, time, damage = 0) { } } -/** - * @type {Record} - */ -let KDSpecialStats = { +let KDSpecialStats: Record = { Corruption: { - PerFloor: (player, amount) => { + PerFloor: (_player, _amount) => { return 50; } }, LatexIntegration: { - PerFloor: (player, amount) => { + PerFloor: (_player, amount) => { return Math.max(0, Math.floor(10 - 0.1 * amount)); // 0 at 100 }, - BuffEvents: (player) => { + BuffEvents: (_player) => { return [ {trigger: "beforeStruggleCalc", type: "latexIntegrationDebuff", power: 0.01}, {trigger: "beforeDressRestraints", type: "LatexIntegration"}, @@ -2401,14 +2431,14 @@ let KDSpecialStats = { }; /** - * - * @param {string} stat - * @param {entity} entity - * @param {number} amount - * @param {boolean} Msg - * @param {number} max + * @param stat + * @param entity + * @param amount + * @param Msg + * @param [max] + * @param [color] */ -function KDAddSpecialStat(stat, entity, amount, Msg, max = 100, color = "#722fcc") { +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)); @@ -2442,4 +2472,4 @@ function KDAddSpecialStat(stat, entity, amount, Msg, max = 100, color = "#722fcc KinkyDungeonSendTextMessage(10, TextGet("KDRemove" + stat).replace("AMNT", "" + -amount), color, 2); } } -} \ 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..49372ddf1 --- /dev/null +++ b/Game/src/map/KDRegiments.ts @@ -0,0 +1,148 @@ +"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[] = []; + + 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 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); + } + + 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.js b/Game/src/map/KDSideRooms.ts similarity index 87% rename from Game/src/map/KDSideRooms.js rename to Game/src/map/KDSideRooms.ts index 565f7694d..b0ba65c0a 100644 --- a/Game/src/map/KDSideRooms.js +++ b/Game/src/map/KDSideRooms.ts @@ -1,9 +1,6 @@ "use strict"; -/** - * @type {Record} - */ -let KDSideRooms = { +let KDSideRooms: Record = { "DemonTransition": { name: "DemonTransition", weight: 150, @@ -46,7 +43,7 @@ let KDSideRooms = { mapMod: "None", escapeMethod: "None", faction: "Bandit", - stairCreation: (tile, x, y) => { + stairCreation: (_tile, x, y) => { KinkyDungeonSkinArea({skin: "shoppe"}, x, y, 1.5); return true; }, @@ -64,7 +61,7 @@ let KDSideRooms = { mapMod: "None", escapeMethod: "None", faction: "Elf", - stairCreation: (tile, x, y) => { + stairCreation: (_tile, x, y) => { KinkyDungeonSkinArea({skin: "cst"}, x, y, 1.5); return true; }, @@ -82,7 +79,7 @@ let KDSideRooms = { mapMod: "None", escapeMethod: "None", faction: "AncientRobot", - stairCreation: (tile, x, y) => { + stairCreation: (_tile, x, y) => { KinkyDungeonSkinArea({skin: "bel"}, x, y, 1.5); return true; }, @@ -100,7 +97,7 @@ let KDSideRooms = { mapMod: "None", escapeMethod: "None", faction: "Bast", - stairCreation: (tile, x, y) => { + stairCreation: (_tile, x, y) => { KinkyDungeonSkinArea({skin: "tmb"}, x, y, 1.5); return true; }, @@ -118,7 +115,7 @@ let KDSideRooms = { mapMod: "None", escapeMethod: "None", faction: "Bast", - stairCreation: (tile, x, y) => { + stairCreation: (_tile, x, y) => { KinkyDungeonSkinArea({skin: "tmb"}, x, y, 1.5); return true; }, @@ -127,7 +124,7 @@ let KDSideRooms = { name: "GoldVault", weight: 100, chance: 0.4, - filter: (slot, top) => { + filter: (_slot, top) => { if (top) return 0; return 1; }, @@ -135,7 +132,7 @@ let KDSideRooms = { mapMod: "None", escapeMethod: "None", faction: "AncientRobot", - stairCreation: (tile, x, y) => { + stairCreation: (_tile, x, y) => { KinkyDungeonSkinArea({skin: "vault"}, x, y, 1.5); return true; }, @@ -144,13 +141,12 @@ let KDSideRooms = { // KDGetMapGenList(3, KDMapMods); /** - * @param {KDJourneySlot} slot - * @param {boolean} side - * @param {string[]} ignore - * @param {string} [requireTag] - * @returns {KDSideRoom} + * @param slot + * @param side + * @param ignore + * @param [requireTag] */ -function KDGetSideRoom(slot, side, ignore, requireTag) { +function KDGetSideRoom(slot: KDJourneySlot, side: boolean, ignore: string[], requireTag?: string): KDSideRoom { let genWeightTotal = 0; let genWeights = []; let mult = 1.0; @@ -174,4 +170,4 @@ function KDGetSideRoom(slot, side, ignore, requireTag) { } } return undefined; -} \ No newline at end of file +} diff --git a/Game/src/map/KinkyDungeonAlt.js b/Game/src/map/KinkyDungeonAlt.ts similarity index 89% rename from Game/src/map/KinkyDungeonAlt.js rename to Game/src/map/KinkyDungeonAlt.ts index 5cb9765ed..3541ac9a0 100644 --- a/Game/src/map/KinkyDungeonAlt.js +++ b/Game/src/map/KinkyDungeonAlt.ts @@ -13,6 +13,7 @@ let KDDragonList = [ ChaoticCrystalActive: 0.25, SoulCrystal: 0.05, SoulCrystalActive: 0.01, + CuffedGirl: 0.1, }, }, { @@ -135,7 +136,7 @@ let alts = { }, - updatescript: (delta) => { + 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); @@ -304,18 +305,18 @@ let alts = { }, - elevatorCondition: (x, y) => { + elevatorCondition: (_x, _y) => { return true; // Always unlocked once you are in }, - loadscript: (firstTime) => { + 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, CamY, CamX_offsetVis, CamY_offsetVis) => { + drawscript: (_delta, CamX: number, CamY: number, CamX_offsetVis: number, CamY_offsetVis: number) => { if (KDToggles.Backgrounds) { let totalScale = 1.5; let imgwidth = PIXIWidth * totalScale; @@ -393,7 +394,7 @@ let alts = { width: 15, height: 15, nopatrols: false, - onExit: (data) => { + onExit: (data: any) => { // Return to the normal map data.overrideRoomType = true; let journeySlot = KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]; @@ -404,7 +405,7 @@ let alts = { } data.AdvanceAmount = 0; }, - afterExit: (data) => { + afterExit: (_data) => { // Dump the player in a random place on top of a demon portal let point = KinkyDungeonGetRandomEnemyPoint(false, false); if (point) { @@ -594,14 +595,14 @@ let alts = { ElevatorRoom: true, noHostileDoodad: true, }, - elevatorCondition: (x, y) => { + 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) => { + updatescript: (_delta) => { KinkyDungeonResetFog(); }, @@ -646,13 +647,13 @@ let alts = { ElevatorRoom: true, noHostileDoodad: true, }, - elevatorCondition: (x, y) => { + 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) => { + updatescript: (_delta) => { if (KDRandom() < 0.2) { for (let X = 1; X < KDMapData.GridWidth - 1; X++) { for (let Y = 1; Y < KDMapData.GridHeight - 1; Y++) { @@ -900,7 +901,7 @@ let KDJourneyListSkin = { }; if (param_test) KDJourneyList.push("Test"); -function KinkyDungeonAltFloor(Type) { +function KinkyDungeonAltFloor(Type: string) { if (KDPersonalAlt[Type]) return alts[KDPersonalAlt[Type].RoomType]; return alts[Type]; @@ -941,7 +942,7 @@ let KinkyDungeonCreateMapGenType = { "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) => { + "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) => { @@ -953,36 +954,36 @@ let KinkyDungeonCreateMapGenType = { "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) => { + "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) => { + "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) => { + "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) => { + "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) => { + "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) => { + "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) => { + "Warden": (POI, VisitedRooms, width, height, _openness, _density, _hallopenness, data) => { KinkyDungeonCreateWarden(POI, VisitedRooms, width, height, 0, 10, 0, data); }, }; -function KinkyDungeonCreateMaze(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +function KinkyDungeonCreateMaze(POI: any[], VisitedRooms: any[], width: number, height: number, openness: number, density: number, hallopenness: number, data: any): void { // Variable setup - let Walls = {}; - let WallsList = {}; - let VisitedCells = {}; + 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); @@ -1173,12 +1174,12 @@ function KinkyDungeonCreateMaze(POI, VisitedRooms, width, height, openness, dens } } -function KinkyDungeonCreateCaldera(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +function KinkyDungeonCreateCaldera(POI: any[], VisitedRooms: GridEntry, width: number, height: number, openness: number, density: number, _hallopenness: number, data: any) { // Variable setup - let Walls = {}; - let WallsList = {}; - let VisitedCells = {}; + 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); @@ -1388,132 +1389,167 @@ function KinkyDungeonCreateCaldera(POI, VisitedRooms, width, height, openness, d } +let usePrimmMaze = false; /** - * - * @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 + * @param POI + * @param VisitedRooms + * @param width + * @param height + * @param openness + * @param density + * @param hallopenness + * @param data */ -function KinkyDungeonCreateTileMaze(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +function KinkyDungeonCreateTileMaze(_POI: any[], VisitedRooms: any[], width: number, height: number, openness: number, density: number, _hallopenness: number, data: any) { // Variable setup // VisitedRooms = []; - KinkyDungeonMapSet(1, 1, '0', VisitedRooms); - let Walls = {}; - let WallsList = {}; - let VisitedCells = {}; + 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}; + let genPrimmMaze = () => { - // 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}; - } + KDMapData.Grid = ""; - // Setup the wallslist for the first room - KinkyDungeonMazeWalls(VisitedRooms[0], Walls, WallsList); + // 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'; + } - // Per a randomized primm algorithm from Wikipedia, we loop through the list of walls until there are no more walls + let genParams = KDGetMazeParams(data.params); - let WallKeys = Object.keys(WallsList); - //let CellKeys = Object.keys(VisitedCells); + 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); - 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}; - } + for (let t of maze) { + if (KinkyDungeonMapGet(t.x, t.y) == '1') + KinkyDungeonMapSet(t.x, t.y, '0'); } + }; - // We only add a new cell if only one of the cells is unvisited - if (unvisitedCell) { - delete Walls[wall.x + "," + wall.y]; + 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}; + } - KinkyDungeonMapSet(wall.x, wall.y, '0'); - KinkyDungeonMapSet(unvisitedCell.x, unvisitedCell.y, '0'); - VisitedCells[unvisitedCell.x + "," + unvisitedCell.y] = unvisitedCell; + // Setup the wallslist for the first room + KinkyDungeonMazeWalls(VisitedRooms[0], Walls, WallsList); - KinkyDungeonMazeWalls(unvisitedCell, Walls, WallsList); - } + // Per a randomized primm algorithm from Wikipedia, we loop through the list of walls until there are no more walls - // Either way we remove this wall from consideration - delete WallsList[wall.x + "," + wall.y]; - // Update keys + let WallKeys = Object.keys(WallsList); + //let CellKeys = Object.keys(VisitedCells); - WallKeys = Object.keys(WallsList); - //CellKeys = Object.keys(VisitedCells); - } + while (WallKeys.length > 0) { + let I = Math.floor(KDRandom() * WallKeys.length); + let wall = Walls[WallKeys[I]]; + let unvisitedCell = null; - // The maze is complete. Now we open up some tiles + // 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}; + } + } - 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) { + // We only add a new cell if only one of the cells is unvisited + if (unvisitedCell) { + delete Walls[wall.x + "," + wall.y]; - let tile = '0'; + KinkyDungeonMapSet(wall.x, wall.y, '0'); + KinkyDungeonMapSet(unvisitedCell.x, unvisitedCell.y, '0'); + VisitedCells[unvisitedCell.x + "," + unvisitedCell.y] = unvisitedCell; - // 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) { + KinkyDungeonMazeWalls(unvisitedCell, Walls, WallsList); + } - let tile = '0'; + // Either way we remove this wall from consideration + delete WallsList[wall.x + "," + wall.y]; + // Update keys - // 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) { + 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; @@ -1530,42 +1566,57 @@ function KinkyDungeonCreateTileMaze(POI, VisitedRooms, width, height, openness, } } - // 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)); - // Randomize start positions a little :) 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 - * @type {Record} */ - let requiredAccess = { - }; + 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 - /** - * @type {Record} - */ - let 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; } } @@ -1601,7 +1652,7 @@ function KinkyDungeonCreateTileMaze(POI, VisitedRooms, width, height, openness, } KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); - let tagModifiers = data.params.tagModifiers ? data.params.tagModifiers : undefined; + 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 @@ -1630,7 +1681,7 @@ function KinkyDungeonCreateTileMaze(POI, VisitedRooms, width, height, openness, } -function KinkyDungeonCreateRoom(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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); @@ -1652,7 +1703,7 @@ function KinkyDungeonCreateRoom(POI, VisitedRooms, width, height, openness, dens KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); } -function KinkyDungeonCreateDollStorage(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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; @@ -1683,7 +1734,7 @@ function KinkyDungeonCreateDollStorage(POI, VisitedRooms, width, height, opennes KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); } -function KinkyDungeonCreateSummit(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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); @@ -1720,7 +1771,7 @@ function KinkyDungeonCreateSummit(POI, VisitedRooms, width, height, openness, de } -function KinkyDungeonCreateDollRoom(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +function KinkyDungeonCreateDollRoom(_POI: any, _VisitedRooms: any[], width: number, height: number, _openness: number, _density: number, _hallopenness: number, _data: any) { // Variable setup @@ -1913,7 +1964,7 @@ function KinkyDungeonCreateDollRoom(POI, VisitedRooms, width, height, openness, } } -function KinkyDungeonCreateDemonTransition(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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); @@ -1927,7 +1978,7 @@ function KinkyDungeonCreateDemonTransition(POI, VisitedRooms, width, height, ope if (!KDMapData.EndPosition) { KDMapData.EndPosition = {x: KDMapData.StartPosition.x, y: KDMapData.StartPosition.x}; } - KDMapData.StartPosition = KinkyDungeonGetRandomEnemyPointCriteria((x, y) => {return KDistChebyshev(x - KDMapData.EndPosition.x, y - KDMapData.EndPosition.y) > width/4;},false, false); + 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; @@ -1952,7 +2003,7 @@ function KinkyDungeonCreateDemonTransition(POI, VisitedRooms, width, height, ope // Create random stair pairs let count = 20; for (let i = 0; i < count; i++) { - let point1 = KinkyDungeonGetRandomEnemyPointCriteria((x, y) => {return KinkyDungeonMapGet(x, y) != 's' && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(x, y));},true, false); + 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"}); @@ -1960,7 +2011,7 @@ function KinkyDungeonCreateDemonTransition(POI, VisitedRooms, width, height, ope } } -function KinkyDungeonCreateDollmaker(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +function KinkyDungeonCreateDollmaker(_POI: any, _VisitedRooms: any[], _width: number, _height: number, _openness: number, _density: number, _hallopenness: number, data: any) { // Variable setup KinkyDungeonSetFlag("NoDollRoomBypass", -1, 1); @@ -1969,8 +2020,10 @@ function KinkyDungeonCreateDollmaker(POI, VisitedRooms, width, height, openness, 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++) { @@ -2006,14 +2059,16 @@ function KinkyDungeonCreateDollmaker(POI, VisitedRooms, width, height, openness, }); // Has to be tunnel } -function KinkyDungeonCreateWarden(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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++) { @@ -2051,7 +2106,7 @@ function KinkyDungeonCreateWarden(POI, VisitedRooms, width, height, openness, de }); // Has to be tunnel } -function KinkyDungeonCreateTunnel(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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); @@ -2159,7 +2214,7 @@ function KinkyDungeonCreateTunnel(POI, VisitedRooms, width, height, openness, de } -function KinkyDungeonCreatePerkRoom(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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); @@ -2207,8 +2262,7 @@ function KinkyDungeonCreatePerkRoom(POI, VisitedRooms, width, height, openness, let perksplaced = 0; if (!KinkyDungeonStatsChoice.get("noperks")) { let perkCount = 3; - /** @type {Record} */ - let perks = {}; + let perks: Record = {}; for (let i = 0; i < perkCount; i++) { let newperks = KinkyDungeonStatsChoice.get("perksdebuff") ? KDGetRandomPerks(perks, true) : KDGetRandomPerks(perks); let bondage = KDGetPerkShrineBondage(newperks); @@ -2249,7 +2303,7 @@ function KinkyDungeonCreatePerkRoom(POI, VisitedRooms, width, height, openness, } -function KinkyDungeonCreateJourneyFloor(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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}; @@ -2350,7 +2404,7 @@ function KinkyDungeonCreateJourneyFloor(POI, VisitedRooms, width, height, openne } -function KinkyDungeonCreateShopStart(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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}; @@ -2421,7 +2475,7 @@ function KinkyDungeonCreateShopStart(POI, VisitedRooms, width, height, openness, } -function KinkyDungeonCreateGoldVault(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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}; @@ -2451,7 +2505,7 @@ function KinkyDungeonCreateGoldVault(POI, VisitedRooms, width, height, openness, } -function KinkyDungeonCreateElevatorRoom(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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}; @@ -2478,10 +2532,7 @@ function KinkyDungeonCreateElevatorRoom(POI, VisitedRooms, width, height, openne KDGenerateBaseTraffic(KDMapData.GridWidth, KDMapData.GridHeight); let def = KDDragonList[Math.floor(KDRandom() * KDDragonList.length)]; - /** - * @type {Record} - */ - let obstacles = {}; + let obstacles: Record = {} if (def) { DialogueCreateEnemy(15,2 + 7 + 2,def.enemy); obstacles = def.obstacles; @@ -2564,7 +2615,7 @@ function KinkyDungeonCreateElevatorRoom(POI, VisitedRooms, width, height, openne } -function KinkyDungeonCreateElevatorEgyptian(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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}; @@ -2600,7 +2651,7 @@ function KinkyDungeonCreateElevatorEgyptian(POI, VisitedRooms, width, height, op } -function KinkyDungeonCreateElevatorEgyptian2(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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}; @@ -2635,7 +2686,7 @@ function KinkyDungeonCreateElevatorEgyptian2(POI, VisitedRooms, width, height, o }); } -function KinkyDungeonCreateTestTile(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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}; @@ -2670,7 +2721,7 @@ function KinkyDungeonCreateTestTile(POI, VisitedRooms, width, height, openness, } -function KinkyDungeonCreateTutorial(POI, VisitedRooms, width, height, openness, density, hallopenness, data) { +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}; @@ -2850,4 +2901,4 @@ function KinkyDungeonCreateTutorial(POI, VisitedRooms, width, height, openness, KDMapData.EndPosition = {x: width*2 - 2, y: VisitedRooms[0].y*2}; KinkyDungeonTilesSet("" + (width*2 - 2) + "," + (VisitedRooms[0].y*2), {RoomType: "ShopStart"}); -} \ No newline at end of file +} diff --git a/Game/src/map/KinkyDungeonBoss.js b/Game/src/map/KinkyDungeonBoss.ts similarity index 97% rename from Game/src/map/KinkyDungeonBoss.js rename to Game/src/map/KinkyDungeonBoss.ts index f5dd5127b..a52eb65c9 100644 --- a/Game/src/map/KinkyDungeonBoss.js +++ b/Game/src/map/KinkyDungeonBoss.ts @@ -99,11 +99,11 @@ let bosses = { }, }; -function KinkyDungeonBossFloor(Floor) { +function KinkyDungeonBossFloor(Floor: number): any { 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; -} \ No newline at end of file +} diff --git a/Game/src/map/KinkyDungeonEditor.js b/Game/src/map/KinkyDungeonEditor.ts similarity index 93% rename from Game/src/map/KinkyDungeonEditor.js rename to Game/src/map/KinkyDungeonEditor.ts index 1a168d9a9..1831b22db 100644 --- a/Game/src/map/KinkyDungeonEditor.js +++ b/Game/src/map/KinkyDungeonEditor.ts @@ -1,7 +1,7 @@ "use strict"; -let KDMapTilesListEditor = localStorage.getItem("KDMapTilesListEditor") ? JSON.parse(localStorage.getItem("KDMapTilesListEditor")) : Object.assign({}, KDMapTilesList); +let KDMapTilesListEditor: Record = localStorage.getItem("KDMapTilesListEditor") ? JSON.parse(localStorage.getItem("KDMapTilesListEditor")) : Object.assign({}, KDMapTilesList); let KDTileToTest = null; @@ -17,21 +17,12 @@ let KDEditorTileFlexSuper = ""; let KDEditorTileIndexQuery = '1,1'; -/** - * @type {Record} - */ -let KDEditorTileIndexStore = { +let KDEditorTileIndexStore: Record = { "1,1": 'lr', }; -/** - * @type {Record} - */ -let KDEditorTileFlexStore = { +let KDEditorTileFlexStore: Record = { }; -/** - * @type {Record} - */ -let KDEditorTileFlexSuperStore = { +let KDEditorTileFlexSuperStore: Record = { }; let KDEditorCurrentMapTileName = 'test'; @@ -65,6 +56,7 @@ 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"}}, @@ -73,14 +65,14 @@ let KDTilePalette = { '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"]}}, - 'SpawnStatueRare': {type: "tile", tile: '3', special: {Type: "ForceSpawn", required: ["statue"], Label: "Statue", tags: ["statue"], Chance: 0.4}}, + '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"], Label: "SoulC"}}, - 'SpawnSoulCrysActive': {type: "tile", tile: '3', special: {Type: "ForceSpawn", 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: "ForceSpawn", required: ["chaos"], tags: ["chaos"], Label: "ChaosC"}}, - 'SpawnChaosCrysActive': {type: "tile", tile: '3', special: {Type: "ForceSpawn", required: ["chaos", "active"], tags: ["chaos"], Label: "ChaosC_A"}}, + '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: { @@ -167,7 +159,8 @@ let KDTilePalette = { '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}}, + '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"}, @@ -222,10 +215,15 @@ let KDTilePalette = { '----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"}, @@ -238,6 +236,7 @@ let KDTilePalette = { 'OL': {type: "offlimits"}, 'NW': {type: "NW"}, 'Jail': {type: "jail"}, + 'JailPoint': {type: "tile", tile: 'o', special: {Type: "JailPoint"}}, 'Keyring': {type: "Keyring"}, 'MazeSeed': {type: "MazeSeed", customfields: { @@ -263,7 +262,7 @@ let KDTilePalette = { }, }; -function KDGetTileIndexImg(index) { +function KDGetTileIndexImg(index: string) { return { u: index.includes('u'), d: index.includes('d'), @@ -316,13 +315,13 @@ function KDDrawTileEditor() { KDTE_UpdateUI(false); if (!KDTE_State) { - DrawButtonKDEx("ToTags", (bdata) => { + DrawButtonKDEx("ToTags", (_bdata) => { KDTE_State = "Tags"; return true; }, true, 20 , 920, 250, 64, 'Edit Tile Tags', "#ffffff"); KDDrawEditorUI(); } else { - DrawButtonKDEx("backToBrushes", (bdata) => { + DrawButtonKDEx("backToBrushes", (_bdata) => { KDTE_State = ""; return true; }, true, 20 , 920, 250, 64, 'Go Back', "#ffffff"); @@ -398,7 +397,7 @@ function KDDrawEditorUI() { yy += grid * 5; } - DrawButtonKDEx("flextoggle", (bdata) => { + DrawButtonKDEx("flextoggle", (_bdata) => { KDEditorTileFlex = KDEditorTileFlex ? "" : "y"; if (KDEditorTileFlexStore[KDEditorTileIndexQuery] && !KDEditorTileFlex) { delete KDEditorTileFlexStore[KDEditorTileIndexQuery]; @@ -408,7 +407,7 @@ function KDDrawEditorUI() { return true; }, true, 150 , 160, 140, 45, 'Flex', "#ffffff", KDEditorTileFlex ? (KinkyDungeonRootDirectory + "UI/CheckSmall.png") : undefined); - DrawButtonKDEx("flexsupertoggle", (bdata) => { + DrawButtonKDEx("flexsupertoggle", (_bdata) => { KDEditorTileFlexSuper = KDEditorTileFlexSuper ? "" : "y"; if (KDEditorTileFlexSuperStore[KDEditorTileIndexQuery] && !KDEditorTileFlexSuper) { delete KDEditorTileFlexSuperStore[KDEditorTileIndexQuery]; @@ -427,7 +426,7 @@ function KDDrawEditorUI() { let width = 200; let brushKeys = Object.keys(KDTilePalette); - DrawButtonKDEx("tilebrushup", (bdata) => { + DrawButtonKDEx("tilebrushup", (_bdata) => { if (KDEditorTileBrushIndex == 0) KDEditorTileBrushIndex = brushKeys.length - 4; else KDEditorTileBrushIndex = Math.max(0, KDEditorTileBrushIndex - 14); return true; @@ -443,14 +442,14 @@ function KDDrawEditorUI() { KDEditorTileBrushIndex = Math.min(brushKeys.length - 4, KDEditorTileBrushIndex + 3*Math.round(amount/grid)); KDEditorTileBrushIndex = Math.max(0, KDEditorTileBrushIndex); }, - (bdata) => { + (_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) => { + DrawButtonKDEx("tilebrushdown", (_bdata) => { if (KDEditorTileBrushIndex >= brushKeys.length - 6) KDEditorTileBrushIndex = 0; else KDEditorTileBrushIndex = Math.min(brushKeys.length - 4, KDEditorTileBrushIndex + 14); return true; @@ -462,7 +461,7 @@ function KDDrawEditorUI() { xx = 1590; grid = 40; - DrawButtonKDEx("tilebrushup2", (bdata) => { + DrawButtonKDEx("tilebrushup2", (_bdata) => { if (KDEditorTileBrushIndex2 == 0) KDEditorTileBrushIndex2 = brushKeys.length - 4; else KDEditorTileBrushIndex2 = Math.max(0, KDEditorTileBrushIndex2 - 8); return true; @@ -477,14 +476,14 @@ function KDDrawEditorUI() { KDEditorTileBrushIndex2 = Math.min(brushKeys.length - 4, KDEditorTileBrushIndex2 + 2*Math.round(amount/grid)); KDEditorTileBrushIndex2 = Math.max(0, KDEditorTileBrushIndex2); }, - (bdata) => { + (_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) => { + DrawButtonKDEx("tilebrushdown2", (_bdata) => { if (KDEditorTileBrushIndex2 >= brushKeys.length - 6) KDEditorTileBrushIndex2 = 0; else KDEditorTileBrushIndex2 = Math.min(brushKeys.length - 4, KDEditorTileBrushIndex2 + 8); return true; @@ -498,7 +497,7 @@ function KDDrawEditorUI() { width = 200; DrawTextFitKD("Tile List", xx + width/2 , yy - 30, width, "#ffffff", undefined, 36); - DrawButtonKDEx("tilenameup", (bdata) => { + DrawButtonKDEx("tilenameup", (_bdata) => { if (KDEditorTileNameIndex == 0) KDEditorTileNameIndex = tileKeys.length - 4; else KDEditorTileNameIndex = Math.max(0, KDEditorTileNameIndex - 9); KDTELoadConfirm = false; @@ -515,7 +514,7 @@ function KDDrawEditorUI() { KDEditorTileNameIndex = Math.min(tileKeys.length - 4, KDEditorTileNameIndex + 5*Math.round(amount/grid)); KDEditorTileNameIndex = Math.max(0, KDEditorTileNameIndex); }, - (bdata) => { + (_bdata) => { if (KDEditorCurrentMapTileName != tileKeys[index] || !KDTELoadConfirm) { KDEditorCurrentMapTileName = tileKeys[index]; ElementValue("MapTileTitle", KDEditorCurrentMapTileName); @@ -528,7 +527,7 @@ function KDDrawEditorUI() { }, 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) => { + DrawButtonKDEx("deletetilename" + i, (_bdata) => { delete KDMapTilesListEditor[KDEditorCurrentMapTileName]; return true; }, true, xx - 160, yy, 150, grid-5, "Delete!!!", tileKeys[index] == KDEditorCurrentMapTileName ? "#ffffff" : "#888888"); @@ -536,35 +535,35 @@ function KDDrawEditorUI() { yy += grid; } - DrawButtonKDEx("tilenamedown", (bdata) => { + 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) => { + DrawButtonKDEx("tilesave", (_bdata) => { KDTE_SaveTile(KDEditorCurrentMapTileName); return true; }, true, 900 , 150, 200, 60, 'Save Tile', "#ffffff"); - DrawButtonKDEx("maptileR", (bdata) => { + 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) => { + 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) => { + 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) => { + DrawButtonKDEx("maptileU", (_bdata) => { KinkyDungeonPlayerEntity.y = Math.max(0, Math.min(KDMapData.GridHeight - 1, KinkyDungeonPlayerEntity.y - 3)); KDTELoadConfirm = false; return true; @@ -627,7 +626,9 @@ function KDDrawEditorUI() { if (JSON.parse(text)) { console.log(JSON.parse(text)); console.log("Parse successful!!!"); - for (let tile of Object.values(JSON.parse(text))) { + 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; @@ -783,7 +784,7 @@ let KDTE_MAXDIM = 20; let KDTELoadConfirm = false; -function KDTE_Clear(x, y, force = false) { +function KDTE_Clear(x: number, y: number, force: boolean = false) { if (force || !KDIsSmartMovable(x, y)) { KinkyDungeonMapSetForce(x, y, '0'); KinkyDungeonTilesDelete(x + "," + y); @@ -802,8 +803,8 @@ function KDTE_Clear(x, y, force = false) { } } -let KDTE_Brush = { - "clear": (brush, curr, noSwap) => { +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) { @@ -849,7 +850,7 @@ let KDTE_Brush = { } } }, - 'offlimits': (brush, curr, noSwap) => { + 'offlimits': (_brush, _curr, noSwap) => { if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)) { if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).OL) { if (!noSwap) @@ -860,7 +861,7 @@ let KDTE_Brush = { KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {OL: true}); } }, - 'NW': (brush, curr, noSwap) => { + 'NW': (_brush, _curr, noSwap) => { if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)) { if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).NW) { if (!noSwap) @@ -871,7 +872,7 @@ let KDTE_Brush = { KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {NW: true}); } }, - 'MazeBlock': (brush, curr, noSwap) => { + 'MazeBlock': (_brush, _curr, noSwap) => { if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)) { if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).MazeBlock) { if (!noSwap) @@ -882,11 +883,10 @@ let KDTE_Brush = { KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {MazeBlock: true}); } }, - 'Label': (brush, curr, noSwap) => { + 'Label': (brush, _curr, _noSwap) => { if (!KDMapData.Labels) KDMapData.Labels = {}; - /** @type {KDLabel} */ - let label = { + let label: KDLabel = { name: "null", type: "null", assigned: -1, @@ -912,7 +912,7 @@ let KDTE_Brush = { } }, - 'MazeSeed': (brush, curr, noSwap) => { + 'MazeSeed': (brush, _curr, noSwap) => { if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)) { if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).MazeSeed) { if (!noSwap) @@ -930,7 +930,7 @@ let KDTE_Brush = { } } }, - 'jail': (brush, curr, noSwap) => { + 'jail': (_brush, _curr, noSwap) => { if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY)) { if (KinkyDungeonTilesGet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY).Jail) { if (!noSwap) @@ -941,7 +941,7 @@ let KDTE_Brush = { KinkyDungeonTilesSet(KinkyDungeonTargetX + "," + KinkyDungeonTargetY, {Jail: true}); } }, - 'Keyring': (brush, curr, noSwap) => { + '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) { @@ -964,7 +964,7 @@ let KDTE_Brush = { } } }, - "POI": (brush, curr, noSwap) => { + "POI": (_brush, _curr, noSwap) => { let deleted = false; for (let p of KinkyDungeonPOI) { if (p.x == KinkyDungeonTargetX && p.y == KinkyDungeonTargetY) { @@ -1008,7 +1008,7 @@ let KDTE_Inaccessible = false; let KDTE_confirmreset = false; let KDTE_confirmcommit = false; -function KDHandleTileEditor(noSwap) { +function KDHandleTileEditor(noSwap?: boolean): void { // @ts-ignore if (document.activeElement && (document.activeElement?.type == "text" || document.activeElement?.type == "textarea" || KDFocusableTextFields.includes(document.activeElement.id))) return; @@ -1059,7 +1059,7 @@ function KDHandleTileEditor(noSwap) { } -function KDTE_UpdateUI(Load) { +function KDTE_UpdateUI(Load: boolean): void { let tagCount = 17; if (Load) { ElementCreateTextArea("MapTileTitle"); @@ -1164,7 +1164,7 @@ function KDTE_UpdateUI(Load) { DrawTextFitKD("Some entrances are inaccessible. This tile will occur more rarely in worldgen", 1000, 800, 1000, "#ff5555"); } -function KDTESetIndexToTile(propTile) { +function KDTESetIndexToTile(propTile: string): void { if (KDMapTilesListEditor[propTile]) { let tileKeys = Object.keys(KDMapTilesListEditor); let brushKeys = Object.keys(KDTilePalette); @@ -1173,7 +1173,7 @@ function KDTESetIndexToTile(propTile) { } } -function 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)); @@ -1195,14 +1195,13 @@ function KDTE_CloseUI() { /** - * - * @param {number} w - * @param {number} h - * @param {string} chkpoint - * @param {boolean} closed - The edges will be closed index - * @param {boolean} empty - All floor + * @param w + * @param h + * @param [chkpoint] + * @param [closed] - The edges will be closed index + * @param [empty] - All floor * */ -function KDTE_Create(w, h, chkpoint = 'grv', closed = false, empty = false) { +function KDTE_Create(w: number, h: number, chkpoint: string = 'grv', closed: boolean = false, empty: boolean = false): void { MiniGameKinkyDungeonCheckpoint = 'grv'; KinkyDungeonMapIndex = { 'grv' : chkpoint, @@ -1275,11 +1274,8 @@ function KDTE_Create(w, h, chkpoint = 'grv', closed = false, empty = false) { KDTE_UpdateUI(true); } -function KDTE_LoadTile(name, loadedTile) { - /** - * @type {KDMapTile} - */ - let nt = loadedTile || KDMapTilesListEditor[name]; +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 || {}; @@ -1340,14 +1336,10 @@ function KDTE_LoadTile(name, loadedTile) { } } -/** - * @returns {KDMapTile} - */ -function KDTE_ExportTile() { +function KDTE_ExportTile(): KDMapTile { /** - * @type {KDMapTile} */ - let saveTile = { + let saveTile: KDMapTile = { name: KDEditorCurrentMapTileName, Labels: JSON.parse(JSON.stringify(KDMapData.Labels)), w: KDMapData.GridWidth / KDTE_Scale, @@ -1390,7 +1382,7 @@ function KDTE_ExportTile() { return saveTile; } -function KDTE_SaveTile(tile) { +function KDTE_SaveTile(_tile?: string) { let saveTile = KDTE_ExportTile(); // JSON recreation to kill all references @@ -1402,18 +1394,19 @@ function KDTE_SaveTile(tile) { 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 = []; +/* 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)) { @@ -1480,7 +1473,7 @@ function KDTEGetInaccessible() { return list; } -function KDObjFromMapArray(array) { +function KDObjFromMapArray(array: any): any { if (array.length != undefined) { let map = {}; for (let entry of array) { @@ -1500,11 +1493,11 @@ function KDReloadAllEditorTiles() { } } -function KDTE_GetField(field) { +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]); -} \ No newline at end of file +} diff --git a/Game/src/map/KinkyDungeonEditorGen.js b/Game/src/map/KinkyDungeonEditorGen.ts similarity index 79% rename from Game/src/map/KinkyDungeonEditorGen.js rename to Game/src/map/KinkyDungeonEditorGen.ts index 7817f7ba2..b3a8c7839 100644 --- a/Game/src/map/KinkyDungeonEditorGen.js +++ b/Game/src/map/KinkyDungeonEditorGen.ts @@ -4,60 +4,71 @@ let KD_GENWEIGHTCUTOFF = 100000; -function KDAddLabel(label) { +function KDAddLabel(label: any) { if (!KDMapData.Labels) KDMapData.Labels = {}; if (!KDMapData.Labels[label.type]) KDMapData.Labels[label.type] = []; KDMapData.Labels[label.type].push(label); } /** - * - * @param {number} w - * @param {number} h - * @param {Record} indices - * @param {any} data - * @param {Record} requiredAccess - * @param {Record} maxTagFlags - * @returns {Record} + * @param w + * @param h + * @param indices + * @param data + * @param requiredAccess + * @param maxTagFlags */ -function KDMapTilesPopulate(w, h, indices, data, requiredAccess, maxTagFlags, tagModifiers) { +function KDMapTilesPopulate ( + _w: number, + _h: number, + indices: Record, + data: any, + requiredAccess: Record, + maxTagFlags: Record, + tagModifiers: Record +): Record +{ /** * temp helper var - * @type {string[]} */ - let tiles_temp = []; + 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 - * @type {string[]} */ - let tileOrder = []; + let tileOrder: string[] = []; - // 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 = {}; + let tilesFilled: Record = {}; /** * indices that are filled in - * @type {Record} */ - let indexFilled = {}; + 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 - * @type {Record} */ - let tagCounts = {}; + let tagCounts: Record = {}; // Next we start filling in tiles! @@ -65,19 +76,13 @@ function KDMapTilesPopulate(w, h, indices, data, requiredAccess, maxTagFlags, ta let ii = 0; - /** - * @type {Record} - */ - let globalTags = Object.assign({}, data.params.globalTags || {}); + 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) { - /** - * @type {KDMapDataType} - */ - let mapData = data.MapData; + let mapData: KDMapDataType = data.MapData; if (mapData.JailFaction) { for (let jf of mapData.JailFaction) { globalTags["jf_" + jf] = true; @@ -176,14 +181,12 @@ function KDMapTilesPopulate(w, h, indices, data, requiredAccess, maxTagFlags, ta } /** - * - * @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} + * @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, tags, tagCounts, tagModifiers) { +function KDGetTileWeight(mapTile: KDMapTile, tags: Record, tagCounts: Record, tagModifiers: Record): number { let weight = mapTile.weight; // Forbid tags are not allowed @@ -233,19 +236,30 @@ function KDGetTileWeight(mapTile, tags, tagCounts, tagModifiers) { /** - * - * @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} + * @param index + * @param indX + * @param indY + * @param tilesFilled + * @param indexFilled + * @param tagCounts + * @param requiredAccess + * @param globalTags + * @param indices + * @param tagModifiers */ -function KD_GetMapTile(index, indX, indY, tilesFilled, indexFilled, tagCounts, requiredAccess, globalTags, indices, 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), }; @@ -259,7 +273,11 @@ function KD_GetMapTile(index, indX, indY, tilesFilled, indexFilled, tagCounts, r 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 (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; @@ -310,16 +328,14 @@ function KD_GetMapTile(index, indX, indY, tilesFilled, indexFilled, tagCounts, r } /** - * - * @param {KDMapTile} mapTile - * @param {number} indX - * @param {number} indY - * @param {Record} indices - * @param {Record} requiredAccess - * @param {Record} indexFilled - * @returns {boolean} + * @param mapTile + * @param indX + * @param indY + * @param indices + * @param requiredAccess + * @param indexFilled */ -function KDCheckMapTileFilling(mapTile, indX, indY, indices, requiredAccess, 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++) @@ -328,18 +344,27 @@ function KDCheckMapTileFilling(mapTile, indX, indY, indices, requiredAccess, ind // 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; + 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)]) - && (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; + 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 @@ -355,7 +380,7 @@ function KDCheckMapTileFilling(mapTile, indX, indY, indices, requiredAccess, ind } /** Suspends the inside of large tiles */ -function KDLooseIndexRankingSuspend(indexCheck, indexTile, w, h, xx, yy) { +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 @@ -368,15 +393,13 @@ function KDLooseIndexRankingSuspend(indexCheck, indexTile, w, h, xx, yy) { } /** - * - * @param {KDMapTile} mapTile - * @param {number} indX - * @param {number} indY - * @param {Record} indexFilled - * @param {Record} requiredAccess - * @returns {boolean} + * @param mapTile + * @param indX + * @param indY + * @param indexFilled + * @param requiredAccess */ -function KDCheckMapTileAccess(mapTile, indX, indY, indexFilled, 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) { @@ -402,14 +425,12 @@ function KDCheckMapTileAccess(mapTile, indX, indY, indexFilled, requiredAccess) } /** - * - * @param {KDMapTile} tile - * @param {number} x - * @param {number} y - * @param {any} y - * @returns {string[]} + * @param tile + * @param x + * @param y + * @param y */ -function KD_PasteTile(tile, x, y, data) { +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 @@ -529,19 +550,18 @@ function KD_PasteTile(tile, x, y, data) { } /** - * - * @param {number} startX - * @param {number} startY - * @param {any} tile - * @param {any} seed - * @param {{x: number, y: number}[]} MazeBlock - * @returns {{x: number, y: number}[]} + * @param startX + * @param startY + * @param tile + * @param seed + * @param MazeBlock */ -function KDGenMaze(startX, startY, tile, seed, MazeBlock) { - let tileWidth = KDTE_Scale * tile.w; - let tileHeight = KDTE_Scale * tile.h; +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; @@ -549,13 +569,13 @@ function KDGenMaze(startX, startY, tile, seed, MazeBlock) { //let getGrid = (x, y) => { //return tile.grid[x + y*(tileWidth+1)]; //}; - let isMazeBlock = (x, y) => { - return tile.Tiles[x + ',' + y] && tile.Tiles[x + ',' + y].MazeBlock; + let isMazeBlock = (x: number, y: number) => { + return tile.Tiles && tile.Tiles[x + ',' + y] && tile.Tiles[x + ',' + y].MazeBlock; }; let ActivatedTiles = {}; - let isValid = (x, y, allowActivated) => { + 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; @@ -569,6 +589,11 @@ function KDGenMaze(startX, startY, tile, seed, MazeBlock) { // 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 @@ -580,7 +605,7 @@ function KDGenMaze(startX, startY, tile, seed, MazeBlock) { }; // xe = x_edge, ye = y_edge - let spread = (x, y, xe, ye) => { + 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)) { @@ -598,7 +623,7 @@ function KDGenMaze(startX, startY, tile, seed, MazeBlock) { return false; }; - let operate = (x, y) => { + 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}); @@ -619,6 +644,25 @@ function KDGenMaze(startX, startY, tile, seed, MazeBlock) { // 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); @@ -627,7 +671,11 @@ function KDGenMaze(startX, startY, tile, seed, MazeBlock) { // 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 (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}); + } } } @@ -636,6 +684,7 @@ function KDGenMaze(startX, startY, tile, seed, MazeBlock) { return chooseNext(); }; + // Start with the seed tile ActiveTiles.push({x: startX, y: startY}); let activeTile = operate(startX, startY); @@ -644,11 +693,53 @@ function KDGenMaze(startX, startY, tile, seed, MazeBlock) { 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 = { +let KDEffectTileGen: Record any> = { "TorchUnlit": (x, y, tile, tileGenerator, data) => { let torchlitchance = data.params.torchlitchance || 0.6; /* @@ -793,6 +884,8 @@ let KDTileGen = { 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), @@ -812,8 +905,10 @@ let KDTileGen = { return { NoTrap: tileGenerator.NoTrap, Type: tileGenerator.Lock ? "Lock" : undefined, Lock: tileGenerator.Lock, - Loot: tileGenerator.Lock == "Blue" ? "blue" : (tileGenerator.Loot ? tileGenerator.Loot : "chest"), + 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"), @@ -900,6 +995,11 @@ let KDTileGen = { 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}); @@ -984,14 +1084,13 @@ let KDTileGen = { /** * Creates a map tile based on a generator tile - * @param {number} x - * @param {number} y - * @param {any} tileGenerator - * @param {any} data - * @returns {any} + * @param x + * @param y + * @param tileGenerator + * @param data */ -function KDCreateTile(x, y, tileGenerator, data) { - let tile = {}; +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 { @@ -1006,13 +1105,12 @@ function KDCreateTile(x, y, tileGenerator, data) { /** * Creates a map tile based on a generator tile - * @param {number} x - * @param {number} y - * @param {any} tileGenerator - * @param {any} data - * @returns {any} + * @param x + * @param y + * @param tileGenerator + * @param data */ -function KDCreateEffectTileTile(x, y, tileGenerator, 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); @@ -1051,7 +1149,7 @@ function KDAggregateTileTags(x, y, w, h, tilesFilled, globalTags) { if (index) { let neighbor = tilesFilled[indX + ',' + indY]; - if (neighbor) { + if (neighbor?.tags) { for (let t of neighbor.tags) { tags[index + t] = true; tags[t] = true; @@ -1074,4 +1172,4 @@ function KDGetCategoryIndex(x, y) { return KDMapData.CategoryIndex[Math.ceil(x/KDTE_Scale) + ',' + Math.ceil(y/KDTE_Scale)]; } return {category: "", tags: []}; -} \ No newline at end of file +} diff --git a/Game/src/map/KinkyDungeonEditorTiles.js b/Game/src/map/KinkyDungeonEditorTiles.ts similarity index 52% rename from Game/src/map/KinkyDungeonEditorTiles.js rename to Game/src/map/KinkyDungeonEditorTiles.ts index 967326859..9d8b7b672 100644 --- a/Game/src/map/KinkyDungeonEditorTiles.js +++ b/Game/src/map/KinkyDungeonEditorTiles.ts @@ -1,8 +1,5 @@ "use strict"; -/** - * @type {Record} - */ -let KDMapTilesList = -{"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,-1],"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","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":10,"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","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":25,"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":10,"y":0,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":10,"y":6,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":3,"y":0,"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":17,"y":0,"guard":true,"interesting":true},{"name":"Guard","type":"Patrol","assigned":-1,"x":17,"y":6,"guard":true,"interesting":true},{"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}]},"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":1000,"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","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":"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","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"],"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":"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","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":500,"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","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":2,"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","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"]}}},"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\nLLXLLXLL1222100vvvvvu\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}},"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":9999,"priority":-2.01,"affinities":["Latex"],"tags":["latex","insulator","terrain"]}},"18,16":{"LatexBlue":{"x":18,"y":16,"name":"LatexBlue","functionName":"Latex","duration":9999,"priority":-2.01,"affinities":["Latex"],"tags":["latex","insulator","terrain"]}},"18,17":{"LatexBlue":{"x":18,"y":17,"name":"LatexBlue","functionName":"Latex","duration":9999,"priority":-2.01,"affinities":["Latex"],"tags":["latex","insulator","terrain"]}},"18,18":{"LatexBlue":{"x":18,"y":18,"name":"LatexBlue","functionName":"Latex","duration":9999,"priority":-2.01,"affinities":["Latex"],"tags":["latex","insulator","terrain"]}},"16,15":{"Latex":{"x":16,"y":15,"name":"Latex","duration":9999,"priority":-2,"affinities":["Sticky","Latex"],"tags":["latex","insulator","terrain"]}},"16,16":{"Latex":{"x":16,"y":16,"name":"Latex","duration":9999,"priority":-2,"affinities":["Sticky","Latex"],"tags":["latex","insulator","terrain"]}},"16,17":{"Latex":{"x":16,"y":17,"name":"Latex","duration":9999,"priority":-2,"affinities":["Sticky","Latex"],"tags":["latex","insulator","terrain"]}},"16,18":{"Latex":{"x":16,"y":18,"name":"Latex","duration":9999,"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":205,"grid":"XmX0XaX\na00040A\nX0141RX\n004C100\nX41440X\na0R000m\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":[{"indX1":1,"indY1":1,"indX2":1,"indY2":1,"dir1":"l","dir2":"r"},{"indX1":1,"indY1":1,"indX2":1,"indY2":1,"dir1":"l","dir2":"d"},{"indX1":1,"indY1":1,"indX2":1,"indY2":1,"dir1":"r","dir2":"l"},{"indX1":1,"indY1":1,"indX2":1,"indY2":1,"dir1":"r","dir2":"u"},{"indX1":1,"indY1":1,"indX2":1,"indY2":1,"dir1":"u","dir2":"r"},{"indX1":1,"indY1":1,"indX2":1,"indY2":1,"dir1":"u","dir2":"d"},{"indX1":1,"indY1":1,"indX2":1,"indY2":1,"dir1":"d","dir2":"l"},{"indX1":1,"indY1":1,"indX2":1,"indY2":1,"dir1":"d","dir2":"u"}],"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":[]}} -; \ No newline at end of file +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","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"]}}},"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\nLLXLLXLL1222100vvvvvu\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}},"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":110,"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"]}}},"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":[""]},"GrandSanctum2":{"name":"GrandSanctum2","Labels":{"Patrol":[]},"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,2":"y","1,3":"y","2,3":"y","3,3":"y","1,1":"y"},"scale":7,"category":"temple","weight":110,"grid":"111000000000000000111\n112000000000000000211\n122222222222222222221\n002X1111X222X1111X200\n002111110222011111200\n002111110222011111200\n002111100232001111200\n002111000222000111200\n002111A0022200A111200\n0X11112222222221111X0\n0111112222C2222111110\n0X11112222222221111X0\n002111A0022200A111200\n002111000222000111200\n002111100232001111200\n002111110222011111200\n002111110222011111200\n002X1111X222X1111X200\n122222222222222222221\n112000000000000000211\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":{"14,8":{"Type":"Shrine","Name":"Metal"},"6,8":{"Type":"Shrine","Name":"Metal"},"6,12":{"Type":"Shrine","Name":"Metal"},"14,12":{"Type":"Shrine","Name":"Metal"},"10,10":{"Type":"Chest","Loot":"lessergold","NoTrap":true,"Priority":true},"10,6":{"Type":"ForceSpawn","required":["soul","active"],"tags":["soul","open"],"Label":"SoulC_A"},"10,14":{"Type":"ForceSpawn","required":["soul","active"],"tags":["soul","open"],"Label":"SoulC_A"}},"effectTiles":{},"Skin":{},"inaccessible":[],"tags":["temple","hall","maxlessergold"],"forbidTags":["maxlessergold"],"requireTags":["temple"],"indexTags":["temple"],"maxTags":[-1],"bonusTags":[0],"multTags":[1],"notTags":[""]}} +; diff --git a/Game/src/map/KinkyDungeonEffectTiles.js b/Game/src/map/KinkyDungeonEffectTiles.ts similarity index 90% rename from Game/src/map/KinkyDungeonEffectTiles.js rename to Game/src/map/KinkyDungeonEffectTiles.ts index d440b3ea8..18629ab11 100644 --- a/Game/src/map/KinkyDungeonEffectTiles.js +++ b/Game/src/map/KinkyDungeonEffectTiles.ts @@ -4,10 +4,7 @@ let KDLatexDmg = 1; let KDLatexBind = 2; let KDBubbleDmg = 3; -/** - * @type {Record} - */ -let KDEffectTiles = { +let KDEffectTiles: Record = { "FateBoundGround": { name: "FateBoundGround", duration: 2, @@ -24,6 +21,7 @@ let KDEffectTiles = { name: "Ice", duration: 1, priority: 1, + fade: "ice", tags: ["ice", "slippery", "terrain"], }, "Acid": { @@ -281,6 +279,24 @@ let KDEffectTiles = { 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, @@ -330,6 +346,26 @@ let KDEffectTiles = { 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, @@ -337,7 +373,7 @@ let KDEffectTiles = { tags: [], }, "ManaPartial": { - name: "ManaEmpty", + name: "ManaPartial", duration: 9999, infinite: true, priority: 50, tags: ["wire"], @@ -473,4 +509,4 @@ let KDEffectTiles = { priority: 10, tags: [], }, -}; \ No newline at end of file +}; diff --git a/Game/src/map/KinkyDungeonEscapeList.js b/Game/src/map/KinkyDungeonEscapeList.ts similarity index 99% rename from Game/src/map/KinkyDungeonEscapeList.js rename to Game/src/map/KinkyDungeonEscapeList.ts index 9a3157845..62f168d75 100644 --- a/Game/src/map/KinkyDungeonEscapeList.js +++ b/Game/src/map/KinkyDungeonEscapeList.ts @@ -273,7 +273,7 @@ let KinkyDungeonEscapeTypes = { }, }; -function KDEscapeWorldgenStart(method) { +function KDEscapeWorldgenStart(method: string) { if (method) { if (KinkyDungeonEscapeTypes[method] && KinkyDungeonEscapeTypes[method].worldgenstart) { KinkyDungeonEscapeTypes[method].worldgenstart(); diff --git a/Game/src/map/KinkyDungeonMapMods.js b/Game/src/map/KinkyDungeonMapMods.ts similarity index 95% rename from Game/src/map/KinkyDungeonMapMods.js rename to Game/src/map/KinkyDungeonMapMods.ts index 00a9bf853..48a203e4e 100644 --- a/Game/src/map/KinkyDungeonMapMods.js +++ b/Game/src/map/KinkyDungeonMapMods.ts @@ -1,14 +1,11 @@ "use strict"; -/** - * @type {Record} - */ -let KDMapMods = { +let KDMapMods: Record = { "None": { name: "None", roomType: "", weight: 300, - filter: (slot) => { + filter: (_slot) => { return 1.0; }, tags: [], @@ -200,14 +197,12 @@ let KDMapMods = { // KDGetMapGenList(3, KDMapMods); /** - * - * @param {number} count - * @param {Record} mods - * @param {KDJourneySlot} slot - * @returns {MapMod[]} + * @param count + * @param mods + * @param slot */ -function KDGetMapGenList(count, mods, slot) { - let ret = []; +function KDGetMapGenList(count: number, mods: Record, slot: KDJourneySlot): MapMod[] { + let ret: MapMod[] = []; for (let i = 0; i < count; i++) { let genWeightTotal = 0; let genWeights = []; @@ -233,4 +228,4 @@ function KDGetMapGenList(count, mods, slot) { } } return ret; -} \ No newline at end of file +} diff --git a/Game/src/map/KinkyDungeonObject.js b/Game/src/map/KinkyDungeonObject.ts similarity index 94% rename from Game/src/map/KinkyDungeonObject.js rename to Game/src/map/KinkyDungeonObject.ts index 4de346ce6..75411257c 100644 --- a/Game/src/map/KinkyDungeonObject.js +++ b/Game/src/map/KinkyDungeonObject.ts @@ -2,9 +2,8 @@ /** * Script happens when you display an object message - * @type {Record void>} */ -let KDObjectMessages = { +let KDObjectMessages: Record void> = { "Ghost": () => KinkyDungeonGhostMessage(), "Angel": () => KinkyDungeonAngelMessage(), "Food": () => KinkyDungeonFoodMessage(), @@ -14,9 +13,8 @@ let KDObjectMessages = { * 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 = { +let KDObjectClick: Record void> = { "Food": (x, y) => { let tile = KinkyDungeonTilesGet(x + "," + y); if (tile.Food && KDFood[tile.Food] && !KDFood[tile.Food].inedible && !tile.Eaten) { @@ -45,15 +43,14 @@ let KDObjectClick = { } else KinkyDungeonElevatorMessage(); }, - "Oriel": (x, y) => { + "Oriel": (_x, _y) => { KDStartDialog("Oriel", "", true, ""); }, }; /** * Script happens when you interact to an object - * @type {Record void>} */ -let KDObjectInteract = { +let KDObjectInteract: Record void> = { "DollDropoff": (x, y) => { if (KDistChebyshev(x - KDPlayer().x, y - KDPlayer().y) < 1.5) if (!KinkyDungeonGetRestraintItem("ItemDevices")) { @@ -80,9 +77,8 @@ let KDObjectInteract = { }; /** * Script happens when you interact to an tile - * @type {Record void>} */ -let KDTileInteract = { +let KDTileInteract: Record void> = { 'B': (x, y) => { if (KDistChebyshev(x - KDPlayer().x, y - KDPlayer().y) < 1.5) if (!KinkyDungeonFlags.get("slept") && !KinkyDungeonFlags.get("nobed") && KinkyDungeonStatWill < KinkyDungeonStatWillMax * 0.49) { @@ -95,18 +91,16 @@ let KDTileInteract = { /** * Script to handle click in an object's modal * tbh should remove this soon - * @type {Record boolean>} */ -let KDObjectHandle = { +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. - * @type {Record void>} */ -let KDObjectDraw = { +let KDObjectDraw: Record void> = { "Ghost": () => KinkyDungeonDrawGhost(), "Angel": () => KinkyDungeonDrawAngel(), "Charger": () => KinkyDungeonDrawCharger(), @@ -305,7 +299,7 @@ function KinkyDungeonAngelMessage() { } } -function KinkyDungeonFoodMessage(Tile) { +function KinkyDungeonFoodMessage(Tile?: any) { let tile = Tile || KinkyDungeonTargetTile; if (tile) { let msg = TextGet("KinkyDungeonFood" + (tile.Food ? tile.Food : "")); @@ -356,7 +350,7 @@ function KinkyDungeonDrawTablet() { if (KinkyDungeonTargetTile.Name == "Heart") { KDDrawHeartTablet(); } else { - DrawButtonKDEx("Tablet",(bdata) => { + DrawButtonKDEx("Tablet",(_bdata) => { KDSendInput("tabletInteract", {action: "read", targetTile: KinkyDungeonTargetTileLocation}); KinkyDungeonTargetTile = null; KinkyDungeonTargetTileLocation = ""; @@ -369,7 +363,7 @@ function KinkyDungeonDrawTablet() { function KinkyDungeonDrawFood() { KDModalArea = true; if (KinkyDungeonTargetTile && KinkyDungeonTargetTile.Food && KinkyDungeonTargetTile.Food != "Plate") { - DrawButtonKDEx("Food",(bdata) => { + DrawButtonKDEx("Food",(_bdata) => { KDSendInput("foodInteract", {action: "eat", targetTile: KinkyDungeonTargetTileLocation}); KinkyDungeonTargetTile = null; KinkyDungeonTargetTileLocation = ""; @@ -445,20 +439,17 @@ let KDElevatorFloorIndex = { }; /** - * - * @param {string | number} num - * @returns {boolean} + * @param num */ -function KDIsElevatorFloorUnlocked(num) { +function KDIsElevatorFloorUnlocked(num: string | number): boolean { return typeof num === "string" ? (KDGameData.ElevatorsUnlocked[num] || KDAlwaysUnlockedElevFloors[num]) : num != MiniGameKinkyDungeonLevel && KDGameData.ElevatorsUnlocked[num]; } /** - * - * @param {number} floor + * @param floor */ -function KDElevatorToFloor(floor, RoomType) { +function KDElevatorToFloor(floor: number, RoomType: string) { // Only works if the map has been generated let slot = KDWorldMap['0,' + floor]; if (slot) { @@ -513,21 +504,21 @@ let KDBuyableStats = [ let KDStat = { AP: { - getMax: (player) => {return KinkyDungeonStatDistractionMax;}, - getCurrent: (player) => {return KinkyDungeonStatDistraction;}, + getMax: (_player) => {return KinkyDungeonStatDistractionMax;}, + getCurrent: (_player) => {return KinkyDungeonStatDistraction;}, }, SP: { - getMax: (player) => {return KinkyDungeonStatStaminaMax;}, - getCurrent: (player) => {return KinkyDungeonStatStamina;}, + getMax: (_player) => {return KinkyDungeonStatStaminaMax;}, + getCurrent: (_player) => {return KinkyDungeonStatStamina;}, }, MP: { - getMax: (player) => {return KinkyDungeonStatManaMax;}, - getCurrent: (player) => {return KinkyDungeonStatMana;}, + getMax: (_player) => {return KinkyDungeonStatManaMax;}, + getCurrent: (_player) => {return KinkyDungeonStatMana;}, }, WP: { - getMax: (player) => {return KinkyDungeonStatWillMax;}, - getCurrent: (player) => {return KinkyDungeonStatWill;}, - getAmnt2: (amnt) => {return 0.01*Math.floor(100*amnt*0.02);}, + getMax: (_player) => {return KinkyDungeonStatWillMax;}, + getCurrent: (_player) => {return KinkyDungeonStatWill;}, + getAmnt2: (amnt: number) => {return 0.01*Math.floor(100*amnt*0.02);}, }, }; @@ -575,7 +566,7 @@ function KDDrawHeartTablet() { if (statMax >= 20) amount -= 0.5; if (statMax >= 30) amount -= 1; - DrawButtonKDEx("heartbuy" + stat, (bdata) => { + DrawButtonKDEx("heartbuy" + stat, (_bdata) => { //KDSendInput("shrineBuy", {type: type, shopIndex: KinkyDungeonShopIndex}); if (canBuy) KDStatChoice = stat; @@ -603,7 +594,7 @@ function KDDrawHeartTablet() { DrawTextFitKD(TextGet("KDStatBuy" + KDStatChoice + "Desc2").replace("AMNT", "" + amnt2), KDModalArea_x + 625, KDModalArea_y - 220 + 25, 450, "#ffffff", undefined, 20,); - DrawButtonKDEx("heartbuyconfirm", (bdata) => { + DrawButtonKDEx("heartbuyconfirm", (_bdata) => { KDSendInput("heart", {type: KDStatChoice, targetTile: KinkyDungeonTargetTileLocation, amount: amount}); return true; }, true, KDModalArea_x + 500, KDModalArea_y - 50, 250, 45, TextGet("KDStatBuyConfirm"), "#ffffff", "", "", false, @@ -675,7 +666,7 @@ function KDDrawOrb() { if (value > 30) color = "#4fd658"; else color = "#9bd45d"; } - DrawButtonKDEx("orbspell" + shrine, (b) => { + 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); @@ -688,7 +679,7 @@ function KDDrawOrb() { } - DrawButtonKDEx("orbspellrandom", (b) => { + 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"; @@ -696,4 +687,4 @@ function KDDrawOrb() { }, true, XX, yPad + KDModalArea_y + spacing * i - 27 + 30, 250, spacing - 8, TextGet("KinkyDungeonSurpriseMe"), "white", undefined, undefined, undefined, false, KDTextGray2); i += 2; -} \ No newline at end of file +} diff --git a/Game/src/map/KinkyDungeonParams.js b/Game/src/map/KinkyDungeonParams.ts similarity index 99% rename from Game/src/map/KinkyDungeonParams.js rename to Game/src/map/KinkyDungeonParams.ts index 7eac00c83..944350750 100644 --- a/Game/src/map/KinkyDungeonParams.js +++ b/Game/src/map/KinkyDungeonParams.ts @@ -1,8 +1,6 @@ "use strict"; -/** - * @type {Record} - */ -const KinkyDungeonMapParams = { + +const KinkyDungeonMapParams: Record = { "menu":{ successorNegative: { menu: 1.0, @@ -45,9 +43,9 @@ const KinkyDungeonMapParams = { enemyTags: [], "traps": [], - "min_width" : 5, + "min_width" : 4, "max_width" : 7, - "min_height" : 5, + "min_height" : 4, "max_height" : 6, "defeat_outfit": "Prisoner", "shrines": [], @@ -99,9 +97,9 @@ const KinkyDungeonMapParams = { enemyTags: [], "traps": [], - "min_width" : 5, + "min_width" : 4, "max_width" : 7, - "min_height" : 5, + "min_height" : 4, "max_height" : 6, "defeat_outfit": "Prisoner", "shrines": [], @@ -151,9 +149,9 @@ const KinkyDungeonMapParams = { tagModifiers: {}, enemyTags: ["bandit", "explosiveBarrel"], - "min_width" : 5, + "min_width" : 4, "max_width" : 7, - "min_height" : 5, + "min_height" : 4, "max_height" : 6, "defeat_outfit": "Prisoner", @@ -270,9 +268,9 @@ const KinkyDungeonMapParams = { factionList: ["Bandit", "Apprentice", "Bountyhunter", "Elemental", "Dragon", "Maidforce"], "min_width" : 5, - "max_width" : 7, + "max_width" : 8, "min_height" : 5, - "max_height" : 6, + "max_height" : 7, "defeat_outfit": "Prisoner", "shrines": [ //{Type: "Charms", Weight: 5}, @@ -378,9 +376,9 @@ const KinkyDungeonMapParams = { ], "min_width" : 5, - "max_width" : 7, + "max_width" : 8, "min_height" : 5, - "max_height" : 6, + "max_height" : 7, factionList: ["AncientRobot", "Bandit", "Apprentice", "Bountyhunter", "Bast", "Dragon", "Maidforce", "Alchemist"], @@ -555,9 +553,9 @@ const KinkyDungeonMapParams = { ], "min_width" : 5, - "max_width" : 6, + "max_width" : 7, "min_height" : 5, - "max_height" : 5, + "max_height" : 7, factionList: ["AncientRobot", "Nevermere", "Bandit", "Bountyhunter", "Elf", "Bast", "Dragon", "Maidforce", "Alchemist"], @@ -675,13 +673,14 @@ const KinkyDungeonMapParams = { ], "min_width" : 5, - "max_width" : 7, + "max_width" : 8, "min_height" : 5, - "max_height" : 5, + "max_height" : 6, factionList: ["Apprentice", "Bandit", "Bountyhunter", "Elemental", "Dragon", "Maidforce", "Alchemist"], - enemyTags: ["skeleton", "temple", "ghost", "magical"], + enemyTags: ["skeleton", "temple", "ghost", "soul", "magical"], + "defeat_outfit": "LatexPrisoner", "shrines": [ {Type: "Latex", Weight: 5}, @@ -798,9 +797,9 @@ const KinkyDungeonMapParams = { ], "min_width" : 5, - "max_width" : 6, + "max_width" : 7, "min_height" : 5, - "max_height" : 7, + "max_height" : 8, factionList: ["Bast", "Bandit", "AncientRobot", "Elemental", "Dragon"], @@ -905,10 +904,11 @@ const KinkyDungeonMapParams = { {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "BookBondage"}, ], - "min_width" : 5, - "max_width" : 5, - "min_height" : 5, - "max_height" : 5, + "min_width" : 6, + "max_width" : 7, + "min_height" : 6, + "max_height" : 7, + deadend: 0.1, factionList: ["Elf", "Bandit", "Apprentice", "Elemental", "Dragon", "Maidforce", "Alchemist"], @@ -1018,9 +1018,9 @@ const KinkyDungeonMapParams = { ], "min_width" : 4, - "max_width" : 5, - "min_height" : 5, - "max_height" : 7, + "max_width" : 6, + "min_height" : 4, + "max_height" : 8, factionList: ["Nevermere", "Elf", "Bandit", "Apprentice", "Bountyhunter", "Elemental", "Dragon", "Maidforce", "Alchemist"], @@ -1133,9 +1133,9 @@ const KinkyDungeonMapParams = { ], "min_width" : 5, - "max_width" : 7, + "max_width" : 8, "min_height" : 5, - "max_height" : 7, + "max_height" : 8, enemyTags: ["shadowcreature", "magical", "shadow", "elemental", "angel"], "defeat_outfit": "LatexPrisoner", @@ -1242,7 +1242,7 @@ const KinkyDungeonMapParams = { ], - "min_width" : 6, + "min_width" : 5, "max_width" : 8, "min_height" : 4, "max_height" : 4, @@ -1341,7 +1341,7 @@ const KinkyDungeonMapParams = { "traps": [ ], - "min_width" : 6, + "min_width" : 5, "max_width" : 8, "min_height" : 4, "max_height" : 4, @@ -1456,7 +1456,7 @@ const KinkyDungeonMapParams = { ], - "min_width" : 6, + "min_width" : 5, "max_width" : 8, "min_height" : 4, "max_height" : 4, @@ -1577,10 +1577,11 @@ const KinkyDungeonMapParams = { ], - "min_width" : 6, - "max_width" : 8, + "min_width" : 4, + "max_width" : 9, "min_height" : 4, - "max_height" : 4, + "max_height" : 9, + deadend: 0.5, worldGenCode: () => { KDAddPipes(0.2, 0.35, 0.7, 0.2); @@ -1797,9 +1798,9 @@ const KinkyDungeonMapParams = { {Name: "SpawnEnemies", Enemy: "AnimStraitjacket", strict: true, Level: 0, Power: 2, Weight: 10, filterTag: "ItemArmsFull", filterBackup: "Observer"}, ], - "min_width" : 5, + "min_width" : 4, "max_width" : 7, - "min_height" : 5, + "min_height" : 4, "max_height" : 6, factionList: ["Demon"], @@ -1912,9 +1913,10 @@ const KinkyDungeonMapParams = { ], "min_width" : 5, - "max_width" : 5, - "min_height" : 5, - "max_height" : 5, + "max_width" : 6, + "min_height" : 6, + "max_height" : 7, + deadend: .15, factionList: ["Elf", "Bast", "Dragon"], @@ -2131,4 +2133,4 @@ const KinkyDungeonMapParams = { "max_height" : 19, "lockmult" : 0.0, - },*/ \ No newline at end of file + },*/ diff --git a/Game/src/map/KinkyDungeonSetpiece.js b/Game/src/map/KinkyDungeonSetpiece.ts similarity index 94% rename from Game/src/map/KinkyDungeonSetpiece.js rename to Game/src/map/KinkyDungeonSetpiece.ts index 41344ebbe..2c46ac497 100644 --- a/Game/src/map/KinkyDungeonSetpiece.js +++ b/Game/src/map/KinkyDungeonSetpiece.ts @@ -26,7 +26,34 @@ let KDSetPieces = [ let KDCountSetpiece = new Map(); -function KinkyDungeonPlaceSetPieces(POI, trapLocations, chestlist, shrinelist, chargerlist, spawnPoints, InJail, width, height) { +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; +} + +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(); @@ -99,7 +126,7 @@ function KinkyDungeonPlaceSetPieces(POI, trapLocations, chestlist, shrinelist, c } -function KDGetFavoredSetpieces(POI, setpieces) { +function KDGetFavoredSetpieces(POI: any, setpieces: any[]) { let pieces = []; for (let p of POI) { if (p.used) continue; @@ -111,7 +138,7 @@ function KDGetFavoredSetpieces(POI, setpieces) { } return setpieces.filter((p) => {return pieces.includes(p.Name);}); } -function KDGetFavoringSetpieces(Name, tags, POI, POIBlacklist) { +function KDGetFavoringSetpieces(Name: string, tags: string[], POI: any, POIBlacklist?: Map) { let pois = []; for (let p of POI) { if (POIBlacklist && POIBlacklist.get(p)) continue; @@ -125,7 +152,7 @@ function KDGetFavoringSetpieces(Name, tags, POI, POIBlacklist) { for (let p of POI) { if (POIBlacklist && POIBlacklist.get(p)) continue; if (p.used) continue; - if (p.requireTags.length == 0 || p.requireTags.some((tag) => {return tags.includes(tag);})) { + if (p.requireTags.length == 0 || p.requireTags.some((tag: string) => {return tags.includes(tag);})) { pois.push(p); } } @@ -133,7 +160,7 @@ function KDGetFavoringSetpieces(Name, tags, POI, POIBlacklist) { return pois[Math.floor(KDRandom() * pois.length)]; } -function KinkyDungeonGetSetPiece(POI, setpieces, pieces) { +function KinkyDungeonGetSetPiece(POI: any, setpieces: any[], pieces: Map) { let setpieces2 = KDGetFavoredSetpieces(POI, setpieces); if (setpieces2.length < 1 || KDRandom() < 0.1) setpieces2 = setpieces; @@ -159,7 +186,20 @@ function KinkyDungeonGetSetPiece(POI, setpieces, pieces) { } } -function KinkyDungeonGenerateSetpiece(POI, Piece, InJail, trapLocations, chestlist, shrinelist, chargerlist, spawnPoints, forcePOI, altType, MapParams) { +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; @@ -419,7 +459,7 @@ function KinkyDungeonGenerateSetpiece(POI, Piece, InJail, trapLocations, chestli } 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"; + 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, keys: true, faction: KDGetMainFaction() || "Enemy"}); spawnPoints.push({x:cornerX+5, y:cornerY + 3, required: ["jail", ...t], tags: t, AI: "guard", force: true, keys: true, faction: KDGetMainFaction() || "Enemy"}); @@ -433,7 +473,7 @@ function KinkyDungeonGenerateSetpiece(POI, Piece, InJail, trapLocations, chestli let t = []; - let jt = KDMapData.JailFaction?.length > 0 ? KinkyDungeonFactionTag[[KDMapData.JailFaction[Math.floor(KDRandom() * KDMapData.JailFaction.length)]]] : "jailer"; + 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"}); @@ -741,11 +781,11 @@ function KinkyDungeonGenerateSetpiece(POI, Piece, InJail, trapLocations, chestli /** * This function unblocks movement to ensure a map is pathable - * @param {number} x - * @param {number} y - * @returns {boolean} - whether it's possible + * @param x + * @param y + * @returns - whether it's possible */ -function KDUnblock(x, y) { +function KDUnblock(x: number, y: number): boolean { let blocked = false; let blockTiles = "1X"; let t = KinkyDungeonMapGet(x, y-1); @@ -819,7 +859,7 @@ function KDUnblock(x, y) { return !blocked; } -function SetpieceSpawnPrisoner(x, y, persistentOnly) { +function SetpieceSpawnPrisoner(x: number, y: number, persistentOnly?: boolean) { let Enemy = null; let noJam = false; let noPersistent = false; @@ -835,9 +875,8 @@ function SetpieceSpawnPrisoner(x, y, persistentOnly) { || capturedPersistent.length > 0; if (!noPersistent && persistentAvailable) { /** - * @type {entity} */ - let e = null; + let e: entity = null; if (KDGameData.CapturedParty?.length > 0) { let index = Math.floor(KDRandom() * KDGameData.CapturedParty.length); if (!KDGameData.SpawnedPartyPrisoners) KDGameData.SpawnedPartyPrisoners = {}; @@ -887,7 +926,7 @@ function SetpieceSpawnPrisoner(x, y, persistentOnly) { } -function KDTorch(X, Y, altType, MapParams) { +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", @@ -897,8 +936,8 @@ function KDTorch(X, Y, altType, MapParams) { if (!KinkyDungeonTilesGet(X + "," + Y)) KinkyDungeonTilesSet(X + "," + Y, {}); } -function KDTorchUnlit(X, Y, altType, MapParams) { +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", @@ -909,13 +948,13 @@ function KDTorchUnlit(X, Y, altType, MapParams) { KinkyDungeonTilesSet(X + "," + Y, {}); } -function KDChest(X, Y, loot = "chest", faction = "") { +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, Top, Width, Height, openChance = 0, convertDoodads = true) { - let doors = {}; +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]; @@ -969,7 +1008,7 @@ function KDCreateDoors(Left, Top, Width, Height, openChance = 0, convertDoodads } -function KDPlaceChest(cornerX, cornerY, radius, chestlist, spawnPoints, NoAddToChestList) { +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"]}, @@ -1029,7 +1068,7 @@ function KDPlaceChest(cornerX, cornerY, radius, chestlist, spawnPoints, NoAddToC return factionSelected.faction; } -function KDAddPipes(pipechance, pipelatexchance, thinlatexchance, heavylatexspreadchance) { +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 ( @@ -1065,13 +1104,12 @@ function KDAddPipes(pipechance, pipelatexchance, thinlatexchance, heavylatexspre } /** - * - * @param {entity} e - * @param {boolean} noJam - * @param {string} dialogue - * @param {NPCRestraint} [restraint] + * @param e + * @param noJam + * @param [dialogue] + * @param [restraint] */ -function KDImprisonEnemy(e, noJam, dialogue = "PrisonerJail", restraint) { +function KDImprisonEnemy(e: entity, noJam: boolean, dialogue: string = "PrisonerJail", restraint?: NPCRestraint): void { if (noJam) KinkyDungeonSetEnemyFlag(e, "nojam", -1); e.specialdialogue = dialogue; @@ -1085,4 +1123,4 @@ function KDImprisonEnemy(e, noJam, dialogue = "PrisonerJail", restraint) { e.playerdmg = undefined; if (e.hp <= 0.5) e.hp = 0.51; KDSetToExpectedBondage(e, 1); -} \ No newline at end of file +} diff --git a/Game/src/map/KinkyDungeonShrine.js b/Game/src/map/KinkyDungeonShrine.ts similarity index 92% rename from Game/src/map/KinkyDungeonShrine.js rename to Game/src/map/KinkyDungeonShrine.ts index 2861be3f3..b491199d5 100644 --- a/Game/src/map/KinkyDungeonShrine.js +++ b/Game/src/map/KinkyDungeonShrine.ts @@ -2,9 +2,8 @@ /** * Base costs for all the shrines. Starts at this value, increases thereafter - * @type {Record} */ -let KinkyDungeonShrineBaseCosts = { +let KinkyDungeonShrineBaseCosts: Record = { //"Charms": 25, "Leather": 40, "Latex": 40, @@ -27,9 +26,8 @@ let KDMinGoddessBonus = 0.15; /** * Cost growth, overrides the default amount - * @type {Record} */ -let KinkyDungeonShrineBaseCostGrowth = { +let KinkyDungeonShrineBaseCostGrowth: Record = { "Elements": 2, "Conjure": 2, "Illusion": 2, @@ -41,9 +39,8 @@ let KinkyDungeonShrinePoolChancePerUse = 0.2; /** * Current costs multipliers for shrines - * @type {Record} */ -let KinkyDungeonShrineCosts = {}; +let KinkyDungeonShrineCosts: Record = {}; let KinkyDungeonShrineTypeRemove = ["Charms", "Leather", "Metal", "Rope", "Latex", "Gags", "Blindfolds", "Boots"]; // These shrines will always remove restraints associated with their shrine @@ -57,11 +54,9 @@ function KinkyDungeonShrineInit() { /** - * - * @param {string} Name - * @returns {string} + * @param Name */ -function KDGoddessColor(Name) { +function KDGoddessColor(Name: string): string { let color = "#ffffff"; if (Name == "Illusion") color = "#8154FF"; else if (Name == "Conjure") color = "#D4AAFF"; @@ -74,7 +69,7 @@ function KDGoddessColor(Name) { return color; } -function KinkyDungeonShrineAvailable(type) { +function KinkyDungeonShrineAvailable(type: string): boolean { if (type == "Commerce") { if (KDMapData.ShopItems.length > 0) return true; else return false; @@ -90,10 +85,9 @@ function KinkyDungeonShrineAvailable(type) { let KDLevelsPerCheckpoint = 4; /** - * - * @param {number} Level + * @param Level */ -function KinkyDungeonGenerateShop(Level) { +function KinkyDungeonGenerateShop(Level: number): any[] { let ShopItems = []; let items_mid = 0; let items_high = 0; @@ -103,7 +97,7 @@ function KinkyDungeonGenerateShop(Level) { items_high = -1; itemCount += 2; } - let uniqueTags = {}; + let uniqueTags: Record = {}; for (let I = itemCount; I > 0; I--) { let Rarity = Math.floor(KDRandom() * 0.4 * KDMaxRarity/KinkyDungeonMaxLevel*Level); if (items_high < 3) { @@ -129,13 +123,11 @@ function KinkyDungeonGenerateShop(Level) { } /** - * - * @param {any} item - * @param {boolean} [noScale] - * @param {boolean} [sell] - * @returns {number} + * @param item + * @param [noScale] + * @param [sell] */ -function KinkyDungeonItemCost(item, noScale, sell) { +function KinkyDungeonItemCost(item: any, noScale?: boolean, sell?: boolean): number { if (!item) return 0; if (item.cost != null) return item.cost; @@ -146,7 +138,7 @@ function KinkyDungeonItemCost(item, noScale, sell) { if (restraint.armor) power += 3; if (restraint.protection) power += 3*restraint.protection; if (KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]) { - let enchants = {}; + 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; } @@ -178,7 +170,7 @@ function KinkyDungeonItemCost(item, noScale, sell) { if (costMod) rarity += costMod; if (KinkyDungeonConsumableVariants[item.name] || KinkyDungeonWeaponVariants[item.name]) { - let enchants = {}; + 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; } @@ -207,7 +199,7 @@ function KinkyDungeonItemCost(item, noScale, sell) { return costs; } -function KinkyDungeonShrineCost(type) { +function KinkyDungeonShrineCost(type: string): number { let mult = 1.0; let growth = 1.0; let noMult = false; @@ -241,7 +233,7 @@ function KinkyDungeonShrineCost(type) { return Math.round(Math.round(KinkyDungeonShrineBaseCosts[type] * mult/10)*10 * (1 + 0.01 * KinkyDungeonDifficulty)); } -function KDAddBasic(item) { +function KDAddBasic(item: item | shopItem) { if (item.name == "RedKey") { KinkyDungeonRedKeys += 1; } else if (item.name == "BlueKey") { @@ -261,7 +253,7 @@ function KDAddBasic(item) { } } -function KinkyDungeonPayShrine(type, mult = 1) { +function KinkyDungeonPayShrine(type: string, mult: number = 1) { let cost = KinkyDungeonShrineCost(type); KinkyDungeonGold -= cost * mult; let ShrineMsg = ""; @@ -327,7 +319,11 @@ function KinkyDungeonPayShrine(type, mult = 1) { if (KinkyDungeonShopIndex > 0) KinkyDungeonShopIndex -= 1; KDGameData.ShopRewardProgram += cost*mult; - let point = KinkyDungeonGetNearbyPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, true, undefined, true); + 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 && KinkyDungeonGroundTiles.includes(KinkyDungeonMapGet(point.x, point.y)) && KDGameData.ShopRewardProgram > KDGameData.ShopRewardProgramThreshold) { @@ -422,7 +418,7 @@ function KinkyDungeonDrawShrine() { // Draw the item and cost } - DrawButtonKDEx("shrinebuy", (bdata) => { + 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" : "#ff5555", "", ""); @@ -443,7 +439,7 @@ function KinkyDungeonDrawShrine() { { zIndex: 69, }); - DrawButtonKDEx("l.name" + ii, (bdata) => { + DrawButtonKDEx("l.name" + ii, (_bdata) => { KinkyDungeonShopIndex = index; return true; }, true, @@ -515,7 +511,7 @@ function KinkyDungeonDrawShrine() { let II = 0; let shrineActionSpacing = 80; - if (DrawButtonKDEx("shrineUse", (bdata) => { + if (DrawButtonKDEx("shrineUse", (_bdata) => { KDSendInput("shrineUse", {type: type, cost: cost*discount, targetTile: KinkyDungeonTargetTileLocation}); KinkyDungeonTargetTileLocation = ""; KinkyDungeonTargetTile = null; @@ -528,7 +524,7 @@ function KinkyDungeonDrawShrine() { II++; let tiles = KinkyDungeonRescueTiles(); let rescueAvailable = tiles.length > 0; - if (DrawButtonKDEx("shrinePray", (bdata) => { + if (DrawButtonKDEx("shrinePray", (_bdata) => { if (rescueAvailable) { KDSendInput("shrinePray", {type: type, cost: cost, targetTile: KinkyDungeonTargetTileLocation}); KinkyDungeonTargetTileLocation = ""; @@ -542,7 +538,7 @@ function KinkyDungeonDrawShrine() { KDModalArea_x+400, YY + 55 - II*shrineActionSpacing, 600, "#ffffff", KDTextGray0, 20, "left", 70); II++; - if (DrawButtonKDEx("drinkShrine", (bdata) => { + if (DrawButtonKDEx("drinkShrine", (_bdata) => { KDSendInput("shrineDrink", {type: type, targetTile: KinkyDungeonTargetTileLocation}); return true; }, true,KDModalArea_x, YY + 25 - II*shrineActionSpacing, 325, 60, @@ -552,7 +548,7 @@ function KinkyDungeonDrawShrine() { KDModalArea_x+400, YY + 55 - II*shrineActionSpacing, 600, "#ffffff", KDTextGray0, 20, "left", 70); II++; - if (DrawButtonKDEx("bottleShrine", (bdata) => { + if (DrawButtonKDEx("bottleShrine", (_bdata) => { KDSendInput("shrineBottle", {type: type, targetTile: KinkyDungeonTargetTileLocation}); return true; }, true, KDModalArea_x, YY + 25 - II*shrineActionSpacing, 325, 60, @@ -564,7 +560,7 @@ function KinkyDungeonDrawShrine() { II++; if (KDGameData.Champion == type) { - if (DrawButtonKDEx("shrineDevote", (bdata) => { + if (DrawButtonKDEx("shrineDevote", (_bdata) => { KDSendInput("shrineDevote", {type: "", cost: cost, targetTile: KinkyDungeonTargetTileLocation}); KinkyDungeonTargetTileLocation = ""; KinkyDungeonTargetTile = null; @@ -575,7 +571,7 @@ function KinkyDungeonDrawShrine() { 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) => { + if (DrawButtonKDEx("shrineDevote", (_bdata) => { KDSendInput("shrineDevote", {type: type, cost: cost, targetTile: KinkyDungeonTargetTileLocation}); KinkyDungeonTargetTileLocation = ""; KinkyDungeonTargetTile = null; @@ -589,7 +585,7 @@ function KinkyDungeonDrawShrine() { II++; if (KinkyDungeonTargetTile?.Quest) { - if (DrawButtonKDEx("shrineQuest", (bdata) => { + if (DrawButtonKDEx("shrineQuest", (_bdata) => { KDSendInput("shrineQuest", {type: type, cost: cost, targetTile: KinkyDungeonTargetTileLocation}); KinkyDungeonTargetTileLocation = ""; KinkyDungeonTargetTile = null; @@ -637,10 +633,7 @@ function KinkyDungeonDrawShrine() { } } -/** - * @type {Record} - */ -let KDGoddessRevengeMobTypes = { +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"]}, @@ -652,15 +645,13 @@ let KDGoddessRevengeMobTypes = { }; /** - * - * @param {number} x - * @param {number} y - * @param {string} Goddess - * @param {number} [mult] - * @param {number} [LevelBoost] - * @returns {number} + * @param x + * @param y + * @param Goddess + * @param [mult] + * @param [LevelBoost] */ -function KDSummonRevengeMobs(x, y, Goddess, mult = 1.0, LevelBoost = 2) { +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; @@ -696,16 +687,14 @@ function KDSummonRevengeMobs(x, y, Goddess, mult = 1.0, LevelBoost = 2) { } /** - * - * @param {boolean} Bottle - Is this bottling or drinking? - * @returns {boolean} + * @param Bottle - Is this bottling or drinking? */ -function KDCanDrinkShrine(Bottle) { +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) { +function KinkyDungeonGetSetPieces(Dict: any) { let ret = []; for (let sh of Dict) { if (sh.Type) { @@ -715,7 +704,7 @@ function KinkyDungeonGetSetPieces(Dict) { return ret; } -function KinkyDungeonGetMapShrines(Dict) { +function KinkyDungeonGetMapShrines(Dict: any) { let ret = []; for (let sh of Dict) { if (sh.Type) { @@ -725,7 +714,7 @@ function KinkyDungeonGetMapShrines(Dict) { return ret; } -function KinkyDungeonTakeOrb(Amount, X, Y) { +function KinkyDungeonTakeOrb(Amount: number, X: number, Y: number) { KinkyDungeonSetFlag("NoDialogue", 3); KinkyDungeonDrawState = "Orb"; KinkyDungeonOrbAmount = Amount; @@ -762,7 +751,7 @@ function KinkyDungeonDrawOrb() { if (value > 30) color = "#4fd658"; else color = "#9bd45d"; } - DrawButtonKDEx("orbspell" + shrine, (b) => { + DrawButtonKDEx("orbspell" + shrine, (_b) => { KDSendInput("orb", {shrine: shrine, Amount: 1, Rep: 1 * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "DivinePrivilege")), x: KDOrbX, y: KDOrbY}); KinkyDungeonDrawState = "Game"; return true; @@ -776,14 +765,14 @@ function KinkyDungeonDrawOrb() { } - DrawButtonKDEx("orbspellrandom", (b) => { + 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) => { + DrawButtonKDEx("cancelorb", (_bdata) => { KinkyDungeonDrawState = "Game"; return true; }, true, canvasOffsetX_ui + 525, yPad + canvasOffsetY_ui + spacing * i, 425, 55, TextGet("KinkyDungeonCancel"), "white"); @@ -802,7 +791,7 @@ let KDPerkConfirm = false; let KDPerkOrbPerks = []; let KDPerkOrbBondage = []; let KDPerkOrbMethod = "Default"; -function KinkyDungeonTakePerk(Amount, X, Y) { +function KinkyDungeonTakePerk(Amount: number, X: number, Y: number) { KinkyDungeonSetFlag("NoDialogue", 3); KDPerkOrbPerks = KinkyDungeonTilesGet(X + "," + Y).Perks; @@ -888,7 +877,7 @@ function KinkyDungeonDrawPerkOrb() { DrawTextFitKD(TextGet("KinkyDungeonPerkConfirm"), 1250, 800, 1300, "#ffffff", KDTextGray2, 30); } - DrawButtonKDEx("reject", (bdata) => { + 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, @@ -897,7 +886,7 @@ function KinkyDungeonDrawPerkOrb() { alpha: 0, }); - DrawButtonKDEx("accept", (bdata) => { + DrawButtonKDEx("accept", (_bdata) => { if (KDPerkConfirm) { KDSendInput("perkorb", {shrine: "perk", perks: KDPerkOrbPerks, bondage: KDPerkOrbBondage, method: KDPerkOrbMethod, Amount: 1, x: KDOrbX, y: KDOrbY}); KinkyDungeonDrawState = "Game"; @@ -912,18 +901,18 @@ function KinkyDungeonDrawPerkOrb() { } -function KDGetPosNegColor(value) { +function KDGetPosNegColor(value: number): string { return (value ? (value > 0 ? KDGoodColor : KDCurseColor) : "#dddddd"); } -function KDGetGoddessBonus(shrine) { +function KDGetGoddessBonus(shrine: string): number { 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) { +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) + "%"; @@ -931,17 +920,12 @@ function KDDrawRestraintBonus(shrine, x, y, width = 100, FontSize, align, zIndex } /** - * - * @param {KDMapDataType} map - * @param {*} tile - * @returns {string} + * @param map + * @param tile */ -function KDGetShrineQuest(map, tile) { +function KDGetShrineQuest(map: KDMapDataType, tile: any): string { if (!tile) return ""; - /** - * @type {Record} - */ - let eligibleQuests = {}; + 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, {}); @@ -953,11 +937,10 @@ function KDGetShrineQuest(map, tile) { } /** - * - * @param {KDMapDataType} map - * @param {*} tile + * @param map + * @param tile */ -function KDSetShrineQuest(map, tile, quest) { +function KDSetShrineQuest(map: KDMapDataType, tile: any, quest: string) { if (!tile) return; tile.Quest = quest; KDSetMapFlag(map, quest); diff --git a/Game/src/map/KinkyDungeonTiles.js b/Game/src/map/KinkyDungeonTiles.ts similarity index 84% rename from Game/src/map/KinkyDungeonTiles.js rename to Game/src/map/KinkyDungeonTiles.ts index 6e750c583..cc4eb8a95 100644 --- a/Game/src/map/KinkyDungeonTiles.js +++ b/Game/src/map/KinkyDungeonTiles.ts @@ -2,12 +2,12 @@ let KDCancelEvents = { - JourneyChoice: (x, y, tile, data) => { + JourneyChoice: (_x, _y, _tile, _data) => { KinkyDungeonState = "JourneyMap"; }, }; let KDCancelFilters = { - JourneyChoice: (x, y, tile, data) => { + JourneyChoice: (_x, _y, _tile, data: any) => { // This one is set by event if (!KDGameData.JourneyTarget && data.AdvanceAmount > 0) { if (KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]?.Connections.length > 0) @@ -18,24 +18,20 @@ let KDCancelFilters = { }; /** - * - * @param {entity} entity - * @returns {boolean} + * @param entity */ -function KDWettable(entity) { +function KDWettable(entity: entity): boolean { return entity.player || (!entity.Enemy.tags.acidimmune && !entity.Enemy.tags.acidresist && !entity.Enemy.tags.nowet); } /** - * - * @param {entity} entity - * @returns {boolean} + * @param entity */ -function KDConducting(entity) { +function KDConducting(entity: entity): boolean { return entity.player || (!entity.Enemy.tags.electricimmune && !entity.Enemy.tags.electric && !entity.Enemy.tags.noconduct); } -function KinkyDungeonHandleTilesEnemy(enemy, delta) { +function KinkyDungeonHandleTilesEnemy(enemy: entity, _delta: number): void { let tile = KinkyDungeonMapGet(enemy.x, enemy.y); if (tile == 'w') { if (KDWettable(enemy) && !KDIsFlying(enemy)) { @@ -59,9 +55,9 @@ function KinkyDungeonHandleTilesEnemy(enemy, delta) { /** * Applies effects based on nearby tiles. Affects only the player - * @param {number} delta + * @param delta */ -function KDPeripheralTileEffects(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); @@ -77,9 +73,9 @@ function KDPeripheralTileEffects(delta) { /** * Applies effects based on the tile you are standing on. Affects only the player - * @param {number} delta + * @param delta */ -function KinkyDungeonUpdateTileEffects(delta) { +function KinkyDungeonUpdateTileEffects(delta: number) { let tile = KinkyDungeonMapGet(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y); if (KDTileUpdateFunctions[tile] && KDTileUpdateFunctions[tile](delta)) { // Boop @@ -98,7 +94,7 @@ function KinkyDungeonUpdateTileEffects(delta) { let KinkyDungeonChestConfirm = false; -function KinkyDungeonHandleMoveToTile(toTile) { +function KinkyDungeonHandleMoveToTile(toTile: string): void { if (toTile == 's' || toTile == 'H' || (toTile == 'S' && ( MiniGameKinkyDungeonLevel > 0 //|| (MiniGameKinkyDungeonLevel == 1 && KDGameData.RoomType) @@ -116,19 +112,19 @@ function KinkyDungeonHandleMoveToTile(toTile) { } } -function KDCanEscape(method) { +function KDCanEscape(method: string): boolean { return KinkyDungeonEscapeTypes[method].check(); } -function KDGetEscapeMinimapText(method) { +function KDGetEscapeMinimapText(method: string): string { return KinkyDungeonEscapeTypes[method].minimaptext(); } -function KDGetEscapeDoorText(method) { +function KDGetEscapeDoorText(method: string): string { return KinkyDungeonEscapeTypes[method].doortext(); } -function KDGetEscapeMethod(level) { +function KDGetEscapeMethod(_level: number) { let alt = KDGetAltType(MiniGameKinkyDungeonLevel); if (alt?.escapeMethod) return alt.escapeMethod; @@ -153,13 +149,11 @@ function KDGetRandomEscapeMethod() { /** * Creates combined record of tags - * @param {number} x - * @param {number} y - * @returns {Record} + * @param x + * @param y */ -function KDEffectTileTags(x, y) { - /** @type {Record} */ - let ret = {}; +function KDEffectTileTags(x: number, y: number): Record { + let ret: Record = {}; let tiles = KDGetEffectTiles(x, y); if (tiles) { for (let t of Object.values(tiles)) { @@ -176,7 +170,7 @@ function KDEffectTileTags(x, y) { -function KinkyDungeonHandleStairs(toTile, suppressCheckPoint) { +function KinkyDungeonHandleStairs(toTile: string, suppressCheckPoint?: boolean) { if (KinkyDungeonFlags.get("stairslocked")) { KinkyDungeonSendActionMessage(10, TextGet("KDStairsLocked").replace("NMB", "" + KinkyDungeonFlags.get("stairslocked")), "#ffffff", 1); } else @@ -200,7 +194,7 @@ function KinkyDungeonHandleStairs(toTile, suppressCheckPoint) { //let currCheckpoint = MiniGameKinkyDungeonCheckpoint; let originalRoom = KDGameData.RoomType; let altRoom = KDGameData.RoomType ? KinkyDungeonAltFloor(KDGameData.RoomType) : KinkyDungeonBossFloor(MiniGameKinkyDungeonLevel); - let altRoomTarget = (tile && tile.RoomType) ? KinkyDungeonAltFloor(tile.RoomType) : journeyTile?.RoomType; + let altRoomTarget = (tile && tile.RoomType) ? KinkyDungeonAltFloor(tile.RoomType) : (KinkyDungeonAltFloor(journeyTile?.RoomType)); let AdvanceAmount = KDAdvanceAmount[toTile](altRoom, altRoomTarget); let data = { @@ -295,6 +289,7 @@ function KinkyDungeonHandleStairs(toTile, suppressCheckPoint) { KDGameData.MapMod = ""; // Reset the map mod } else if (!data.overrideRoomType) { roomType = (altRoom?.skiptunnel) ? "" : "PerkRoom"; // We do a perk room, then a tunnel + altRoomTarget = KinkyDungeonAltFloor(roomType); KDGameData.MapMod = ""; // Reset the map mod } } @@ -381,7 +376,7 @@ function KinkyDungeonHandleStairs(toTile, suppressCheckPoint) { let KinkyDungeonConfirmStairs = false; -function KinkyDungeonHandleMoveObject(moveX, moveY, moveObject) { +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); @@ -393,39 +388,34 @@ function KinkyDungeonHandleMoveObject(moveX, moveY, moveObject) { } /** - * - * @param {number} x - * @param {number} y - * @returns {boolean} + * @param x + * @param y */ -function KDHasEffectTile(x, y) { +function KDHasEffectTile(x: number, y: number): boolean { return KinkyDungeonEffectTilesGet(x + "," + y) != undefined; } /** - * - * @param {number} x - * @param {number} y - * @returns {Record} + * @param x + * @param y */ -function KDGetEffectTiles(x, y) { +function KDGetEffectTiles(x: number, y: number): Record { let str = x + "," + y; return KinkyDungeonEffectTilesGet(str) ? KinkyDungeonEffectTilesGet(str) : {}; } -function KDGetSpecificEffectTile(x, y, tile) { +function KDGetSpecificEffectTile(x: number, y: number, tile?: string) { return KDGetEffectTiles(x, y)[tile]; } /** - * - * @param {number} x - * @param {number} y - * @param {effectTileRef} tile - * @param {number} durationMod + * @param x + * @param y + * @param tile + * @param durationMod * @returns {effectTile} */ -function KDCreateEffectTile(x, y, tile, durationMod) { +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); @@ -449,7 +439,7 @@ function KDCreateEffectTile(x, y, tile, durationMod) { return null; } -function KDInteractNewTile(newTile) { +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))) { @@ -464,36 +454,38 @@ function KDInteractNewTile(newTile) { } /** - * - * @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 + * @param x + * @param y + * @param tile + * @param [durationMod] + * @param [rad] + * @param [avoidPoint] + * @param [density] + * @param mod - explosion modifier */ -function KDCreateAoEEffectTiles(x, y, tile, durationMod, rad, avoidPoint, density, mod = "") { +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)) { + 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 + * @param x + * @param y + * @param tagsToRemove + * @param [rad] + * @param [avoidPoint] + * @param [density] + * @param mod - explosion modifier */ -function KDRemoveAoEEffectTiles(x, y, tagsToRemove, rad, avoidPoint, density, mod = "") { +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)) { @@ -512,12 +504,12 @@ function KDRemoveAoEEffectTiles(x, y, tagsToRemove, rad, avoidPoint, density, mo /** * Current alpha vs fade type - * @param {string} id - * @param {number} alpha - * @param {string} fade - * @param {number} delta + * @param id + * @param alpha + * @param fade + * @param delta */ -function KDApplyAlpha(id, alpha, fade, delta) { +function KDApplyAlpha(id: string, alpha: number, fade: string, delta: number) { if (!fade) return 1.0; switch (fade) { case "random": { @@ -527,16 +519,17 @@ function KDApplyAlpha(id, alpha, fade, delta) { case "sine3000": { return Math.max(0, Math.min(1, .5 + 0.25 * Math.sin(CommonTime()/3000))); } + case "ice": { + return Math.max(0, Math.min(1, .25 + 0.25 * Math.sin(CommonTime()/5000))); + } } } -/** @type {Record} */ -let KDTileModes = { -}; +let KDTileModes: Record = {}; let KDLastEffTileUpdate = 0; -function KDDrawEffectTiles(canvasOffsetX, canvasOffsetY, CamX, CamY) { +function KDDrawEffectTiles(_canvasOffsetX: number, _canvasOffsetY: number, CamX: number, CamY: number) { let delta = CommonTime() - KDLastEffTileUpdate; KDLastEffTileUpdate = CommonTime(); for (let tileLocation of Object.values(KDMapData.EffectTiles)) { @@ -554,8 +547,8 @@ function KDDrawEffectTiles(canvasOffsetX, canvasOffsetY, CamX, CamY) { alpha: KDApplyAlpha(tileid, kdpixisprites.get(tileid)?.alpha, tile.fade, delta), }; if (tile.spin) { - op.anchorx = 0.5; - op.anchory = 0.5; + op['anchorx'] = 0.5; + op['anchory'] = 0.5; if (tile.spinAngle == undefined) tile.spinAngle = 0; tile.spinAngle += tile.spin * KDTimescale*delta; @@ -567,7 +560,7 @@ function KDDrawEffectTiles(canvasOffsetX, canvasOffsetY, CamX, CamY) { op.alpha *= 0.7; } } - if (color != undefined) op.tint = color; + 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))*KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KinkyDungeonGridSizeDisplay, KDAnimQuantize(Math.PI/4 * (tile.spin || 1), tile.spinAngle), op); @@ -577,11 +570,9 @@ function KDDrawEffectTiles(canvasOffsetX, canvasOffsetY, CamX, CamY) { } /** - * - * @param {effectTile} tile - * @returns {boolean} + * @param tile */ -function KDCanSeeEffectTile(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; @@ -590,7 +581,7 @@ function KDCanSeeEffectTile(tile) { } -function KDUpdateEffectTiles(delta) { +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); @@ -624,22 +615,20 @@ function KDUpdateEffectTiles(delta) { } /** - * - * @param {number} delta - * @param {entity} entity - * @param {effectTile} tile + * @param delta + * @param entity + * @param tile */ -function KinkyDungeonUpdateSingleEffectTile(delta, entity, 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 {number} delta - * @param {effectTile} tile + * @param delta + * @param tile */ -function KinkyDungeonUpdateSingleEffectTileStandalone(delta, tile,) { +function KinkyDungeonUpdateSingleEffectTileStandalone(delta: number, tile: effectTile): void { if (tile.noWalls && !KinkyDungeonMovableTilesEnemy.includes(KinkyDungeonMapGet(tile.x, tile.y))) { tile.duration = 0; } @@ -651,19 +640,18 @@ function KinkyDungeonUpdateSingleEffectTileStandalone(delta, tile,) { /** - * - * @param {any} b - * @param {effectTile} tile - * @param {number} d + * @param b + * @param tile + * @param d */ -function KinkyDungeonBulletInteractionSingleEffectTile(b, tile, 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, y, b, 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); } @@ -671,15 +659,15 @@ function KDEffectTileInteractions(x, y, b, d) { /** * Moves an entity - * @param {entity} enemy - * @param {number} x - * @param {number} y - * @param {boolean} willing - * @param {boolean} [dash] - * @param {boolean} [ignoreBlocked] - Ignore if the target is blocked--important if swapping - * @param {boolean} [forceHitBullets] - Forces the target to hit stationary bullets if in the way + * @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, x, y, willing, dash, forceHitBullets, ignoreBlocked) { +function KDMoveEntity(enemy: entity, x: number, y: number, willing: boolean, dash?: boolean, forceHitBullets?: boolean, ignoreBlocked?: boolean) { enemy.lastx = enemy.x; enemy.lasty = enemy.y; let cancel = {cancelmove: false, returnvalue: false}; @@ -713,10 +701,9 @@ function KDMoveEntity(enemy, x, y, willing, dash, forceHitBullets, ignoreBlocked } /** - * - * @param {entity} enemy + * @param enemy */ -function KDStaggerEnemy(enemy) { +function KDStaggerEnemy(enemy: entity) { enemy.fx = undefined; enemy.fy = undefined; enemy.movePoints = 0; @@ -724,7 +711,7 @@ function KDStaggerEnemy(enemy) { } -function KDMovePlayer(moveX, moveY, willing, sprint, forceHitBullets, suppressNoise) { +function KDMovePlayer(moveX: number, moveY: number, willing: boolean, sprint?: boolean, forceHitBullets?: boolean, suppressNoise?: boolean): boolean { KinkyDungeonPlayerEntity.lastx = KinkyDungeonPlayerEntity.x; KinkyDungeonPlayerEntity.lasty = KinkyDungeonPlayerEntity.y; let cancel = {cancelmove: false, returnvalue: false}; @@ -770,7 +757,7 @@ function KDMovePlayer(moveX, moveY, willing, sprint, forceHitBullets, suppressNo return cancel.returnvalue; } -function KDSlip(dir) { +function KDSlip(dir: { x: number, y: number }): boolean { KinkyDungeonFastMovePath = []; let maxSlip = 2; let maxReached = 0; @@ -804,7 +791,7 @@ function KDSlip(dir) { /** * Helper function for flammable tiles */ -function KDInferno(existingTile, newTile, duration) { +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, { @@ -817,13 +804,13 @@ function KDInferno(existingTile, newTile, duration) { } /** * - * @param {effectTile} tile - * @param {string} type - * @param {number} duration - * @param {number} chance - * @returns {boolean} + * @param tile + * @param type + * @param [duration] + * @param [chance] + * @param [refreshDuration] */ -function KDGrow( tile, type, duration = 20, chance = 0.1, refreshDuration = 20) { +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; @@ -840,11 +827,11 @@ function KDGrow( tile, type, duration = 20, chance = 0.1, refreshDuration = 20) /** * Helper function for flammables - * @param {*} b - * @param {effectTile} tile - * @param {*} d + * @param b + * @param tile + * @param d */ -function KDIgnition(b, tile, 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) { @@ -858,11 +845,12 @@ function KDIgnition(b, tile, d) { /** * Code for a conveyor tile. DY and DX enable this functionality - * @param {number} delta - * @param {number} X - * @param {number} Y + * @param delta + * @param X + * @param Y + * @param [unwilling] */ -function KDConveyor(delta, X, Y, 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); @@ -899,7 +887,7 @@ function KDTickSpecialStats() { KDGameData.LockoutChance = 0; } -function KDAdvanceLevel(data, closeConnections = true) { +function KDAdvanceLevel(data: any, closeConnections: boolean = true): { x: number, y: number } { MiniGameKinkyDungeonLevel += data.AdvanceAmount; let currentSlot = KDGameData.JourneyMap[KDGameData.JourneyX + ',' + KDGameData.JourneyY]; @@ -927,14 +915,14 @@ function KDAdvanceLevel(data, closeConnections = true) { -let KDAdvanceAmount = { - 'S': (altRoom, altRoomPrevious) => { // Stairs up +let KDAdvanceAmount: Record number> = { + 'S': (_altRoom, altRoomPrevious) => { // Stairs up return (altRoomPrevious?.skiptunnel ? -1 : 0); }, - 's': (altRoom, altRoomPrevious) => { // Stairs down + 's': (altRoom, _altRoomPrevious) => { // Stairs down return (altRoom?.skiptunnel ? 1 : 0); }, - 'H': (altRoom, altRoomPrevious) => { // Stairs down + 'H': (_altRoom, _altRoomPrevious) => { // Stairs down return 0; }, -}; \ No newline at end of file +}; diff --git a/Game/src/map/KinkyDungeonTilesList.js b/Game/src/map/KinkyDungeonTilesList.ts similarity index 88% rename from Game/src/map/KinkyDungeonTilesList.js rename to Game/src/map/KinkyDungeonTilesList.ts index 867bdee34..273f2015f 100644 --- a/Game/src/map/KinkyDungeonTilesList.js +++ b/Game/src/map/KinkyDungeonTilesList.ts @@ -19,9 +19,8 @@ let KDCornerTiles = { /** * Updates local tiles such as conveyors - * @type {Record void>} */ -let KDTileUpdateFunctionsLocal = { +let KDTileUpdateFunctionsLocal: Record void> = { "]": (delta, X, Y) => {// Happy Gas! if (delta > 0) KDDealEnvironmentalDamage(X, Y, 0.5, { @@ -41,7 +40,7 @@ let KDTileUpdateFunctionsLocal = { bind: 0, }); }, - 'z': (delta, X, Y) => { + 'z': (_delta, X, Y) => { let entity = KinkyDungeonEntityAt(X, Y); if (entity) return; let mapTile = KinkyDungeonTilesGet(X + "," + Y); @@ -53,7 +52,7 @@ let KDTileUpdateFunctionsLocal = { } } }, - 'Z': (delta, X, Y) => { + 'Z': (_delta, X, Y) => { let mapTile = KinkyDungeonTilesGet(X + "," + Y); if (mapTile?.wireType == "AutoDoor_HoldOpen" || mapTile?.wireType == "AutoDoor_HoldClosed") { let tags = KDEffectTileTags(X, Y); @@ -63,13 +62,13 @@ let KDTileUpdateFunctionsLocal = { } } }, - "w": (delta, X, Y) => { + "w": (_delta, X, Y) => { KDCreateEffectTile(X, Y, { name: "Water", duration: 2, }, 0); }, - "W": (delta, X, Y) => { + "W": (_delta, X, Y) => { KDCreateEffectTile(X, Y, { name: "Water", duration: 2, @@ -156,7 +155,7 @@ let KDTileUpdateFunctionsLocal = { tile.cd -= delta; } }, - "t": (delta, X, Y) => { + "t": (_delta, X, Y) => { // Consume prisoners on the tile let entity = KinkyDungeonEntityAt(X, Y); if (entity && !entity.player) { @@ -183,21 +182,20 @@ let KDTileUpdateFunctionsLocal = { /** * Return value: whether or not to continue to allow peripheral tile updates - * @type {Record} */ -let KDBondageMachineFunctions = { +let KDBondageMachineFunctions: Record = { "Latex": { - eligible_player: (tile, x, y, entity) => { + 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) => { + function_player: (_tile, _delta, _x, _y, _entity) => { KDBasicRestraintsMachine_Player(['latexEncase', 'latexCatsuits'], 2, "KDEncasement"); return false; }, - eligible_enemy: (tile, x, y, entity) => { + eligible_enemy: (_tile, _x, _y, _entity) => { return true; }, - function_enemy: (tile, delta, x, y, entity) => { + function_enemy: (_tile, _delta, _x, _y, entity) => { KDTieUpEnemy(entity, 4.0, "Latex", "glue"); if (KDBoundEffects(entity) > 2 ) { KDTieUpEnemy(entity, 4.0, "Latex", "glue"); @@ -212,17 +210,17 @@ let KDBondageMachineFunctions = { }, }, "Metal": { - eligible_player: (tile, x, y, entity) => { + 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) => { + function_player: (_tile, _delta, _x, _y, _entity) => { KDBasicRestraintsMachine_Player(["hitechCables", "cableGag", "controlHarness"], 2, "KDMetalMachine"); return false; }, - eligible_enemy: (tile, x, y, entity) => { + eligible_enemy: (_tile, _x, _y, _entity) => { return true; }, - function_enemy: (tile, delta, x, y, entity) => { + function_enemy: (_tile, _delta, _x, _y, entity) => { KDTieUpEnemy(entity, 4.0, "Metal", "chain"); if (KDBoundEffects(entity) < 1 ) { KinkyDungeonSetEnemyFlag(entity, "conveyed", 1); @@ -233,17 +231,17 @@ let KDBondageMachineFunctions = { }, }, "Doll": { - eligible_player: (tile, x, y, entity) => { + 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) => { + function_player: (_tile, _delta, _x, _y, _entity) => { KDBasicRestraintsMachine_Player(["cyberdollrestraints"], 2, "KDDollMachine"); return false; }, - eligible_enemy: (tile, x, y, entity) => { + eligible_enemy: (_tile, _x, _y, _entity) => { return true; }, - function_enemy: (tile, delta, x, y, entity) => { + function_enemy: (_tile, _delta, _x, _y, entity) => { KDTieUpEnemy(entity, 4.0, "Metal", "chain"); if (KDBoundEffects(entity) < 1 ) { KinkyDungeonSetEnemyFlag(entity, "conveyed", 1); @@ -254,17 +252,17 @@ let KDBondageMachineFunctions = { }, }, "Tape": { - eligible_player: (tile, x, y, entity) => { + 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) => { + function_player: (_tile, _delta, _x, _y, _entity) => { KDBasicRestraintsMachine_Player(["autoTape"], 2, "KDTapeMachine"); return false; }, - eligible_enemy: (tile, x, y, entity) => { + eligible_enemy: (_tile, _x, _y, _entity) => { return true; }, - function_enemy: (tile, delta, x, y, entity) => { + function_enemy: (_tile, _delta, _x, _y, entity) => { KDTieUpEnemy(entity, 4.0, "Tape", "glue"); if (KDBoundEffects(entity) < 1 ) { KinkyDungeonSetEnemyFlag(entity, "conveyed", 1); @@ -275,16 +273,16 @@ let KDBondageMachineFunctions = { }, }, "Plug": { - eligible_player: (tile, x, y, entity) => { + 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) => { + function_player: (_tile, _delta, _x, _y, _entity) => { return KDBasicRestraintsMachine_Player(['machinePlug'], 1, "KDPlugMachine") != 0; }, - eligible_enemy: (tile, x, y, entity) => { + 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) => { + function_enemy: (_tile, _delta, _x, _y, entity) => { if (!KinkyDungeonGetBuffedStat(entity.buffs, "Plug")) { KDPlugEnemy(entity); if (KinkyDungeonGetBuffedStat(entity.buffs, "Plug") > 0) { @@ -297,16 +295,16 @@ let KDBondageMachineFunctions = { }, }, "Chastity": { - eligible_player: (tile, x, y, entity) => { + 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) => { + function_player: (_tile, _delta, _x, _y, _entity) => { return KDBasicRestraintsMachine_Player(['machineChastity', 'cyberdollchastity'], 1, "KDChastityMachine") != 0; }, - eligible_enemy: (tile, x, y, entity) => { + eligible_enemy: (_tile, _x, _y, entity) => { return entity.boundLevel > 0 && !KDEntityGetBuff(entity, "Chastity"); }, - function_enemy: (tile, delta, x, y, entity) => { + function_enemy: (_tile, _delta, _x, _y, entity) => { KDTieUpEnemy(entity, 2.0, "Metal", "chain"); if (!KDEntityGetBuff(entity, "Chastity")) { KinkyDungeonApplyBuffToEntity(entity, KDChastity); @@ -322,12 +320,11 @@ let KDBondageMachineFunctions = { }; /** - * - * @param {string[]} tags - * @param {number} count - * @param {string} msg + * @param tags + * @param count + * @param msg */ -function KDBasicRestraintsMachine_Player(tags, count, 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, @@ -349,10 +346,9 @@ function KDBasicRestraintsMachine_Player(tags, count, msg) { /** * Return value: whether or not to continue to allow peripheral tile updates - * @type {Record boolean>} */ -let KDTileUpdateFunctions = { - "W": (delta) => { // Happy Gas! +let KDTileUpdateFunctions: Record boolean> = { + "W": (_delta) => { // Happy Gas! KinkyDungeonApplyBuffToEntity(KinkyDungeonPlayerEntity, KDWaterSlow); KinkyDungeonSendTextMessage(5, TextGet("KDWaterIsWet"), "#4fa4b8", 1); return true; @@ -362,7 +358,7 @@ let KDTileUpdateFunctions = { KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonHappyGas"), "pink", 1); return true; }, - "[": (delta) => { // Happy Gas! + "[": (_delta) => { // Happy Gas! KinkyDungeonSleepiness = Math.max(KinkyDungeonSleepiness + (2) * KinkyDungeonMultiplicativeStat(KDEntityBuffedStat(KinkyDungeonPlayerEntity, "happygasDamageResist") * 2), 5); KinkyDungeonSendTextMessage(5, TextGet("KinkyDungeonSporeGas"), "pink", 1); return true; @@ -397,11 +393,11 @@ let KDTileUpdateFunctions = { } return true; }, - "?": (delta) => { // High hook + "?": (_delta) => { // High hook KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonHookHigh"), "lightgreen", 1, true); return true; }, - "/": (delta) => { // Low hook + "/": (_delta) => { // Low hook KinkyDungeonSendTextMessage(3, TextGet("KinkyDungeonScrap"), "lightgreen", 1, true); return true; }, @@ -409,10 +405,9 @@ let KDTileUpdateFunctions = { /** * Return true if movement is stopped - * @type {Record boolean>} */ -let KDMoveObjectFunctions = { - 'B': (moveX, moveY) => { +let KDMoveObjectFunctions: Record boolean> = { + 'B': (_moveX, _moveY) => { /*if (!KinkyDungeonFlags.get("slept") && !KinkyDungeonFlags.get("nobed") && KinkyDungeonStatWill < KinkyDungeonStatWillMax * 0.49) { KDGameData.InteractTargetX = moveX; KDGameData.InteractTargetY = moveY; @@ -425,7 +420,7 @@ let KDMoveObjectFunctions = { } return false; }, - '@': (moveX, moveY) => { + '@': (_moveX, _moveY) => { if (!KinkyDungeonFlags.get("nobutton")) { KDStartDialog("Button", "", true); } @@ -547,7 +542,7 @@ let KDMoveObjectFunctions = { if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Magic.ogg"); return true; }, - '-': (moveX, moveY) => { // Open the chest + '-': (_moveX, _moveY) => { // Open the chest KinkyDungeonSendActionMessage(4, TextGet("KinkyDungeonObjectChargerDestroyed"), "#999999", 1, true); return true; }, @@ -556,10 +551,9 @@ let KDMoveObjectFunctions = { /** * Return is whether or not something the player should know about happened - * @type {Record boolean>} */ -let KDEffectTileFunctionsStandalone = { - "Inferno": (delta, tile) => { +let KDEffectTileFunctionsStandalone: Record boolean> = { + "Inferno": (_delta, tile) => { if (tile.duration > 4 && KDRandom() < 0.3 && !(tile.pauseDuration > 0)) { KDCreateAoEEffectTiles(tile.x, tile.y, { name: "Ember", @@ -568,17 +562,17 @@ let KDEffectTileFunctionsStandalone = { } return true; }, - "Vines": (delta, tile) => { + "Vines": (_delta, tile) => { KDGrow(tile, "Vines"); return false; }, - "Soap": (delta, tile) => { + "Soap": (_delta, tile) => { if (!KDEffectTileTags(tile.x, tile.y).wet) { tile.duration = 0; } return false; }, - "SlimeBurning": (delta, tile) => { + "SlimeBurning": (_delta, tile) => { if (tile.duration > 0 && !(tile.pauseDuration > 0)) { KDCreateEffectTile(tile.x, tile.y, { name: "Inferno", @@ -593,37 +587,37 @@ let KDEffectTileFunctionsStandalone = { } return true; }, - "Torch": (delta, tile) => { + "Torch": (_delta, tile) => { if (tile.duration > 9000) { tile.duration = 9999; } return true; }, - "TorchUnlit": (delta, tile) => { + "TorchUnlit": (_delta, tile) => { if (tile.duration > 9000) { tile.duration = 9999; } return true; }, - "Lantern": (delta, tile) => { + "Lantern": (_delta, tile) => { if (tile.duration > 9000) { tile.duration = 9999; } return true; }, - "LanternUnlit": (delta, tile) => { + "LanternUnlit": (_delta, tile) => { if (tile.duration > 9000) { tile.duration = 9999; } return true; }, - "TorchOrb": (delta, tile) => { + "TorchOrb": (_delta, tile) => { if (tile.duration > 9000) { tile.duration = 9999; } return true; }, - "ManaFull": (delta, tile) => { + "ManaFull": (_delta, tile) => { KDCreateEffectTile(tile.x, tile.y, { name: "WireSparks", duration: 2, @@ -632,7 +626,7 @@ let KDEffectTileFunctionsStandalone = { }, }; -function KDSlimeImmuneEntity(entity) { +function KDSlimeImmuneEntity(entity: entity) { if (entity.player) { if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "glueDamageResist") >= 0.45) return true; for (let inv of KinkyDungeonAllRestraint()) { @@ -643,7 +637,7 @@ function KDSlimeImmuneEntity(entity) { } else return KDSlimeImmune(entity); } -function KDSoapImmuneEntity(entity) { +function KDSoapImmuneEntity(entity: entity) { if (entity.player) { if (KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "soapDamageResist") >= 0.45) return true; for (let inv of KinkyDungeonAllRestraint()) { @@ -654,24 +648,22 @@ function KDSoapImmuneEntity(entity) { } else return KDSoapImmune(entity); } -function KDSlimeWalker(entity) { +function KDSlimeWalker(entity: entity) { if (KDSlimeImmuneEntity(entity)) return true; else if (!entity.player && KDIsFlying(entity)) return true; return false; } -function KDSoapWalker(entity) { +function KDSoapWalker(entity: entity) { if (KDSoapImmuneEntity(entity)) return true; else if (!entity.player && KDIsFlying(entity)) return true; return false; } /** - * - * @param {entity} enemy - * @returns {boolean} + * @param enemy */ -function KDSlimeImmune(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") @@ -679,11 +671,9 @@ function KDSlimeImmune(enemy) { || KDEntityBuffedStat(enemy, "glueDamageResist") >= 0.45; } /** - * - * @param {entity} enemy - * @returns {boolean} + * @param enemy */ -function KDSoapImmune(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") @@ -693,10 +683,9 @@ function KDSoapImmune(enemy) { /** * 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) => { +let KDEffectTileFunctions: Record boolean> = { + "PressurePlateHold": (_delta, _entity, tile) => { KDCreateEffectTile(tile.x, tile.y, { name: "WireSparks", duration: 2, @@ -705,18 +694,18 @@ let KDEffectTileFunctions = { }, - "MotionLamp": (delta, entity, tile) => { + "MotionLamp": (_delta, _entity, tile) => { KDCreateEffectTile(tile.x, tile.y, { name: "MotionLampLight", duration: 12, }, 0); return false; }, - "ManaFull": (delta, entity, tile) => { + "ManaFull": (_delta, _entity, _tile) => { KinkyDungeonSendTextMessage(8, TextGet("KDManaStationCharged"), "#7799ff"); return false; }, - "ManaEmpty": (delta, entity, tile) => { + "ManaEmpty": (_delta, entity, tile) => { if (entity.player) { if (KinkyDungeonStatMana + KinkyDungeonStatManaPool >= 5) { KinkyDungeonChangeMana(-5, false, 0, true, true); @@ -733,7 +722,7 @@ let KDEffectTileFunctions = { } return false; }, - "ManaPartial": (delta, entity, tile) => { + "ManaPartial": (_delta, entity, tile) => { if (entity.player) { if (KinkyDungeonStatMana + KinkyDungeonStatManaPool >= 5) { KinkyDungeonChangeMana(-5, false, 0, true, true); @@ -752,7 +741,7 @@ let KDEffectTileFunctions = { return false; }, - "PressurePlate": (delta, entity, tile) => { + "PressurePlate": (_delta, _entity, tile) => { let tags = KDEffectTileTags(tile.x, tile.y); if (!tags.ppactive) { KDCreateEffectTile(tile.x, tile.y, { @@ -766,7 +755,7 @@ let KDEffectTileFunctions = { }, 0); return false; }, - "PressurePlateOneUse": (delta, entity, tile) => { + "PressurePlateOneUse": (_delta, _entity, tile) => { KDCreateEffectTile(tile.x, tile.y, { name: "WireSparks", duration: 2, @@ -774,7 +763,7 @@ let KDEffectTileFunctions = { tile.duration = 0; return false; }, - "SlimeBurning": (delta, entity, tile) => { + "SlimeBurning": (_delta, entity, tile) => { if (!KDEntityHasBuff(entity, "Drenched")) { let slimeWalker = KDSlimeWalker(entity); if (!slimeWalker) { @@ -789,7 +778,7 @@ let KDEffectTileFunctions = { } return false; }, - "Slime": (delta, entity, tile) => { + "Slime": (_delta, entity, tile) => { if (tile.pauseDuration > 0) { // Meep } else if (!KDEntityHasBuff(entity, "Drenched")) { @@ -806,7 +795,7 @@ let KDEffectTileFunctions = { } return false; }, - "Glue": (delta, entity, tile) => { + "Glue": (_delta, entity, tile) => { if (tile.pauseDuration > 0) { // Meep } else if (!KDEntityHasBuff(entity, "Drenched")) { @@ -820,7 +809,7 @@ let KDEffectTileFunctions = { } return false; }, - "Latex": (delta, entity, tile) => { + "Latex": (_delta, entity, tile) => { if (tile.pauseDuration > 0) { // Meep } else { @@ -875,7 +864,7 @@ let KDEffectTileFunctions = { } return false; }, - "Bubble": (delta, entity, tile) => { + "Bubble": (_delta, entity, tile) => { if (tile.pauseDuration > 0) { // Meep } else { @@ -890,7 +879,7 @@ let KDEffectTileFunctions = { } return false; }, - "LiquidMetal": (delta, entity, tile) => { + "LiquidMetal": (_delta, entity, tile) => { if (tile.pauseDuration > 0) { // Meep } else { @@ -945,7 +934,7 @@ let KDEffectTileFunctions = { } return true; }, - "Ice": (delta, entity, tile) => { + "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")) { @@ -954,14 +943,14 @@ let KDEffectTileFunctions = { } return true; }, - "Soap": (delta, entity, tile) => { + "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) => { + "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}); @@ -974,7 +963,7 @@ let KDEffectTileFunctions = { } return true; }, - "Inferno": (delta, entity, tile) => { + "Inferno": (delta, entity, _tile) => { if (entity.player) { KinkyDungeonDealDamage({ type: "fire", @@ -1002,9 +991,8 @@ let KDEffectTileFunctions = { /** * Return is whether or not something the player should know about happened - * @type {Record boolean>} */ -let KDEffectTileCreateFunctionsCreator = { +let KDEffectTileCreateFunctionsCreator: Record boolean> = { "Ropes": (newTile, existingTile) => { KDInferno(newTile, existingTile, 4); return true; @@ -1044,13 +1032,13 @@ let KDEffectTileCreateFunctionsCreator = { } return true; }, - "Latex": (newTile, existingTile) => { + "Latex": (_newTile, existingTile) => { if (existingTile.tags.includes("slime")) { existingTile.duration = 0; } return true; }, - "LiquidMetal": (newTile, existingTile) => { + "LiquidMetal": (_newTile, existingTile) => { if (existingTile.tags.includes("slime") || existingTile.tags.includes("latex")) { existingTile.duration = 0; } @@ -1070,7 +1058,7 @@ let KDEffectTileCreateFunctionsCreator = { } return true; }, - "Sparks": (newTile, existingTile) => { + "Sparks": (_newTile, existingTile) => { if (existingTile.tags.includes("conductive")) { let rt = KDEffectTileTags(existingTile.x + 1, existingTile.y); let lt = KDEffectTileTags(existingTile.x - 1, existingTile.y); @@ -1114,7 +1102,7 @@ let KDEffectTileCreateFunctionsCreator = { } return true; }, - "Chill": (newTile, existingTile) => { + "Chill": (_newTile, existingTile) => { if (existingTile.tags.includes("conductcold")) { let rt = KDEffectTileTags(existingTile.x + 1, existingTile.y); let lt = KDEffectTileTags(existingTile.x - 1, existingTile.y); @@ -1159,7 +1147,10 @@ let KDEffectTileCreateFunctionsCreator = { return true; }, "WireSparks": (newTile, existingTile) => { - if (existingTile.tags.includes("wire")) { + // 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)) { @@ -1171,7 +1162,7 @@ let KDEffectTileCreateFunctionsCreator = { 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) { + if (!rt.signalFrame && (rt.wire || rt.wireend) && !rt.vert && !existingTile.tags?.includes("vert")) { KDCreateEffectTile(existingTile.x + 1, existingTile.y, { name: "WireSparksAct", duration: 1, @@ -1181,7 +1172,7 @@ let KDEffectTileCreateFunctionsCreator = { duration: 2, }, 0); } - if (!lt.signalFrame && lt.wire) { + if (!lt.signalFrame && (lt.wire || lt.wireend) && !lt.vert && !existingTile.tags?.includes("vert")) { KDCreateEffectTile(existingTile.x - 1, existingTile.y, { name: "WireSparksAct", duration: 1, @@ -1191,7 +1182,7 @@ let KDEffectTileCreateFunctionsCreator = { duration: 2, }, 0); } - if (!dt.signalFrame && dt.wire) { + if (!dt.signalFrame && (dt.wire || dt.wireend) && !dt.horiz && !existingTile.tags?.includes("horiz")) { KDCreateEffectTile(existingTile.x, existingTile.y + 1, { name: "WireSparksAct", duration: 1, @@ -1201,7 +1192,7 @@ let KDEffectTileCreateFunctionsCreator = { duration: 2, }, 0); } - if (!ut.signalFrame && ut.wire) { + if (!ut.signalFrame && (ut.wire || ut.wireend) && !ut.horiz && !existingTile.tags?.includes("horiz")) { KDCreateEffectTile(existingTile.x, existingTile.y - 1, { name: "WireSparksAct", duration: 1, @@ -1220,15 +1211,14 @@ let KDEffectTileCreateFunctionsCreator = { /** * 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) => { +let KDActivateMapTile: Record boolean> = { + "increment": (tile, _x, _y) => { if (!tile.count) tile.count = 0; tile.count += 1; return false; }, - "AutoDoor_Toggle": (tile, x, y) => { + "AutoDoor_Toggle": (_tile, x, y) => { let entity = KinkyDungeonEntityAt(x, y); if (entity) return true; @@ -1238,32 +1228,32 @@ let KDActivateMapTile = { KinkyDungeonMapSet(x, y, 'Z'); return false; }, - "Conveyor_Toggle": (tile, x, y) => { + "Conveyor_Toggle": (tile, _x, _y) => { if (tile.SwitchMode == "Off") tile.SwitchMode = "On"; else tile.SwitchMode = "Off"; return false; }, - "Conveyor_Switch": (tile, x, y) => { + "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) => { + "AutoDoor_HoldOpen": (_tile, x, y) => { KinkyDungeonMapSet(x, y, 'z'); return false; }, - "AutoDoor_HoldClosed": (tile, x, y) => { + "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) => { + "AutoDoor_Open": (_tile, x, y) => { KinkyDungeonMapSet(x, y, 'z'); return false; }, - "AutoDoor_Close": (tile, x, y) => { + "AutoDoor_Close": (_tile, x, y) => { let entity = KinkyDungeonEntityAt(x, y); if (entity) return false; @@ -1275,9 +1265,8 @@ let KDActivateMapTile = { /** * Return is whether or not something the player should know about happened - * @type {Record boolean>} */ -let KDEffectTileCreateFunctionsExisting = { +let KDEffectTileCreateFunctionsExisting: Record boolean> = { "Ropes": (newTile, existingTile) => { KDInferno(existingTile, newTile, 4); return true; @@ -1322,13 +1311,13 @@ let KDEffectTileCreateFunctionsExisting = { } return true; }, - "Latex": (newTile, existingTile) => { + "Latex": (newTile, _existingTile) => { if (newTile.tags.includes("slime")) { newTile.duration = 0; } return true; }, - "LiquidMetal": (newTile, existingTile) => { + "LiquidMetal": (newTile, _existingTile) => { if (newTile.tags.includes("slime") || newTile.tags.includes("latex")) { newTile.duration = 0; } @@ -1358,10 +1347,9 @@ let KDEffectTileCreateFunctionsExisting = { /** * Return is whether or not the move should be interrupted - * @type {Record {cancelmove: boolean, returnvalue: boolean}>} */ -let KDEffectTileMoveOnFunctions = { - "Cracked": (entity, tile, willing, dir, sprint) => { +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)) { @@ -1377,7 +1365,7 @@ let KDEffectTileMoveOnFunctions = { return {cancelmove: false, returnvalue: false}; }, - "Rubble": (entity, tile, willing, dir, sprint) => { + "Rubble": (entity, tile, _willing, _dir, _sprint) => { if (tile.pauseDuration > 0) { // Meep } else if (!entity.Enemy || (!entity.Enemy.tags.earth && !entity.Enemy.tags.unstoppable)) { @@ -1392,7 +1380,7 @@ let KDEffectTileMoveOnFunctions = { } return {cancelmove: false, returnvalue: false}; }, - "LiquidMetal": (entity, tile, willing, dir, sprint) => { + "LiquidMetal": (entity, _tile, willing, dir, sprint) => { if (sprint && entity.player && willing && (dir.x || dir.y) && !KinkyDungeonFlags.get("slipped")) { KDSlip(dir); KinkyDungeonSetFlag("slipped", 1); @@ -1400,7 +1388,7 @@ let KDEffectTileMoveOnFunctions = { } return {cancelmove: false, returnvalue: false}; }, - "Ice": (entity, tile, willing, dir, sprint) => { + "Ice": (entity, _tile, willing, dir, sprint) => { if (sprint && entity.player && willing && (dir.x || dir.y) && !KinkyDungeonFlags.get("slipped")) { KDSlip(dir); KinkyDungeonSetFlag("slipped", 1); @@ -1408,7 +1396,7 @@ let KDEffectTileMoveOnFunctions = { } return {cancelmove: false, returnvalue: false}; }, - "Soap": (entity, tile, willing, dir, sprint) => { + "Soap": (entity, _tile, willing, dir, sprint) => { if (sprint && entity.player && willing && (dir.x || dir.y) && !KinkyDungeonFlags.get("slipped")) { KDSlip(dir); KinkyDungeonSetFlag("slipped", 1); @@ -1431,9 +1419,8 @@ let KDEffectTileMoveOnFunctions = { /** * Return is idk - * @type {Record boolean>} */ -let KDEffectTileBulletFunctions = { +let KDEffectTileBulletFunctions: Record boolean> = { "Ropes": (b, tile, d) => { KDIgnition(b, tile, d); return true; @@ -1446,7 +1433,7 @@ let KDEffectTileBulletFunctions = { KDIgnition(b, tile, d); return true; }, - "SlimeBurning": (b, tile, d) => { + "SlimeBurning": (b, tile, _d) => { if (b.bullet.damage) { let type = b.bullet.damage.type; if (type == "soap") { @@ -1466,7 +1453,7 @@ let KDEffectTileBulletFunctions = { } return true; }, - "Slime": (b, tile, d) => { + "Slime": (b, tile, _d) => { if (b.bullet.damage) { let type = b.bullet.damage.type; if (type == "soap") { @@ -1486,7 +1473,7 @@ let KDEffectTileBulletFunctions = { } return true; }, - "Ember": (b, tile, d) => { + "Ember": (b, tile, _d) => { if (b.bullet.damage) { let type = b.bullet.damage.type; if (type == "stun" && b.bullet.damage.damage > 1) { @@ -1503,7 +1490,7 @@ let KDEffectTileBulletFunctions = { } return true; }, - "Glue": (b, tile, d) => { + "Glue": (b, tile, _d) => { if (b.bullet.damage) { let type = b.bullet.damage.type; if (type == "soap" || type == "acid") { @@ -1513,7 +1500,7 @@ let KDEffectTileBulletFunctions = { } return true; }, - "Torch": (b, tile, d) => { + "Torch": (b, tile, _d) => { if (b.bullet.damage) { let type = b.bullet.damage.type; if (KDTorchExtinguishTypes.includes(type)) { @@ -1526,7 +1513,7 @@ let KDEffectTileBulletFunctions = { } return true; }, - "TorchUnlit": (b, tile, d) => { + "TorchUnlit": (b, tile, _d) => { if (b.bullet.damage) { let type = b.bullet.damage.type; if ((KDIgnitionSources.includes(type))) { @@ -1539,7 +1526,7 @@ let KDEffectTileBulletFunctions = { } return true; }, - "Lantern": (b, tile, d) => { + "Lantern": (b, tile, _d) => { if (b.bullet.damage) { let type = b.bullet.damage.type; if (KDTorchExtinguishTypes.includes(type)) { @@ -1552,7 +1539,7 @@ let KDEffectTileBulletFunctions = { } return true; }, - "LanternUnlit": (b, tile, d) => { + "LanternUnlit": (b, tile, _d) => { if (b.bullet.damage) { let type = b.bullet.damage.type; if ((KDIgnitionSources.includes(type))) { @@ -1565,7 +1552,7 @@ let KDEffectTileBulletFunctions = { } return true; }, - "Ice": (b, tile, d) => { + "Ice": (b, tile, _d) => { if (b.bullet.damage) { let type = b.bullet.damage.type; if ((KDIgnitionSources.includes(type)) && b.bullet.damage.damage > 0) { @@ -1580,7 +1567,7 @@ let KDEffectTileBulletFunctions = { } return true; }, - "Water": (b, tile, d) => { + "Water": (b, tile, _d) => { if (b.bullet.damage) { let type = b.bullet.damage.type; if ((type == "ice" || type == "frost")) { @@ -1611,11 +1598,11 @@ let KDEffectTileBulletFunctions = { let KDStairsAltAction = { - "RandomTeleport": (toTile, suppressCheckPoint) => { + "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, y) => { + let point = KinkyDungeonGetRandomEnemyPointCriteria((x: number, y: number) => { return KinkyDungeonMapGet(x, y) == 's' && KinkyDungeonTilesGet(x + "," + y)?.AltStairAction == "RandomTeleport"; }, false, false, undefined, undefined, undefined, true); @@ -1631,12 +1618,12 @@ let KDStairsAltAction = { if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Teleport.ogg"); } }, - "Null": (toTile, suppressCheckPoint) => { + "Null": (_toTile, _suppressCheckPoint) => { // Beep } }; -function KDAttemptDoor(moveX, moveY) { +function KDAttemptDoor(moveX: number, moveY: number) { KinkyDungeonAdvanceTime(1, true); let open = !KinkyDungeonStatsChoice.get("Doorknobs") || !KinkyDungeonIsHandsBound(true, true, 0.45); if (!open) { @@ -1676,4 +1663,4 @@ function KDAttemptDoor(moveX, moveY) { if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/DoorOpen.ogg"); } -} \ No newline at end of file +} diff --git a/Game/src/map/KinkyDungeonTraps.js b/Game/src/map/KinkyDungeonTraps.ts similarity index 93% rename from Game/src/map/KinkyDungeonTraps.js rename to Game/src/map/KinkyDungeonTraps.ts index bc05f6ee5..be142737a 100644 --- a/Game/src/map/KinkyDungeonTraps.js +++ b/Game/src/map/KinkyDungeonTraps.ts @@ -1,9 +1,8 @@ "use strict"; -/** @type {Record} */ -let KDTrapTypes = { - CustomSleepDart: (tile, entity, x, y) => { +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 @@ -57,14 +56,14 @@ let KDTrapTypes = { KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("BedTrap"), 0, true); if (KDToggles.Sound && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); tile.Trap = undefined; - tile.Type = "Furniture"; + tile.Type = undefined; KinkyDungeonMakeNoise(10, x, y); return { triggered: true, msg: TextGet("KDBedTrap"), }; }, - CageTrap: (tile, entity, x, y) => { + CageTrap: (tile, entity, _x, _y) => { if (entity.player) KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("CageTrap"), 0, true); if (KDToggles.Sound && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); @@ -75,7 +74,7 @@ let KDTrapTypes = { msg: TextGet("KDCageTrap"), }; }, - DisplayTrap: (tile, entity, x, y) => { + DisplayTrap: (tile, entity, _x, _y) => { if (entity.player) KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DisplayTrap"), 0, true); if (KDToggles.Sound && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); @@ -86,7 +85,7 @@ let KDTrapTypes = { msg: TextGet("KDDisplayTrap"), }; }, - DisplayStandTrap: (tile, entity, x, y) => { + DisplayStandTrap: (tile, entity, _x, _y) => { if (entity.player) KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("DisplayTrap"), 0, true); if (KDToggles.Sound && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); @@ -97,7 +96,7 @@ let KDTrapTypes = { msg: TextGet("KDDisplayTrap"), }; }, - BarrelTrap: (tile, entity, x, y) => { + BarrelTrap: (tile, entity, _x, _y) => { if (entity.player) KinkyDungeonAddRestraintIfWeaker(KinkyDungeonGetRestraintByName("BarrelTrap"), 0, true); if (KDToggles.Sound && entity == KinkyDungeonPlayerEntity) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/Trap.ogg"); @@ -191,7 +190,7 @@ let KDTrapTypes = { }; let KDTrapTypesStepOff = { - DoorLock: (tile, entity, x, y) => { + DoorLock: (tile: any, entity: entity, x: number, y: number) => { let created = 0; if (KinkyDungeonNoEnemy(x, y)) { let lifetime = tile.Lifetime ? tile.Lifetime : undefined; @@ -239,7 +238,7 @@ let KDTrapTypesStepOff = { let KinkyDungeonTrapMoved = false; -function KinkyDungeonHandleStepOffTraps(entity, x, y, moveX, moveY) { +function KinkyDungeonHandleStepOffTraps(entity: entity, x: number, y: number, moveX: number, moveY: number) { let flags = { AllowTraps: true, }; @@ -270,7 +269,7 @@ function KinkyDungeonHandleStepOffTraps(entity, x, y, moveX, moveY) { } -function KinkyDungeonHandleTraps(entity, x, y, Moved) { +function KinkyDungeonHandleTraps(entity: entity, x: number, y: number, Moved: boolean) { let flags = { AllowTraps: true, }; @@ -310,22 +309,27 @@ function KinkyDungeonHandleTraps(entity, x, y, Moved) { KinkyDungeonTrapMoved = false; } -function KDTrigPanic(chest) { +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); } } -/** - * - * @returns {{ Name: string; Enemy?: string; Spell?: string; Level: number; Power: number; Weight: number; strict?: true; teleportTime?: number}[]} - */ -function KinkyDungeonGetGoddessTrapTypes() { - /** - * @type {{ Name: string; Enemy?: string; Spell?: string; Level: number; Power: number; Weight: number; strict?: true; teleportTime?: number,}[]} - */ - let trapTypes = []; +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 }); @@ -397,7 +401,7 @@ function KinkyDungeonGetGoddessTrapTypes() { return trapTypes; } -function KinkyDungeonGetTrap(trapTypes, Level, tags) { +function KinkyDungeonGetTrap(trapTypes: any[], Level: number, tags: string[]) { let trapWeightTotal = 0; let trapWeights = []; @@ -409,7 +413,7 @@ function KinkyDungeonGetTrap(trapTypes, Level, tags) { if (effLevel >= trap.Level && (!trap.arousalMode || KinkyDungeonStatsChoice.get("arousalMode"))) { trapWeights.push({trap: trap, weight: trapWeightTotal}); - let weight = trap.Weight + weightBonus; + let weight: number = trap.Weight + weightBonus; if (trap.terrainTags) for (let tag of tags) if (trap.terrainTags[tag]) weight += trap.terrainTags[tag]; @@ -433,6 +437,8 @@ function KinkyDungeonGetTrap(trapTypes, Level, tags) { Spell: trapWeights[L].trap.Spell, Power: trapWeights[L].trap.Power, extraTag: trapWeights[L].trap.extraTag, + Hostile: undefined, + Faction: undefined, }; } } @@ -440,7 +446,7 @@ function KinkyDungeonGetTrap(trapTypes, Level, tags) { } -function KDSmokePuff(x, y, radius, density, nomsg) { +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++) @@ -454,7 +460,7 @@ function KDSmokePuff(x, y, radius, density, nomsg) { } } -function KDSteamPuff(x, y, radius, density, nomsg) { +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++) @@ -466,4 +472,4 @@ function KDSteamPuff(x, y, radius, density, nomsg) { } } } -} \ No newline at end of file +} diff --git a/Game/src/player/KDClasses.js b/Game/src/player/KDClasses.js index 1e443d271..12a074029 100644 --- a/Game/src/player/KDClasses.js +++ b/Game/src/player/KDClasses.js @@ -62,9 +62,9 @@ let KDClassStart = { }, "Mage": () => { // Mage KinkyDungeonInventoryAddWeapon("Knife"); - KinkyDungeonInventoryAddWeapon("ArcaneCrystal"); - KDGameData.PreviousWeapon = ["ArcaneCrystal", "Knife", "Unarmed", "Unarmed"]; - KDSetWeapon("ArcaneCrystal"); + KinkyDungeonInventoryAddWeapon("ArcaneTome"); + KDGameData.PreviousWeapon = ["ArcaneTome", "Knife", "Unarmed", "Unarmed"]; + KDSetWeapon("ArcaneTome"); KDPushSpell(KinkyDungeonFindSpell("ManaRegen")); KDPushSpell(KinkyDungeonFindSpell("Bondage")); diff --git a/Game/src/player/KDDelayedActions.js b/Game/src/player/KDDelayedActions.js index 71dedeb95..9d399fc1d 100644 --- a/Game/src/player/KDDelayedActions.js +++ b/Game/src/player/KDDelayedActions.js @@ -52,6 +52,7 @@ let KDDelayedActionCommit = { 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; diff --git a/Game/src/player/KDExpressions.ts b/Game/src/player/KDExpressions.ts index 3b501633c..1cc108294 100644 --- a/Game/src/player/KDExpressions.ts +++ b/Game/src/player/KDExpressions.ts @@ -339,7 +339,7 @@ let KDExpressions: Record = { BrowsPose: "BrowsSad", Brows2Pose: "Brows2Sad", BlushPose: "BlushExtreme", - MouthPose: "MouthSmile", + MouthPose: KinkyDungeonGoddessRep.Ghost > 0 ? "MouthSmile" : "MouthEmbarrassed", }; }, }, @@ -358,7 +358,7 @@ let KDExpressions: Record = { BrowsPose: "BrowsNeutral", Brows2Pose: "Brows2Neutral", BlushPose: "BlushHigh", - MouthPose: "MouthSmile", + MouthPose: KinkyDungeonGoddessRep.Ghost > 0 ? "MouthSmile" : "MouthPout", }; }, }, diff --git a/Game/src/player/KDWardrobe.js b/Game/src/player/KDWardrobe.js index b75bd83b6..146b7d2d1 100644 --- a/Game/src/player/KDWardrobe.js +++ b/Game/src/player/KDWardrobe.js @@ -6,6 +6,21 @@ 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; @@ -20,6 +35,8 @@ let FilterUpdateInterval = 90; let KDModelListMax = 14; let KDModelListViewSkip = 7; +let KDShowCharacterPalette = false; + let KDModelList_Categories_index = 0; let KDModelList_Categories_viewindex = {index: 0}; @@ -158,9 +175,42 @@ function KDDrawSavedColors(X, y, max, C) { 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: [ - new PIXI.filters.AdjustmentFilter(KDSavedColors[ii]), + KDCurrentColorFilter[ii], ] }); DrawButtonKDEx("SavedColorCopy" + ii, (bdata) => { @@ -270,6 +320,9 @@ function KDDrawColorSliders(X, Y, C, Model) { 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; @@ -296,6 +349,7 @@ function KDDrawColorSliders(X, Y, C, Model) { "YScale": "1", "Rotation": "0", "LayerBonus": "0", + "Protected": "0", "SuppressDynamic": "0", "HideOverridden": "0", "NoOverride": "0", @@ -310,7 +364,7 @@ function KDDrawColorSliders(X, Y, C, Model) { YY += 400; } else { let YYold = YY; - YY -= 25; + YY -= 24; for (let field0 of Object.entries(fields)) { let field = field0[0]; @@ -491,7 +545,6 @@ function KDDrawColorSliders(X, Y, C, Model) { } let radius = 150; - KDDraw(kdcanvas, kdpixisprites, "colorpicker", KinkyDungeonRootDirectory + "ColorPicker.png", X, YY, 300, 300); if (ElementValue("KDSelectedColor") && Model?.Filters && Model.Filters[KDCurrentLayer]) { let hsl = rgbToHsl( Math.max(0, Math.min(1, Model.Filters[KDCurrentLayer].red/5 || 0)), @@ -501,14 +554,55 @@ function KDDrawColorSliders(X, Y, C, Model) { 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-F]{6}$/i; + 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) ? KDhexToRGB(ElementValue("KDSelectedColor")) : 0xffffff, - }); + 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) { @@ -605,7 +699,7 @@ function KDDrawColorSliders(X, Y, C, Model) { if (TF.Created) { TF.Element.oninput = (event) => { let value = ElementValue("KDSelectedColor"); - let RegExp = /^#[0-9A-F]{6}$/i; + let RegExp = /^#[0-9A-Fa-f]{6}$/i; if (RegExp.test(value)) { let hex = KDhexToRGB(value); @@ -891,7 +985,7 @@ function KDChangeWardrobe(C) { if (C == KinkyDungeonPlayer) try { if (!KDOriginalValue) - KDOriginalValue = LZString.compressToBase64(CharacterAppearanceStringify(C)); + KDOriginalValue = AppearanceItemStringify(C.Appearance); } catch (e) { // Fail } @@ -1151,7 +1245,14 @@ function KDDrawWardrobe(screen, Character) { if (!ElementValue("KDOutfitName")) { ElementValue("KDOutfitName", KDOutfitInfo[KDCurrentOutfit]); } - KDDrawModelList(720, C); + if (KDShowCharacterPalette) { + 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) { @@ -1184,31 +1285,60 @@ function KDDrawWardrobe(screen, Character) { + 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") + KDOUTFITEXTENSION, - LZString.compressToBase64(CharacterAppearanceStringify(C || KinkyDungeonPlayer))); + downloadFile((ElementValue("savename") || KDOutfitInfo[KDCurrentOutfit] || "Outfit") + KDOUTFITBACKUP, + LZString.compressToBase64(CharacterAppearanceStringify(C || KinkyDungeonPlayer, + KDGetCharMetadata(C || KinkyDungeonPlayer) + ))); return true; - }, true, 715, 875, 240, 50, TextGet("KDBackupOutfits"), "#ffffff", + }, 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, 715, 930, 240, 50, TextGet("KDLoadOutfits"), "#ffffff", + }, true, 835, 930, 115, 50, TextGet("KDLoadOutfits"), "#ffffff", KinkyDungeonRootDirectory + "UI/Restore.png", "", false, false, undefined, undefined, true); - if (KDSelectedModel) { - KDDrawColorSliders(1625, 100, C, KDSelectedModel); + if (KDShowCharacterPalette) { + // nyet } else { - KDCurrentLayer = ""; - KDRefreshProps = true; + if (KDSelectedModel) { + KDDrawColorSliders(1625, 100, C, KDSelectedModel); + } else { + KDCurrentLayer = ""; + KDRefreshProps = true; + } } + // Return anon function anonymously let clickButton = (index) => { return (bdata) => { if (C == KinkyDungeonPlayer) { - KDOutfitStore[KDCurrentOutfit] = LZString.compressToBase64(CharacterAppearanceStringify(KinkyDungeonPlayer)); + KDOutfitStore[KDCurrentOutfit] = LZString.compressToBase64(CharacterAppearanceStringify(C || KinkyDungeonPlayer, + KDGetCharMetadata(C || KinkyDungeonPlayer) + )); KDOutfitOriginalStore[KDCurrentOutfit] = KDOriginalValue; ElementValue("KDOutfitName", ""); } @@ -1223,16 +1353,25 @@ function KDDrawWardrobe(screen, Character) { KinkyDungeonSetDress("None", "None", C, true); KDRefreshCharacter.set(C, true); KinkyDungeonDressPlayer(C, true); - CharacterAppearanceRestore(C, DecompressB64(NewOutfit), C != KinkyDungeonPlayer); + let newOut = DecompressB64(NewOutfit); + CharacterAppearanceRestore(C, newOut, C != KinkyDungeonPlayer); + 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); } else if (C == KinkyDungeonPlayer) { KDGetDressList().Default = KinkyDungeonDefaultDefaultDress; - CharacterAppearanceRestore(KinkyDungeonPlayer, CharacterAppearanceStringify(KinkyDungeonPlayerCharacter ? KinkyDungeonPlayerCharacter : Player)); + CharacterAppearanceRestore(KinkyDungeonPlayer, + CharacterAppearanceStringify(DefaultPlayer, + KDGetCharMetadata(DefaultPlayer) + )); CharacterReleaseTotal(KinkyDungeonPlayer); KinkyDungeonSetDress("Default", "Default", C, true); + C.Palette = ""; KDRefreshCharacter.set(C, true); KinkyDungeonDressPlayer(); KDInitProtectedGroups(KinkyDungeonPlayer); @@ -1296,8 +1435,6 @@ function KDDrawWardrobe(screen, Character) { DrawButtonKDEx("StripOutfit", (bdata) => { if (KDConfirmType == "strip" && KinkyDungeonReplaceConfirm > 0) { KDChangeWardrobe(C); - //if (C == KinkyDungeonPlayer) - //CharacterAppearanceRestore(KinkyDungeonPlayer, CharacterAppearanceStringify(KinkyDungeonPlayerCharacter ? KinkyDungeonPlayerCharacter : Player)); CharacterReleaseTotal(C); CharacterNaked(C); KDRefreshCharacter.set(C, true); @@ -1328,10 +1465,11 @@ function KDDrawWardrobe(screen, Character) { KinkyDungeonState = "LoadOutfit"; - //LZString.compressToBase64(CharacterAppearanceStringify(KinkyDungeonPlayer)); CharacterReleaseTotal(C || KinkyDungeonPlayer); ElementCreateTextArea("saveInputField"); - ElementValue("saveInputField", LZString.compressToBase64(CharacterAppearanceStringify(C || KinkyDungeonPlayer))); + 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, @@ -1365,7 +1503,12 @@ function KDDrawWardrobe(screen, Character) { KDSaveOutfitInfo(); } KinkyDungeonReplaceConfirm = 0; - localStorage.setItem("kinkydungeonappearance" + KDCurrentOutfit, LZString.compressToBase64(CharacterAppearanceStringify(KinkyDungeonPlayer))); + localStorage.setItem("kinkydungeonappearance" + KDCurrentOutfit, + LZString.compressToBase64( + CharacterAppearanceStringify(C || KinkyDungeonPlayer, + KDGetCharMetadata(C || KinkyDungeonPlayer) + ) + )); //localStorage.setItem("kdcurrentoutfit", KDCurrentOutfit + ""); KinkyDungeonDressSet(); KDOriginalValue = ""; @@ -1388,7 +1531,11 @@ function KDDrawWardrobe(screen, Character) { if (C == KinkyDungeonPlayer) { KDChangeWardrobe(C); KDGetDressList().Default = KinkyDungeonDefaultDefaultDress; - CharacterAppearanceRestore(KinkyDungeonPlayer, CharacterAppearanceStringify(KinkyDungeonPlayerCharacter ? KinkyDungeonPlayerCharacter : Player)); + CharacterAppearanceRestore(KinkyDungeonPlayer, + CharacterAppearanceStringify(DefaultPlayer, + KDGetCharMetadata(KinkyDungeonPlayer) + ) + ); CharacterReleaseTotal(KinkyDungeonPlayer); KinkyDungeonSetDress("Default", "Default", C, true); KinkyDungeonDressPlayer(); @@ -1471,7 +1618,7 @@ function KDDrawWardrobe(screen, Character) { let exportData = []; if (C?.Appearance) for (let a of C.Appearance) { - if (a.Model && !a.Model.Protected && !a.Model.Restraint && !a.Model.Cosplay) { + 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, @@ -1491,7 +1638,7 @@ function KDDrawWardrobe(screen, Character) { let exportData = []; if (C?.Appearance) for (let a of C.Appearance) { - if (a.Model && !a.Model.Protected && !a.Model.Restraint && !a.Model.Cosplay) { + 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, @@ -1513,7 +1660,7 @@ function KDDrawWardrobe(screen, Character) { let exportData = []; if (C?.Appearance) for (let a of C.Appearance) { - if (a.Model && a.Model.Protected && (a.Model.Categories?.includes("Face") && !a.Model.Categories?.includes("Hair") && !a.Model.Categories?.includes("Cosplay"))) { + 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, @@ -1532,7 +1679,7 @@ function KDDrawWardrobe(screen, Character) { let exportData = []; if (C?.Appearance) for (let a of C.Appearance) { - if (a.Model && a.Model.Protected && (a.Model.Categories?.includes("Hairstyles") && !a.Model.Categories?.includes("Cosplay"))) { + 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, @@ -1551,7 +1698,7 @@ function KDDrawWardrobe(screen, Character) { let exportData = []; if (C?.Appearance) for (let a of C.Appearance) { - if (a.Model && a.Model.Protected && (a.Model.Categories?.includes("Cosplay"))) { + if (a.Model && KDModelIsProtected(a.Model) && (a.Model.Categories?.includes("Cosplay"))) { exportData.push({ Item: a.Model.Name, Group: a.Model.Group || a.Model.Name, @@ -1600,11 +1747,6 @@ function KDSaveCodeOutfit(C, clothesOnly = false) { KDRefreshCharacter.set(C, true); KinkyDungeonDressPlayer(C, true); - /*if (stringified) { - localStorage.setItem("kinkydungeonappearance" + KDCurrentOutfit, stringified); - KDSaveOutfitInfo(); - KDRefreshOutfitInfo(); - }*/ //KinkyDungeonNewDress = true; } @@ -1612,7 +1754,7 @@ function KDSaveCodeOutfit(C, clothesOnly = false) { function KDRestoreOutfit() { // Restore the original outfit if (KDOriginalValue) { - CharacterAppearanceRestore(KinkyDungeonPlayer, DecompressB64(KDOriginalValue)); + CharacterAppearanceRestore(KinkyDungeonPlayer, DecompressB64(KDOriginalValue) || KDOriginalValue); CharacterRefresh(KinkyDungeonPlayer); KDInitProtectedGroups(KinkyDungeonPlayer); KinkyDungeonDressPlayer(); @@ -1718,7 +1860,7 @@ let KDVisualBrightness = 0.5; function KDLoadOutfit(files) { for (let f of files) { if (f && f.name) { - if (f.name.endsWith(KDOUTFITEXTENSION) || f.name.endsWith('.txt')) { + if (f.name.endsWith(KDOUTFITEXTENSION) || f.name.endsWith(KDOUTFITBACKUP) || f.name.endsWith('.txt')) { let str = ""; KDSaveName = f.name; try { @@ -1741,7 +1883,7 @@ function KDLoadOutfit(files) { function KDLoadOutfitDirect(files, Char) { for (let f of files) { if (f && f.name) { - if (f.name.endsWith(KDOUTFITEXTENSION) || f.name.endsWith('.txt')) { + if (f.name.endsWith(KDOUTFITEXTENSION) || f.name.endsWith(KDOUTFITBACKUP) || f.name.endsWith('.txt')) { let str = ""; KDSaveName = f.name; try { @@ -1754,6 +1896,10 @@ function KDLoadOutfitDirect(files, Char) { let origAppearance = Char.Appearance; try { CharacterAppearanceRestore(Char, decompressed, false); + let newParsed = JSON.parse(decompressed); + if (newParsed) { + Char.Palette = newParsed.metadata.palette; + } CharacterRefresh(Char); KDOldValue = str; KDInitProtectedGroups(Char); @@ -1775,3 +1921,15 @@ function KDLoadOutfitDirect(files, Char) { } } } + +/** + * + * @param {Character} C + * @returns {KDOutfitMetadata} + */ +function KDGetCharMetadata(C) { + return { + name: C.Name, + palette: C.Palette, + }; +} \ No newline at end of file diff --git a/Game/src/player/KinkyDungeonDress.js b/Game/src/player/KinkyDungeonDress.js index 1c0549a57..a05a14ab4 100644 --- a/Game/src/player/KinkyDungeonDress.js +++ b/Game/src/player/KinkyDungeonDress.js @@ -81,7 +81,7 @@ function KinkyDungeonDressSet(C) { for (let A = 0; A < C.Appearance.length; A++) { let save = false; if (StandalonePatched) { - if (C.Appearance[A].Model?.Protected) save = true; + 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({ @@ -177,7 +177,7 @@ function KinkyDungeonDressPlayer(Character, NoRestraints, Force, npcRestraints, if (!noDressOutfit && KDNPCStyle.get(Character)?.customOutfit) { DressList = []; for (let a of JSON.parse(DecompressB64(KDNPCStyle.get(Character)?.customOutfit))) { - if (a.Model && !a.Model.Protected && !a.Model.Restraint && !a.Model.Cosplay) { + 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, @@ -198,8 +198,6 @@ function KinkyDungeonDressPlayer(Character, NoRestraints, Force, npcRestraints, Character: Character, }; - KinkyDungeonPlayer.OnlineSharedSettings = {BlockBodyCosplay: true}; - if (KinkyDungeonCheckClothesLoss) KDRefreshCharacter.set(Character, true); // if true, nakeds the player, then reclothes @@ -224,7 +222,7 @@ function KinkyDungeonDressPlayer(Character, NoRestraints, Force, npcRestraints, if (StandalonePatched) { let model = Character.Appearance[A]?.Model; if (model && ((!model.Restraint && !model.Group?.startsWith("Item") && !clothGroups[model.Group || model.Name]) - || model.Protected || model.SuperProtected)) { + || KDModelIsProtected(model) || model.SuperProtected)) { //Character.Appearance.splice(A, 1); //A -= 1; newAppearance[model.Group || model.Name] = Character.Appearance[A]; @@ -773,11 +771,8 @@ function KinkyDungeonGetOutfit(Name) { */ function KDInventoryWear(Character, AssetName, AssetGroup, par, color, filters, Properties) { const M = StandalonePatched ? ModelDefs[AssetName] : undefined; - const A = AssetGet(Character.AssetFamily, AssetGroup, AssetName); - if ((StandalonePatched && !M) || (!StandalonePatched && !A)) return; - let item = StandalonePatched ? - KDAddModel(Character, AssetGroup, M, color || "Default", filters, undefined, Properties) - : KDAddAppearance(Character, AssetGroup, A, color || A.DefaultColor); + 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; @@ -803,7 +798,7 @@ function KDCharacterAppearanceNaked(C) { let f = !(C.Appearance[A]?.Model && ((C == KinkyDungeonPlayer && KDProtectedCosplay.includes(C.Appearance[A].Model.Group)) - || C.Appearance[A].Model.Protected + || KDModelIsProtected(C.Appearance[A].Model) || C.Appearance[A].Model.SuperProtected)); if (!f){continue;} C.Appearance.splice(A, 1); @@ -912,69 +907,6 @@ function KDApplyItem(C, inv, tags, customFaction = undefined) { } } return; - } else - KDApplyItemLegacy(inv, tags); -} - -/** Legacy */ -function KDApplyItemLegacy(C, inv, tags) { - if (!C) C = KinkyDungeonPlayer; - let _ChatRoomCharacterUpdate = ChatRoomCharacterUpdate; - ChatRoomCharacterUpdate = () => {}; - try { - let restraint = KDRestraint(inv); - let AssetGroup = restraint.AssetGroup ? restraint.AssetGroup : restraint.Group; - let faction = inv.faction ? inv.faction : ""; - - - let data = { - color: "", - faction: faction, - }; - KinkyDungeonSendEvent("legacyApply", data); - - //let already = InventoryGet(C, AssetGroup); - //let difficulty = already?.Property?.Difficulty || 0; - - /** @type {Item} */ - let placed = null; - - if (!restraint.armor || KDToggles.DrawArmor) { - placed = KDAddAppearance(C, AssetGroup, AssetGet("3DCGFemale", AssetGroup, restraint.Asset), data.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) { - 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.Modules) { - let D = ModularItemDataLookup[AssetGroup + restraint.Asset]; - let asset = D.asset; - let modules = D.modules; - placed.Property = ModularItemMergeModuleValues({ asset, modules }, restraint.Modules); - placed.Property.LockedBy = inv.lock ? "MetalPadlock" : undefined; - } else if (type) TypedItemSetOptionByName(C, placed, type, false); - if (restraint.OverridePriority) { - placed.Property.OverridePriority = restraint.OverridePriority; - } - } - } finally { - ChatRoomCharacterUpdate = _ChatRoomCharacterUpdate; } } diff --git a/Game/src/player/KinkyDungeonPerks.js b/Game/src/player/KinkyDungeonPerks.js index 35467342a..46d5a6648 100644 --- a/Game/src/player/KinkyDungeonPerks.js +++ b/Game/src/player/KinkyDungeonPerks.js @@ -481,6 +481,7 @@ let KinkyDungeonStatsPresets = { "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"]}, }; @@ -601,7 +602,7 @@ function KDInitPerks() { // We use magichands for the start scenarios KinkyDungeonStatsChoice.set("MagicHands", true); } - KinkyDungeonPlayerTags = KinkyDungeonUpdateRestraints(0.0); + 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); @@ -755,6 +756,8 @@ let KDPerkStart = { KDCustomDefeatUniforms.CyberDoll(); KDFixPlayerClothes((KinkyDungeonStatsChoice.get("DollmakerVisor") || KinkyDungeonStatsChoice.get("DollmakerMask") || KinkyDungeonStatsChoice.get("CommonCyber")) ? "Dollsmith" : "AncientRobot"); if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + KinkyDungeonRedKeys = 0; + KinkyDungeonLockpicks = 0; }, StartMaid: () =>{ KDAddQuest("MaidSweeper"); @@ -764,6 +767,8 @@ let KDPerkStart = { KinkyDungeonInventoryAddLoose("DusterGag"); KDFixPlayerClothes("Maidforce"); if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + KinkyDungeonRedKeys = 0; + KinkyDungeonLockpicks = 0; }, StartWolfgirl: () =>{ KDChangeFactionRelation("Player", "Nevermere", 0.2 - KDFactionRelation("Player", "Nevermere"), true); @@ -771,6 +776,8 @@ let KDPerkStart = { KDAddQuest("WolfgirlHunters"); KDFixPlayerClothes("Nevermere"); if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + KinkyDungeonRedKeys = 0; + KinkyDungeonLockpicks = 0; }, StartObsidian: () =>{ KDChangeFactionRelation("Player", "Elemental", 0.2 - KDFactionRelation("Player", "Elemental"), true); @@ -780,6 +787,8 @@ let KDPerkStart = { KDFixPlayerClothes("Elemental"); if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + KinkyDungeonRedKeys = 0; + KinkyDungeonLockpicks = 0; }, Hogtied: () =>{ KDAddQuest("Nawashi"); @@ -790,6 +799,8 @@ let KDPerkStart = { } KDFixPlayerClothes("Jail"); if (!KDHasSpell("ZeroResistance")) KDPushSpell(KinkyDungeonFindSpell("ZeroResistance")); + KinkyDungeonRedKeys = 0; + KinkyDungeonLockpicks = 0; }, Bandit: () =>{ for (let key of Object.keys(KinkyDungeonFactionTag)) { @@ -880,7 +891,6 @@ function KinkyDungeonDrawPerks(NonSelectable) { let tooltip = false; let catsdrawn = 0; - let perksdrawn = 0; let catsdrawnStrict = 0; function inView() { @@ -899,6 +909,8 @@ function KinkyDungeonDrawPerks(NonSelectable) { }; + 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); @@ -908,25 +920,20 @@ function KinkyDungeonDrawPerks(NonSelectable) { Y = KDPerksYStart; } + let oldY = Y; + let oldYAlt = Y_alt; Y += KDPerksYPad; Y_alt = Y; - //MainCanvas.textAlign = "left"; - DrawTextFitKDTo(kdUItext, TextGet("KDCategory" + c.name), X + KDPerksButtonWidth + KDPerksButtonWidthPad/2, Y - KDPerksButtonHeight/2 - 5, KDPerksButtonWidth*2, "#ffffff", - undefined, undefined, undefined, undefined, undefined, undefined, true); - //MainCanvas.textAlign = "center"; - if (inView()) { - catsdrawn += 1; - } - if (inViewStrict()) { - catsdrawnStrict += 1; - if (!firstDrawn) firstDrawn = c.name; - } + + 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 : @@ -938,7 +945,7 @@ function KinkyDungeonDrawPerks(NonSelectable) { 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 += 1; + //perksdrawn++;x DrawButtonKDExTo(kdUItext, stat[0], (bdata) => { if (!KinkyDungeonStatsChoice.get(stat[0]) && KinkyDungeonCanPickStat(stat[0])) { KinkyDungeonStatsChoice.set(stat[0], true); @@ -988,6 +995,23 @@ function KinkyDungeonDrawPerks(NonSelectable) { 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; } @@ -1026,6 +1050,7 @@ function KinkyDungeonDrawPerks(NonSelectable) { if ((catsdrawn < 3 || perksdrawn == 0) && KDPerksIndex > 0) KDPerksIndex -= 1; + return tooltip; } @@ -1073,6 +1098,7 @@ function drawHorizList(list, x, y, w, h, max, fontSize, clickfnc, prefix, revers /** * * @param {Record} existing + * @param {boolean} [debuff] * @returns {string[]} */ function KDGetRandomPerks(existing, debuff) { @@ -1210,4 +1236,4 @@ function KDGetPerkShrineBondage(perks) { } return ret; -} \ No newline at end of file +} diff --git a/Game/src/player/KinkyDungeonStats.js b/Game/src/player/KinkyDungeonStats.js index 4130a2552..d8c7383ff 100644 --- a/Game/src/player/KinkyDungeonStats.js +++ b/Game/src/player/KinkyDungeonStats.js @@ -608,7 +608,7 @@ function KinkyDungeonDealDamage(Damage, bullet, noAlreadyHit, noInterrupt, noMsg } let shieldDmg = Math.max(0, Math.min(KDGameData.Shield, amt - Math.max(0, data.dmg))); - KDDamagePlayerShield(shieldDmg); + KDDamagePlayerShield(shieldDmg, KDPlayer()); if (data.dmg < 0) data.dmg = 0; data.dmgShield += shieldDmg; } @@ -1176,6 +1176,11 @@ function KinkyDungeonHasWill(Cost, AddRate) { return s >= Cost; } +/** + * @param {number} Cost + * @param {boolean} [AddRate] + * @returns {boolean} + */ function KinkyDungeonHasMana(Cost, AddRate) { let s = KinkyDungeonStatMana; if (AddRate) s += KinkyDungeonStatManaRate; @@ -2204,4 +2209,4 @@ function KDIsBlindfolded(player) { */ function KDCanHack(player) { return (KinkyDungeonPlayerTags.get("Cyberjack")); -} \ No newline at end of file +} diff --git a/Game/src/player/KinkyDungeonVibe.js b/Game/src/player/KinkyDungeonVibe.js index 89f2796a7..ca5c3545d 100644 --- a/Game/src/player/KinkyDungeonVibe.js +++ b/Game/src/player/KinkyDungeonVibe.js @@ -105,7 +105,7 @@ function KDUpdateVibeSound(Location, Sound, Volume) { if (Sound && !KDVibeSounds[Location].update) { // Start the new sound let audio = new Audio(); - let vol = Player.AudioSettings.Volume * (Volume != undefined ? Volume : 1.0); + let vol = (Volume != undefined ? Volume : 1.0); if (KDVibeSounds[Location].vol) vol *= KDVibeSounds[Location].vol; KDVibeSounds[Location].Audio = audio; KDVibeSounds[Location].update = true; @@ -126,7 +126,7 @@ function KDUpdateVibeSound(Location, Sound, Volume) { 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); + KDVibeSounds[Location].Audio.volume = Math.min(Volume * (KDVibeSounds[Location].vol ? KDVibeSounds[Location].vol : 1.0), 1); } } diff --git a/Game/src/prison/KDPrison.js b/Game/src/prison/KDPrison.ts similarity index 73% rename from Game/src/prison/KDPrison.js rename to Game/src/prison/KDPrison.ts index a4ffd05cb..4c41f0deb 100644 --- a/Game/src/prison/KDPrison.js +++ b/Game/src/prison/KDPrison.ts @@ -1,12 +1,11 @@ 'use strict'; /** - * @param {number} x - * @param {number} y - * @returns {entity} + * @param x + * @param y */ -function KDGetNearestFactionGuard(x, y) { - let condition = (en) => { +function KDGetNearestFactionGuard(x: number, y: number): entity { + let condition = (en: entity) => { return (KDEnemyHasFlag(en, "mapguard") || ( KDGetFaction(en) == KDGetMainFaction() @@ -34,11 +33,9 @@ function KDGetNearestFactionGuard(x, y) { } /** - * - * @param {entity} player - * @returns {entity} + * @param player */ -function KDPrisonCommonGuard(player, call = false) { +function KDPrisonCommonGuard(player: entity, _call: boolean = false): entity { // Suppress standard guard call behavior KinkyDungeonSetFlag("SuppressGuardCall", 10); let guard = KDGetNearestFactionGuard(player.x, player.y); @@ -51,30 +48,17 @@ function KDPrisonCommonGuard(player, call = false) { /** * Gets the groups and restraints to add based on a set of jail tags - * @param {entity} player - * @param {string[]} jailLists - * @param {string} lock - * @param {number} maxPower - * @returns {KDJailGetGroupsReturn} + * @param player + * @param jailLists + * @param lock + * @param maxPower */ -function KDPrisonGetGroups(player, jailLists, lock, maxPower) { - /** - * @type {string[]} - */ - let groupsToStrip = []; - /** - * @type {{item: string; variant: string}[]} - */ - let itemsToApply = []; +function KDPrisonGetGroups(_player: entity, jailLists: string[], lock: string, maxPower: number): KDJailGetGroupsReturn { + let groupsToStrip: string[] = []; + let itemsToApply: {item: string; variant: string}[] = []; let itemsApplied = {}; - /** - * @type {Record} - */ - let itemsToKeep = {}; - /** - * @type {Record} - */ - let itemsToStrip = {}; + let itemsToKeep: Record = {}; + let itemsToStrip: Record = {}; // First populate the items let jailList = KDGetJailRestraints(jailLists, false, false); @@ -129,10 +113,9 @@ function KDPrisonGetGroups(player, jailLists, lock, maxPower) { /** * Throttles prison checks - * @param {entity} player - * @returns {boolean} + * @param player */ -function KDPrisonTick(player) { +function KDPrisonTick(_player: entity): boolean { if (!KinkyDungeonFlags.get("prisonCheck")) { KinkyDungeonSetFlag("prisonCheck", 3 + Math.floor(KDRandom() * 3)); return true; @@ -141,11 +124,9 @@ function KDPrisonTick(player) { } /** - * - * @param {entity} player - * @returns {boolean} + * @param player */ -function KDPrisonIsInFurniture(player) { +function KDPrisonIsInFurniture(player: entity): boolean { if (KinkyDungeonPlayerTags.get("Furniture")) { let tile = KinkyDungeonTilesGet(player.x + "," + player.y); if (tile?.Furniture) { @@ -156,22 +137,18 @@ function KDPrisonIsInFurniture(player) { } /** - * - * @param {entity} player - * @param {string} state - * @returns {string} + * @param player + * @param state */ -function KDGoToSubState(player, state) { +function KDGoToSubState(_player: entity, state: string): string { KDMapData.PrisonStateStack.unshift(KDMapData.PrisonState); return state; } /** - * - * @param {entity} player - * @returns {string} + * @param player */ -function KDPopSubstate(player) { +function KDPopSubstate(_player: entity): string { let state = KDMapData.PrisonStateStack[0]; if (state) { KDMapData.PrisonStateStack.splice(0, 1); @@ -183,11 +160,10 @@ function KDPopSubstate(player) { /** * Resets the prison state stack - * @param {entity} player - * @param {string} state - * @returns {string} + * @param player + * @param state */ -function KDSetPrisonState(player, 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); @@ -199,10 +175,8 @@ function KDSetPrisonState(player, state) { } /** - * - * @param {entity} player - * @returns {string} + * @param player */ -function KDCurrentPrisonState(player) { +function KDCurrentPrisonState(_player: entity): string { return KDMapData.PrisonState; -} \ No newline at end of file +} diff --git a/Game/src/prison/KDPrisonList.ts b/Game/src/prison/KDPrisonList.ts index 98886baab..0482f57fb 100644 --- a/Game/src/prison/KDPrisonList.ts +++ b/Game/src/prison/KDPrisonList.ts @@ -38,9 +38,8 @@ let KDPRISONGROUPS = [ ]; /** - * @type {Record} */ -let KDPrisonTypes = { +let KDPrisonTypes: Record = { Summit: { name: "Summit", default_state: "BusinessAsUsual", diff --git a/Game/src/prison/KinkyDungeonJail.js b/Game/src/prison/KinkyDungeonJail.ts similarity index 90% rename from Game/src/prison/KinkyDungeonJail.js rename to Game/src/prison/KinkyDungeonJail.ts index 7f9a96dc8..8c8693d6c 100644 --- a/Game/src/prison/KinkyDungeonJail.js +++ b/Game/src/prison/KinkyDungeonJail.ts @@ -12,7 +12,7 @@ let KDMaxKeys = 2; /** Only these have jail events */ let KDJailFilters = ['jail']; -function KDAssignGuardAction(guard, xx, yy) { +function KDAssignGuardAction(guard: entity, xx: number, yy: number): void { let eventWeightTotal = 0; let eventWeights = []; @@ -31,7 +31,7 @@ function KDAssignGuardAction(guard, xx, yy) { } } -function KDGetJailEvent(guard, xx, yy) { +function KDGetJailEvent(guard: entity, xx: number, yy: number): (g: entity, x: number, y: number) => void { let eventWeightTotal = 0; let eventWeights = []; @@ -47,11 +47,11 @@ function KDGetJailEvent(guard, xx, yy) { return eventWeights[L].event.trigger; } } - return (g, x, y) => {}; + return (_g, _x, _y) => {}; } -function KinkyDungeonLoseJailKeys(Taken, boss, enemy) { +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) { @@ -81,7 +81,7 @@ function KinkyDungeonUpdateJailKeys() { } } -function KinkyDungeonAggroFaction(faction, noAllyRepPenalty, securityPenalty = 0) { +function KinkyDungeonAggroFaction(faction: string, noAllyRepPenalty?: boolean, securityPenalty: number = 0): boolean { if (faction == "Player") return false; let list = []; let list2 = []; @@ -142,12 +142,10 @@ function KinkyDungeonPlayerIsVisibleToJailers() { } /** - * - * @param {number} playChance - * @param {entity} enemy - * @returns {number} + * @param playChance + * @param enemy */ -function KDCalcPlayChance(playChance, 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; @@ -169,11 +167,9 @@ function KDCalcPlayChance(playChance, enemy) { } /** - * - * @param {entity} enemy - * @returns {boolean} + * @param enemy */ -function KinkyDungeonCanPlay(enemy) { +function KinkyDungeonCanPlay(enemy: entity): boolean { return (KDGameData.PrisonerState == 'parole' || KDGameData.PrisonerState == 'jail' || (!KDHostile(enemy) && !(KDAllied(enemy) && !KDEnemyHasFlag(enemy, "allyPlay")))) @@ -183,7 +179,7 @@ function KinkyDungeonCanPlay(enemy) { } function KinkyDungeonCheckRelease() { - if (KDMapData.JailFaction && KDFactionRelation("Jail", KDMapData.JailFaction) < -0.15) return -1; + 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; @@ -205,11 +201,11 @@ let KDMaxAlertTimer = 14; let KDMaxAlertTimerAggro = 300; /** - * - * @param {string} action - * @param {{enemy?: entity, x?: number, y?: number, faction?: string, force?: boolean}} data + * @param action + * @param data */ -function KinkyDungeonAggroAction(action, 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 @@ -300,24 +296,18 @@ function KinkyDungeonAggroAction(action, data) { } } -/** - * @type {string[]} - */ -let KDLocalChaseTypes = ["Refusal", "Attack", "Spell", "SpellItem", "Shrine", "Orb", "Chest"]; -/** - * @type {string[]} - */ -let KDSevereTypes = ["Attack"]; +let KDLocalChaseTypes: string[] = ["Refusal", "Attack", "Spell", "SpellItem", "Shrine", "Orb", "Chest"]; +let KDSevereTypes: string[] = ["Attack"]; /** - * - * @param {entity} enemy - * @param {string} Type - * @param {string} [faction] - * @param {boolean} [force] + * @param enemy + * @param Type + * @param [faction] + * @param [force] */ -function KinkyDungeonStartChase(enemy, Type, faction, 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') { KinkyDungeonChangeRep("Ghost", -10); @@ -371,11 +361,10 @@ function KinkyDungeonStartChase(enemy, Type, faction, force) { } /** - * - * @param {entity} enemy - * @param {string} Type + * @param enemy + * @param Type */ -function KinkyDungeonPlayExcuse(enemy, Type) { +function KinkyDungeonPlayExcuse(enemy: entity, Type: string): void { if (Type == "Free" && enemy && enemy.Enemy.noChaseUnrestrained) { return; } @@ -394,31 +383,27 @@ function KinkyDungeonPlayExcuse(enemy, Type) { } /** - * - * @param {entity} enemy - * @param {number} mult - * @param {number} base + * @param enemy + * @param mult + * @param base */ -function KDSetPlayCD(enemy, mult, base = 10) { +function KDSetPlayCD(enemy: entity, mult: number, base: number = 10): void { enemy.playWithPlayerCD = Math.max(enemy.playWithPlayerCD || 0, base * mult + (enemy.playWithPlayer || 0) * mult); } /** - * - * @param {string} Group - * @param {KDJailRestraint[]} [jailRestraintList] - * @param {string} [lock] - * @returns {{restraint: restraint, variant: string}} + * @param Group + * @param [jailRestraintList] + * @param [lock] */ -function KinkyDungeonGetJailRestraintForGroup(Group, jailRestraintList, lock) { +function KinkyDungeonGetJailRestraintForGroup(Group: string, jailRestraintList?: KDJailRestraint[], lock?: string): {restraint: restraint, variant: string} { if (!jailRestraintList) { jailRestraintList = KDGetJailRestraints(); } /** - * @type {restraint} */ - let cand = null; + let cand: restraint = null; let variant = ""; let candLevel = 0; let currentItem = KinkyDungeonGetRestraintItem(Group); @@ -500,22 +485,19 @@ function KinkyDungeonGetJailRestraintForGroup(Group, jailRestraintList, lock) { /** - * - * @param {string} Group - * @param {boolean} agnostic - Dont care about whether it can be put on or not - * @param {KDJailRestraint[]} [jailRestraintList] - * @param {string} [lock] - * @returns {{restraint: restraint, variant: string, def: KDJailRestraint}[]} + * @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, jailRestraintList, agnostic = false, lock, ignoreLevel = false, ignoreWorn = false) { +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(); } - /** - * @type {{restraint: restraint, variant: string, def: KDJailRestraint}[]} - */ - let cands = []; + let cands: {restraint: restraint, variant: string, def: KDJailRestraint}[] = []; for (let pri of [true, false]) { for (let r of jailRestraintList) { let level = 0; @@ -548,11 +530,9 @@ function KinkyDungeonGetJailRestraintsForGroup(Group, jailRestraintList, agnosti } /** - * - * @param {KDJailRestraint} r - * @returns {boolean} + * @param r */ -function KDJailCondition(r) { +function KDJailCondition(r: KDJailRestraint): boolean { if (r.Condition && KDJailConditions[r.Condition]) { return KDJailConditions[r.Condition](r); } @@ -560,11 +540,9 @@ function KDJailCondition(r) { } /** - * - * @param {KDJailRestraint} r - * @returns {boolean} + * @param r */ -function KDPriorityCondition(r) { +function KDPriorityCondition(r: KDJailRestraint): boolean { if (r.Priority && KDJailConditions[r.Priority]) { return KDJailConditions[r.Priority](r); } @@ -572,7 +550,7 @@ function KDPriorityCondition(r) { } -function KinkyDungeonGetJailRestraintLevelFor(Name) { +function KinkyDungeonGetJailRestraintLevelFor(Name: string): number { for (let r of KDGetJailRestraints()) { if (r.Name === Name) { return r.Level; @@ -582,11 +560,9 @@ function KinkyDungeonGetJailRestraintLevelFor(Name) { } /** - * - * @param {string[]} [filter] - Have to be in a jail, not a dropoff - * @returns {boolean} + * @param [filter] - Have to be in a jail, not a dropoff */ -function KinkyDungeonInJail(filter) { +function KinkyDungeonInJail(filter: string[]): boolean { return KinkyDungeonPlayerInCell(false, false, filter);//KDGameData.KinkyDungeonSpawnJailers > 0 && KDGameData.KinkyDungeonSpawnJailers + 1 >= KDGameData.KinkyDungeonSpawnJailersMax; } @@ -624,7 +600,7 @@ function KinkyDungeonPlaceJailKeys() { } } -function KinkyDungeonHandleJailSpawns(delta) { +function KinkyDungeonHandleJailSpawns(delta: number): void { if (KDGameData.JailTurns) KDGameData.JailTurns += delta; else KDGameData.JailTurns = 1; if (KinkyDungeonInJail(KDJailFilters)) KDGameData.JailRemoveRestraintsTimer += delta; @@ -769,14 +745,7 @@ function KinkyDungeonHandleJailSpawns(delta) { function KinkyDungeonLockableItems() { let LockableGroups = []; - for (let gr of KinkyDungeonStruggleGroupsBase) { - let g = gr; - if (gr == "ItemM") { - g = "ItemMouth"; - } - if (gr == "ItemH") { - g = "ItemHead"; - } + for (let g of KinkyDungeonStruggleGroupsBase) { let currentItem = KinkyDungeonGetRestraintItem(g); if (currentItem && !currentItem.lock && KinkyDungeonIsLockable(KDRestraint(currentItem))) { LockableGroups.push(g); @@ -787,18 +756,8 @@ function KinkyDungeonLockableItems() { 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 = "ItemHead"; - } + for (let g of KinkyDungeonStruggleGroupsBase) { + let jrest = KinkyDungeonGetJailRestraintForGroup(g); let rest = jrest.restraint; let currentItem = KinkyDungeonGetRestraintItem(g); @@ -853,12 +812,11 @@ function KinkyDungeonTooMuchRestraint() { } /** - * - * @param {entity} player - * @param {entity} enemy - * @param {{x: number, y: number}} point + * @param player + * @param enemy + * @param point */ -function KDPutInJail(player, enemy, point) { +function KDPutInJail(player: entity, enemy: entity, point: { x: number, y: number }): void { let entity = enemy ? enemy : player; let nearestJail = KinkyDungeonNearestJailPoint(entity.x, entity.y); let jailRadius = (nearestJail && nearestJail.radius) ? nearestJail.radius : 1.5; @@ -878,12 +836,11 @@ function KDPutInJail(player, enemy, point) { } /** - * - * @param {number} xx - * @param {number} yy - * @param {string} type + * @param xx + * @param yy + * @param type */ -function KinkyDungeonHandleLeashTour(xx, yy, 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) { @@ -936,8 +893,20 @@ function KinkyDungeonHandleLeashTour(xx, yy, type) { 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; + 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 { @@ -948,6 +917,20 @@ function KinkyDungeonHandleLeashTour(xx, yy, type) { 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; } @@ -963,8 +946,12 @@ function KinkyDungeonHandleLeashTour(xx, yy, type) { 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) + && (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) { @@ -1040,7 +1027,7 @@ function KinkyDungeonHandleLeashTour(xx, yy, type) { } } -function KDGetEffSecurityLevel(faction, Cap) { +function KDGetEffSecurityLevel(faction?: string, Cap?: boolean): number { if (!faction) faction = KDGetMainFaction(); let basemod = (KinkyDungeonStatsChoice.get("NoWayOut") ? 10 : 0) @@ -1056,12 +1043,11 @@ function KDGetEffSecurityLevel(faction, Cap) { } /** - * - * @param {number} xx - * @param {number} yy - * @param {string} type + * @param xx + * @param yy + * @param type */ -function KinkyDungeonJailGuardGetLeashWaypoint(xx, yy, 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)]); @@ -1090,7 +1076,7 @@ function KinkyDungeonJailGuardGetLeashWaypoint(xx, yy, type) { } } -function KinkyDungeonJailGetLeashPoint(xx, yy, enemy) { +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); @@ -1106,12 +1092,12 @@ function KinkyDungeonJailGetLeashPoint(xx, yy, enemy) { } /** - * @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 + * @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, qualified, filter) { +function KinkyDungeonPlayerInCell(any?: boolean, qualified?: boolean, filter?: string[]): boolean { if (!filter && KinkyDungeonTilesGet(KinkyDungeonPlayerEntity.x + "," + KinkyDungeonPlayerEntity.y)?.Jail) { return true; } @@ -1121,14 +1107,14 @@ function KinkyDungeonPlayerInCell(any, qualified, filter) { //return (Math.abs(KinkyDungeonPlayerEntity.x - KDMapData.StartPosition.x) < KinkyDungeonJailLeashX - 1 && Math.abs(KinkyDungeonPlayerEntity.y - KDMapData.StartPosition.y) <= KinkyDungeonJailLeash); } -function KinkyDungeonPointInCell(x, y, radius = 2) { +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) { +function KinkyDungeonPassOut(noteleport?: boolean) { KDDefeatedPlayerTick(); KDBreakTether(KinkyDungeonPlayerEntity); KDGameData.KinkyDungeonLeashedPlayer = 0; @@ -1181,7 +1167,7 @@ function KinkyDungeonPassOut(noteleport) { KDGameData.SlowMoveTurns = 10; } -function KDGetJailDoor(x, y) { +function KDGetJailDoor(x: number, y: number): { tile: any; x: number; y: number } { let point = KinkyDungeonNearestJailPoint(x, y); if (point) { x = point.x; @@ -1191,7 +1177,7 @@ function KDGetJailDoor(x, y) { return {tile: KinkyDungeonTilesGet((x) + "," + y), x: x, y: y}; } -function KDDefeatedPlayerTick(nodefeat) { +function KDDefeatedPlayerTick(nodefeat?: boolean) { KinkyDungeonSetFlag("refusedShopkeeperRescue", 5); // To prevent spawning instantly KinkyDungeonRemoveBuffsWithTag(KinkyDungeonPlayerEntity, ["removeDefeat"]); KDGameData.JailGuard = 0; @@ -1229,7 +1215,7 @@ function KDEnterDemonTransition() { KinkyDungeonSaveGame(); } -function KDEnterDollTerminal(willing, cancelDialogue = true, forceOutfit = true) { +function KDEnterDollTerminal(willing: boolean, cancelDialogue: boolean = true, forceOutfit: boolean = true): void { let dollStand = KinkyDungeonPlayerTags.get("Dollstand"); KDDefeatedPlayerTick(!willing); @@ -1326,7 +1312,7 @@ function KDApplyLivingCollars() { } } -function KinkyDungeonDefeat(PutInJail, leashEnemy) { +function KinkyDungeonDefeat(PutInJail?: boolean, leashEnemy?: entity) { KinkyDungeonInterruptSleep(); KDBreakAllLeashedTo(KinkyDungeonPlayerEntity); @@ -1416,7 +1402,6 @@ function KinkyDungeonDefeat(PutInJail, leashEnemy) { if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/StoneDoor_Close.ogg"); KDMapData.KeysHeld = 0; - KinkyDungeonSaveGame(); if (PutInJail) { //KDGameData.RoomType = "Jail"; // We do a tunnel every other room @@ -1464,7 +1449,7 @@ function KinkyDungeonDefeat(PutInJail, leashEnemy) { 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.Jail || (KDGameData.PrisonerState == 'jail' || KDistChebyshev(KDPlayer().x - X, KDPlayer().y - Y) > 2.5))) { tile.Lock = tile.OGLock || "Red"; tile.Type = "Door"; KDUpdateDoorNavMap(); @@ -1477,13 +1462,13 @@ function KinkyDungeonDefeat(PutInJail, leashEnemy) { KDRepairRubble(true); + KinkyDungeonSaveGame(); } /** - * - * @param {boolean} JailBorderOnly + * @param JailBorderOnly */ -function KDRepairRubble(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++) { @@ -1516,23 +1501,20 @@ function KDRepairRubble(JailBorderOnly) { } /** - * - * @param {entity} enemy - * @returns {boolean} + * @param enemy */ -function KDEnemyIsTemporary(enemy) { +function KDEnemyIsTemporary(enemy: entity): boolean { return enemy.Enemy.tags.temporary || (enemy.lifetime > 0); } /** * Kicks enemies away, and also out of offlimits zones if they are aware - * @param {any} nearestJail - * @param {boolean} ignoreAware - * @param {number} Level - * @param {boolean} [noCull] - * @returns + * @param nearestJail + * @param ignoreAware + * @param Level + * @param [noCull] */ -function KDKickEnemies(nearestJail, ignoreAware, Level, noCull) { +function KDKickEnemies(nearestJail: any, ignoreAware: boolean, Level: number, noCull?: boolean): boolean { let altRoom = KDMapData.RoomType; let mapMod = KDMapData.MapMod ? KDMapMods[KDMapData.MapMod] : null; @@ -1615,7 +1597,7 @@ function KDKickEnemies(nearestJail, ignoreAware, Level, noCull) { return atLeastOneAware; } -function KDResetAllIntents(nonHostileOnly, endPlay = 30, player) { +function KDResetAllIntents(nonHostileOnly?: boolean, endPlay: number = 30, _player?: void) { for (let e of KDMapData.Entities) { if (!nonHostileOnly || !KinkyDungeonAggressive(e)) { if (endPlay) { @@ -1629,14 +1611,14 @@ function KDResetAllIntents(nonHostileOnly, endPlay = 30, player) { } } -function KDResetAllAggro(player) { +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, radius = 10) { +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) { @@ -1647,10 +1629,9 @@ function KDForceWanderFar(player, radius = 10) { } /** - * - * @param {entity} en + * @param en */ -function KDWanderEnemy(en) { +function KDWanderEnemy(en: entity) { en.gx = en.x; en.gy = en.y; KinkyDungeonSetEnemyFlag(en, "forceWFar", 5); @@ -1659,13 +1640,15 @@ function KDWanderEnemy(en) { /** * Moves an enemy to a random position on the map - * @param {entity} e + * @param e */ -function KDKickEnemy(e, minDist = 10) { - if (!e.Enemy.tags.temporary) { +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) ? {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)) { + 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) { @@ -1688,16 +1671,16 @@ function KDKickEnemy(e, minDist = 10) { /** * Moves an enemy to a random position nearby - * @param {entity} e + * @param e */ -function KDKickEnemyLocal(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) { +function KinkyDungeonStripInventory(KeepPicks: boolean) { KinkyDungeonRedKeys = 0; KinkyDungeonBlueKeys = 0; KinkyDungeonLockpicks = KeepPicks ? (Math.min(Math.max(0, Math.round(3 * (1 - (KDGetEffSecurityLevel(undefined, true) + 50)/100))), KinkyDungeonLockpicks)) : 0; @@ -1718,7 +1701,7 @@ function KinkyDungeonStripInventory(KeepPicks) { } } -function KDExpireFlags(enemy) { +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; @@ -1728,12 +1711,11 @@ function KDExpireFlags(enemy) { /** * 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 {KDJailRestraint[]} + * @param [overrideTags] + * @param [requireJail] + * @param [requireParole] */ -function KDGetJailRestraints(overrideTags, requireJail, requireParole) { +function KDGetJailRestraints(overrideTags?: string[], requireJail?: boolean, requireParole?: boolean): KDJailRestraint[] { let restraints = []; //let pris = {}; let guard = KinkyDungeonJailGuard(); @@ -1781,10 +1763,9 @@ function KDGetJailRestraints(overrideTags, requireJail, requireParole) { } /** - * @type {Record void>} */ -let KDCustomDefeats = { - "DemonTransition": (enemy) => { +let KDCustomDefeats: Record void> = { + "DemonTransition": (_enemy) => { KDEnterDemonTransition(); }, WolfgirlHunters: (enemy) => { @@ -1815,7 +1796,7 @@ let KDCustomDefeats = { }, - RopeDojo: (enemy) => { + RopeDojo: (_enemy) => { KinkyDungeonPassOut(false); KDCustomDefeatUniforms.RopeDojo(); }, @@ -1931,7 +1912,7 @@ let KDCustomDefeatUniforms = { }, }; -function KDFixPlayerClothes(faction) { +function KDFixPlayerClothes(faction: string) { for (let inv of KinkyDungeonAllRestraintDynamic()) { inv.item.faction = faction; } @@ -1955,11 +1936,9 @@ let KDChestPenalty = { }; /** - * - * @param {{enemy?: entity, x?: number, y?: number, faction?: string}} data - * @returns {number} + * @param data */ -function KDChestSecurity(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) { @@ -1972,7 +1951,7 @@ function KDChestSecurity(data) { return 0.25; } -function KDGetHiSecDialogue(enemy) { +function KDGetHiSecDialogue(enemy: entity): string { if (enemy) { let faction = KDGetFaction(enemy); if (KDFactionProperties[faction]?.customHiSecDialogue) { @@ -1980,4 +1959,4 @@ function KDGetHiSecDialogue(enemy) { } } return "JailerHiSec"; -} \ No newline at end of file +} diff --git a/Game/src/prison/KinkyDungeonJailList.js b/Game/src/prison/KinkyDungeonJailList.ts similarity index 90% rename from Game/src/prison/KinkyDungeonJailList.js rename to Game/src/prison/KinkyDungeonJailList.ts index 3bd7318a8..44788a884 100644 --- a/Game/src/prison/KinkyDungeonJailList.js +++ b/Game/src/prison/KinkyDungeonJailList.ts @@ -1,16 +1,13 @@ "use strict"; -/** - * @type {Record number, trigger: (guard: any, xx: any, yy: any) => void}>} - */ -let KDJailEvents = { +let KDJailEvents: Record number, trigger: (guard: any, xx: any, yy: any) => void}> = { "spawnGuard": { // Determines the weight - weight: (guard, xx, yy) => { + weight: (_guard, _xx, _yy) => { return 70; }, // Occurs when the jail event triggers - trigger: (g, xx, yy) => { + trigger: (_g, xx, yy) => { // Allow the player to sleep 150 turns after the guard shows up if (KinkyDungeonFlags.get("slept") == -1) { KinkyDungeonSetFlag("slept", 0); @@ -18,7 +15,7 @@ let KDJailEvents = { } let mainFaction = KDGetMainFaction(); // Jail tag - let jt = KDMapData.JailFaction?.length > 0 ? KinkyDungeonFactionTag[[KDMapData.JailFaction[Math.floor(KDRandom() * KDMapData.JailFaction.length)]]] : "jailer"; + 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"]); @@ -27,10 +24,22 @@ let KDJailEvents = { Enemy = KinkyDungeonGetEnemy(["jailGuard", jt], KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', [jt, "jailer"]); } } - let guard = {summoned: 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; + let guard = { + summoned: 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, ""); @@ -54,11 +63,11 @@ let KDJailEvents = { }, "spawnRescue": { // Determines the weight - weight: (guard, xx, yy) => { + weight: (_guard, _xx, _yy) => { return KDCanSpawnShopkeeper() ? 100 : 0; }, // Occurs when the jail event triggers - trigger: (g, xx, yy) => { + trigger: (_g, _xx, _yy) => { KDStartDialog("ShopkeeperRescue", "ShopkeeperRescue", true, "", undefined); }, }, @@ -68,38 +77,47 @@ let KDJailEvents = { for (let rescue of Object.entries(KDPrisonRescues)) { KDJailEvents[rescue[0]] = { // Determines the weight - weight: (guard, xx, yy) => { + weight: (guard: entity, _xx: number, _yy: number) => { 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) => { + trigger: (_guard: entity, _xx: number, _yy: number) => { KDStartDialog(rescue[0], rescue[1].speaker, true, "", undefined); }, }; } /** - * - * @param {boolean} [override] - Override jailing requirement - * @returns {boolean} + * @param [override] - Override jailing requirement */ -function KDCanSpawnShopkeeper(override) { +function KDCanSpawnShopkeeper(override?: boolean): boolean { return (KinkyDungeonStatsChoice.get("easyMode") && (override || (KinkyDungeonFlags.get("JailIntro") && !KinkyDungeonFlags.get("JailRepeat"))) && !KinkyDungeonFlags.get("refusedShopkeeperRescue") && !KDIsPlayerTethered(KinkyDungeonPlayerEntity)); } -let KDGuardActions = { +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) => { + weight: (_guard, _xx, _yy) => { return 100; }, - assignable: (guard, xx, yy) => { // Can assign a new behavior on top of this one + 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) => { + assign: (_guard, _xx, _yy) => { }, handle: (guard, xx, yy) => { @@ -116,11 +134,11 @@ let KDGuardActions = { }, }, "release": { - weight: (guard, xx, yy) => { + weight: (_guard, _xx, _yy) => { let missingJailUniform = KinkyDungeonMissingJailUniform(); return (KinkyDungeonCheckRelease() >= 0 && KinkyDungeonLockableItems().length == 0 && missingJailUniform.length < 1) ? 1000 : 0; }, - assign: (guard, xx, yy) => { + assign: (guard, _xx, _yy) => { KinkyDungeonInterruptSleep(); if (KDGetEffSecurityLevel() >= KDSecurityLevelHiSec && KDGameData.RoomType != "Jail" && (!(KDMapData.JailFaction?.length > 0) || KDFactionRelation("Player", KDMapData.JailFaction[0]) < 0.4)) { let dd = KDGetHiSecDialogue(guard); @@ -142,20 +160,20 @@ let KDGuardActions = { } } }, - handle: (guard, xx, yy) => { + handle: (guard, _xx, _yy) => { guard.gx = KinkyDungeonPlayerEntity.x; guard.gy = KinkyDungeonPlayerEntity.y; }, }, "jailTease": { - weight: (guard, xx, yy) => { + weight: (_guard, _xx, _yy) => { return 10 + (KinkyDungeonGoddessRep.Ghost + 50); }, - assign: (guard, xx, yy) => { + assign: (guard, _xx, _yy) => { // Always a random chance to tease guard.CurrentAction = "jailTease"; }, - handle: (guard, xx, yy, delta) => { + handle: (guard, xx, yy, _delta) => { let playerHasVibrator = Array.from(KinkyDungeonAllRestraint()).some(i => KDRestraint(i).allowRemote); guard.gx = xx - 2; guard.gy = yy; @@ -179,7 +197,7 @@ let KDGuardActions = { } }, "bindings": { - weight: (guard, xx, yy) => { + weight: (_guard, _xx, _yy) => { let missingJailUniform = KinkyDungeonMissingJailUniform(); let tooMuchRestraint = KinkyDungeonTooMuchRestraint(); let lockableRestraint = KinkyDungeonLockableItems(); @@ -189,7 +207,7 @@ let KDGuardActions = { || missingJailUniform.length > 0 || (tooMuchRestraint.length > 0 && KDGameData.JailRemoveRestraintsTimer > KinkyDungeonJailRemoveRestraintsTimerMin)) ? (100 + (missingJailUniform.length > 0 ? 100 : 0)) : 0; }, - assign: (guard, xx, yy) => { + assign: (guard, _xx, _yy) => { let missingJailUniform = KinkyDungeonMissingJailUniform(); let tooMuchRestraint = KinkyDungeonTooMuchRestraint(); let lockableRestraint = KinkyDungeonLockableItems(); @@ -237,18 +255,18 @@ let KDGuardActions = { KinkyDungeonSendDialogue(guard, TextGet("KinkyDungeonJailerLock").replace("EnemyName", TextGet("Name" + guard.Enemy.name)), "#e7cf1a", 4, 3); } }, - handle: (guard, xx, yy, delta) => { + handle: (_guard, _xx, _yy, _delta) => { // Dummy, this one assigns to a different style }, }, "jailRemoveRestraints": { - weight: (guard, xx, yy) => { + weight: (_guard, _xx, _yy) => { return 0; // Assigned by JailBindings }, - assign: (guard, xx, yy) => { + assign: (_guard, _xx, _yy) => { // Assigned by JailBindings }, - handle: (guard, xx, yy, delta) => { + 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); @@ -290,13 +308,13 @@ let KDGuardActions = { }, }, "jailAddRestraints": { - weight: (guard, xx, yy) => { + weight: (_guard, _xx, _yy) => { return 0; // Assigned by JailBindings }, - assign: (guard, xx, yy) => { + assign: (_guard, _xx, _yy) => { // Assigned by JailBindings }, - handle: (guard, xx, yy, delta) => { + 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); @@ -342,13 +360,13 @@ let KDGuardActions = { }, }, "jailLockRestraints": { - weight: (guard, xx, yy) => { + weight: (_guard, _xx, _yy) => { return 0; // Assigned by JailBindings }, - assign: (guard, xx, yy) => { + assign: (_guard, _xx, _yy) => { // Assigned by JailBindings }, - handle: (guard, xx, yy, delta) => { + 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); @@ -392,11 +410,11 @@ let KDGuardActions = { }, }, "jailLeashTour": { - weight: (guard, xx, yy) => { + 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) => { + assign: (guard, _xx, _yy) => { guard.RemainingJailLeashTourWaypoints = 2 + Math.ceil(KDRandom() * 4); guard.CurrentAction = "jailLeashTour"; guard.KinkyDungeonJailTourInfractions = 0; @@ -405,7 +423,7 @@ let KDGuardActions = { KinkyDungeonSendDialogue(guard, msg, "#e7cf1a", 4, 9); }, - handle: (guard, xx, yy, delta) => { + handle: (_guard, xx, yy, delta) => { if (KDGameData.KinkyDungeonJailTourTimer > 0) { KDGameData.KinkyDungeonJailTourTimer = Math.max(0, KDGameData.KinkyDungeonJailTourTimer - delta); } @@ -416,20 +434,27 @@ let KDGuardActions = { }, }, "jailLeashTransfer": { - weight: (guard, xx, yy) => { + weight: (_guard, _xx, _yy) => { KDGameData.KinkyDungeonJailTourTimer = 0; return (KDGameData.JailTurns > 30 && KinkyDungeonRandomJailPoint(["jail"], [KinkyDungeonNearestJailPoint(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y)])) ? 5 : 0; }, - assign: (guard, xx, yy) => { + 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) => { + handle: (_guard, xx, yy, delta) => { if (KDGameData.KinkyDungeonJailTourTimer > 0) { KDGameData.KinkyDungeonJailTourTimer = Math.max(0, KDGameData.KinkyDungeonJailTourTimer - delta); } @@ -453,10 +478,7 @@ let KDJailReleaseTurns = [ let KDSecurityLevelHiSec = 0; -/** - * @type {Record} -*/ -let KDJailOutfits = { +let KDJailOutfits: Record = { "jailer": { overridelowerpriority: false, priority: -1, @@ -828,89 +850,86 @@ KDJailOutfits.angel = JSON.parse(JSON.stringify(KDJailOutfits.celestialRopes)); KDJailOutfits.robot = JSON.parse(JSON.stringify(KDJailOutfits.dollsmith)); KDJailOutfits.cyborg = JSON.parse(JSON.stringify(KDJailOutfits.dollsmith)); -/** - * @type {Record boolean>} - */ -let KDJailConditions = { - Mage: (r) => { +let KDJailConditions: Record boolean> = { + Mage: (_r) => { return KinkyDungeonStatManaMax > 17; }, - Warrior: (r) => { + Warrior: (_r) => { return KinkyDungeonStatWillMax > 17; }, - Rogue: (r) => { + Rogue: (_r) => { return KinkyDungeonStatStaminaMax > 17; }, - Kinky: (r) => { + Kinky: (_r) => { return KinkyDungeonStatDistractionMax > 17; }, - NoUnmasked: (r) => { + NoUnmasked: (_r) => { return !KinkyDungeonStatsChoice.get("Unmasked"); }, - Hood: (r) => { + Hood: (_r) => { return !KinkyDungeonStatsChoice.get("NoHood"); }, - Plug: (r) => { + Plug: (_r) => { return !KinkyDungeonPlayerTags.get("SupremeBelt"); }, - Clamp: (r) => { + Clamp: (_r) => { return !KinkyDungeonPlayerTags.get("SupremeBra"); }, - SenseDep: (r) => { + SenseDep: (_r) => { return !KinkyDungeonStatsChoice.get("NoSenseDep"); }, - SenseDepMask: (r) => { + SenseDepMask: (_r) => { return !KinkyDungeonStatsChoice.get("NoSenseDep") && !KinkyDungeonStatsChoice.get("Unmasked"); }, - SenseDepHood: (r) => { + SenseDepHood: (_r) => { return !KinkyDungeonStatsChoice.get("NoSenseDep") && !KinkyDungeonStatsChoice.get("NoHood"); }, - ChastityBra: (r) => { + ChastityBra: (_r) => { return !KinkyDungeonStatsChoice.get("FreeBoob2") && (KinkyDungeonPlayerTags.get("ItemNipples") || !KinkyDungeonStatsChoice.get("FreeBoob1")); }, - NoPetsuit: (r) => { + NoPetsuit: (_r) => { return !KinkyDungeonStatsChoice.get("NoPet"); }, - NoKigu: (r) => { + NoKigu: (_r) => { return !KinkyDungeonStatsChoice.get("NoKigu"); }, - NoBlindfolds: (r) => { + NoBlindfolds: (_r) => { return !KinkyDungeonStatsChoice.get("NoBlindfolds"); }, - LessArmbinders: (r) => { + LessArmbinders: (_r) => { return !KinkyDungeonStatsChoice.get("Less_Armbinders") || (KinkyDungeonStatsChoice.get("Less_Jackets") && KinkyDungeonStatsChoice.get("Less_Boxbinders") && KinkyDungeonStatsChoice.get("Less_Yokes")); }, - LessBoxbinders: (r) => { + LessBoxbinders: (_r) => { return !KinkyDungeonStatsChoice.get("Less_Boxbinders") || (KinkyDungeonStatsChoice.get("Less_Jackets") && KinkyDungeonStatsChoice.get("Less_Armbinders") && KinkyDungeonStatsChoice.get("Less_Yokes")); }, - LessJackets: (r) => { + LessJackets: (_r) => { return !KinkyDungeonStatsChoice.get("Less_Jackets") || (KinkyDungeonStatsChoice.get("Less_Armbinders") && KinkyDungeonStatsChoice.get("Less_Boxbinders") && KinkyDungeonStatsChoice.get("Less_Yokes")); }, - LessYokes: (r) => { + LessYokes: (_r) => { return !KinkyDungeonStatsChoice.get("Less_Yokes") || (KinkyDungeonStatsChoice.get("Less_Jackets") && KinkyDungeonStatsChoice.get("Less_Boxbinders") && KinkyDungeonStatsChoice.get("Less_Armbinders")); }, - MoreArmbinders: (r) => { + MoreArmbinders: (_r) => { return KinkyDungeonStatsChoice.get("More_Armbinders"); }, - MoreYokes: (r) => { + MoreYokes: (_r) => { return KinkyDungeonStatsChoice.get("More_Yokes"); }, - MoreBoxbinders: (r) => { + MoreBoxbinders: (_r) => { return KinkyDungeonStatsChoice.get("More_Boxbinders"); }, - MoreJackets: (r) => { + MoreJackets: (_r) => { return KinkyDungeonStatsChoice.get("More_Jackets"); }, -}; \ No newline at end of file +}; diff --git a/Game/src/restraint/KDApplyVariants.js b/Game/src/restraint/KDApplyVariants.ts similarity index 68% rename from Game/src/restraint/KDApplyVariants.js rename to Game/src/restraint/KDApplyVariants.ts index 9f9103b6d..68b5f0341 100644 --- a/Game/src/restraint/KDApplyVariants.js +++ b/Game/src/restraint/KDApplyVariants.ts @@ -1,9 +1,6 @@ "use strict"; -/** - * @type {Record} - */ -let KDApplyVariants = { +let KDApplyVariants: Record = { "AntiMagic": { minfloor: 0, //maxfloor: 0, @@ -13,4 +10,4 @@ let KDApplyVariants = { hexes: ["AntiMagic"], enchants: [], }, -}; \ No newline at end of file +}; diff --git a/Game/src/restraint/KDLocks.js b/Game/src/restraint/KDLocks.ts similarity index 69% rename from Game/src/restraint/KDLocks.js rename to Game/src/restraint/KDLocks.ts index 2c7959c31..d66354ed0 100644 --- a/Game/src/restraint/KDLocks.js +++ b/Game/src/restraint/KDLocks.ts @@ -2,18 +2,15 @@ -/** - * @type {Record} - */ -let KDLocks = { +let KDLocks: Record = { "Rubber": { - canNPCPass: (xx, yy, MapTile, Enemy) => { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { return Enemy?.Enemy?.tags.rubber || Enemy?.Enemy?.tags.slime || Enemy?.Enemy?.tags.latex; }, - filter: (Guaranteed, Floor, AllowGold, Type, Data) => { + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return false; }, - weight: (Guaranteed, Floor, AllowGold, Type, Data) => { + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return 0; }, @@ -24,37 +21,185 @@ let KDLocks = { pick_speed: 1.5, // Multiplies the picking rate pick_diff: -0.1, // Added to the item's pick difficulty - canPick: (data) => { + canPick: (_data) => { return false; }, - doPick: (data) => { + doPick: (_data) => { return false; }, - failPick: (data) => { + failPick: (_data) => { return "Fail"; }, - breakChance: (data) => { + 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) => { + 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"); + KinkyDungeonChangeDistraction(-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 KinkyDungeonRedKeys > 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") && KinkyDungeonRedKeys > 0) { + KinkyDungeonRedKeys -= 1; + KinkyDungeonSendTextMessage(4, TextGet("KDConvertToHandcuffsKey"), "lightgreen", 2); + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("CuffKeys"), 1); + } else if (!data?.unlock) { + if (KinkyDungeonRedKeys > 0) { + KinkyDungeonRedKeys -= 1; + KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); + } else if (KinkyDungeonInventoryGet("CuffKeys")) { + KinkyDungeonDropItem({name: "CuffKeys"}, KinkyDungeonPlayerEntity, true, true); + KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("CuffKeys"), -1); + } + } }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, // Start of level -- for gold locks - levelStart: (item) => { + levelStart: (_item) => { }, shrineImmune: false, @@ -72,14 +217,14 @@ let KDLocks = { specialActions: (tile, player) => { KDCyberActions(tile, player, 20); }, - canNPCPass: (xx, yy, MapTile, Enemy) => { + 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) => { + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return false; }, - weight: (Guaranteed, Floor, AllowGold, Type, Data) => { + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return 0; }, @@ -92,38 +237,40 @@ let KDLocks = { hackPick: true, - canPick: (data) => { + canPick: (_data) => { return false; }, - doPick: (data) => { + doPick: (_data) => { return false; }, - failPick: (data) => { + failPick: (_data) => { return "Fail"; }, - breakChance: (data) => { + 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) => { + canUnlock: (_data) => { return KinkyDungeonInventoryGet("KeyCard") != undefined; }, unlock_diff: -1.0, doUnlock: (data) => { - return KDCyberUnlock(data, 20); + if (!data.NoEvent) + KDCyberUnlock(data, 20); + return true; }, - removeKeys: (data) => { + removeKeys: (_data) => { }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, // Start of level -- for gold locks - levelStart: (item) => { + levelStart: (_item) => { }, shrineImmune: false, @@ -141,14 +288,14 @@ let KDLocks = { specialActions: (tile, player) => { KDCyberActions(tile, player, 50); }, - canNPCPass: (xx, yy, MapTile, Enemy) => { + 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) => { + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return false; }, - weight: (Guaranteed, Floor, AllowGold, Type, Data) => { + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return 0; }, @@ -166,38 +313,40 @@ let KDLocks = { "Cut": 0.2, }, - canPick: (data) => { + canPick: (_data) => { return false; }, - doPick: (data) => { + doPick: (_data) => { return false; }, - failPick: (data) => { + failPick: (_data) => { return "Fail"; }, - breakChance: (data) => { + 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) => { + canUnlock: (_data) => { return KinkyDungeonInventoryGet("KeyCard") != undefined; }, unlock_diff: -1.0, doUnlock: (data) => { - return KDCyberUnlock(data, 50); + if (!data.NoEvent) + KDCyberUnlock(data, 50); + return true; }, - removeKeys: (data) => { + removeKeys: (_data) => { }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, // Start of level -- for gold locks - levelStart: (item) => { + levelStart: (_item) => { }, shrineImmune: false, @@ -215,14 +364,14 @@ let KDLocks = { specialActions: (tile, player) => { KDCyberActions(tile, player, 150); }, - canNPCPass: (xx, yy, MapTile, Enemy) => { + 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) => { + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return false; }, - weight: (Guaranteed, Floor, AllowGold, Type, Data) => { + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return 0; }, @@ -240,38 +389,40 @@ let KDLocks = { hackPick: true, - canPick: (data) => { + canPick: (_data) => { return false; }, - doPick: (data) => { + doPick: (_data) => { return false; }, - failPick: (data) => { + failPick: (_data) => { return "Fail"; }, - breakChance: (data) => { + 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) => { + canUnlock: (_data) => { return KinkyDungeonInventoryGet("KeyCard") != undefined; }, unlock_diff: -1.0, doUnlock: (data) => { - return KDCyberUnlock(data, 150); + if (!data.NoEvent) + KDCyberUnlock(data, 150); + return true; }, - removeKeys: (data) => { + removeKeys: (_data) => { }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, // Start of level -- for gold locks - levelStart: (item) => { + levelStart: (_item) => { }, shrineImmune: false, @@ -286,13 +437,13 @@ let KDLocks = { loot_locked: false, }, "White": { - canNPCPass: (xx, yy, MapTile, Enemy) => { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { return KDEnemyRank(Enemy) > 0; }, - filter: (Guaranteed, Floor, AllowGold, Type) => { + filter: (_Guaranteed, Floor, _AllowGold, _Type) => { return Floor < 11; }, - weight: (Guaranteed, Floor, AllowGold, Type) => { + weight: (_Guaranteed, Floor, _AllowGold, _Type) => { return Math.max(10, 100 - Floor * 10); }, @@ -303,26 +454,26 @@ let KDLocks = { pick_speed: 1.5, // Multiplies the picking rate pick_diff: -0.1, // Added to the item's pick difficulty - canPick: (data) => { + canPick: (_data) => { return true; }, - doPick: (data) => { + doPick: (_data) => { return true; }, - failPick: (data) => { + failPick: (_data) => { return "Fail"; }, - breakChance: (data) => { + 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) => { + canUnlock: (_data) => { return KinkyDungeonRedKeys > 0 || KinkyDungeonInventoryGet("CuffKeys") != undefined; }, - doUnlock: (data) => { + doUnlock: (_data) => { return true; }, removeKeys: (data) => { @@ -340,12 +491,12 @@ let KDLocks = { } } }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, // Start of level -- for gold locks - levelStart: (item) => { + levelStart: (_item) => { }, shrineImmune: false, @@ -360,13 +511,13 @@ let KDLocks = { loot_locked: true, }, "Red": { - canNPCPass: (xx, yy, MapTile, Enemy) => { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { return KDEnemyRank(Enemy) > 1; }, - filter: (Guaranteed, Floor, AllowGold, Type, Data) => { + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return true; }, - weight: (Guaranteed, Floor, AllowGold, Type, Data) => { + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return 50; }, @@ -377,26 +528,26 @@ let KDLocks = { pick_speed: 1.0, // Multiplies the picking rate pick_diff: 0.0, // Added to the item's pick difficulty - canPick: (data) => { + canPick: (_data) => { return true; }, - doPick: (data) => { + doPick: (_data) => { return true; }, - failPick: (data) => { + failPick: (_data) => { return "Fail"; }, - breakChance: (data) => { + 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) => { + canUnlock: (_data) => { return KinkyDungeonRedKeys > 0; }, - doUnlock: (data) => { + doUnlock: (_data) => { return true; }, @@ -406,12 +557,12 @@ let KDLocks = { KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); } }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, // Start of level -- for gold locks - levelStart: (item) => { + levelStart: (_item) => { }, shrineImmune: false, @@ -426,13 +577,13 @@ let KDLocks = { loot_locked: true, }, "Red_Med": { - canNPCPass: (xx, yy, MapTile, Enemy) => { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { return KDEnemyRank(Enemy) > 1; }, - filter: (Guaranteed, Floor, AllowGold, Type, Data) => { + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return true; }, - weight: (Guaranteed, Floor, AllowGold, Type, Data) => { + weight: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { return 15 + Floor * 3; }, @@ -444,26 +595,26 @@ let KDLocks = { pick_diff: 0.0, // Added to the item's pick difficulty pick_lim: 0.15, // Added to the item's pick limitchance - canPick: (data) => { + canPick: (_data) => { return true; }, - doPick: (data) => { + doPick: (_data) => { return true; }, - failPick: (data) => { + failPick: (_data) => { return "Fail"; }, - breakChance: (data) => { + 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) => { + canUnlock: (_data) => { return KinkyDungeonRedKeys > 0; }, - doUnlock: (data) => { + doUnlock: (_data) => { return true; }, @@ -473,12 +624,12 @@ let KDLocks = { KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); } }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, // Start of level -- for gold locks - levelStart: (item) => { + levelStart: (_item) => { }, shrineImmune: false, @@ -493,13 +644,13 @@ let KDLocks = { loot_locked: true, }, "Red_Hi": { - canNPCPass: (xx, yy, MapTile, Enemy) => { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { return KDEnemyRank(Enemy) > 1; }, - filter: (Guaranteed, Floor, AllowGold, Type, Data) => { + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return true; }, - weight: (Guaranteed, Floor, AllowGold, Type, Data) => { + weight: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { return 15 + Floor * 3; }, @@ -511,26 +662,26 @@ let KDLocks = { pick_diff: 0.0, // Added to the item's pick difficulty pick_lim: 0.3, // Added to the item's pick limitchance - canPick: (data) => { + canPick: (_data) => { return true; }, - doPick: (data) => { + doPick: (_data) => { return true; }, - failPick: (data) => { + failPick: (_data) => { return "Fail"; }, - breakChance: (data) => { + 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) => { + canUnlock: (_data) => { return KinkyDungeonRedKeys > 0; }, - doUnlock: (data) => { + doUnlock: (_data) => { return true; }, @@ -540,12 +691,12 @@ let KDLocks = { KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); } }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, // Start of level -- for gold locks - levelStart: (item) => { + levelStart: (_item) => { }, shrineImmune: false, @@ -560,13 +711,13 @@ let KDLocks = { loot_locked: true, }, "HiSec": { - canNPCPass: (xx, yy, MapTile, Enemy) => { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { return KDEnemyRank(Enemy) > 2; }, - filter: (Guaranteed, Floor, AllowGold, Type, Data) => { + filter: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { return Floor > 2; }, - weight: (Guaranteed, Floor, AllowGold, Type, Data) => { + weight: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { return 16 + Floor * 4; }, @@ -578,26 +729,26 @@ let KDLocks = { pick_diff: -1.0, // Added to the item's pick difficulty pick_lim: 1.0, // Added to the item's pick limitchance - canPick: (data) => { + canPick: (_data) => { return true; }, - doPick: (data) => { + doPick: (_data) => { return true; }, - failPick: (data) => { + failPick: (_data) => { return "Fail"; }, - breakChance: (data) => { + 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) => { + canUnlock: (_data) => { return KinkyDungeonRedKeys > 0; }, - doUnlock: (data) => { + doUnlock: (_data) => { return true; }, @@ -607,12 +758,12 @@ let KDLocks = { KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); } }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, // Start of level -- for gold locks - levelStart: (item) => { + levelStart: (_item) => { }, shrineImmune: false, @@ -627,13 +778,13 @@ let KDLocks = { loot_locked: true, }, "Disc": { - canNPCPass: (xx, yy, MapTile, Enemy) => { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { return KDEnemyRank(Enemy) > 2; }, - filter: (Guaranteed, Floor, AllowGold, Type, Data) => { + filter: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { return Floor > 1; }, - weight: (Guaranteed, Floor, AllowGold, Type, Data) => { + weight: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { return 20 + Floor * 5; }, @@ -645,28 +796,28 @@ let KDLocks = { pick_diff: -0.25, // Added to the item's pick difficulty pick_lim: 0.3, // Added to the item's pick limitchance - canPick: (data) => { + canPick: (_data) => { let pick = KinkyDungeonInventoryGet("DiscPick"); //if (!data.noMsg) KinkyDungeonSendTextMessage(10, TextGet("KDNeedDiscPick"), "#ffffff", 2, true); return pick != undefined; }, - doPick: (data) => { + doPick: (_data) => { return true; }, - failPick: (data) => { + failPick: (_data) => { return "Fail"; }, - breakChance: (data) => { + 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) => { + canUnlock: (_data) => { return KinkyDungeonRedKeys > 0; }, - doUnlock: (data) => { + doUnlock: (_data) => { return true; }, @@ -676,12 +827,12 @@ let KDLocks = { KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); } }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, // Start of level -- for gold locks - levelStart: (item) => { + levelStart: (_item) => { }, shrineImmune: false, @@ -696,13 +847,13 @@ let KDLocks = { loot_locked: true, }, "Blue": { - canNPCPass: (xx, yy, MapTile, Enemy) => { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { return KDEnemyRank(Enemy) > 3 || (Enemy?.Enemy?.unlockCommandLevel > 1 && KDEnemyCanTalk(Enemy)); }, - filter: (Guaranteed, Floor, AllowGold, Type, Data) => { + filter: (_Guaranteed, Floor, _AllowGold, Type, _Data) => { return Type != "Door" && Floor > 4; }, - weight: (Guaranteed, Floor, AllowGold, Type, Data) => { + weight: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { return 8 * Floor - 30; }, @@ -718,26 +869,26 @@ let KDLocks = { pick_speed: 0.0, // Multiplies the picking rate pick_diff: 0.0, // Added to the item's pick difficulty - canPick: (data) => { + canPick: (_data) => { return false; }, - doPick: (data) => { + doPick: (_data) => { return false; }, - failPick: (data) => { + failPick: (_data) => { return "Break"; }, - breakChance: (data) => { + 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) => { + canUnlock: (_data) => { return KinkyDungeonBlueKeys > 0; }, - doUnlock: (data) => { + doUnlock: (_data) => { return true; }, removeKeys: (data) => { @@ -746,12 +897,12 @@ let KDLocks = { KinkyDungeonDropItem({name: data.keytype+"Key"}, KinkyDungeonPlayerEntity, true); } }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, // Start of level -- for gold locks - levelStart: (item) => { + levelStart: (_item) => { }, shrineImmune: false, @@ -766,13 +917,13 @@ let KDLocks = { loot_locked: false, }, "Gold": { - canNPCPass: (xx, yy, MapTile, Enemy) => { + 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) => { + filter: (_Guaranteed, Floor, AllowGold, _Type, _Data) => { return AllowGold && Floor > 10; }, - weight: (Guaranteed, Floor, AllowGold, Type, Data) => { + weight: (_Guaranteed, Floor, _AllowGold, _Type, _Data) => { return 2 * Floor - 15; }, @@ -788,26 +939,26 @@ let KDLocks = { pick_speed: 0.0, // Multiplies the picking rate pick_diff: 0.0, // Added to the item's pick difficulty - canPick: (data) => { + canPick: (_data) => { return false; }, - doPick: (data) => { + doPick: (_data) => { return false; }, - failPick: (data) => { + failPick: (_data) => { return "Break"; }, - breakChance: (data) => { + 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) => { + canUnlock: (_data) => { return KinkyDungeonItemCount("MistressKey") > 0; }, - doUnlock: (data) => { + doUnlock: (_data) => { return true; }, removeKeys: (data) => { @@ -816,7 +967,7 @@ let KDLocks = { } KinkyDungeonChangeConsumable(KinkyDungeonFindConsumable("MistressKey"), -1); }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, @@ -827,7 +978,7 @@ let KDLocks = { } }, // Start of level -- for gold locks and others - levelStart: (item, data) => { + levelStart: (item) => { if ((MiniGameKinkyDungeonLevel >= item.data?.lockTimer || !item.data?.lockTimer || item.data?.lockTimer >= KinkyDungeonMaxLevel)) { KinkyDungeonLock(item, "Blue"); KinkyDungeonSendTextMessage(8, TextGet("KinkyDungeonGoldLockRemove"), "yellow", 2); @@ -846,13 +997,13 @@ let KDLocks = { loot_locked: false, }, "Divine": { - canNPCPass: (xx, yy, MapTile, Enemy) => { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { return KDEnemyRank(Enemy) > 4 || Enemy?.Enemy?.tags.angel || Enemy?.Enemy?.tags.holy; }, - filter: (Guaranteed, Floor, AllowGold, Type, Data) => { + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return false; }, - weight: (Guaranteed, Floor, AllowGold, Type, Data) => { + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return 0; }, @@ -868,37 +1019,37 @@ let KDLocks = { pick_speed: 0.0, // Multiplies the picking rate pick_diff: 0.0, // Added to the item's pick difficulty - canPick: (data) => { + canPick: (_data) => { return false; }, - doPick: (data) => { + doPick: (_data) => { return false; }, - failPick: (data) => { + failPick: (_data) => { return "Break"; }, - breakChance: (data) => { + 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) => { + canUnlock: (_data) => { return false; }, - doUnlock: (data) => { + doUnlock: (_data) => { return true; }, - removeKeys: (data) => { + removeKeys: (_data) => { // }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, // Start of level -- for gold locks and others - levelStart: (item) => { + levelStart: (_item) => { KinkyDungeonSendTextMessage(8, TextGet("KDDivineLockReminder"), "#ffff44", 2, false, true); }, shrineImmune: true, @@ -914,13 +1065,13 @@ let KDLocks = { loot_locked: false, }, "Divine2": { - canNPCPass: (xx, yy, MapTile, Enemy) => { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { return KDEnemyRank(Enemy) > 4 || Enemy?.Enemy?.tags.angel || Enemy?.Enemy?.tags.holy; }, - filter: (Guaranteed, Floor, AllowGold, Type, Data) => { + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return false; }, - weight: (Guaranteed, Floor, AllowGold, Type, Data) => { + weight: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return 0; }, @@ -936,37 +1087,37 @@ let KDLocks = { pick_speed: 0.0, // Multiplies the picking rate pick_diff: 0.0, // Added to the item's pick difficulty - canPick: (data) => { + canPick: (_data) => { return false; }, - doPick: (data) => { + doPick: (_data) => { return false; }, - failPick: (data) => { + failPick: (_data) => { return "Break"; }, - breakChance: (data) => { + 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) => { + canUnlock: (_data) => { return false; }, - doUnlock: (data) => { + doUnlock: (_data) => { return true; }, - removeKeys: (data) => { + removeKeys: (_data) => { // }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, // Start of level -- for gold locks and others - levelStart: (item) => { + levelStart: (_item) => { }, shrineImmune: true, @@ -981,13 +1132,13 @@ let KDLocks = { loot_locked: false, }, "Purple": { - canNPCPass: (xx, yy, MapTile, Enemy) => { + canNPCPass: (_xx, _yy, _MapTile, Enemy) => { return KDEnemyRank(Enemy) > 3 || (Enemy?.Enemy?.unlockCommandLevel > 0 &&KDEnemyCanTalk(Enemy)); }, - filter: (Guaranteed, Floor, AllowGold, Type, Data) => { + filter: (_Guaranteed, _Floor, _AllowGold, _Type, _Data) => { return true; }, - weight: (Guaranteed, Floor, AllowGold, Type, Data) => { + weight: (_Guaranteed, _Floor, _AllowGold, _Type, Data) => { return 30 + 30 * (Data?.enemy?.Enemy.unlockCommandLevel > 0 ? Data?.enemy?.Enemy.unlockCommandLevel : (Data?.enemy ? -1 : 0)); }, @@ -999,37 +1150,37 @@ let KDLocks = { pick_speed: 0.0, // Multiplies the picking rate pick_diff: 0.0, // Added to the item's pick difficulty - canPick: (data) => { + canPick: (_data) => { return false; }, - doPick: (data) => { + doPick: (_data) => { return false; }, - failPick: (data) => { + failPick: (_data) => { return "Fail"; }, - breakChance: (data) => { + 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) => { + canUnlock: (_data) => { return false; }, - doUnlock: (data) => { + doUnlock: (_data) => { return true; }, - removeKeys: (data) => { + removeKeys: (_data) => { // }, - failUnlock: (data) => { + failUnlock: (_data) => { return "Fail"; }, // Start of level -- for gold locks - levelStart: (item) => { + levelStart: (_item) => { }, shrineImmune: false, @@ -1046,11 +1197,9 @@ let KDLocks = { }; /** - * - * @param {entity} player * @returns {boolean} */ -function KDCyberHostile(player) { +function KDCyberHostile(player: entity): boolean { let faction = player.player ? "Player" : KDGetFaction(player); if (faction == "Player") { return KDGameData.HostileFactions.includes("AncientRobot") || ( @@ -1061,11 +1210,9 @@ function KDCyberHostile(player) { } /** - * - * @param {entity} player - * @returns {boolean} + * @param player */ -function KDCyberAccess(player) { +function KDCyberAccess(player: entity): boolean { let faction = player.player ? "Player" : KDGetFaction(player); if (faction == "Player") { return !KDGameData.HostileFactions.includes("AncientRobot") @@ -1077,26 +1224,22 @@ function KDCyberAccess(player) { } /** - * - * @param {entity} player - * @returns {boolean} + * @param player */ -function KDCyberLink(player) { +function KDCyberLink(player: entity): boolean { if (player.player) { return KinkyDungeonPlayerTags.get("CyberLink") || KinkyDungeonFlags.get("CyberLink"); } return player.Enemy?.tags.cyberlink; } /** - * - * @param {entity} player - * @returns {boolean} + * @param player */ -function KDTryHack(player) { +function KDTryHack(player: entity): boolean { return KDRandom() < (KDCyberLink(player) ? 0.5 : 0); } -function KDCyberUnlock(data, base = 20) { +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) { @@ -1114,7 +1257,7 @@ function KDCyberUnlock(data, base = 20) { return true; } -function KDCyberActions(data, player, base) { +function KDCyberActions(_data: any, player: entity, base: number) { DrawButtonKDEx("ModalDoorSwipe", () => { KDSendInput("swipe", {targetTile: KinkyDungeonTargetTileLocation, base: base}); return true; @@ -1134,4 +1277,4 @@ function KDCyberActions(data, player, base) { }, true, KDModalArea_x + 725, KDModalArea_y + 25, 250, 60, TextGet("KinkyDungeonHackDoor"), KDCanHack(player) ? "#ffffff" : "#ff5555", "", ""); -} \ No newline at end of file +} diff --git a/Game/src/restraint/KDTethers.ts b/Game/src/restraint/KDTethers.ts index 5568df4f4..c2dec3661 100644 --- a/Game/src/restraint/KDTethers.ts +++ b/Game/src/restraint/KDTethers.ts @@ -91,7 +91,7 @@ let KDLeashReason : {[_: string]: (entity: entity) => boolean} = { }, }; -function KDGetLeashedToCount(entity: 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++; @@ -100,6 +100,15 @@ function KDGetLeashedToCount(entity: entity) { 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) { @@ -401,7 +410,7 @@ function KinkyDungeonUpdateTether(Msg: boolean, Entity: entity, xTo?: number, yT function KDWillingLeash(entity: entity): boolean { - return KDGetPersonality(entity) != undefined - && KDLeashablePersonalities[KDGetPersonality(entity)] - && KDLeashablePersonalities[KDGetPersonality(entity)](entity, KDPlayer()); + 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.js b/Game/src/restraint/KinkyDungeonFurniture.ts similarity index 92% rename from Game/src/restraint/KinkyDungeonFurniture.js rename to Game/src/restraint/KinkyDungeonFurniture.ts index 7941bbd63..f5d59f9d5 100644 --- a/Game/src/restraint/KinkyDungeonFurniture.js +++ b/Game/src/restraint/KinkyDungeonFurniture.ts @@ -4,7 +4,7 @@ let KDFurniture = { floor: "Floor", sprite: "Cage", restraintTag: "cage", - tickFunction: (delta) => { + tickFunction: (_delta) => { if (!KDGameData.PrisonerState) { let power = 0; if (KDBoundPowerLevel >= 0.35) power = 2; @@ -24,7 +24,7 @@ let KDFurniture = { floor: "Floor", sprite: "DisplayStand", restraintTag: "displaystand", - tickFunction: (delta) => { + tickFunction: (_delta) => { if (!KDGameData.PrisonerState) { let power = 0; if (KDBoundPowerLevel >= 0.35) power = 2; @@ -44,7 +44,7 @@ let KDFurniture = { floor: "Floor", sprite: "FutureBox", restraintTag: "futurebox", - tickFunction: (delta) => { + tickFunction: (_delta) => { // Nothing yet TODO add special features like dressing the player } }, @@ -52,15 +52,24 @@ let KDFurniture = { floor: "Brickwork", sprite: "Sarcophagus", restraintTag: "sarcophagus", - tickFunction: (delta) => { + tickFunction: (_delta) => { // Nothing yet TODO add special features like dressing the player } }, + "Bed": { + floor: "Floor", + sprite: "Bed", + restraintTag: "bed", + tickFunction: (_delta) => { + // Small stamina regen :) + KinkyDungeonChangeStamina(0.1, true, false, false); + } + }, "DisplayEgyptian": { floor: "Floor", sprite: "DisplayEgyptian", restraintTag: "displaystand", - tickFunction: (delta) => { + tickFunction: (_delta) => { if (!KDGameData.PrisonerState) { let power = 0; if (KDBoundPowerLevel >= 0.35) power = 2; @@ -76,4 +85,4 @@ let KDFurniture = { } } }, -}; \ No newline at end of file +}; diff --git a/Game/src/restraint/KinkyDungeonRestraints.js b/Game/src/restraint/KinkyDungeonRestraints.ts similarity index 82% rename from Game/src/restraint/KinkyDungeonRestraints.js rename to Game/src/restraint/KinkyDungeonRestraints.ts index 1828b64d7..1cfa16568 100644 --- a/Game/src/restraint/KinkyDungeonRestraints.js +++ b/Game/src/restraint/KinkyDungeonRestraints.ts @@ -10,20 +10,20 @@ // 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 KDWillEscapePenalty = 0.15; let KDWillEscapePenaltyArms = 0.1; -let KDWillEscapePenaltyStart = 0.0; -let KDWillEscapePenaltyStartArms = 0.0; -let KDWillEscapePenaltyEnd = 0.0; +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 @@ -37,10 +37,7 @@ let StruggleTypeHandThresh = { let KDRestraintArchetypes = ["Rope", "Latex", "Ribbon", "Leather", "Cyber", "Metal", "Armbinders", "Boxbinders", "Straitjackets", "Legbinders"]; -/** - * @type {Record boolean>} - */ -let KDCustomAffinity = { +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; @@ -90,7 +87,7 @@ let KDCustomAffinity = { }, }; -function KDGetTightnessEffect(escapeChance, struggleType, T = 0) { +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; @@ -101,12 +98,12 @@ function KDGetTightnessEffect(escapeChance, struggleType, T = 0) { /** * Returns the multiplier of a restraint based on the player's current restraint counts - * @param {entity} player - * @param {restraint} restraint - * @param {string[]} augmentedInventory + * @param player + * @param restraint + * @param augmentedInventory * @returns {number} - multiplier for apparent power */ -function KDRestraintPowerMult(player, restraint, augmentedInventory) { +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);}); @@ -150,11 +147,7 @@ function KDRestraintPowerMult(player, restraint, augmentedInventory) { return Math.min(2, Math.max(0.5, mult || 0)); } -/** - * - * @returns {number} - */ -function KDGetWillPenalty() { +function KDGetWillPenalty(StruggleType: string): number { let perc = KinkyDungeonStatWill/KinkyDungeonStatWillMax; let scale = 0; let scalestart = KDWillEscapePenaltyStart; @@ -168,7 +161,7 @@ function KDGetWillPenalty() { scale = Math.min(1.0, (scalestart - perc) / (scalestart - KDWillEscapePenaltyEnd)); else if (perc <= 0) scale = 1.0; } - return scale * max; + return scale * max * ((StruggleType == "Cut") ? 0.5 : (StruggleType == "Struggle" ? 1.0 : 0.1)); } let KinkyDungeonCurrentEscapingItem = null; @@ -224,16 +217,14 @@ let KDWeakBonus = -0.1; let KDBondageLoverAmount = 1; /** - * @type {Map} */ -let KinkyDungeonRestraintsCache = new Map(); +let KinkyDungeonRestraintsCache: Map = new Map(); /** * gets a restraint - * @param {Named} item - * @returns {restraint} + * @param item */ -function KDRestraint(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); } @@ -243,11 +234,10 @@ function KDRestraint(item) { /** * gets a restraint - * @param {Named} item - * @param {entity} target - * @returns {number} + * @param item + * @param target */ -function KDRestraintBondageMult(item, target) { +function KDRestraintBondageMult(item: Named, target: entity): number { let r = KDRestraint(item); if (r) { let data = { @@ -262,7 +252,7 @@ function KDRestraintBondageMult(item, target) { if (r.quickBindMult && target && !KinkyDungeonIsDisabled(target)) { data.mult *= r.quickBindMult; - data.quickBind = true; + data['quickBind'] = true; } KinkyDungeonSendEvent("calcBondageMult", data); @@ -272,10 +262,9 @@ function KDRestraintBondageMult(item, target) { } /** * gets a restraint - * @param {Named} item - * @returns {string} + * @param item */ -function KDRestraintBondageType(item) { +function KDRestraintBondageType(item: Named): string { let r = KDRestraint(item); if (r) { let data = { @@ -329,10 +318,9 @@ function KDRestraintBondageType(item) { /** * gets a restraint's conditions - * @param {Named} item - * @returns {string[]} + * @param item */ -function KDRestraintBondageConditions(item) { +function KDRestraintBondageConditions(item: Named): string[] { let r = KDRestraint(item); if (r) { let data = { @@ -367,10 +355,9 @@ function KDRestraintBondageConditions(item) { /** * gets a restraint - * @param {Named} item - * @returns {KDBondageStatus} + * @param item */ -function KDRestraintBondageStatus(item) { +function KDRestraintBondageStatus(item: Named): KDBondageStatus { let r = KDRestraint(item); if (r) { let data = { @@ -441,10 +428,9 @@ function KDRestraintBondageStatus(item) { /** * gets a restraint - * @param {item} item - * @returns {boolean} + * @param item */ -function KDItemIsMagic(item) { +function KDItemIsMagic(item: item): boolean { let res = KinkyDungeonRestraintsCache.get(item.name); if (!res.magic) return false; let disenchlevel = KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "Disenchant"); @@ -471,7 +457,7 @@ let KDProgressiveOrder = { /** Enforces a sort of progression of restraining loosely based on strictness, useful for progressive stuff like applying curses to zones */ -KDProgressiveOrder.Strict = [ +KDProgressiveOrder['Strict'] = [ "ItemTorso", // Usually just makes other restraints harder "ItemBreast", // Goes well with belts "ItemPelvis", // Chastity is for good girls! @@ -486,7 +472,7 @@ KDProgressiveOrder.Strict = [ ]; /** A funner restraining order, starting with non-impactful then locking down spells and finally sealing in helplessness */ -KDProgressiveOrder.Fun1 = [ +KDProgressiveOrder['Fun1'] = [ "ItemTorso", // Usually just makes other restraints harder "ItemPelvis", // Chastity is for good girls! "ItemMouth", // Blocks spells and potions @@ -502,7 +488,7 @@ KDProgressiveOrder.Fun1 = [ /** A funner restraining order, starting with non-impactful then locking down spells and finally sealing in helplessness */ -KDProgressiveOrder.Fun2 = [ +KDProgressiveOrder['Fun2'] = [ "ItemTorso", // Usually just makes other restraints harder "ItemPelvis", // Chastity is for good girls! "ItemMouth", // Blocks spells and potions @@ -517,7 +503,7 @@ KDProgressiveOrder.Fun2 = [ ]; /** A funner restraining order, starting with non-impactful then locking down spells and finally sealing in helplessness */ -KDProgressiveOrder.Fun3 = [ +KDProgressiveOrder['Fun3'] = [ "ItemPelvis", // Chastity is for good girls! "ItemBreast", // Goes well with belts "ItemMouth", // Blocks spells and potions @@ -535,21 +521,16 @@ function KDGetProgressiveOrderFun() { return KDProgressiveOrder["Fun" + Math.floor(3 * KDRandom() + 1)]; } -/** - * @type {Map} - */ -let KDRestraintsCache = new Map(); +let KDRestraintsCache: Map = new Map(); let KDTetherGraphics = new PIXI.Graphics; KDTetherGraphics.zIndex = 2; let KDGameBoardAddedTethers = false; /** - * - * @param {number} [modifier] - * @returns {number} + * @param [modifier] */ -function KinkyDungeonKeyGetPickBreakChance(modifier) { +function KinkyDungeonKeyGetPickBreakChance(modifier?: number): number { let mult = (modifier) ? modifier : 1.0; let chance = 0; @@ -561,11 +542,9 @@ function KinkyDungeonKeyGetPickBreakChance(modifier) { } /** - * - * @param {number} [modifier] - * @returns {number} + * @param [modifier] */ -function KinkyDungeonGetKnifeBreakChance(modifier) { +function KinkyDungeonGetKnifeBreakChance(modifier?: number): number { let mult = (modifier) ? modifier : 1.0; let chance = 0; @@ -577,11 +556,9 @@ function KinkyDungeonGetKnifeBreakChance(modifier) { } /** - * - * @param {number} [modifier] - * @returns {number} + * @param [modifier] */ -function KinkyDungeonGetEnchKnifeBreakChance(modifier) { +function KinkyDungeonGetEnchKnifeBreakChance(modifier: number): number { let mult = (modifier) ? modifier : 1.0; let chance = 0; @@ -593,68 +570,65 @@ function KinkyDungeonGetEnchKnifeBreakChance(modifier) { } /** - * - * @param {restraint} restraint - * @returns {boolean} + * @param restraint */ -function KinkyDungeonIsLockable(restraint) { +function KinkyDungeonIsLockable(restraint: restraint): boolean { if (restraint && restraint.escapeChance && (restraint.escapeChance.Pick != undefined || restraint.escapeChance.Unlock != undefined)) return true; return false; } /** - * - * @param {item} item - * @param {string} lock - * @param {boolean} NoEvent + * @param item + * @param lock + * @param [NoEvent] + * @param [Link] + * @param [pick] */ -function KinkyDungeonLock(item, lock, NoEvent = false, Link = false, pick = false) { +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; - if (!StandalonePatched) - InventoryLock(KinkyDungeonPlayer, InventoryGet(KinkyDungeonPlayer, KDRestraint(item).AssetGroup ? KDRestraint(item).AssetGroup : KDRestraint(item).Group), "IntricatePadlock", Player.MemberNumber, true); item.pickProgress = 0; } } else { - if (KDLocks[item.lock] && KDLocks[item.lock].doUnlock) KDLocks[item.lock].doUnlock({item: item, link: Link, unlock: !pick, pick: pick}); - 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()}); + 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}); } - KinkyDungeonSendEvent("postUnlock", {item: item}); } - 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} + * @param item */ -function KDGetCurse(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} item - * @returns {boolean} + * @param item */ -function KDIsBinding(item) { +function KDIsBinding(item: item): boolean { let r = KDRestraint(item); if (r) { return !(!(!r.nonbinding && ( @@ -675,36 +649,34 @@ function KDIsBinding(item) { /** * Whether a single item shall be matched by a shrine - * @param {item} item - * @param {string} shrine - * @param {boolean} ignoreGold Gold locks don't prevent shrine matching + * @param item + * @param shrine + * @param ignoreGold Gold locks don't prevent shrine matching * even if they are shrineImmune - * @param {boolean} ignoreShrine Curses and noShrine flag on items don't + * @param ignoreShrine Curses and noShrine flag on items don't * prevent shrine matching. - * @param {boolean} forceIgnoreNonBinding - for "Exclusions Apply" perk - * @returns {boolean} + * @param forceIgnoreNonBinding - for "Exclusions Apply" perk */ function KinkyDungeonSingleRestraintMatchesShrine( - item, - shrine, - ignoreGold, - ignoreShrine, - forceIgnoreNonBinding, -) { + 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} item - * @param {boolean} ignoreGold - * @param {boolean} ignoreShrine - * @param {boolean} forceIgnoreNonBinding - * @returns {boolean} + * @param item + * @param ignoreGold + * @param ignoreShrine + * @param forceIgnoreNonBinding */ -function KinkyDungeonAllowTagMatch(item, ignoreGold, ignoreShrine, forceIgnoreNonBinding) { +function KinkyDungeonAllowTagMatch(item: item, ignoreGold: boolean, ignoreShrine: boolean, forceIgnoreNonBinding: boolean): boolean { return ( (!forceIgnoreNonBinding || KDIsBinding(item)) && KinkyDungeonCurseOrItemAllowMatch(item, ignoreShrine) @@ -713,38 +685,32 @@ function KinkyDungeonAllowTagMatch(item, ignoreGold, ignoreShrine, forceIgnoreNo } /** - * - * @param {item} item - * @param {boolean} ignoreShrine - * @returns {boolean} + * @param item + * @param ignoreShrine */ -function KinkyDungeonCurseOrItemAllowMatch(item, ignoreShrine) { +function KinkyDungeonCurseOrItemAllowMatch(item: item, ignoreShrine: boolean): boolean { return (!KDRestraint(item).noShrine && (!KDGetCurse(item) || !KDCurses[KDGetCurse(item)].noShrine)) || ignoreShrine; } /** - * - * @param {item} item - * @param {boolean} ignoreGold - * @returns {boolean} + * @param item + * @param ignoreGold */ -function KinkyDungeonLockAllowMatch(item, ignoreGold) { +function KinkyDungeonLockAllowMatch(item: item, ignoreGold: boolean): boolean { return ignoreGold || !KDLocks[item.lock]?.shrineImmune; } /** - * - * @param {string} shrine - * @param {boolean} [forceIgnoreNonBinding] - for "Exclusions Apply" perk - * @returns {item[]} + * @param shrine + * @param [ignoreGold] + * @param [recursive] + * @param [ignoreShrine] + * @param [forceIgnoreNonBinding] - for "Exclusions Apply" perk */ -function KinkyDungeonGetRestraintsWithShrine(shrine, ignoreGold, recursive, ignoreShrine, forceIgnoreNonBinding) { - /** - * @type {item[]} - */ - let ret = []; +function KinkyDungeonGetRestraintsWithShrine(shrine: string, ignoreGold?: boolean, recursive?: boolean, ignoreShrine?: boolean, forceIgnoreNonBinding?: boolean): item[] { + let ret: item[] = []; for (let item of KinkyDungeonAllRestraint()) { if (KinkyDungeonSingleRestraintMatchesShrine(item, shrine, ignoreGold, ignoreShrine, forceIgnoreNonBinding)) { @@ -765,19 +731,15 @@ function KinkyDungeonGetRestraintsWithShrine(shrine, ignoreGold, recursive, igno } /** - * - * @param {string} shrine - * @param {boolean} [forceIgnoreNonBinding] - for "Exclusions Apply" perk + * @param shrine + * @param [forceIgnoreNonBinding] - for "Exclusions Apply" perk * @returns {number} */ -function KinkyDungeonRemoveRestraintsWithShrine(shrine, maxCount, recursive, noPlayer, ignoreGold, ignoreShrine, Keep, forceIgnoreNonBinding) { +function KinkyDungeonRemoveRestraintsWithShrine(shrine: string, maxCount?: number, recursive?: boolean, noPlayer?: boolean, ignoreGold?: boolean, ignoreShrine?: boolean, Keep?: boolean, forceIgnoreNonBinding?: boolean): number { let count = 0; for (let i = 0; i < (maxCount ? maxCount : 100); i++) { - /** - * @type {item[]} - */ - let items = KinkyDungeonAllRestraint().filter((r) => KinkyDungeonSingleRestraintMatchesShrine(r, shrine, ignoreGold, ignoreShrine, forceIgnoreNonBinding)); + let items: item[] = KinkyDungeonAllRestraint().filter((r) => 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) { @@ -847,10 +809,9 @@ function KinkyDungeonRemoveRestraintsWithShrine(shrine, maxCount, recursive, noP /** - * - * @param {item} item + * @param item */ -function KDRemoveThisItem(item, Keep, NoEvent, Shrine, Remover) { +function KDRemoveThisItem(item: item, Keep?: boolean, NoEvent?: boolean, Shrine?: boolean, Remover?: entity): void { let r = KinkyDungeonGetRestraintItem(KDRestraint(item).Group); if (r == item) { KinkyDungeonRemoveRestraint(KDRestraint(item).Group, Keep, false, NoEvent, Shrine, false, Remover); @@ -869,11 +830,9 @@ function KDRemoveThisItem(item, Keep, NoEvent, Shrine, Remover) { } /** - * - * @param {string} name - * @returns {number} + * @param name */ -function KinkyDungeonRemoveRestraintsWithName(name) { +function KinkyDungeonRemoveRestraintsWithName(name: string): number { let count = 0; for (let inv of KinkyDungeonAllRestraintDynamic()) { @@ -891,17 +850,15 @@ function KinkyDungeonRemoveRestraintsWithName(name) { } /** - * - * @param {string} shrine - * @returns {number} + * @param shrine */ -function KinkyDungeonUnlockRestraintsWithShrine(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, ""); + KinkyDungeonLock(item, "", true); count++; } } @@ -909,15 +866,8 @@ function KinkyDungeonUnlockRestraintsWithShrine(shrine) { return count; } -/** - * - * @returns {item[]} - */ -function KinkyDungeonPlayerGetLockableRestraints() { - /** - * @type {item[]} - */ - let ret = []; +function KinkyDungeonPlayerGetLockableRestraints(): item[] { + let ret: item[] = []; for (let item of KinkyDungeonAllRestraint()) { if (!item.lock && !KDGetCurse(item) && KDRestraint(item).escapeChance && KDRestraint(item).escapeChance.Pick != undefined) { @@ -929,14 +879,10 @@ function KinkyDungeonPlayerGetLockableRestraints() { } /** - * @param {string[]} Locks - * @returns {item[]} + * @param Locks */ -function KinkyDungeonPlayerGetRestraintsWithLocks(Locks, recursive) { - /** - * @type {item[]} - */ - let ret = []; +function KinkyDungeonPlayerGetRestraintsWithLocks(Locks: string[], recursive?: boolean): item[] { + let ret: item[] = []; for (let itemhost of (recursive ? KinkyDungeonAllRestraintDynamic() : KinkyDungeonAllRestraint())) { // @ts-ignore @@ -950,50 +896,40 @@ function KinkyDungeonPlayerGetRestraintsWithLocks(Locks, recursive) { } /** - * - * @param {string} lock + * @param lock */ -function KinkyDungeonRemoveKeysUnlock(lock) { +function KinkyDungeonRemoveKeysUnlock(lock: string) { if (KDLocks[lock]) KDLocks[lock].removeKeys({unlock: true}); } + /** - * - * @param {string} lock - * @param {string} keytype + * @param lock + * @param keytype */ -function KinkyDungeonRemoveKeysDropped(lock, keytype) { +function KinkyDungeonRemoveKeysDropped(lock: string, keytype: string) { if (KDLocks[lock]) KDLocks[lock].removeKeys({dropped: true, keytype: keytype}); } /** - * - * @param {string} lock + * @param lock * @returns {string} */ -function KinkyDungeonGetKey(lock) { +function KinkyDungeonGetKey(lock: string): string { if (KDLocks[lock]) return KDLocks[lock].key; return ""; } -/** - * - * @returns {boolean} - */ -function KinkyDungeonHasGhostHelp() { +function KinkyDungeonHasGhostHelp(): boolean { return ((KinkyDungeonTargetTile && ((KinkyDungeonTargetTile.Type == "Ghost" && KinkyDungeonTargetTile.GhostDecision <= 0) || KinkyDungeonTargetTile.Type == "Angel"))); } -function KinkyDungeonHasHelp() { +function KinkyDungeonHasHelp(): boolean { return KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp() || KinkyDungeonHasAngelHelp(); } -/** - * - * @returns {boolean} - */ -function KinkyDungeonHasAllyHelp() { +function KinkyDungeonHasAllyHelp(): boolean { return (KDNearbyEnemies(KinkyDungeonPlayerEntity.x, KinkyDungeonPlayerEntity.y, 1.5).some( (enemy) => { return (KDEnemyHasFlag(enemy, "HelpMe") || enemy.Enemy.tags.alwayshelp) @@ -1013,19 +949,12 @@ function KinkyDungeonHasAllyHelp() { } KinkyDungeonSetFlag("HelpMeFlag", 20); -/** - * - * @returns {boolean} - */ -function KinkyDungeonHasAngelHelp() { + +function KinkyDungeonHasAngelHelp(): boolean { return (KinkyDungeonTargetTile && KinkyDungeonTargetTile.Type == "Angel"); } -/** - * - * @returns {boolean} - */ -function KinkyDungeonIsWearingLeash() { +function KinkyDungeonIsWearingLeash(): boolean { for (let restraint of KinkyDungeonAllRestraint()) { if (KDRestraint(restraint) && KDRestraint(restraint).leash) { return true; @@ -1037,19 +966,14 @@ function KinkyDungeonIsWearingLeash() { let KDAffinityList = ["Hook", "Edge", "Sticky", "Sharp"]; /** - * - * @param {boolean} Message - Show a message? - * @param {string} affinity - * @param {string} [group] - * @param {entity} [entity] - * @returns {boolean} + * @param Message - Show a message? + * @param affinity + * @param [group] + * @param [entity] */ -function KinkyDungeonGetAffinity(Message, affinity, group, entity) { +function KinkyDungeonGetAffinity(Message: boolean, affinity: string, group?: string, entity?: entity): boolean { if (!entity) entity = KinkyDungeonPlayerEntity; - /** - * @param {KDEventData_affinity} data - */ - let data = { + let data: KDEventData_affinity = { forceTrue: 0, forceFalse: 0, affinity: affinity, @@ -1079,8 +1003,8 @@ function KinkyDungeonGetAffinity(Message, affinity, group, entity) { 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; + 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"); } @@ -1091,7 +1015,7 @@ function KinkyDungeonGetAffinity(Message, affinity, group, entity) { 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, + 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(); @@ -1137,7 +1061,7 @@ function KinkyDungeonGetAffinity(Message, affinity, group, entity) { return KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp(); } -function KinkyDungeonWallCrackAndKnife(Message) { +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) { @@ -1165,10 +1089,9 @@ function KinkyDungeonWallCrackAndKnife(Message) { /** * Determines if the entire dynamic item tree has at least one inaccessable item - * @param {item} item - * @returns {boolean} + * @param item */ -function KDIsTreeAccessible(item) { +function KDIsTreeAccessible(item: item): boolean { let link = item; while (link && KDRestraint(link)) { if (KDRestraint(link).inaccessible) return false; @@ -1179,10 +1102,9 @@ function KDIsTreeAccessible(item) { /** * Determines if the entire dynamic item tree has at least one chastity item - * @param {item} item - * @returns {boolean} + * @param item */ -function KDIsTreeChastity(item) { +function KDIsTreeChastity(item: item): boolean { let link = item; while (link && KDRestraint(link)) { if (KDRestraint(link).chastity) return false; @@ -1193,10 +1115,9 @@ function KDIsTreeChastity(item) { /** * Determines if the entire dynamic item tree has at least one chastity bra item - * @param {item} item - * @returns {boolean} + * @param item */ -function KDIsTreeChastityBra(item) { +function KDIsTreeChastityBra(item: item): boolean { let link = item; while (link && KDRestraint(link)) { if (KDRestraint(link).chastitybra) return false; @@ -1206,12 +1127,10 @@ function KDIsTreeChastityBra(item) { } /** - * - * @param {string} Group - Group - * @param {boolean} [External] - By enemies or by player? - * @returns {boolean} + * @param Group - Group + * @param [External] - By enemies or by player? */ -function KDGroupBlocked(Group, External) { +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; @@ -1229,14 +1148,13 @@ function KDGroupBlocked(Group, External) { } /** - * @param {string} Group - * @param {boolean} External - * @return {item[]} - * Gets a list of restraints blocking this group */ -function KDGetBlockingRestraints(Group, External) { + * Gets a list of restraints blocking this group + * @param Group + * @param External + */ +function KDGetBlockingRestraints(Group: string, _External?: boolean): item[] { // Create the storage system - /** @type {Map} */ - let map = new Map(); + 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)) { @@ -1279,11 +1197,11 @@ function KDGetBlockingRestraints(Group, External) { } /** - * @param {string} Group - * @param {boolean} External - * @return {item[]} - * Gets a list of restraints with Security that block this */ -function KDGetBlockingSecurity(Group, External) { + * 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; @@ -1292,22 +1210,19 @@ function KDGetBlockingSecurity(Group, External) { } /** - * - * @param {boolean} Other - false = self, true = other prisoner door etc - * @returns {boolean} - Can you use keys on target + * @param Other - false = self, true = other prisoner door etc + * @returns - Can you use keys on target */ -function KinkyDungeonCanUseKey(Other = true) { +function KinkyDungeonCanUseKey(Other: boolean = true): boolean { return !KinkyDungeonIsHandsBound(true, Other, 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} + * @param [ApplyGhost] - Can you receive help in this context? + * @param [Other] - Is this on yourself or another? + * @param Threshold - Threshold */ -function KinkyDungeonIsHandsBound(ApplyGhost, Other, Threshold = 0.99) { +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) { @@ -1324,10 +1239,10 @@ function KinkyDungeonIsHandsBound(ApplyGhost, Other, Threshold = 0.99) { /** * Returns the total level of hands bondage, 1.0 or higher meaning unable to use hands - * @param {boolean} Other - on other or self - * @return {number} - The bindhands level, sum of all bindhands properties of worn restraints + * @param Other - on other or self + * @return - The bindhands level, sum of all bindhands properties of worn restraints */ -function KDHandBondageTotal(Other = false) { +function KDHandBondageTotal(Other: boolean = false): number { let total = 0; for (let rest of KinkyDungeonAllRestraintDynamic()) { let inv = rest.item; @@ -1339,11 +1254,7 @@ function KDHandBondageTotal(Other = false) { return total; } -/** - * - * @returns {boolean} - */ -function KinkyDungeonCanUseFeet(bootsPrevent = true) { +function KinkyDungeonCanUseFeet(bootsPrevent: boolean = true): boolean { return KinkyDungeonStatsChoice.get("Flexible") && KinkyDungeonSlowLevel < 1 && (!bootsPrevent || (!KinkyDungeonPlayerTags.get("HinderFeet") @@ -1351,23 +1262,18 @@ function KinkyDungeonCanUseFeet(bootsPrevent = true) { && !KinkyDungeonPlayerTags.get("Boots") && !KinkyDungeonPlayerTags.get("BootsArmor"))); } -/** - * - * @returns {boolean} - */ -function KinkyDungeonCanUseFeetLoose(bootsPrevent = true) { + +function KinkyDungeonCanUseFeetLoose(bootsPrevent: boolean = true): boolean { return KinkyDungeonCanUseFeet(bootsPrevent) || ( !KDForcedToGround() ); } /** - * - * @param {boolean} [ApplyGhost] - * @param {boolean} [Other] - Is this on yourself or another? - * @returns {boolean} + * @param [ApplyGhost] + * @param [Other] - Is this on yourself or another? */ -function KinkyDungeonIsArmsBound(ApplyGhost, Other) { +function KinkyDungeonIsArmsBound(ApplyGhost?: boolean, _Other?: boolean): boolean { let blocked = KDGroupBlocked("ItemArms"); if (!blocked) for (let inv of KinkyDungeonAllRestraintDynamic()) { @@ -1380,17 +1286,16 @@ function KinkyDungeonIsArmsBound(ApplyGhost, Other) { blocked; } /** - * @param {Character} C - * @param {boolean} [ApplyGhost] - * @param {boolean} [Other] - Is this on yourself or another? - * @returns {boolean} + * @param C + * @param [ApplyGhost] + * @param [Other] - Is this on yourself or another? */ -function KinkyDungeonIsArmsBoundC(C, ApplyGhost, Other) { +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) { + if (KDRestraint(inv)?.bindarms) { return true; } } @@ -1401,13 +1306,11 @@ function KinkyDungeonIsArmsBoundC(C, ApplyGhost, Other) { /** - * - * @param {boolean} ApplyGhost - * @param {string} Group - * @param {item} [excludeItem] - * @returns {number} + * @param ApplyGhost + * @param Group + * @param [excludeItem] */ -function KinkyDungeonStrictness(ApplyGhost, Group, excludeItem) { +function KinkyDungeonStrictness(ApplyGhost: boolean, Group: string, excludeItem?: item): number { if (ApplyGhost && (KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp())) return 0; let strictness = 0; for (let invItem of KinkyDungeonAllRestraintDynamic()) { @@ -1467,11 +1370,10 @@ function KinkyDungeonStrictness(ApplyGhost, Group, excludeItem) { /** * Gets the list of restraint nammes affecting the Group - * @param {string} Group - * @param {item} excludeItem - * @returns {string[]} + * @param Group + * @param excludeItem */ -function KinkyDungeonGetStrictnessItems(Group, excludeItem) { +function KinkyDungeonGetStrictnessItems(Group: string, excludeItem: item): string[] { let list = []; for (let inv of KinkyDungeonAllRestraint()) { while (inv) { @@ -1496,11 +1398,7 @@ function KinkyDungeonGetStrictnessItems(Group, excludeItem) { } -/** - * - * @returns {number} - */ -function KinkyDungeonGetPickBaseChance() { +function KinkyDungeonGetPickBaseChance(): number { let bonus = 0; if (KinkyDungeonStatsChoice.get("Locksmith")) bonus += KDLocksmithPickBonus; if (KinkyDungeonStatsChoice.get("Clueless")) bonus += KDCluelessPickBonus; @@ -1508,11 +1406,7 @@ function KinkyDungeonGetPickBaseChance() { return 0.33 / (1.0 + 0.02 * MiniGameKinkyDungeonLevel) + bonus; } -/** - * - * @returns {number} - */ -function KinkyDungeonGetPickBonus() { +function KinkyDungeonGetPickBonus(): number { let bonus = 0; if (KinkyDungeonStatsChoice.get("Locksmith")) bonus += KDLocksmithBonus; if (KinkyDungeonStatsChoice.get("Clueless")) bonus += KDCluelessBonus; @@ -1520,11 +1414,7 @@ function KinkyDungeonGetPickBonus() { return bonus; } -/** - * - * @returns {boolean} - */ -function KinkyDungeonPickAttempt() { +function KinkyDungeonPickAttempt(): boolean { let Pass = "Fail"; let escapeChance = KinkyDungeonGetPickBaseChance(); let cost = KinkyDungeonStatStaminaCostPick; @@ -1584,11 +1474,9 @@ function KinkyDungeonPickAttempt() { } /** - * - * @param {string} lock - * @returns {boolean} + * @param lock */ -function KinkyDungeonUnlockAttempt(lock) { +function KinkyDungeonUnlockAttempt(lock: string): boolean { let Pass = "Fail"; let escapeChance = 1.0; @@ -1626,7 +1514,7 @@ function KinkyDungeonUnlockAttempt(lock) { } /** Gets the affinity of a restraint */ -function KDGetRestraintAffinity(item, data) { +function KDGetRestraintAffinity(item: item, data: any): string { data.item = item; data.affinity = ""; data.overrideAffinity = false; @@ -1651,10 +1539,7 @@ function KDGetRestraintAffinity(item, data) { return data.affinity; } -/** - * - */ -function KDGetEscapeChance(restraint, StruggleType, escapeChancePre, limitChancePre, ApplyGhost, ApplyPlayerBonus, Msg) { +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; @@ -1788,7 +1673,7 @@ let KDUnboundAffinityOverride = { "Hook": true, }; -function KDGetDynamicItem(group, index) { +function KDGetDynamicItem(group: string, index: number) { let restraint = KinkyDungeonGetRestraintItem(group); let host = restraint; if (index) { @@ -1812,10 +1697,9 @@ function KDGetDynamicItem(group, index) { /** * Mutates the GetStruggleData array - * @param {KDStruggleData} data - * @returns {string} - * */ -function KDGetStruggleData(data) { + * @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; @@ -1837,6 +1721,28 @@ function KDGetStruggleData(data) { // 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 (KDToggles.Sound) 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; @@ -1904,11 +1810,6 @@ function KDGetStruggleData(data) { // 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); - 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.3*Math.max(2 - KinkyDungeonSlowLevel, 0)); - else if ((data.struggleType == "Remove") && data.hasAffinity) data.escapeChance += edgeBonus * (0.1 + 0.1*Math.max(2 - KinkyDungeonSlowLevel, 0)); // Restriction penalties AFTER bonuses if (data.restriction > 0 && !KinkyDungeonHasHelp()) { @@ -1944,13 +1845,57 @@ function KDGetStruggleData(data) { } + 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 (KDToggles.Sound) 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; } @@ -1972,15 +1917,17 @@ function KDGetStruggleData(data) { struggleType: data.struggleType, result: "NeedEdge", }); + return "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.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; @@ -2027,9 +1974,6 @@ function KDGetStruggleData(data) { } } - // 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; // Bound arms make fine motor skill escaping more difficult in general if (!(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && data.struggleType != "Struggle" && armsBound) { if (data.struggleGroup == "ItemArms") @@ -2068,8 +2012,8 @@ function KDGetStruggleData(data) { struggleType: data.struggleType, result: "NeedEdge", }); + return "NeedEdge"; } - return "NeedEdge"; } let possible = data.escapeChance > 0; @@ -2095,8 +2039,8 @@ function KDGetStruggleData(data) { struggleType: data.struggleType, result: "Strict", }); + return "Strict"; } - return "Strict"; } // Reduce cutting power if you dont have hands @@ -2128,8 +2072,6 @@ function KDGetStruggleData(data) { if (!(KinkyDungeonHasGhostHelp() || KinkyDungeonHasAllyHelp()) && (data.struggleType == "Pick" || data.struggleType == "Unlock" || data.struggleType == "Remove")) data.escapeChance /= 1.0 + KinkyDungeonStatDistraction/KinkyDungeonStatDistractionMax*KinkyDungeonDistractionUnlockSuccessMod; - if (KDGroupBlocked(data.struggleGroup) && !KDRestraint(data.restraint).alwaysStruggleable) data.escapeChance = 0; - // 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]); @@ -2146,10 +2088,13 @@ function KDGetStruggleData(data) { if (data.struggleGroup == "ItemNipples" || data.struggleGroup == "ItemNipplesPiercings") bra = KinkyDungeonGetRestraintItem("ItemBreast"); if (bra && KDRestraint(bra) && KDRestraint(bra).chastitybra) data.escapeChance = 0.0; - if (!data.query) + 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.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) { @@ -2183,8 +2128,8 @@ function KDGetStruggleData(data) { } KinkyDungeonAdvanceTime(1); KinkyDungeonSetFlag("escapeimpossible", 2); + return "Impossible"; } - return "Impossible"; } } @@ -2196,26 +2141,10 @@ function KDGetStruggleData(data) { data.limitChance *= KDRestraint(data.restraint).limitMult[data.struggleType]; - 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 > 0 && KinkyDungeonHasWill(0.01, false)) { - data.escapeChance -= data.willEscapePenalty; - if (data.escapeChance <= 0) { + 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 (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" @@ -2230,25 +2159,46 @@ function KDGetStruggleData(data) { struggleType: data.struggleType, result: "Will", }); + return "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]); + + + return ""; } -// Lockpick = use tool or cut -// Otherwise, just a normal struggle /** - * - * @param {string} struggleGroup - * @param {string} StruggleType - * @param {boolean} [query] - * @param {KDStruggleData} [retData] - * @returns {string} + * Lockpick = use tool or cut + * Otherwise, just a normal struggle + * @param struggleGroup + * @param StruggleType + * @param index + * @param [query] + * @param [retData] */ -function KinkyDungeonStruggle(struggleGroup, StruggleType, index, query = false, 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" : ""); @@ -2310,9 +2260,8 @@ function KinkyDungeonStruggle(struggleGroup, StruggleType, index, query = false, let affinity = KDGetRestraintAffinity(restraint, {StruggleType: StruggleType}); /** - * @type {KDStruggleData} */ - let data = { + let data: KDStruggleData = { minSpeed: KDMinEscapeRate, handBondage: 0, handsBound: false, @@ -2336,14 +2285,14 @@ function KinkyDungeonStruggle(struggleGroup, StruggleType, index, query = false, cost: KinkyDungeonStatStaminaCostStruggle, wcost: KinkyDungeonStatWillCostStruggle, escapePenalty: -KinkyDungeonGetBuffedStat(KinkyDungeonPlayerBuffs, "StrugglePower"), - willEscapePenalty: KDGetWillPenalty(), + willEscapePenalty: KDGetWillPenalty(StruggleType), 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, + buffMult: 1.0, struggleTime: 1.0, restriction: KDGameData.Restriction || 0, speedMult: (speedmult || 1) * (KinkyDungeonHasHelp() ? 2.0 : 1.0), @@ -2355,6 +2304,8 @@ function KinkyDungeonStruggle(struggleGroup, StruggleType, index, query = false, extraLim: 0, extraLimPenalty: 0, extraLimThreshold: 0, + + upfrontWill: KDUpfrontWill, }; // Prevent crashes due to weirdness @@ -2388,7 +2339,7 @@ function KinkyDungeonStruggle(struggleGroup, StruggleType, index, query = false, // Main struggling block - if ((data.wcost > 0 && !KinkyDungeonHasWill(-data.wcost, false)) && (data.escapeChance*0.5 <= data.willEscapePenalty && !KinkyDungeonHasWill(0.01, false))) { + /*if ((data.wcost > 0 && !KinkyDungeonHasWill(-data.wcost, false)) && (data.escapeChance*0.5 <= data.willEscapePenalty && !KinkyDungeonHasWill(0.01, false))) { if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).NoWill) ? KDGetEscapeSFX(restraint).NoWill : "Struggle") + ".ogg"); @@ -2402,7 +2353,8 @@ function KinkyDungeonStruggle(struggleGroup, StruggleType, index, query = false, result: "Will", }); return "Will"; - } else if (!KinkyDungeonHasStamina(-data.cost, true)) { + } else */ + if (!KinkyDungeonHasStamina(-data.cost, true)) { if (KDToggles.Sound) AudioPlayInstantSoundKD(KinkyDungeonRootDirectory + "Audio/" + ((KDGetEscapeSFX(restraint) && KDGetEscapeSFX(restraint).NoStamina) ? KDGetEscapeSFX(restraint).NoStamina : "Struggle") + ".ogg"); @@ -2744,11 +2696,11 @@ function KinkyDungeonStruggle(struggleGroup, StruggleType, index, query = false, /** * "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. + * @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, index) { +function KinkyDungeonGetRestraintItem(group: string, index?: number): item { for (let item of KinkyDungeonAllRestraint()) { if (item.type == Restraint && KDRestraint(item).Group == group) { if (index) { @@ -2779,11 +2731,9 @@ function KinkyDungeonRefreshRestraintsCache() { /** - * - * @param {string} Name - * @returns {restraint} + * @param Name */ -function KinkyDungeonGetRestraintByName(Name) { +function KinkyDungeonGetRestraintByName(Name: string): restraint { if (KinkyDungeonRestraintsCache.size > 0) { // Nothing } else { @@ -2795,14 +2745,12 @@ function KinkyDungeonGetRestraintByName(Name) { } /** - * - * @param {string} Lock - * @param {item} [item] - Factoring in curse - * @param {string} [curse] - Curse to add - * @param {restraint} [restraint] - restraint to add, checks to make sure its lockable - * @returns {number} + * @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, item, curse, restraint) { +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; @@ -2837,35 +2785,71 @@ let KDNoOverrideTags = [ "NoBlindfolds", ...KDHeavyRestraintPrefs, ]; + +type eligibleRestraintOptions = { + dontAugmentWeight?: boolean; + ApplyVariants?: boolean; + dontPreferVariant?: boolean; + allowLowPower?: boolean; + ForceDeep?: boolean; +} + /** - * - * @param {KDHasTags} enemy - * @param {*} Level - * @param {*} Index - * @param {*} Bypass - * @param {*} Lock - * @param {*} RequireWill - * @param {*} LeashingOnly - * @param {*} NoStack - * @param {*} extraTags - * @param {boolean} minWeightFallback - * @param {*} agnostic - Determines if playertags and current bondage are ignored - * @param {number} filterEps - Anything under this is filtered unless nothing is above it - * @param {entity} [securityEnemy] - Bypass is treated separately for these groups - * @param {string} [curse] - Going to add this curse - * @param {boolean} [useAugmented] - useAugmented - * @param {string[]} [augmentedInventory] - * @param {object} [options] - * @param {boolean} [options.dontAugmentWeight] - * @param {boolean} [options.ApplyVariants] - * @param {boolean} [options.dontPreferVariant] - * @param {boolean} [options.allowLowPower] - * @param {boolean} [options.ForceDeep] - * @param {{minPower?: number, maxPower?: number, onlyLimited?: boolean, noUnlimited?: boolean, noLimited?: boolean, onlyUnlimited?: boolean, ignore?: string[], require?: string[], looseLimit?: boolean, ignoreTags?: string[], allowedGroups?: string[]}} [filter] - Filters for items - * @returns {{restraint: restraint, variant?: ApplyVariant, weight: number}[]} + * Not to be confused with EligibleRestraintEntry */ -function KDGetRestraintsEligible(enemy, Level, Index, Bypass, Lock, RequireWill, LeashingOnly, NoStack, extraTags, agnostic, filter, securityEnemy, curse, filterEps = 0.9, minWeightFallback = true, useAugmented = false, augmentedInventory = undefined, options) { - let RestraintsList = []; +type eligibleRestraintItem = { + restraint: restraint; + variant?: ApplyVariant; + weight: number; +} + +/** + * @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] + */ +function KDGetRestraintsEligible ( + enemy: KDHasTags, + Level: number, + Index: string, + Bypass: boolean, + Lock: string, + RequireWill?: boolean, + LeashingOnly?: boolean, + NoStack?: boolean, + extraTags?: Record, + agnostic?: boolean, + filter?: {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, + 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; @@ -2890,7 +2874,12 @@ function KDGetRestraintsEligible(enemy, Level, Index, Bypass, Lock, RequireWill, } if (extraTags) for (let t of Object.entries(extraTags)) { - if (effLevel >= t[1]) + /* + * FIXME: `extraTags` is passed in variously as a + * Record and a Record. + * Find out what the truth is. + */ + if (effLevel >= +t[1]) tags.set(t[0], true); } @@ -2901,7 +2890,7 @@ function KDGetRestraintsEligible(enemy, Level, Index, Bypass, Lock, RequireWill, } let arousalMode = KinkyDungeonStatsChoice.get("arousalMode"); - let cache = []; + let cache: { r : restraint; w : number }[] = []; for (let restraint of KinkyDungeonRestraints) { if (( @@ -3040,10 +3029,10 @@ function KDGetRestraintsEligible(enemy, Level, Index, Bypass, Lock, RequireWill, } } - let RestraintsList2 = []; + let RestraintsList2: eligibleRestraintItem[] = []; if (!options?.allowLowPower) { // Only does strictest for that group - let groupPower = {}; + 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]; @@ -3071,31 +3060,47 @@ function KDGetRestraintsEligible(enemy, Level, Index, Bypass, Lock, RequireWill, } /** - * - * @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 {string} [curse] - Planning to add this curse - * @param {boolean} [useAugmented] - useAugmented - * @param {string[]} [augmentedInventory] - - * @param {object} [options] - * @param {boolean} [options.dontAugmentWeight] - * @param {boolean} [options.ApplyVariants] - * @param {boolean} [options.dontPreferVariant] - * @param {boolean} [options.allowLowPower] - * @param {boolean} [options.ForceDeep] - * @param {{minPower?: number, maxPower?: number, onlyLimited?: boolean, noUnlimited?: boolean, noLimited?: boolean, onlyUnlimited?: boolean, ignore?: string[], require?: string[], looseLimit?: boolean, ignoreTags?: string[], allowedGroups?: string[]}} [filter] - Filters for items - * @returns + * @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, Level, Index, Bypass, Lock, RequireWill, LeashingOnly, NoStack, extraTags, agnostic, filter, securityEnemy, curse, useAugmented, augmentedInventory, options) { +function KinkyDungeonGetRestraint ( + enemy: KDHasTags, + Level: number, + Index: string, + Bypass?: boolean, + Lock?: string, + RequireWill?: boolean, + LeashingOnly?: boolean, + NoStack?: boolean, + extraTags?: Record, + agnostic?: boolean, + filter?: {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 +) +{ let restraintWeightTotal = 0; let restraintWeights = []; @@ -3119,31 +3124,48 @@ function KinkyDungeonGetRestraint(enemy, Level, Index, Bypass, Lock, RequireWill } /** - * - * @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 {string} [curse] - Planning to add this curse - * @param {boolean} [useAugmented] - useAugmented - * @param {string[]} [augmentedInventory] - - * @param {object} [options] - * @param {boolean} [options.dontAugmentWeight] - * @param {boolean} [options.ApplyVariants] - * @param {boolean} [options.dontPreferVariant] - * @param {boolean} [options.allowLowPower] - * @param {boolean} [options.ForceDeep] - * @param {{minPower?: number, maxPower?: number, onlyLimited?: boolean, noUnlimited?: boolean, noLimited?: boolean, onlyUnlimited?: boolean, ignore?: string[], require?: string[], looseLimit?: boolean, ignoreTags?: string[], allowedGroups?: string[]}} [filter] - Filters for items + * @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] * @returns {{r: restraint, v: ApplyVariant}} */ -function KDGetRestraintWithVariants(enemy, Level, Index, Bypass, Lock, RequireWill, LeashingOnly, NoStack, extraTags, agnostic, filter, securityEnemy, curse, useAugmented, augmentedInventory, options) { +function KDGetRestraintWithVariants ( + enemy: KDHasTags, + Level: number, + Index: string, + Bypass: boolean, + Lock: string, + RequireWill: boolean, + LeashingOnly?: boolean, + NoStack?: boolean, + extraTags?: Record, + agnostic?: boolean, + filter?: {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} +{ let restraintWeightTotal = 0; let restraintWeights = []; @@ -3168,11 +3190,11 @@ function KDGetRestraintWithVariants(enemy, Level, Index, Bypass, Lock, RequireWi } } -function KinkyDungeonUpdateRestraints(C, id, delta, customRestraints, extraTags) { +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 customRestraints || KinkyDungeonAllRestraintDynamic()) { + for (let inv of KinkyDungeonAllRestraintDynamic()) { let group = KDRestraint(inv.item).Group; if (group) { if (KDGroupBlocked(group)) playerTags.set(group + "Blocked", true); @@ -3182,21 +3204,15 @@ function KinkyDungeonUpdateRestraints(C, id, delta, customRestraints, extraTags) } 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); + 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) && (!KDDefaultPalette || KinkyDungeonFactionFilters[KDDefaultPalette])) { + if ((!inv.faction || KDToggles.ForcePalette || outfit?.palette) + && (KDToggles.ApplyPaletteRestraint && (!KDDefaultPalette || KinkyDungeonFactionFilters[KDDefaultPalette]))) { inv.faction = outfit?.palette || KDDefaultPalette; } @@ -3387,17 +3403,15 @@ function KinkyDungeonUpdateRestraints(C, id, delta, customRestraints, extraTags) } -function KDGetCursePower(item) { +function KDGetCursePower(item: item): number { if (!item || !KDGetCurse(item)) return 0; return KDCursePower(KDGetCurse(item)); } /** - * - * @param {item} item - * @returns {number} + * @param item */ -function KDGetVariantPower(item) { +function KDGetVariantPower(item: item): number { if (item && KinkyDungeonRestraintVariants[item.inventoryVariant || item.name]) { return KinkyDungeonRestraintVariants[item.inventoryVariant || item.name].power || 0; } @@ -3405,15 +3419,13 @@ function KDGetVariantPower(item) { } /** - * - * @param {item} item - * @param {boolean} [NoLink] - * @param {restraint} [toLink] - * @param {string} [newLock] - If we are trying to add a new item - * @param {string} [newCurse] - If we are trying to add a new item - * @returns + * @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, NoLink, toLink, newLock, newCurse) { +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); @@ -3446,16 +3458,15 @@ function KinkyDungeonRestraintPower(item, NoLink, toLink, newLock, newCurse) { } /** - * @param {restraint} oldRestraint - * @param {restraint} newRestraint - * @param {item} [item] - * @param {item} [ignoreItem] - * @param {string} [Lock] - * @param {string} [Curse] - * @param {number} [power] - * @returns {boolean} + * @param oldRestraint + * @param newRestraint + * @param [item] + * @param [Lock] + * @param [Curse] + * @param [ignoreItem] + * @param [power] */ -function KinkyDungeonLinkableAndStricter(oldRestraint, newRestraint, item, Lock, Curse, ignoreItem, 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}}); @@ -3468,40 +3479,52 @@ function KinkyDungeonLinkableAndStricter(oldRestraint, newRestraint, item, Lock, * Blanket function for stuff needed to select a restraint * @param {restraint} restraint */ -function KDIsEligible(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() { +function KinkyDungeonGenerateRestraintTrap(): string { let enemy = KinkyDungeonGetEnemy(["chestTrap"], KDGetEffLevel(),(KinkyDungeonMapIndex[MiniGameKinkyDungeonCheckpoint] || MiniGameKinkyDungeonCheckpoint), '0', ["chestTrap"]); if (enemy) return enemy.name; return "GreedyGhast"; } -function KDGetLockVisual(item) { +function KDGetLockVisual(item: item): string { //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] - allow linking under - * @param {boolean} [noOverpower] - not allowed to replace items that currently exist - * @param {entity} [securityEnemy] - Bypass is treated separately for these groups - * @param {boolean} [useAugmentedPower] - Bypass is treated separately for these groups - * @param {string} [curse] - Bypass is treated separately for these groups - * @param {string[]} [augmentedInventory] - * @param {number} [powerBonus] - * @returns {boolean} - Restraint can be added + * @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, Bypass, Lock, NoStack, r, Deep, noOverpower, securityEnemy, useAugmentedPower, curse, augmentedInventory, powerBonus = 0) { +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; @@ -3596,12 +3619,10 @@ function KDCanAddRestraint(restraint, Bypass, Lock, NoStack, r, Deep, noOverpowe } /** - * - * @param {string} Group - * @param {entity} enemy - * @returns {boolean} + * @param Group + * @param enemy */ -function KDEnemyPassesSecurity(Group, enemy) { +function KDEnemyPassesSecurity(Group: string, enemy: entity): boolean { if (!enemy) return false; let blockers = KDGetBlockingRestraints(Group, true); for (let blocker of blockers) { @@ -3615,19 +3636,18 @@ function KDEnemyPassesSecurity(Group, enemy) { /** * 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 - * @param {string} [Lock] - * @param {string} [Curse] - * @param {number} [powerBonus] - * @param {boolean} [allowOverride] - * @returns {item} + * @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, restraint, bypass, NoStack, Deep, securityEnemy, Lock, Curse, powerBonus, 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) { @@ -3643,19 +3663,18 @@ function KDGetLinkUnder(currentRestraint, restraint, bypass, NoStack, Deep, secu /** * 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 - * @param {string} [Lock] - * @param {string} [Curse] - * @param {item} [ignoreItem] - * @param {number} [powerBonus] - * @param {boolean} [allowOverride] - * @returns {boolean} + * @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, restraint, bypass, NoStack, securityEnemy, Lock, Curse, ignoreItem, powerBonus, 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)) @@ -3697,12 +3716,10 @@ function KDCanLinkUnder(currentRestraint, restraint, bypass, NoStack, securityEn } /** - * - * @param {item} currentItem - * @param {restraint} newItem - * @returns {boolean} + * @param currentItem + * @param newItem */ -function KDCurrentItemLinkable(currentItem, 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) @@ -3714,20 +3731,18 @@ function KDCurrentItemLinkable(currentItem, newItem) { } /** - * - * @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 - * @param {object} [props] - Curse and lock properties - * @param {string} [props.newLock] - * @param {string} [props.newCurse] - * @param {number} [power] - Item that can overpower other linked items - * @returns {boolean} + * @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, restraint, bypass, NoStack, securityEnemy, ignoreItem, props, power) { +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] : []); @@ -3761,12 +3776,10 @@ function KDCheckLinkSize(currentRestraint, restraint, bypass, NoStack, securityE } /** - * - * @param {restraint} restraint - * @param {ApplyVariant} variant - * @returns {KDRestraintVariant} + * @param restraint + * @param variant */ -function KDApplyVarToInvVar(restraint, variant) { +function KDApplyVarToInvVar(restraint: restraint, variant: ApplyVariant): KDRestraintVariant { let events = []; let restvar = { template: restraint.name, @@ -3778,30 +3791,53 @@ function KDApplyVarToInvVar(restraint, variant) { events.push(...JSON.parse(JSON.stringify(KDEventHexModular[e].events({variant: restvar})))); } for (let e of variant.enchants) { - 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})))); + /* + * 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} 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 - * @param {boolean} [reserved] - Reserved do not use - * @param {string} [inventoryAs] - inventoryAs for the item - * @param {Record} [data] - data for the item - * @returns {number} + * @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, Tightness, Bypass, Lock, Keep, Trapped, events, faction, Deep, Curse, securityEnemy, reserved, inventoryAs, data, powerBonus = 0) { +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 +): number +{ KDRestraintDebugLog.push("LKUndering " + restraint.name); let r = KinkyDungeonGetRestraintItem(restraint.Group); @@ -3931,26 +3967,44 @@ function KDLinkUnder(restraint, Tightness, Bypass, Lock, Keep, Trapped, events, } /** - * @param {restraint | string} restraint - * @param {number} [Tightness] - * @param {boolean} [Bypass] - * @param {string} [Lock] - * @param {boolean} [Keep] - * @param {boolean} [Trapped] - Deprecated do not use - * @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 - * @param {boolean} [useAugmentedPower] - Augment power to keep consistency - * @param {string} [inventoryAs] - inventoryAs for the item - * @param {string[]} [augmentedInventory] - * @param {Record} [data] - data for the item - * @param {ApplyVariant} [variant] - variant for the item - * @param {number} [powerBonus] - 0 without variant - * @returns {number} + * @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, Tightness, Bypass, Lock, Keep, Trapped, events, faction, Deep, Curse, securityEnemy, useAugmentedPower, inventoryAs, data, augmentedInventory, variant, powerBonus = 0) { +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 +): number +{ let player = KDPlayer(); if (typeof restraint === "string") { KDRestraintDebugLog.push("Lookup" + restraint); @@ -4016,9 +4070,8 @@ function KinkyDungeonAddRestraintIfWeaker(restraint, Tightness, Bypass, Lock, Ke * @param {string} [data.props.newLock] * @param {string} [data.props.newCurse] * @param {number} [data.power] - * @returns {boolean} */ -function KinkyDungeonIsLinkable(data) { +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, @@ -4043,12 +4096,11 @@ function KinkyDungeonIsLinkable(data) { /** * Checks if all the items linked under allow this item - * @param {item} oldRestraint - * @param {restraint} newRestraint - * @param {item} [ignoreItem] - * @returns {boolean} + * @param oldRestraint + * @param newRestraint + * @param [ignoreItem] */ -function KDCheckLinkTotal(oldRestraint, newRestraint, ignoreItem, lock = "", curse = "", useAugmentedPower = false, augmentedInventory = undefined) { +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; } @@ -4092,9 +4144,9 @@ function KDCheckLinkTotal(oldRestraint, newRestraint, ignoreItem, lock = "", cur /** * Gets the linkability cache - * @param {item} restraint + * @param restraint */ -function KDUpdateLinkCaches(restraint) { +function KDUpdateLinkCaches(restraint: item) { let link = restraint; while (link) { link.linkCache = KDGetLinkCache(link); @@ -4104,10 +4156,9 @@ function KDUpdateLinkCaches(restraint) { /** * Gets the linkability cache - * @param {item} restraint - * @returns {string[]} + * @param restraint */ -function KDGetLinkCache(restraint) { +function KDGetLinkCache(restraint: item): string[] { let cache = Object.assign([], KDRestraint(restraint).LinkableBy || []); let link = restraint.dynamicLink; while (link) { @@ -4126,27 +4177,46 @@ 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 {boolean} [NoEvent] - * @param {entity} [securityEnemy] - Whether or not to automatically dispatch messages - * @param {string} [inventoryAs] - InventoryAs for the item - * @param {number} [powerBonus] - bonus power - * @param {Record} [data] - data for the item - * @returns + * @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, Tightness, Bypass, Lock, Keep, Link, SwitchItems, events, faction, Unlink, dynamicLink, Curse, autoMessage = true, securityEnemy = undefined, inventoryAs = undefined, data, powerBonus = 0, NoEvent = false) { +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 +): number +{ KDDelayedActionPrune(["Restrain"]); if (restraint.bypass) Bypass = true; KDStruggleGroupLinkIndex = {}; @@ -4242,8 +4312,16 @@ function KinkyDungeonAddRestraint(restraint, Tightness, Bypass, Lock, Keep, Link KinkyDungeonSendFloater({x: 1100, y: 600 - KDRecentRepIndex * 40}, `+${TextGet("Restraint" + restraint.name)}!`, "pink", 5, true); KDRecentRepIndex += 1; - let item = {name: restraint.name, id: KinkyDungeonGetItemID(), type: Restraint, curse: Curse, events: events ? events : KDGetEventsForRestraint(inventoryAs || restraint.name), - tightness: tight, lock: "", faction: faction, dynamicLink: dynamicLink, + 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; @@ -4320,17 +4398,18 @@ function KinkyDungeonAddRestraint(restraint, Tightness, Bypass, Lock, Keep, Link /** * It removes a restraint from the player - * @param {item} item - 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 - * @param {boolean} [ForceRemove] - Ignore AlwaysKeep, for example if armor gets confiscated - * @returns {item[]} removed items + * @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, Keep, Add, NoEvent, Shrine, UnLink, Remover, ForceRemove) { +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); @@ -4349,17 +4428,17 @@ function KinkyDungeonRemoveRestraintSpecific(item, Keep, Add, NoEvent, Shrine, U /** * 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 - * @param {boolean} [ForceRemove] - Ignore AlwaysKeep, for example if armor gets confiscated - * @returns {item[]} items removed + * @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, Keep, Add, NoEvent, Shrine, UnLink, Remover, ForceRemove) { +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"]); @@ -4426,7 +4505,7 @@ function KinkyDungeonRemoveRestraint(Group, Keep, Add, NoEvent, Shrine, UnLink, } if (!KinkyDungeonInventoryGetLoose(inventoryAs)) { - let loose = {name: inventoryAs, id: KinkyDungeonGetItemID(), type: LooseRestraint, events:invitem.events || origRestraint.events, quantity: 1}; + 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); @@ -4498,21 +4577,21 @@ function KinkyDungeonRemoveRestraint(Group, Keep, Add, NoEvent, Shrine, UnLink, return rem; } -function KDIInsertRestraintUnderneath(restraint) { +function KDIInsertRestraintUnderneath(_restraint: 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 - * @param {boolean} [ForceRemove] - Ignore AlwaysKeep, for example if armor gets confiscated - * @returns {item[]} removed items + * @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, Keep, NoEvent, Remover, ForceRemove) { +function KinkyDungeonRemoveDynamicRestraint(hostItem: item, Keep?: boolean, NoEvent?: boolean, Remover?: entity, ForceRemove?: boolean): item[] { let item = hostItem.dynamicLink; let rem = []; if (item) { @@ -4540,7 +4619,7 @@ function KinkyDungeonRemoveDynamicRestraint(hostItem, Keep, NoEvent, Remover, Fo } } if (!KinkyDungeonInventoryGetLoose(inventoryAs)) { - let loose = {name: inventoryAs, id: KinkyDungeonGetItemID(), type: LooseRestraint, events: item.events || KDGetEventsForRestraint(inventoryAs), quantity: 1}; + 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); @@ -4615,8 +4694,8 @@ function KinkyDungeonRemoveDynamicRestraint(hostItem, Keep, NoEvent, Remover, Fo * @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 = []; +function KinkyDungeonRestraintTypes(ShrineFilter: string[]): string[] { + let ret: string[] = []; for (let invItem of KinkyDungeonAllRestraintDynamic()) { let inv = invItem.item; @@ -4632,21 +4711,33 @@ function KinkyDungeonRestraintTypes(ShrineFilter) { /** - * - * @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 - * @param {string} [inventoryAs] - inventoryAs for the item - * @param {KinkyDungeonEvent[]} [events] - inventoryAs for the item - * @param {Record} [data] - data for the item + * @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, oldItem, tightness, Lock, Keep, faction, Curse, autoMessage = true, inventoryAs = null, events = undefined, data) { +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); @@ -4681,14 +4772,11 @@ function KinkyDungeonLinkItem(newRestraint, oldItem, tightness, Lock, Keep, fact * @param {boolean} Keep * @returns {item[]} */ -function KinkyDungeonUnLinkItem(item, Keep, dynamic) { +function KinkyDungeonUnLinkItem(item: item, Keep: boolean, _dynamic?: any): item[] { //if (!data.add && !data.shrine) let rem = []; if (item.type == Restraint) { - /** - * @type {item} - */ - let UnLink = null; + let UnLink: item = null; if (item.dynamicLink) { UnLink = item.dynamicLink; } @@ -4714,12 +4802,16 @@ function KinkyDungeonUnLinkItem(item, Keep, dynamic) { } /** - * - * @param {number} x - * @param {number} y - * @param {{aoe: number, number: number, dist: number, kind: string, duration?: number, durationExtra?: number}} options + * @param x + * @param y + * @param options */ -function KDCreateDebris(x, y, 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; @@ -4748,15 +4840,14 @@ function KDCreateDebris(x, y, options) { } /** - * - * @param {string} StruggleType - * @param {item} restraint - * @param {KDLockType} lockType - * @param {number} index - * @param {any} data - * @param {item} host + * @param StruggleType + * @param restraint + * @param lockType + * @param index + * @param data + * @param host */ -function KDSuccessRemove(StruggleType, restraint, lockType, index, data, 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; @@ -4833,7 +4924,8 @@ function KDSuccessRemove(StruggleType, restraint, lockType, index, data, host) { } } let suff = ""; - if (KinkyDungeonStatDistraction > KinkyDungeonStatDistractionMax*0.1) suff = "Aroused"; + 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); @@ -4841,7 +4933,7 @@ function KDSuccessRemove(StruggleType, restraint, lockType, index, data, host) { return destroy; } -function KDAddDelayedStruggle(amount, time, StruggleType, struggleGroup, index, data, progress = 0, limit = 100) { +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))); @@ -4863,15 +4955,13 @@ function KDAddDelayedStruggle(amount, time, StruggleType, struggleGroup, index, } /** - * - * @param {number} bonus - * @param {number} penalty - * @param {number} threshold - * @param {number} bonusscale - * @param {number} penaltyscale - * @returns {number} + * @param bonus + * @param penalty + * @param threshold + * @param bonusscale + * @param penaltyscale */ -function KDGetManaBonus(bonus, penalty, threshold, bonusscale, 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; @@ -4879,10 +4969,10 @@ function KDGetManaBonus(bonus, penalty, threshold, bonusscale, penaltyscale) { /** * Gets the goddess bonus for this item - * @param {item} item - * @param {any} data - Escape chance data + * @param item + * @param [data] - Escape chance data */ -function KDGetItemGoddessBonus(item, data) { +function KDGetItemGoddessBonus(item: item, data?: any): number { if (!item) return 0; if (data) { if (data.struggleType == "Unlock") return 0; @@ -4902,12 +4992,11 @@ function KDGetItemGoddessBonus(item, data) { /** * Gets a restraint from a list of eligible restraints and a group prioritization order - * @param {{restraint: restraint, weight: number}[]} RestraintList - * @param {string[]} GroupOrder - * @param {boolean} [skip] - * @returns {restraint} + * @param RestraintList + * @param GroupOrder + * @param [skip] */ -function KDChooseRestraintFromListGroupPri(RestraintList, GroupOrder, skip = true) { +function KDChooseRestraintFromListGroupPri(RestraintList: {restraint: restraint, weight: number}[], GroupOrder: string[], skip: boolean = true): restraint { let cycled = false; for (let i = 0; i < GroupOrder.length; i++) { @@ -4952,12 +5041,16 @@ function KDChooseRestraintFromListGroupPri(RestraintList, GroupOrder, skip = tru /** * Gets a restraint from a list of eligible restraints and a group prioritization order - * @param {{restraint: restraint, variant?: ApplyVariant, weight: number}[]} RestraintList - * @param {string[]} GroupOrder - * @param {boolean} [skip] - * @returns {{r: restraint, v: ApplyVariant}} + * @param RestraintList + * @param GroupOrder + * @param [skip] */ -function KDChooseRestraintFromListGroupPriWithVariants(RestraintList, GroupOrder, skip = true) { +function KDChooseRestraintFromListGroupPriWithVariants ( + RestraintList: {restraint: restraint, variant?: ApplyVariant, weight: number}[], + GroupOrder: string[], + skip: boolean = true +): { r: restraint, v: ApplyVariant } +{ let cycled = false; for (let i = 0; i < GroupOrder.length; i++) { let group = GroupOrder[i]; @@ -5000,8 +5093,12 @@ function KDChooseRestraintFromListGroupPriWithVariants(RestraintList, GroupOrder } +type kdRopeSlimePart = { + enemyTagSuffix?: string; + enemyTagExtra?: Record, +} -let KDSlimeParts = { +let KDSlimeParts: Record = { "Collar": {enemyTagSuffix: "Collar",enemyTagExtra: {"livingCollar":10}}, "Boots": {}, "Feet": {}, @@ -5013,7 +5110,7 @@ let KDSlimeParts = { "Raw": {}, }; -let KDRopeParts = { +let KDRopeParts: Record = { "Collar": {enemyTagSuffix: "Collar",enemyTagExtra: {"livingCollar":10}}, "ArmsBoxtie": {}, "ArmsWrist": {}, @@ -5036,8 +5133,17 @@ let KDRopeParts = { "Raw": {}, }; -let KDCuffParts = { - "LivingCollar": {base: true, enemyTagSuffix: "Collar", enemyTagOverride: {"livingCollar":10}}, +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"}, @@ -5050,28 +5156,55 @@ let KDCuffParts = { }; /** - * - * @param {string} CopyOf - The cuff family to copy - * @param {string} idSuffix - The suffix to add to the cuff family - * @param {string} ModelSuffix - The suffix for the cuff model to use - * @param {string} tagBase - The base for the enemy tags - * @param {Record} extraTags - extra enemy tags - * @param {string[]} allTag - adds a tag to all of the cuffs if specified - * @param {number} addPower - Base opower level - * @param {KDRestraintPropsBase} properties - Restraint properties to override - * @param {KinkyDungeonEvent[]} extraEvents - Extra events to add on to the base cuffs - * @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 {boolean} [noGeneric] - does not add this to tagBaseRestraints, only tagBaseCuffs - * @param {Record} [CuffAssets] - mapping of Group to Assets - * @param {Record} [CuffModels] - mapping of Group to Models - * @param {boolean} [noLockBase] - Removes Pick and Unlock methods of escape - * @param {boolean} [noLockLink] - Removes Pick and Unlock methods of escape - * @param {Record} [Properties] + * @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, idSuffix, ModelSuffix, tagBase, extraTags, allTag, removeTag, addPower, properties, extraEvents = [], addStruggle, premultStruggle, addStruggleLink, premultStruggleLink, Filters, baseWeight = 10, noGeneric, CuffAssets = {}, CuffModels = {}, noLockBase, noLockLink, Properties) { +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]; @@ -5079,8 +5212,7 @@ function KDAddCuffVariants(CopyOf, idSuffix, ModelSuffix, tagBase, extraTags, al 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 - /** @type {Record} */ - let enemyTags = {}; + let enemyTags: Record = {}; if (cuffInfo.base) { enemyTags[tagBase + (cuffInfo.enemyTagSuffix || "Cuffs")] = baseWeight; if (cuffInfo.enemyTagOverride) { @@ -5101,16 +5233,14 @@ function KDAddCuffVariants(CopyOf, idSuffix, ModelSuffix, tagBase, extraTags, al } } - /** @type {Record} */ - let enemyTagsMult = {}; + 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); } - /** @type {KDRestraintPropsBase} */ - let props = { + let props: KDRestraintPropsBase = { Model: CuffModels[cuffPart] || (origRestraint.Model + ModelSuffix + (cuffInfo.ModelSuffix || "")), Asset: CuffAssets[cuffPart] || (origRestraint.Asset), power: origRestraint.power + addPower, @@ -5180,25 +5310,43 @@ function KDAddCuffVariants(CopyOf, idSuffix, ModelSuffix, tagBase, extraTags, al * @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 {boolean} Enchantable - Do NOT delete enchantable rope categories * @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, idSuffix, ModelSuffix, tagBase, allTag, removeTag, basePower, properties, extraEvents = [], addStruggle, premultStruggle, Filters, baseWeight = 10, Enchantable = false, Properties) { +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 - /** @type {Record} */ - let enemyTags = {}; + let enemyTags: Record = {}; enemyTags[tagBase + (part[1].enemyTagSuffix || "")] = baseWeight; if (part[1].enemyTagExtra) { for (let tag in part[1].enemyTagExtra) { @@ -5208,15 +5356,13 @@ function KDAddRopeVariants(CopyOf, idSuffix, ModelSuffix, tagBase, allTag, remov - /** @type {Record} */ - let enemyTagsMult = {}; + let enemyTagsMult: Record = {}; enemyTagsMult[tagBase + (part[1].enemyTagSuffix || "")] = 1; let shrine = [...allTag, ...KDGetRestraintTags(origRestraint)]; for (let t of removeTag) { if (shrine.includes(t)) shrine.splice(shrine.indexOf(t), 1); } - /** @type {KDRestraintPropsBase} */ - let props = { + let props: KDRestraintPropsBase = { Model: origRestraint.Model + ModelSuffix, power: origRestraint.power + basePower, shrine: shrine, @@ -5269,31 +5415,48 @@ function KDAddRopeVariants(CopyOf, idSuffix, ModelSuffix, tagBase, allTag, remov /** - * - * @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 {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 {string} [restraintType] - Restrainttype for slime spread event - * @param {Record} [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, idSuffix, ModelSuffix, tagBase, allTag, removeTag, basePower, properties, extraEvents = [], addStruggle, premultStruggle, Filters, baseWeight = 100, restraintType, Properties) { +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 - /** @type {Record} */ - let enemyTags = {}; + let enemyTags: Record = {}; enemyTags[tagBase + (part[1].enemyTagSuffix || "")] = baseWeight; enemyTags[tagBase + (part[1].enemyTagSuffix || "") + "Random"] = baseWeight + 3; if (part[1].enemyTagExtra) { @@ -5306,8 +5469,7 @@ function KDAddHardSlimeVariants(CopyOf, idSuffix, ModelSuffix, tagBase, allTag, for (let t of removeTag) { if (shrine.includes(t)) shrine.splice(shrine.indexOf(t), 1); } - /** @type {KDRestraintPropsBase} */ - let props = { + let props: KDRestraintPropsBase = { Model: origRestraint.Model + ModelSuffix, power: origRestraint.power + basePower, shrine: shrine, @@ -5351,33 +5513,29 @@ function KDAddHardSlimeVariants(CopyOf, idSuffix, ModelSuffix, tagBase, allTag, /** * Converts restraint tags to a copy that is also a list (in case data structure changes) - * @param {restraint} restraint + * @param restraint * @returns {string[]} */ -function KDGetRestraintTags(restraint) { +function KDGetRestraintTags(restraint: restraint): string[] { return [...restraint.shrine]; } /** - * - * @param {item} item - * @param {string} name - * @returns {any} + * @param item + * @param name */ -function KDItemDataQuery(item, name) { +function KDItemDataQuery(item: item, name: string): any { if (item?.data) { return item.data[name]; } return undefined; } /** - * - * @param {item} item - * @param {string} name - * @param {number | string} value - * @returns {any} + * @param item + * @param name + * @param value */ -function KDItemDataSet(item, name, value) { +function KDItemDataSet(item: item, name: string, value: number | string): void { if (!item.data) { item.data = {}; } @@ -5386,11 +5544,11 @@ function KDItemDataSet(item, name, value) { /** * Changes a restraint item's name - * @param {item} item - * @param {string} type - Restraint or LooseRestraint - * @param {string} name + * @param item + * @param type - Restraint or LooseRestraint + * @param name */ -function KDChangeItemName(item, type, 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); @@ -5403,12 +5561,10 @@ function KDChangeItemName(item, type, name) { /** * Gets the total curse power rating of the player * @param {boolean} activatedOnly - * @returns {number} */ -function KDCurseCount(activatedOnly) { +function KDCurseCount(activatedOnly: boolean): number { let restraints = KinkyDungeonAllRestraintDynamic(); - /** @type {KDEventData_CurseCount} */ - let data = { + let data: KDEventData_CurseCount = { restraints: restraints, activatedOnly: activatedOnly, count: 0, @@ -5419,15 +5575,14 @@ function KDCurseCount(activatedOnly) { } /** - * - * @param {entity} player - * @param {string[]} requireSingleTag - * @param {string[]} requireAllTags - * @param {boolean} ignoregold - * @param {boolean} ignoreShrine - * @param {boolean} [forceIgnoreNonBinding] + * @param player + * @param requireSingleTag + * @param requireAllTags + * @param ignoregold + * @param ignoreShrine + * @param [forceIgnoreNonBinding] */ -function KDGetTotalRestraintPower(player, requireSingleTag, requireAllTags, ignoregold, ignoreShrine, 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; @@ -5450,7 +5605,7 @@ function KDGetTotalRestraintPower(player, requireSingleTag, requireAllTags, igno return power; } -function KDGetEscapeSFX(restraint) { +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; @@ -5458,7 +5613,7 @@ function KDGetEscapeSFX(restraint) { return null; } -function KDGetRestraintSFX(restraint) { +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; @@ -5466,14 +5621,14 @@ function KDGetRestraintSFX(restraint) { return null; } -function KDGetFinishEscapeSFX(restraint) { +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) { +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; @@ -5482,12 +5637,10 @@ function KDGetRemoveSFX(restraint) { } /** - * - * @param {item} item - * @param {number} level - * @returns {boolean} + * @param item + * @param level */ -function KDHasRemovableCurse(item, level) { +function KDHasRemovableCurse(item: item, level: number): boolean { if (item.curse && KDCurses[item.curse] && KDCurses[item.curse].level <= level) { return true; } @@ -5495,12 +5648,10 @@ function KDHasRemovableCurse(item, level) { } /** - * - * @param {item} item - * @param {number} level - * @returns {boolean} + * @param item + * @param level */ -function KDHasRemovableHex(item, 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; })) { @@ -5510,12 +5661,11 @@ function KDHasRemovableHex(item, level) { } /** - * - * @param {item} item - * @param {number} level + * @param item + * @param level * @returns {KinkyDungeonEvent[]} */ -function KDGetRemovableHex(item, level) { +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" && @@ -5529,9 +5679,9 @@ let KDRestraintDebugLog = []; /** * The name of an item, includes TextGet call - * @param {item} item + * @param item */ -function KDGetItemName(item) { +function KDGetItemName(item: item): string { let base = TextGet("KinkyDungeonInventoryItem" + item.name); let variant = null; switch(item.type) { @@ -5553,34 +5703,32 @@ function KDGetItemName(item) { if (variant?.prefix) return TextGet("KDVarPref" + variant.prefix) + " " + base; return base; } + /** - * - * @param {restraint} restraint - * @param {ApplyVariant} [variant] + * @param restraint + * @param [variant] */ -function KDGetRestraintName(restraint, 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} consumable - * @param {ApplyVariant} [variant] + * @param consumable + * @param [variant] */ -function KDGetConsumableName(consumable, 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} weapon - * @param {ApplyVariant} [variant] + * @param weapon + * @param [variant] */ -function KDGetWeaponName(weapon, 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; @@ -5588,10 +5736,9 @@ function KDGetWeaponName(weapon, variant) { } /** - * - * @param {string} name + * @param name */ -function KDGetItemNameString(name) { +function KDGetItemNameString(name: string): string { let base = TextGet((KinkyDungeonGetRestraintByName(name) ? "Restraint" : "KinkyDungeonInventoryItem") + name); let variant = KinkyDungeonRestraintVariants[name] || KinkyDungeonWeaponVariants[name] || KinkyDungeonConsumableVariants[name]; if (variant) { @@ -5604,7 +5751,7 @@ function KDGetItemNameString(name) { -function KDGetEventsForRestraint(name) { +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 || []); @@ -5612,12 +5759,10 @@ function KDGetEventsForRestraint(name) { /** - * - * @param {item} item - * @param {boolean} [includeItem] - Include 'item' - * @returns {item[]} + * @param item + * @param [includeItem] - Include 'item' */ -function KDDynamicLinkList(item, includeItem) { +function KDDynamicLinkList(item: item, includeItem?: boolean): item[] { let ret = []; if (includeItem) ret.push(item); if (item && item.dynamicLink) { @@ -5632,10 +5777,9 @@ function KDDynamicLinkList(item, includeItem) { /** * Returns a list of items on the 'surface' of a dynamic link, i.e items that can be accessed - * @param {item} item - * @returns {item[]} + * @param item */ -function KDDynamicLinkListSurface(item) { +function KDDynamicLinkListSurface(item: item): item[] { // First we get the whole stack let stack = []; if (item && item.dynamicLink) { @@ -5672,12 +5816,10 @@ function KDDynamicLinkListSurface(item) { } /** - * - * @param {restraint} restraint - * @param {number} [index] - * @returns {number} + * @param restraint + * @param [index] */ -function KDLinkSize(restraint, index) { +function KDLinkSize(restraint: restraint, index?: number): number { if (index != undefined && restraint.linkSizes) { return restraint.linkSizes[index]; } @@ -5685,14 +5827,12 @@ function KDLinkSize(restraint, index) { } /** - * - * @param {item} item - * @param {string} linkCategory - * @param {item} [ignoreItem] - * @param {number} [power] - Ignore items with less power - * @returns {number} + * @param item + * @param linkCategory + * @param [ignoreItem] + * @param [power] - Ignore items with less power */ -function KDLinkCategorySize(item, linkCategory, ignoreItem, power) { +function KDLinkCategorySize(item: item, linkCategory: string, ignoreItem?: item, power?: number): number { let total = 0; // First we get the whole stack let stack = [item]; @@ -5720,11 +5860,9 @@ function KDLinkCategorySize(item, linkCategory, ignoreItem, power) { } /** - * - * @param {item} item - * @returns {item} + * @param item */ -function KDGetRestraintHost(item) { +function KDGetRestraintHost(item: item): item { let host = KinkyDungeonGetRestraintItem(KDRestraint(item)?.Group); let link = item.dynamicLink; @@ -5740,11 +5878,10 @@ function KDGetRestraintHost(item) { /** - * - * @param {KinkyDungeonEvent} e - * @param {item} item + * @param e + * @param item */ -function KDLinkItemEvent(e, item, data) { +function KDLinkItemEvent(e: KinkyDungeonEvent, item: item, data: any): void { let added = false; if (data.restraintsAdded) { for (let r of data.restraintsAdded) { @@ -5772,10 +5909,7 @@ function KDLinkItemEvent(e, item, data) { } } -/** - * @returns {number} - */ -function KDGetRestriction() { +function KDGetRestriction(): number { let data = { restriction: 0 }; @@ -5803,12 +5937,10 @@ function KDGetRestriction() { } /** - * - * @param {item} item - * @param {entity} [Remover] - * @returns {boolean} + * @param item + * @param [Remover] */ -function KDAlwaysKeep(item, 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 @@ -5820,15 +5952,15 @@ function KDAlwaysKeep(item, Remover) { /** * Re-sorts the restraint stack so that items are in LinkPriority order - * @param {string} Group - * @param {item} [addedItem] - * @param {boolean} [bypass] - * @param {entity} [securityEnemy] + * @param Group + * @param [addedItem] + * @param [bypass] + * @param [securityEnemy] */ -function KDResortRestraints(Group, addedItem, bypass, securityEnemy) { +function KDResortRestraints(Group: string, addedItem: item, bypass: boolean, securityEnemy: entity) { let item = KinkyDungeonGetRestraintItem(Group); if (item) { - let pri = (inv) => { + let pri = (inv: item) => { return ((KDRestraint(inv).linkPriority*1000) || KinkyDungeonRestraintPower(inv, true) || 0); }; if (!addedItem) { @@ -5887,11 +6019,9 @@ function KDResortRestraints(Group, addedItem, bypass, securityEnemy) { } /** - * - * @param {entity} player - * @returns {number} + * @param player */ -function KDLockoutChance(player) { +function KDLockoutChance(player: entity): number { let data = { chance: 0, bonus: 0, @@ -5909,12 +6039,11 @@ function KDLockoutChance(player) { /** - * - * @param {entity} player - * @param {any} data - * @returns {void} + * @param player + * @param data + * @param [base] */ -function KDLockoutGain(player, data, base = 20) { +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); @@ -5922,10 +6051,31 @@ function KDLockoutGain(player, data, base = 20) { } -function KDMaxCutDepth(threshold, cutBonus, origEscapeChance, origLimitChance) { +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 ""; } \ No newline at end of file diff --git a/Game/src/restraint/KinkyDungeonRestraintsList.js b/Game/src/restraint/KinkyDungeonRestraintsList.ts similarity index 98% rename from Game/src/restraint/KinkyDungeonRestraintsList.js rename to Game/src/restraint/KinkyDungeonRestraintsList.ts index 04ae8c85b..e45b944c8 100644 --- a/Game/src/restraint/KinkyDungeonRestraintsList.js +++ b/Game/src/restraint/KinkyDungeonRestraintsList.ts @@ -50,9 +50,8 @@ let KDBeltLink = [...KDBindable, ...KDDevices]; // For ACTUAL belt, not chastity /** - * @type {restraint[]} */ -const KinkyDungeonRestraints = [ +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"],}, @@ -703,7 +702,9 @@ const KinkyDungeonRestraints = [ 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", + {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", struggleBreak: true, escapeChance: {"Struggle": -0.5, "Cut": -0.5, "Remove": 0.33, "Pick": -0.15}, @@ -1400,7 +1401,8 @@ const KinkyDungeonRestraints = [ 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"], + enemyTags: {"cyberdollcuffs":20, "cyberdollrestraints":6}, playerTags: {"ItemArmsFull":-2}, + minLevel: 4, allFloors: true, shrine: ["Cyber", "CyberCuffs", "Cuffs", "Metal", "ArmCuffsBase", "CyberWristCuffs"], maxwill: 0.8 }, //endregion @@ -1559,12 +1561,14 @@ const KinkyDungeonRestraints = [ }, factionFilters: { Straps: {color: "LightNeutral", override: true}, - Ball: {color: "Highlight", override: true}, + Ball: {color: "Highlight", override: false}, }, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], power: 1, msg: "KDGagNecklaceOn"}], maxwill: 0.8, enemyTags: {"latexRestraints" : 3, "latexGag" : 10, "latexgagSpell": 10, "jailRestraints": 1}, 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", quickBindCondition: "BallGag", quickBindMult: 0.5, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], 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}, }, @@ -1578,7 +1582,7 @@ const KinkyDungeonRestraints = [ }, factionFilters: { Straps: {color: "LightNeutral", override: true}, - Ball: {color: "Highlight", override: true}, + Ball: {color: "Highlight", override: false}, }, maxwill: 0.8, enemyTags: {"latexRestraints" : 5, "latexRestraintsHeavy" : 5, "latexgagSpell": 10, "latexGag" : 10, "jailRestraints": 3}, ignoreMinLevelTags: ["latexRestraintsHeavy"], playerTags: {"posLatex": -1, "latexAnger": 2, "latexRage": 4}, minLevel: 4, allFloors: true, shrine: ["BallGags", "Latex" , "Gags"]}, @@ -1694,7 +1698,7 @@ const KinkyDungeonRestraints = [ Binder: {color: "DarkNeutral", override: true}, }, events: [ - {trigger: "tick", type: "crystalDrain", power: -0.034, inheritLinked: true}, + {trigger: "tick", type: "crystalDrain", power: -0.01, inheritLinked: true}, {trigger: "struggle", type: "crystalPunish"}, ], escapeChance: {"Struggle": 0.15, "Cut": 0.15, "Remove": 0.1, "Pick": 0.35}, @@ -1787,6 +1791,7 @@ const KinkyDungeonRestraints = [ playerTagsMult: {"ItemMouthFull": 0.1}, }, }, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], power: 1, msg: "KDGagNecklaceOn"}], factionFilters: { Strap: {color: "DarkNeutral", override: false}, Ball: {color: "Highlight", override: false}, @@ -2578,18 +2583,23 @@ const KinkyDungeonRestraints = [ }, // 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: "Bed", + Model: "BondageBed", restriction: 10, + bindarms: true, tightType: "Secure", - 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}, + 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}, ], - 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}]}, + 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, @@ -2621,7 +2631,7 @@ const KinkyDungeonRestraints = [ 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: ["Leather", "Boxbinders", "Block_ItemHands"]}, + minLevel: 8, allFloors: true, shrine: ["Boxbinders", "Leather", "Block_ItemHands"]}, {inventory: true, name: "HighsecStraitjacket", debris: "Belts", strictness: 0.2, Model: "Jacket", factionFilters: { @@ -2680,7 +2690,7 @@ const KinkyDungeonRestraints = [ }, }, factionFilters: { - Ball: {color: "Highlight", override: true}, + 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, "ballGagRestraints" : 4, "gagSpell": 100}, playerTags: {}, minLevel: 5, allFloors: true, shrine: ["BallGags", "Leather", "Latex" , "Gags"]}, @@ -2801,11 +2811,13 @@ const KinkyDungeonRestraints = [ "More_Boxbinders": 3.5, "Less_Boxbinders": 0.1, }, - LinkableBy: [...KDBoxbinderLink], Group: "ItemArms", Color: ["Default", "Default"], bindarms: true, bindhands: 1.0, power: 6, weight: 2, + 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: ["Leather", "Boxbinders", "Block_ItemHands"]}, + 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: { @@ -2869,8 +2881,9 @@ const KinkyDungeonRestraints = [ playerTagsMult: {"ItemMouthFull": 0.1}, }, }, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], power: 1, msg: "KDGagNecklaceOn"}], factionFilters: { - Ball: {color: "Highlight", override: true}, + 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}, playerTags: {}, minLevel: 0, maxLevel: 5, allFloors: true, @@ -2878,6 +2891,7 @@ const KinkyDungeonRestraints = [ {inventory: true, trappable: true, name: "TrapGagLarge", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], Asset: "BallGag", Model: "LargeBallGag", quickBindCondition: "BallGag", quickBindMult: 0.5, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], power: 1, msg: "KDGagNecklaceOn"}], ApplyVariants: { "AntiMagic": { weightMod: -1, @@ -3272,6 +3286,7 @@ const KinkyDungeonRestraints = [ {inventory: true, name: "MagicGag", Asset: "BallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], gag: 0.35, Model: "BallGag", quickBindCondition: "BallGag", quickBindMult: 0.5, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], power: 1, msg: "KDGagNecklaceOn"}], ApplyVariants: { "AntiMagic": { weightMod: -1, @@ -3286,6 +3301,7 @@ const KinkyDungeonRestraints = [ {inventory: true, name: "MagicGagLarge", Asset: "BallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], gag: 0.35, Model: "LargeBallGag", quickBindCondition: "BallGag", quickBindMult: 0.5, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], power: 1, msg: "KDGagNecklaceOn"}], ApplyVariants: { "AntiMagic": { weightMod: -1, @@ -3301,6 +3317,7 @@ const KinkyDungeonRestraints = [ {inventory: true, name: "MagicGag2", Asset: "BallGag", debris: "Belts", LinkableBy: [...KDBallGagLink], renderWhenLinked: [...KDBallGagLink], factionColor: [[], [0]], Model: "LargeBallGag", quickBindCondition: "BallGag", quickBindMult: 0.5, + events: [{trigger: "postRemoval", type: "replaceItem", requireFlag: "Struggle", list: ["GagNecklace"], power: 1, msg: "KDGagNecklaceOn"}], ApplyVariants: { "AntiMagic": { weightMod: -1, @@ -3322,6 +3339,7 @@ const KinkyDungeonRestraints = [ 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"], power: 1, msg: "KDGagNecklaceOn"} ], //"ballGagRestraintsMagic" : 2, "antiMagic": 6 enemyTags: {}, playerTags: {}, minLevel: 3, maxLevel: 7, allFloors: true, shrine: ["Illusion", "BallGags", "Leather" , "Gags", "Conjure"]}, @@ -3334,6 +3352,7 @@ const KinkyDungeonRestraints = [ 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"], power: 1, msg: "KDGagNecklaceOn"}, {trigger: "tick", type: "AntiMagicGag", inheritLinked: true, count: 30, power: 0.4}, ], //"ballGagRestraintsMagic" : 0.3, "antiMagic": 2 @@ -3369,7 +3388,7 @@ const KinkyDungeonRestraints = [ }, }, factionFilters: { - Ball: {color: "Highlight", override: true}, + 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}, @@ -3852,7 +3871,9 @@ const KinkyDungeonRestraints = [ 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, + {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: { @@ -4648,6 +4669,30 @@ const KinkyDungeonRestraints = [ //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", @@ -4661,7 +4706,7 @@ const KinkyDungeonRestraints = [ }, 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, "obsidianNoCuffs": -1000, "obsidianLessCuffs": -3.9, "obsidianCuffs":100}, playerTags: {}, minLevel: 0, allFloors: true, shrine: ["Collars", "Obsidian", "Elements", "HighCollars"], + 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", @@ -5990,7 +6035,7 @@ const KinkyDungeonRestraints = [ {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: 49, weight: 0, Model: "DivineCuffsArms", - specStruggleTypes: ["Struggle"], escapeChance: {"Struggle": -99, "Cut": -99, "Remove": -99}, enemyTags: {"divineRestraints":2}, playerTags: {"ItemArmsFull":-1}, minLevel: 0, allFloors: true, shrine: ["Rope", "Metal", "Latex", "Leather", "HogtieLower"]}, + 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, @@ -6014,7 +6059,8 @@ const KinkyDungeonRestraints = [ events: [ {trigger:"tryOrgasm", type: "DivineBelt"}, ], - specStruggleTypes: ["Struggle"], escapeChance: {"Struggle": -99, "Cut": -99, "Remove": -99}, + 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, @@ -6039,7 +6085,8 @@ const KinkyDungeonRestraints = [ events: [ {trigger:"tryOrgasm", type: "DivineBelt2"}, ], - specStruggleTypes: ["Struggle"], escapeChance: {"Struggle": -99, "Cut": -99, "Remove": -99}, + 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"]}, @@ -6055,7 +6102,8 @@ const KinkyDungeonRestraints = [ power: 49, weight: 0, Model: "DivineBra", - escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {"divinebra": 10}, + 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: [ @@ -6074,7 +6122,8 @@ const KinkyDungeonRestraints = [ power: 49, weight: 0, Model: "DivineBraRunic", - escapeChance: {"Struggle": -100, "Cut": -100, "Remove": -100}, enemyTags: {"divinebra": 10}, + 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: [ @@ -6082,16 +6131,22 @@ const KinkyDungeonRestraints = [ ], }, - {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, addTag: ["FeetLinked"],power: 49, weight: 0, + {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": -99}, 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: "Gold", Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 30, weight: 0, + 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": -99}, 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: "Gold", Group: "ItemMouth", AssetGroup: "ItemMouth3", power: 30, weight: 0, + 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": -99}, enemyTags: {"divineRestraints":2}, playerTags: {"ItemPelvisFull":-1}, minLevel: 12, allFloors: true, shrine: ["Rope", "Metal", "Latex", "Leather"]}, + 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", @@ -6173,6 +6228,23 @@ const KinkyDungeonRestraints = [ }, 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"]}, + { + 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"]}, {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, @@ -6887,9 +6959,10 @@ KDAddCuffVariants( 0, { Color: ["#a694cb", "#ff5277"], + DefaultLock: "Crystal", }, [ - {trigger: "tick", type: "crystalDrain", power: -0.034, inheritLinked: true}, + {trigger: "tick", type: "crystalDrain", power: -0.01, inheritLinked: true}, {trigger: "struggle", type: "crystalPunish"}, ], { @@ -7125,6 +7198,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ protection: 1, displayPower: 4, noRecover: true, + inventory: true, removePrison: true, events: [ {trigger: "tick", type: "ApplyConduction", duration: 2}, @@ -7160,6 +7234,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ strictness: 0.05, restriction: 1, protectionCursed: true, + inventory: true, noRecover: true, removePrison: true, events: [ @@ -7179,6 +7254,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ alwaysKeep: true, alwaysRender: true, UnderlinkedAlwaysRender: true, + inventory: true, escapeChance: { "Struggle": 0.2, "Cut": 0.2, @@ -7212,6 +7288,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ alwaysKeep: true, alwaysRender: true, UnderlinkedAlwaysRender: true, + inventory: true, escapeChance: { "Struggle": -50, "Cut": -50, @@ -7269,6 +7346,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ protection: 2, displayPower: 7, protectionCursed: true, + inventory: true, strictness: 0.08, shrine: ["Armor", "TorsoArmor", "MetalArmor", "Heavy"], addPose: ["TorsoArmor"], @@ -7307,6 +7385,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ }, protection: 1, protectionCursed: true, + inventory: true, strictness: 0.08, shrine: ["Armor", "TorsoArmor", "MetalArmor", "Light"], addPose: ["TorsoArmor"], @@ -7345,6 +7424,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ debris: "Belts", protection: 3, protectionCursed: true, + inventory: true, strictness: 0.15, displayPower: 10, removePrison: true, @@ -7379,6 +7459,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ 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}, @@ -7408,6 +7489,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ protection: 1, debris: "Belts", protectionCursed: true, + inventory: true, displayPower: 5, removePrison: true, events: [ @@ -7439,6 +7521,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ protection: 2, debris: "Belts", protectionCursed: true, + inventory: true, displayPower: 8, removePrison: true, events: [ @@ -7472,6 +7555,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ protection: 1, displayPower: 5, noRecover: true, + inventory: true, removePrison: true, events: [ {trigger: "tick", type: "ApplyConduction", duration: 2}, @@ -7505,6 +7589,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ 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}, @@ -7533,6 +7618,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ displayPower: 3, LinkAll: true, AlwaysLinkable: true, linkCategory: "Armor", linkSize: 0.6, debris: "Belts", + inventory: true, protection: 1, removePrison: true, events: [ @@ -7568,6 +7654,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ 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}, @@ -7597,6 +7684,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ 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}, @@ -7629,6 +7717,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ debris: "Belts", noRecover: true, removePrison: true, + inventory: true, events: [ {trigger: "tick", type: "ApplyConduction", duration: 2}, {trigger: "tick", type: "armorBuff", power: 0.5, inheritLinked: true}, @@ -7662,6 +7751,7 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ displayPower: 2, protection: 1, removePrison: true, + inventory: true, events: [ {trigger: "tick", type: "RestraintBlock", power: 1.0, inheritLinked: true}, ], @@ -7681,8 +7771,8 @@ KinkyDungeonAddCursedVariants(KinkyDungeonCreateRestraint({ let KDControlHarnessCategories = { "Cuffs": { activateCount: 3, - activateTags: ["ArmCuffsBase", "LegCuffsBase", "AnkleCuffsBase"], - activateFunction: (e, item, data, invItems) => { + activateTags: ["CyberWristCuffs", "CyberAnkleCuffs", "CyberLegCuffs"], + activateFunction: (_e: KinkyDungeonEvent, item: item, _data: any, _invItems: item[]) => { //if (!KinkyDungeonFlags.get("ControlHarnessCuffs")) { // If there are any cuffs to upgrade @@ -7715,7 +7805,7 @@ let KDControlHarnessCategories = { //KinkyDungeonSetFlag("ControlHarnessCuffs", 1); //} }, - updateFunction: (e, item, data, invItems) => { + 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, @@ -7731,7 +7821,7 @@ let KDControlHarnessCategories = { "RemoteLink": { activateCount: 0, activateTags: [], - activateFunction: (e, item, data, invItems) => { + activateFunction: (_e: KinkyDungeonEvent, item: item, _data: any, _invItems: item[]) => { //if (!KinkyDungeonFlags.get("ControlHarnessCuffs")) { // If there are any cuffs to upgrade @@ -7764,14 +7854,14 @@ let KDControlHarnessCategories = { //KinkyDungeonSetFlag("ControlHarnessCuffs", 1); //} }, - updateFunction: (e, item, data, invItems) => { + updateFunction: (_e: KinkyDungeonEvent, _item: item, _data: any, _invItems: item[]) => { }, }, "Chastity": { activateCount: 2, activateTags: ["CyberChastityL", "CyberChastityU"], - activateFunction: (e, item, data, invItems) => { + activateFunction: (_e: KinkyDungeonEvent, item: item, _data: any, _invItems: item[]) => { if (!KinkyDungeonStatsChoice.get("arousalMode")) return; //if (!KinkyDungeonFlags.get("ControlHarnessCuffs")) { @@ -7803,7 +7893,7 @@ let KDControlHarnessCategories = { //KinkyDungeonSetFlag("ControlHarnessCuffs", 1); //} }, - updateFunction: (e, item, data, invItems) => { + updateFunction: (_e: KinkyDungeonEvent, _item: item, data: any, invItems: item[]) => { if (!KinkyDungeonStatsChoice.get("arousalMode")) return; let fillGroups = ["ItemVulva", "ItemVulvaPiercings", "ItemButt", "ItemNipples"]; @@ -7811,7 +7901,7 @@ let KDControlHarnessCategories = { KinkyDungeonSendTextMessage(4, TextGet("KDControlHarnessChastityUpdate") .replace("RESTRAINTNAME", TextGet("Restraint" + data.item.name)) - .replace("PERCENT", "" + Math.round(100 * invItems.length / 3)), + .replace("PERCENT", "" + Math.round(100 * invItems.length / 2)), "#ffffff", 1, ); @@ -7821,9 +7911,8 @@ let KDControlHarnessCategories = { }; /** - * @type {Record} */ -let KDSFXGroups = { +let KDSFXGroups: Record = { "Handcuffs": { sfx: "LockHeavy", sfxEscape: { diff --git a/Game/src/restraint/KinkyDungeonSeals.js b/Game/src/restraint/KinkyDungeonSeals.ts similarity index 91% rename from Game/src/restraint/KinkyDungeonSeals.js rename to Game/src/restraint/KinkyDungeonSeals.ts index 1d3f4e9f9..8a4cf15e8 100644 --- a/Game/src/restraint/KinkyDungeonSeals.js +++ b/Game/src/restraint/KinkyDungeonSeals.ts @@ -8,8 +8,7 @@ // 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. -/** @type {Record} */ -let KDSealGroups = { +let KDSealGroups: Record = { "LettingGo": { arousalMode: true, level: 1, @@ -17,4 +16,4 @@ let KDSealGroups = { ], } -}; \ No newline at end of file +}; diff --git a/Models/ArmorPlate/BootLeftHogtie.png b/Models/ArmorPlate/BootLeftHogtie.png index c4272863f..31ef45865 100644 Binary files a/Models/ArmorPlate/BootLeftHogtie.png and b/Models/ArmorPlate/BootLeftHogtie.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/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/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/Hair/StraightBangs.png b/Models/Hair/StraightBangs.png index 6ca3b2d4c..113c1f511 100644 Binary files a/Models/Hair/StraightBangs.png and b/Models/Hair/StraightBangs.png differ diff --git a/Models/Hair/StraightBangs_Overstrap.png b/Models/Hair/StraightBangs_Overstrap.png index b3601c35b..2953d1632 100644 Binary files a/Models/Hair/StraightBangs_Overstrap.png and b/Models/Hair/StraightBangs_Overstrap.png differ diff --git a/Models/LeatherLeotard/LeotardChest.png b/Models/LeatherLeotard/LeotardChest.png index 6469ee784..d7545424f 100644 Binary files a/Models/LeatherLeotard/LeotardChest.png and b/Models/LeatherLeotard/LeotardChest.png differ diff --git a/Models/LeatherLeotard/LeotardCorset.png b/Models/LeatherLeotard/LeotardCorset.png index 80d20a58e..303d25124 100644 Binary files a/Models/LeatherLeotard/LeotardCorset.png and b/Models/LeatherLeotard/LeotardCorset.png differ diff --git a/Models/MaidKnightLight/Apron.png b/Models/MaidKnightLight/Apron.png index 3f1a3ebf8..e85d92541 100644 Binary files a/Models/MaidKnightLight/Apron.png 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 index 071efb7fb..3ff4bca76 100644 Binary files a/Models/MaidKnightLight/ApronChest.png 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/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/ApronKneelHogtie.png b/Models/MaidKnightLight/ApronKneelHogtie.png new file mode 100644 index 000000000..822f29107 Binary files /dev/null and b/Models/MaidKnightLight/ApronKneelHogtie.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/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/DressDecoSpread.png b/Models/MaidKnightLight/DressDeco.png similarity index 100% rename from Models/MaidKnightLight/DressDecoSpread.png rename to Models/MaidKnightLight/DressDeco.png diff --git a/Models/MaidKnightLight/DressDecoBackSpread.png b/Models/MaidKnightLight/DressDecoBack.png similarity index 100% rename from Models/MaidKnightLight/DressDecoBackSpread.png rename to Models/MaidKnightLight/DressDecoBack.png 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/GloveLeftBoxtie.png b/Models/MaidKnightLight/GloveLeftBoxtie.png new file mode 100644 index 000000000..65dc73e41 Binary files /dev/null and b/Models/MaidKnightLight/GloveLeftBoxtie.png differ diff --git a/Models/MaidKnightLight/GloveLeftFront.png b/Models/MaidKnightLight/GloveLeftFront.png new file mode 100644 index 000000000..65dc73e41 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/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/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/GuardLeftCrossed.png b/Models/MaidKnightLight/GuardLeftCrossed.png new file mode 100644 index 000000000..32749a1d5 Binary files /dev/null and b/Models/MaidKnightLight/GuardLeftCrossed.png differ diff --git a/Models/MaidKnightLight/GuardLeftFront.png b/Models/MaidKnightLight/GuardLeftFront.png new file mode 100644 index 000000000..f8403ca3a 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..fad4322e3 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..d78dc7163 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..f9ee1eff7 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..9657fc2b6 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..aea3582f1 Binary files /dev/null and b/Models/MaidKnightLight/GuardRightCrossed.png differ diff --git a/Models/MaidKnightLight/GuardRightFront.png b/Models/MaidKnightLight/GuardRightFront.png new file mode 100644 index 000000000..b7b8f809a 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..e299679b4 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..09baee553 Binary files /dev/null and b/Models/MaidKnightLight/GuardRightYoked.png differ diff --git a/Models/MaidKnightLight/Headband.png b/Models/MaidKnightLight/Headband.png index 078c9d49d..ce20d7061 100644 Binary files a/Models/MaidKnightLight/Headband.png 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/PauldronLeftFree.png b/Models/MaidKnightLight/PauldronLeft.png similarity index 100% rename from Models/MaidKnightLight/PauldronLeftFree.png rename to Models/MaidKnightLight/PauldronLeft.png 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/PauldronStrapFree.png b/Models/MaidKnightLight/PauldronStrap.png similarity index 100% rename from Models/MaidKnightLight/PauldronStrapFree.png rename to Models/MaidKnightLight/PauldronStrap.png 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/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 index 9e65227d6..dd3ed9efd 100644 Binary files a/Models/MaidKnightLight/SockLeftSpread.png 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 index 388cf6584..4f5ca3a18 100644 Binary files a/Models/MaidKnightLight/SockRightSpread.png and b/Models/MaidKnightLight/SockRightSpread.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/Rope/ArmHarnessUnder.png b/Models/Rope/ArmHarnessUnder.png index f1518c048..84543ba28 100644 Binary files a/Models/Rope/ArmHarnessUnder.png and b/Models/Rope/ArmHarnessUnder.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/ShoeLeftHogtie.png b/Models/Warrior/ShoeLeftHogtie.png index 49d431ff6..08d636925 100644 Binary files a/Models/Warrior/ShoeLeftHogtie.png and b/Models/Warrior/ShoeLeftHogtie.png differ diff --git a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv index 6a7a05e06..44af30402 100644 --- a/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv +++ b/Screens/MiniGame/KinkyDungeon/Text_KinkyDungeon.csv @@ -31,7 +31,7 @@ RestartNeededRU,"Restart required!" KDVersion,"Version" KinkyDungeon,"Kinky Dungeon" -KDVersionStr,"5.3.37" +KDVersionStr,"5.3.38-RC6" 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." @@ -46,6 +46,16 @@ KDToggleTabControls,Controls KDToggleTabKeybindings,Keybindings +KDToggleApplyPaletteRestraint,Apply palette to Restraints +KDToggleApplyPaletteTransform,Apply palette to transforms + +KDToggleIgnoreApplyCharPalette,Don't use character palette +KDToggleAlwaysApplyCharPalette,Always use character palette +KDToggleDefaultApplyCharPalette,Use character palette for default outfit + +KDToggleBackgrounds,Show Background Art + + KDToggleBackgrounds,Show Background Art KDToggleRawDP,Show DP instead of % KDToggleOnlySelfQuickInv,Quick Inv only equips to self @@ -240,7 +250,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." @@ -410,11 +420,13 @@ 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,"Binding on enemies is 30% stronger." @@ -834,7 +846,7 @@ 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" @@ -914,7 +926,7 @@ 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" @@ -1045,6 +1057,8 @@ KinkyDungeonKeyReputation,Reputation KinkyDungeonKeyQuest,Quests KinkyDungeonKeyMagic,Spell List KinkyDungeonKeyLog,Journal +KinkyDungeonKeyRestart,Pause Menu +KinkyDungeonKeyFacilities,Facilities KinkyDungeonCurrentPress,"Current Key Pressed" KinkyDungeonCurrentPressInfo,"Press a key, then press a button to set that key" @@ -1744,6 +1758,7 @@ KinkyDungeonAngelDefeated,"Angel: MMMMMPHH!!!" KinkyDungeonAngelUnlock,"(The angel looks puzzled and unlocks your divine restraints)" 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 tries to restrain you, but you resist the bondage!" KDRestraintBlockedItem,"Resist!" @@ -2725,31 +2740,34 @@ AttackFungalBind,"The fun-gal clips a restraint around your neck! (+RestraintAdd 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 murder the armorer! +KillArmorerQuest,You rob the armorer! NameBowyerQuest,Bowyer -KillBowyerQuest,You murder the bowyer! +KillBowyerQuest,You rob the bowyer! NameShadyQuest,Not a Kidnapper KillShadyQuest,You bring the kidnapper to justice! @@ -3067,6 +3085,12 @@ KinkyDungeonStruggleCantPickCyber2Lock,"The lock is technological and does not u 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!" KinkyDungeonStruggleUnlockSuccess,"You unlock the TargetRestraint." @@ -3316,6 +3340,7 @@ KinkyDiscLockType,"Disc" KinkyRubberLockType,"Rubber" KinkyDivineLockType,"Divine" KinkyDivine2LockType,"Divine" +KinkyCrystalLockType,"Crystal" KinkyWhiteLockType,"Simple" KinkyBlueLockType,"Runic" KinkyPurpleLockType,"Magic" @@ -3332,6 +3357,7 @@ KinkyDiscLock,"Disc Lock" KinkyRubberLock,"Rubber Lock" KinkyDivineLock,"Divine Lock" KinkyDivine2Lock,"Divine Lock" +KinkyCrystalLock,"Crystal Lock" KinkyWhiteLock,"Simple Lock" KinkyBlueLock,"Runic Lock" KinkyPurpleLock,"Purple Lock" @@ -4331,6 +4357,9 @@ RestraintWolfCollarDesc2,"Also good for identifying people in general. What a gr 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!" @@ -5781,7 +5810,7 @@ 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 @@ -5941,7 +5970,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 @@ -6607,7 +6636,7 @@ 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 @@ -7638,6 +7667,7 @@ KinkyDungeonPurpleLockRemoveCharger,Your command word is heard and the charger u 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." @@ -10498,6 +10528,7 @@ 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,Preferences KDCategoryToggles2,Preferences 2 @@ -12088,11 +12119,15 @@ dItemShopBuy9,(Buy Item9 for ItemCost9 gp) 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! @@ -12814,6 +12849,9 @@ 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!)" @@ -12849,7 +12887,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!)" @@ -21827,13 +21865,13 @@ 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." +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." +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?" @@ -22079,7 +22117,7 @@ KinkyDungeonSpellsPageClass,"Unique" KDInventoryActionRemoveMagicLock,Unlock using magic -KDQuickLoadout_Weapon,Include Weapons, +KDQuickLoadout_Weapon,Include Weapons KDQuickLoadout_Merge,Merge Armor KDNeedDiscPick,You need a special tool to pick this kind of lock. @@ -22425,7 +22463,7 @@ KinkyDungeonSpellDescriptionEvasiveManeuvers,"While active, you evade almost all 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 +40% plus 20% of Bondage Resist" +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... @@ -22544,46 +22582,46 @@ KDHolyOrbPunish,"The holy orb observes your lack of discipline, and issues a pun RestraintDivineBelt,Divine Chastity Belt RestraintDivineBeltDesc2,"A chastity belt forged in holy light. Only a Goddess' will can release you." -RestraintDivineBeltDesc,"There is no way out but to repent. Its divine aura causes vibrators to cease right before you go over the edge." +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 out but to repent. Its divine aura causes vibrators to cease right before you go over the edge." +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 out but to repent. Its divine aura prevents you from pleasuring yourself." +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 out but to repent. Its divine aura prevents you from pleasuring yourself." +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 out but to repent. Its divine aura causes vibrators to dampen right before you go over the edge." +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 out but to repent. Its divine aura causes vibrators to dampen right before you go over the edge." +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 out but to repent. Its divine aura converts self-pleasure to stamina." +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 out but to repent. Its divine aura converts self-pleasure to stamina." +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? @@ -23129,6 +23167,8 @@ 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! @@ -23479,6 +23519,15 @@ 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" @@ -24201,6 +24250,7 @@ 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 KinkyDungeonLoadFromFile,Load from File KinkyDungeonSaveToFile,Save to File @@ -24319,6 +24369,7 @@ KDRestrainNPC,Edit Restraints KDDrawSelectedTab_Restrain,Editing Restraints KDDrawSelectedTab_Imprison,Imprison in Furniture +KDDrawSelectedTab_Dropoff,Dropoff Prisoner KDBindNPCSlot_ModuleUtility,Module (Utility) KDBindNPCSlot_CollarTag,Leash @@ -24459,8 +24510,8 @@ KDAutoBindPasteAllOver,OVERWRITE All! KDPromoteNotEnough,Need Positive Opinion to Promote -KDCuddleLounge1,Servant Enjoyment: AMNT -KDCuddleLounge2,Prisoner Enjoyment: AMNT +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 @@ -24549,18 +24600,16 @@ KDJourneyDoll,Factory Route KDJourneyLost,Reverse Route KDJourneyRandom,Chaos Route KDMapSeed,"Map Seed: " -KDWillOverride,Will Overwrite! +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)" -KDBackupPalette,Save to File -KDLoadPalette,Load from File - -KDBackupOutfits,Store to File -KDLoadOutfits,Load from File +KDBackupOutfits,Backup +KDLoadOutfits,Restore +KDSetPalette,Set Palette KinkyDungeonStatMC_Mage,"Wizard" @@ -24572,4 +24621,63 @@ 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. \ No newline at end of file +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!" + +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. \ No newline at end of file diff --git a/Scripts/Appearance.ts b/Scripts/Appearance.ts index 4880b5c0d..e89849149 100644 --- a/Scripts/Appearance.ts +++ b/Scripts/Appearance.ts @@ -6,6 +6,7 @@ let CharacterAppearancePreviousEmoticon = null; function CharacterAppearanceSetDefault(C: Character): void { C.Appearance = []; C.Pose = []; + C.Palette = ""; } /** @@ -13,7 +14,7 @@ function CharacterAppearanceSetDefault(C: Character): void { */ function CharacterAppearanceNaked(C: Character): void { for (let A = C.Appearance.length - 1; A >= 0; A--) - if (!C.Appearance[A].Model?.Protected) + if (C.Appearance[A].Model && !KDModelIsProtected(C.Appearance[A].Model)) C.Appearance.splice(A, 1); } @@ -36,8 +37,11 @@ function CharacterAppearanceSetItem(C: Character, Group: string, ItemAsset: any, * @param C - The character whose appearance should be serialised * @returns A serialised version of the character's current appearance */ -function CharacterAppearanceStringify(C: Character): string { - return AppearanceItemStringify(C.Appearance); +function CharacterAppearanceStringify(C: Character, metadata : KDOutfitMetadata): string { + return JSON.stringify({ + metadata: metadata, + appearance: AppearanceItemStringify(C.Appearance), + }); } function AppearanceItemStringify(Item: any[]): string { @@ -63,19 +67,20 @@ function AppearanceItemStringify(Item: any[]): string { * @param clothesOnly - The serialised appearance to restore */ function CharacterAppearanceRestore(C: Character, backup: string, clothesOnly: boolean = false): void { - let newAppearance = AppearanceItemParse(backup); + 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 (!item.Model.Protected) { + if (!KDModelIsProtected(item.Model)) { finalAppearance.push(item); } } for (let item of C.Appearance) { - if (item.Model.Protected) { + if (KDModelIsProtected(item.Model)) { finalAppearance.push(item); } } diff --git a/Scripts/Character.ts b/Scripts/Character.ts index 19353eb46..686131d06 100644 --- a/Scripts/Character.ts +++ b/Scripts/Character.ts @@ -1,32 +1,6 @@ let Character: Character[] = []; let CharacterNextId = 1; -const CharacterDeafLevels: Map = new Map([ - ["DeafTotal", 4], - ["DeafHeavy", 3], - ["DeafNormal", 2], - ["DeafLight", 1], -]); - -const CharacterBlurLevels: Map = 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 - */ -let CharacterType: {[_: string]: CharacterType} = { - ONLINE: "online", - NPC: "npc", - SIMPLE: "simple", -}; - /** * Loads a character into the buffer, creates it if it does not exist * @param CharacterID - ID of the character @@ -34,56 +8,21 @@ let CharacterType: {[_: string]: CharacterType} = { * @param Type - The character type * @returns The newly loaded character */ -function CharacterReset(CharacterID: number, CharacterAssetFamily: string, Type: CharacterType = CharacterType.ONLINE): Character { +function CharacterReset(CharacterID: number): Character { // Prepares the character sheet let NewCharacter: Character = { ID: CharacterID, Name: "", - Type, - AssetFamily: CharacterAssetFamily, - AccountName: "", - Owner: "", - Lover: "", - Money: 0, - Inventory: [], + Palette: "", Appearance: [], - Stage: "0", - CurrentDialog: "", - Dialog: [], - Reputation: [], - Skill: [], - Pose: [], - Effect: [], - Tints: [], - FocusGroup: null, - Canvas: null, - CanvasBlink: null, - MustDraw: false, - BlinkFactor: Math.round(Math.random() * 10) + 10, - AllowItem: true, - BlockItems: [], - LimitedItems: [], - BlackList: [], - IsKneeling: function () { - throw new Error("Function not implemented."); - }, - FavoriteItems: [], - WhiteList: [], HeightModifier: 0, - IsEnclose: () => false, + Pose: [], }; - // If the character doesn't exist, we create it - let 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; + if (CharacterID == 0 && !DefaultPlayer) { + DefaultPlayer = NewCharacter; CharacterAppearanceSetDefault(NewCharacter); } @@ -94,55 +33,6 @@ function CharacterReset(CharacterID: number, CharacterAssetFamily: string, Type: } -/** - * Attributes a random name for the character, does not select a name in use - * @param C - Character for which to attribute a name - */ -function CharacterRandomName(C: Character): void { - - // Generates a name from the name bank - let 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 AccName - The account name to give to the character - * @returns The created character - */ -function CharacterLoadSimple(AccName: string): Character { - // 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 CNew = CharacterReset(CharacterNextId++, "Female3DCG", CharacterType.SIMPLE); - CNew.AccountName = AccName; - - // Returns the new character - return CNew; -} - -/** - * Deletes an NPC from the buffer - * @param NPCType - Account name of the npc to delete - */ -function CharacterDelete(NPCType: string): void { - for (let C = 0; C < Character.length; C++) - if (Character[C].AccountName == NPCType) { - Character.splice(C, 1); - return; - } -} - /** * 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 @@ -241,7 +131,7 @@ function CharacterResetFacialExpression(C: Character): void { * Gets the currently selected character */ function CharacterGetCurrent(): Character | null { - return Player; + return DefaultPlayer; } /** @@ -261,21 +151,11 @@ function CharacterNickname(C: Character): string { * @param NPCType - Archetype of the NPC * @returns The randomly generated NPC */ -function CharacterLoadNPC(NPCType: string): NPCCharacter { - - // 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); - const CNew = Character[Character.length - 1]; - CNew.AccountName = NPCType; - CharacterRandomName(CNew); - //CharacterAppearanceBuildAssets(C); - //CharacterAppearanceFullRandom(C); - +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; diff --git a/Scripts/Common.ts b/Scripts/Common.ts index 2b277e4d3..73305b4b0 100644 --- a/Scripts/Common.ts +++ b/Scripts/Common.ts @@ -1,9 +1,9 @@ // Main variables -let Player: PlayerCharacter; +let DefaultPlayer: PlayerCharacter; let KeyPress: number | string = ""; let CurrentModule: string; let CurrentScreen: string; -let CurrentCharacter: Character | NPCCharacter | null = null; +let CurrentCharacter: Character | null = null; let CurrentOnlinePlayers = 0; let CurrentDarkFactor = 1.0; let CommonIsMobile = false; @@ -375,8 +375,6 @@ function CommonSetScreen(NewModule: string, NewScreen: string): void { CurrentScreen = NewScreen; CurrentDarkFactor = 1.0; - CommonGetFont.clearCache(); - CommonGetFontName.clearCache(); TextLoad(); } @@ -452,65 +450,6 @@ function CommonArraysEqual(a1: any[], a2: any[]): boolean { } -/** - * 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. - * @param func - The function to memoize - * @returns The result of the memoized function - */ -function CommonMemoize(func: T): MemoizedFunction { - let memo: {[_: string]: any} = {}; - let memoized: any = function () { - let index: any = []; - for (let 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 size - The font size that should be specified in the - * returned font string - * @returns A font string specifying the requested font size and - * the player's preferred font stack. For example: - * 12px "Courier New", "Courier", monospace - */ -const CommonGetFont: MemoizedFunction<(size: number) => string> = CommonMemoize((size: number) => { - 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 A font string specifying the player's preferred font - * stack. For example: - * "Courier New", "Courier", monospace - */ -const CommonGetFontName: MemoizedFunction<() => string> = 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]}`; -}); /** diff --git a/Scripts/Inventory.ts b/Scripts/Inventory.ts index 7ff52c380..d18585e90 100644 --- a/Scripts/Inventory.ts +++ b/Scripts/Inventory.ts @@ -6,15 +6,11 @@ */ 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.Family == C.AssetFamily) && (C.Appearance[A].Asset.Group.Name == AssetGroup)) + 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; -} - -let Asset = []; -let InventoryAdd = (a, b, c) => {}; -let InventoryAvailable = (a, b, c) : boolean => {return false;}; \ No newline at end of file +} \ No newline at end of file diff --git a/Scripts/KDMods.ts b/Scripts/KDMods.ts index 1549edd4f..2acba79f0 100644 --- a/Scripts/KDMods.ts +++ b/Scripts/KDMods.ts @@ -226,17 +226,17 @@ async function KDExecuteMods() { console.log(e); } - for (let entry of Object.entries(KDModFiles)) { + for (let [k, v] of Object.entries(KDModFiles) as [string, string][]) { // compat w/ PIXI loading - let ext = PIXI.utils.path.extname(entry[0]); + let ext = PIXI.utils.path.extname(k); //if (ext) PIXI.Assets.load(); - KDModFiles[PIXI.utils.path.toAbsolute(entry[0])] = entry[1]; - PIXI.Assets.resolver.add(entry[0], { - src: entry[1], + KDModFiles[PIXI.utils.path.toAbsolute(k)] = v; + PIXI.Assets.resolver.add(k, { + src: v, format: ext, }); - PIXI.Assets.resolver.add(PIXI.utils.path.toAbsolute(entry[0]), { - src: entry[1], + PIXI.Assets.resolver.add(PIXI.utils.path.toAbsolute(k), { + src: v, format: ext, }); } diff --git a/Scripts/Main.ts b/Scripts/Main.ts index 40678c806..36ed59981 100644 --- a/Scripts/Main.ts +++ b/Scripts/Main.ts @@ -51,11 +51,8 @@ window.onload = function() { // LoginLoad Character = []; CharacterNextId = 1; - CharacterReset(0, "Female3DCG"); + CharacterReset(0); - Player.ArousalSettings = { VFXFilter: "VFXFilterHeavy" }; - Player.OnlineSharedSettings = { ItemsAffectExpressions: true }; - Player.AudioSettings = { Volume: 1 }; CurrentCharacter = null; diff --git a/Scripts/Patch.ts b/Scripts/Patch.ts index c12cbce3d..c61c38dce 100644 --- a/Scripts/Patch.ts +++ b/Scripts/Patch.ts @@ -7,38 +7,8 @@ const ChatRoomChatLog: {Garbled: string, Time: number, SenderName: string}[] = [ const DialogGamingPreviousRoom: string = ""; const MiniGameReturnFunction: string = "ArcadeKinkyDungeonEnd"; -/** - * Returns the expressions of character C as a single big object - * @param C - The character whose expressions should be returned - * @returns Expression - The expresssion of a character - */ -function WardrobeGetExpression(C: Character): any { - let characterExpression = {}; - ServerAppearanceBundle(C.Appearance).filter(item => item.Property != null && item.Property.Expression != null).forEach(item => characterExpression[item.Group] = item.Property.Expression); - return characterExpression; -} -/** - * 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 Appearance - The appearance array to bundle - * @returns The appearance bundle created from the given appearance array - */ -function ServerAppearanceBundle(Appearance: Item[]): AppearanceBundle { - let Bundle: AppearanceBundle = []; - for (let A = 0; A < Appearance.length; A++) { - let N: any = {}; - 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; - Bundle.push(N); - } - return Bundle; -} -function AssetGet(family: string, group: string, asset: string): Asset | undefined { return undefined; }; /** * Returns a specific reputation value for the player @@ -57,8 +27,6 @@ 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 ModularItemMergeModuleValues({ asset, modules }: { asset: any; modules: any; }, moduleValues: number[]): ItemProperties { return undefined; } - function ExtendedItemSetType(C: any, Options: any, Option: any) {} function ExtendedItemExit() {} @@ -66,7 +34,6 @@ let MiniGameVictory = true; function InventoryRemove(C: Character, AssetGroup: string, Refresh = false) {} function InventoryGetLock(Lock: Item): any {} -function InventoryAllow(C: PlayerCharacter, asset: Asset, prerequisites = asset.Prerequisite, setDialog = true) { return true; } 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) {} diff --git a/Scripts/Typedef.d.ts b/Scripts/Typedef.d.ts index bc0cd3c26..cbfdf3d56 100644 --- a/Scripts/Typedef.d.ts +++ b/Scripts/Typedef.d.ts @@ -53,560 +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 VibratorMode = "Off" | "Low" | "Medium" | "High" | "Maximum" | "Random" | "Escalate" | "Tease" | "Deny" | "Edge"; - -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 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: any[]; - Tint: TintDefinition[]; - AllowTint: boolean; - DefaultTint?: string; - CraftGroup: string; - ColorSuffix: { [_: string]: string}; -} -//#endregion /** An ItemBundle is a minified version of the normal Item */ interface ItemBundle { @@ -614,362 +64,40 @@ interface ItemBundle { Name: string; Difficulty?: number; Color?: ItemColor; - Property?: ItemProperties; + 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; }[]; -} - 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; - Property?: ItemProperties; -} - -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 { - IsKneeling(): unknown; 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: any[]; - Skill: any[]; 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; - - ArousalSettings?: { - VFXFilter: string; - }; - AppearanceFull?: Item[]; - // Online character properties - Title?: string; - ActivePose?: any; - LabelColor?: any; - Creation?: any; - Description?: any; - OnlineSharedSettings?: { - AllowFullWardrobeAccess?: boolean; - BlockBodyCosplay?: boolean; - 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?: any[]; - Status?: string | null; - StatusTimer?: number; - Crafting?: CraftingItem[]; - IsEnclose: () => boolean; -} - -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; - }; - GameplaySettings?: { - SensDepChatLog: string; - BlindDisableExamine: boolean; - DisableAutoRemoveLogin: boolean; - ImmersionLockSetting: boolean; - EnableSafeword: boolean; - DisableAutoMaid: boolean; - OfflineLockedRestrained: boolean; - }; - 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; - AnimationQuality?: number; - } - 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)[]; - 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 @@ -982,859 +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; - - Modules?: number[]; - - 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>; @@ -1848,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 @@ -1929,244 +136,6 @@ 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; -} - -//#endregion - -//#region Crafting items - -interface CraftingItem { - Name: string; - Description: string; - Property: string; - Color: string; - Lock: AssetLockType; - Item: string; - Private: boolean; - Type: string; -} - -//#endregion - -interface InventoryItem { - Group: string; - Name: string; - Asset: Asset; -} - -interface NotificationSetting { - AlertType: number; - Audio: number; -} // External globals, added by other libraries interface Window { diff --git a/TextureAtlas/GameAtlas.tps b/TextureAtlas/GameAtlas.tps index 1e48b1ea8..644d1aedb 100644 --- a/TextureAtlas/GameAtlas.tps +++ b/TextureAtlas/GameAtlas.tps @@ -779,6 +779,7 @@ ../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 @@ -805,6 +806,8 @@ ../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 @@ -813,8 +816,11 @@ ../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 @@ -984,6 +990,9 @@ ../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/Melissa.png @@ -1273,6 +1282,8 @@ ../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 @@ -1613,6 +1624,8 @@ ../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 @@ -1642,6 +1655,8 @@ ../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 @@ -1671,6 +1686,8 @@ ../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_cry/Barrel.png ../Game/Floors/Floor_cry/Bars.png @@ -1700,6 +1717,8 @@ ../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 @@ -1716,6 +1735,8 @@ ../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 @@ -1725,6 +1746,8 @@ ../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 @@ -1753,6 +1776,8 @@ ../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 @@ -1779,6 +1804,8 @@ ../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 @@ -1807,6 +1834,8 @@ ../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 @@ -1836,6 +1865,8 @@ ../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 @@ -1893,7 +1924,8 @@ ../Game/Floors/Floor_shoppe/Tile.png ../Game/Floors/Floor_shoppe/Trap.png ../Game/Floors/Floor_shoppe/Wall.png - ../Game/Floors/Floor_shoppe/WallOld.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 @@ -1921,6 +1953,8 @@ ../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 @@ -1951,6 +1985,8 @@ ../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 @@ -1980,6 +2016,8 @@ ../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 @@ -2009,6 +2047,8 @@ ../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 @@ -2639,6 +2679,7 @@ ../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 @@ -2647,6 +2688,7 @@ ../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 @@ -3778,6 +3820,7 @@ ../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 diff --git a/TextureAtlas/TextureAtlas.tps b/TextureAtlas/TextureAtlas.tps index ddc0e2bea..9ca3490ef 100644 --- a/TextureAtlas/TextureAtlas.tps +++ b/TextureAtlas/TextureAtlas.tps @@ -222,6 +222,7 @@ ../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 @@ -1465,6 +1466,9 @@ ../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 @@ -1504,6 +1508,8 @@ ../Models/FutureHarness/StrapsMid.png ../Models/GagLatex/NeckCorset.png ../Models/GagLatex/NeckCorsetRim.png + ../Models/GagLeather/GagNecklace.png + ../Models/GagLeather/GagNecklaceBall.png ../Models/Gothic/Buttons.png ../Models/Gothic/HemLower.png ../Models/Gothic/HemLowerBackCrotchStrap.png @@ -2000,7 +2006,15 @@ ../Models/Maid/StripeSockRightKneelClosed.png ../Models/Maid/StripeSockRightSpread.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/ApronKneel.png + ../Models/MaidKnightLight/ApronKneelHogtie.png ../Models/MaidKnightLight/ArmLeftBoxtie.png ../Models/MaidKnightLight/ArmLeftCrossed.png ../Models/MaidKnightLight/ArmLeftFree.png @@ -2015,7 +2029,13 @@ ../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/Bouquet.png ../Models/MaidKnightLight/Dress.png @@ -2024,25 +2044,66 @@ ../Models/MaidKnightLight/DressChestUp.png ../Models/MaidKnightLight/DressChestWristtie.png ../Models/MaidKnightLight/DressChestYoked.png - ../Models/MaidKnightLight/DressDecoBackSpread.png - ../Models/MaidKnightLight/DressDecoSpread.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/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/GloveLeftBoxtie.png ../Models/MaidKnightLight/GloveLeftFree.png + ../Models/MaidKnightLight/GloveLeftFront.png + ../Models/MaidKnightLight/GloveLeftYoked.png + ../Models/MaidKnightLight/GloveRightCrossed.png ../Models/MaidKnightLight/GloveRightFree.png + ../Models/MaidKnightLight/GloveRightFront.png + ../Models/MaidKnightLight/GloveRightYoked.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/PauldronLeftFree.png - ../Models/MaidKnightLight/PauldronStrapFree.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 @@ -2137,6 +2198,7 @@ ../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 @@ -3071,6 +3133,7 @@ ../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 diff --git a/TextureAtlas/atlas0.json b/TextureAtlas/atlas0.json index 1b3b224c1..7ad7931ac 100644 --- a/TextureAtlas/atlas0.json +++ b/TextureAtlas/atlas0.json @@ -2410,7 +2410,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas1.json b/TextureAtlas/atlas1.json index 8188cb61d..b7c746717 100644 --- a/TextureAtlas/atlas1.json +++ b/TextureAtlas/atlas1.json @@ -1,11 +1,19 @@ {"frames": { -"Models/Armbinder/BinderRightBoxtie.png": +"Models/Belts/Legs2KneelClosed.png": { - "frame": {"x":1724,"y":1840,"w":24,"h":166}, + "frame": {"x":1925,"y":1954,"w":117,"h":91}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":518,"w":24,"h":166}, + "spriteSourceSize": {"x":397,"y":928,"w":117,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Blindfold/KittyEyes.png": +{ + "frame": {"x":1022,"y":856,"w":133,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":275,"w":133,"h":28}, "sourceSize": {"w":1240,"h":1754} }, "Models/Catsuit/HandRightBoxtie.png": @@ -32,44 +40,60 @@ "spriteSourceSize": {"x":605,"y":398,"w":26,"h":31}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CapLongMittenLeftCrossed.png": +"Models/CyberCuffs/ElbowRightBoxtie.png": { - "frame": {"x":2019,"y":555,"w":25,"h":71}, + "frame": {"x":1746,"y":856,"w":28,"h":28}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":417,"y":594,"w":25,"h":71}, + "spriteSourceSize": {"x":455,"y":602,"w":28,"h":28}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberPetsuit/LegsBeltsKneel.png": +"Models/CyberCuffs/LockThighLeftKneel.png": { - "frame": {"x":1337,"y":856,"w":411,"h":663}, + "frame": {"x":1595,"y":856,"w":35,"h":28}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":308,"y":412,"w":411,"h":663}, + "spriteSourceSize": {"x":583,"y":876,"w":35,"h":28}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberPetsuit/LegsBeltsKneelClosed.png": +"Models/CyberCuffs/LockThighLeftKneelClosed.png": { - "frame": {"x":1337,"y":856,"w":411,"h":663}, + "frame": {"x":1595,"y":856,"w":35,"h":28}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":308,"y":412,"w":411,"h":663}, + "spriteSourceSize": {"x":583,"y":876,"w":35,"h":28}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleLeftLockPlateSpread.png": +"Models/CyberCuffs/ScreenWristRightFree.png": { - "frame": {"x":2019,"y":750,"w":25,"h":49}, + "frame": {"x":1307,"y":856,"w":51,"h":28}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":740,"y":1422,"w":25,"h":49}, + "spriteSourceSize": {"x":363,"y":599,"w":51,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CapLongMittenLeftCrossed.png": +{ + "frame": {"x":2019,"y":640,"w":25,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":417,"y":594,"w":25,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/BeltPin.png": +{ + "frame": {"x":1778,"y":856,"w":23,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":558,"y":790,"w":23,"h":28}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleRightLockPlateSpread.png": +"Models/DivineCuffs/AnkleLeftLockPlateSpread.png": { - "frame": {"x":2019,"y":803,"w":25,"h":49}, + "frame": {"x":2019,"y":835,"w":25,"h":49}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":481,"y":1422,"w":25,"h":49}, + "spriteSourceSize": {"x":740,"y":1422,"w":25,"h":49}, "sourceSize": {"w":1240,"h":1754} }, "Models/DivineCuffs/ElbowLeftLockBandBoxtie.png": @@ -96,6 +120,14 @@ "spriteSourceSize": {"x":721,"y":612,"w":26,"h":50}, "sourceSize": {"w":1240,"h":1754} }, +"Models/DivineCuffs/ThighRightLockBandKneel.png": +{ + "frame": {"x":1416,"y":856,"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":163,"w":26,"h":37}, @@ -112,12 +144,20 @@ "spriteSourceSize": {"x":669,"y":601,"w":26,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/CroppedBlouseTorso.png": +"Models/Dress/LaceChestCups.png": { - "frame": {"x":1337,"y":1840,"w":383,"h":180}, + "frame": {"x":1523,"y":1954,"w":267,"h":91}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":559,"w":383,"h":180}, + "spriteSourceSize": {"x":446,"y":534,"w":267,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceChestDecoHardware.png": +{ + "frame": {"x":1634,"y":856,"w":34,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":557,"y":557,"w":34,"h":28}, "sourceSize": {"w":1240,"h":1754} }, "Models/Dress/LaceCorsetHardware.png": @@ -130,12 +170,36 @@ }, "Models/Elf/CrystalShoeRightClosed.png": { - "frame": {"x":2019,"y":630,"w":25,"h":59}, + "frame": {"x":2019,"y":715,"w":25,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":535,"y":1497,"w":25,"h":59}, "sourceSize": {"w":1240,"h":1754} }, +"Models/EyesDai1/Brows2Neutral.png": +{ + "frame": {"x":1955,"y":856,"w":60,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":604,"y":239,"w":60,"h":21}, + "sourceSize": {"w":725,"h":424} +}, +"Models/EyesDai1/BrowsAngry.png": +{ + "frame": {"x":1362,"y":856,"w":50,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":252,"w":50,"h":28}, + "sourceSize": {"w":693,"h":407} +}, +"Models/EyesDai2/BrowsSad.png": +{ + "frame": {"x":1513,"y":856,"w":37,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":539,"y":247,"w":37,"h":28}, + "sourceSize": {"w":806,"h":515} +}, "Models/FaceDask/BrowsAngry.png": { "frame": {"x":2019,"y":354,"w":26,"h":21}, @@ -144,6 +208,14 @@ "spriteSourceSize": {"x":551,"y":259,"w":26,"h":21}, "sourceSize": {"w":700,"h":400} }, +"Models/FaceDask/EyesClosed.png": +{ + "frame": {"x":1805,"y":856,"w":146,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":55,"y":185,"w":146,"h":27}, + "sourceSize": {"w":321,"h":332} +}, "Models/FaceKjus/Brows2Sad.png": { "frame": {"x":951,"y":1717,"w":67,"h":13}, @@ -160,6 +232,14 @@ "spriteSourceSize": {"x":529,"y":262,"w":43,"h":18}, "sourceSize": {"w":693,"h":407} }, +"Models/FaceKoi/BrowsSad.png": +{ + "frame": {"x":1554,"y":856,"w":37,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":61,"y":137,"w":37,"h":28}, + "sourceSize": {"w":321,"h":332} +}, "Models/Fiddle/BackFiddleLines.png": { "frame": {"x":904,"y":1589,"w":114,"h":124}, @@ -176,36 +256,28 @@ "spriteSourceSize": {"x":189,"y":4,"w":897,"h":1732}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/BackShortMessy.png": -{ - "frame": {"x":1752,"y":1483,"w":293,"h":309}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":485,"y":93,"w":293,"h":309}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Hair2/Hair5_Left.png": +"Models/Hair2/Hair4_Left.png": { - "frame": {"x":1180,"y":856,"w":153,"h":1164}, + "frame": {"x":1022,"y":888,"w":344,"h":1154}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":711,"y":171,"w":153,"h":1164}, + "spriteSourceSize": {"x":700,"y":132,"w":344,"h":1154}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair5_Right.png": +"Models/Handcuffs/LegironsRightClosed.png": { - "frame": {"x":1022,"y":856,"w":154,"h":1165}, + "frame": {"x":1159,"y":856,"w":70,"h":28}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":400,"y":171,"w":154,"h":1165}, + "spriteSourceSize": {"x":538,"y":1432,"w":70,"h":28}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Harness/HardwareUnderbustOver.png": +"Models/Handcuffs/LegironsRightSpread.png": { - "frame": {"x":1724,"y":2010,"w":24,"h":10}, + "frame": {"x":1233,"y":856,"w":70,"h":28}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":571,"y":520,"w":24,"h":10}, + "spriteSourceSize": {"x":493,"y":1432,"w":70,"h":28}, "sourceSize": {"w":1240,"h":1754} }, "Models/Heels/BalletLeftClosed.png": @@ -218,13 +290,21 @@ }, "Models/LeatherCuffs/ElbowRightFront.png": { - "frame": {"x":2019,"y":693,"w":25,"h":53}, + "frame": {"x":2019,"y":778,"w":25,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":428,"y":598,"w":25,"h":53}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/DressDecoBackSpread.png": +"Models/Maid/SockLeftKneelClosed.png": +{ + "frame": {"x":1523,"y":1682,"w":522,"h":268}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":366,"y":832,"w":522,"h":268}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/DressDecoBack.png": { "frame": {"x":2019,"y":283,"w":26,"h":32}, "rotated": false, @@ -232,20 +312,28 @@ "spriteSourceSize": {"x":721,"y":815,"w":26,"h":32}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Nipples/Rings.png": +"Models/MaidKnightLight/GuardRightBoxtie.png": +{ + "frame": {"x":2019,"y":555,"w":25,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":676,"y":603,"w":25,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LockLeftFront.png": { - "frame": {"x":1022,"y":2025,"w":205,"h":20}, + "frame": {"x":1672,"y":856,"w":33,"h":28}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":464,"y":562,"w":205,"h":20}, + "spriteSourceSize": {"x":627,"y":561,"w":33,"h":28}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Petsuit/Arms.png": +"Models/Mittens/LockRightFront.png": { - "frame": {"x":1337,"y":1523,"w":411,"h":313}, + "frame": {"x":1709,"y":856,"w":33,"h":28}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":386,"y":404,"w":411,"h":313}, + "spriteSourceSize": {"x":503,"y":557,"w":33,"h":28}, "sourceSize": {"w":1240,"h":1754} }, "Models/Ribbon/Calf3Hogtie.png": @@ -256,6 +344,14 @@ "spriteSourceSize": {"x":677,"y":1107,"w":26,"h":48}, "sourceSize": {"w":1240,"h":1754} }, +"Models/Robes/ShoeRightClosed.png": +{ + "frame": {"x":1794,"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/Calf3Hogtie.png": { "frame": {"x":2019,"y":111,"w":26,"h":48}, @@ -272,6 +368,14 @@ "spriteSourceSize": {"x":677,"y":1107,"w":26,"h":48}, "sourceSize": {"w":1240,"h":1754} }, +"Models/Rope/ForeArm2Wristtie.png": +{ + "frame": {"x":1465,"y":856,"w":44,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":633,"w":44,"h":28}, + "sourceSize": {"w":1240,"h":1754} +}, "Models/Skirts/StripedSkirtClosedCrotchStrap.png": { "frame": {"x":372,"y":1739,"w":403,"h":304}, @@ -320,28 +424,20 @@ "spriteSourceSize": {"x":446,"y":905,"w":142,"h":305}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/FeetClosed.png": -{ - "frame": {"x":1752,"y":856,"w":293,"h":623}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":493,"y":976,"w":293,"h":623}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Wolf/Panties.png": +"Models/Weapon/NightWhipLightFree.png": { - "frame": {"x":1752,"y":1796,"w":293,"h":245}, + "frame": {"x":1370,"y":888,"w":675,"h":790}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":673,"w":293,"h":245}, + "spriteSourceSize": {"x":274,"y":467,"w":675,"h":790}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yoke/SteelBar.png": +"Models/WolfCatsuit/LegRightHogtie.png": { - "frame": {"x":1231,"y":2024,"w":517,"h":21}, + "frame": {"x":1370,"y":1682,"w":149,"h":363}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":355,"y":401,"w":517,"h":21}, + "spriteSourceSize": {"x":444,"y":844,"w":149,"h":363}, "sourceSize": {"w":1240,"h":1754} }, "Models/Yukata/SleeveRightBoxtie.png": @@ -367,7 +463,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas1.webp b/TextureAtlas/atlas1.webp index d3e319c35..342c75e64 100644 Binary files a/TextureAtlas/atlas1.webp and b/TextureAtlas/atlas1.webp differ diff --git a/TextureAtlas/atlas10.json b/TextureAtlas/atlas10.json index 0e75a3a27..7189ee406 100644 --- a/TextureAtlas/atlas10.json +++ b/TextureAtlas/atlas10.json @@ -16,7 +16,7 @@ "spriteSourceSize": {"x":424,"y":543,"w":279,"h":186}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bubble/BallSuitSeam.png": +"Models/Bubble/BallSuit.png": { "frame": {"x":1272,"y":978,"w":771,"h":770}, "rotated": false, @@ -40,33 +40,17 @@ "spriteSourceSize": {"x":424,"y":543,"w":279,"h":186}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ArmRightCrossed.png": -{ - "frame": {"x":1949,"y":1752,"w":96,"h":228}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":428,"y":432,"w":96,"h":228}, - "sourceSize": {"w":1240,"h":1754} -}, "Models/Catsuit/TorsoUpperHogtie.png": { - "frame": {"x":1642,"y":1752,"w":303,"h":293}, + "frame": {"x":1203,"y":1752,"w":303,"h":293}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":446,"y":395,"w":303,"h":293}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraCyberLock.png": -{ - "frame": {"x":1254,"y":1589,"w":14,"h":132}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":567,"y":555,"w":14,"h":132}, - "sourceSize": {"w":1240,"h":1754} -}, "Models/CyberArms/StrapsForeLongMittenLeftFront.png": { - "frame": {"x":1203,"y":1290,"w":65,"h":137}, + "frame": {"x":1203,"y":1503,"w":65,"h":137}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":692,"y":582,"w":65,"h":137}, @@ -74,35 +58,27 @@ }, "Models/CyberMitts/StrapsForeLongMittenLeftFront.png": { - "frame": {"x":1203,"y":1290,"w":65,"h":137}, + "frame": {"x":1203,"y":1503,"w":65,"h":137}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":692,"y":582,"w":65,"h":137}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BraPins.png": -{ - "frame": {"x":1203,"y":1589,"w":47,"h":159}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":562,"y":441,"w":47,"h":159}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ElbowRightLockBandBoxtie.png": +"Models/Dress/BowCorsetLong.png": { - "frame": {"x":1254,"y":1725,"w":14,"h":22}, + "frame": {"x":1510,"y":1752,"w":276,"h":293}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":604,"w":14,"h":22}, + "spriteSourceSize": {"x":445,"y":566,"w":276,"h":293}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/SkirtOverKneel.png": +"Models/EyesDai2/Brows2Surprised.png": { - "frame": {"x":1203,"y":1752,"w":435,"h":293}, + "frame": {"x":1203,"y":1727,"w":51,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":390,"y":799,"w":435,"h":293}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":611,"y":230,"w":51,"h":21}, + "sourceSize": {"w":813,"h":502} }, "Models/Furniture/DisplayFront.png": { @@ -120,6 +96,14 @@ "spriteSourceSize": {"x":403,"y":390,"w":376,"h":1283}, "sourceSize": {"w":1240,"h":1754} }, +"Models/Kigu/Lock.png": +{ + "frame": {"x":1790,"y":1752,"w":255,"h":230}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":604,"y":199,"w":255,"h":230}, + "sourceSize": {"w":1240,"h":1754} +}, "Models/MaidKnightLight/DressChestYoked.png": { "frame": {"x":763,"y":3,"w":279,"h":259}, @@ -128,12 +112,20 @@ "spriteSourceSize": {"x":443,"y":389,"w":279,"h":259}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/PawRightFree.png": +"Models/Mittens/BandRightFree.png": { - "frame": {"x":1203,"y":1514,"w":65,"h":71}, + "frame": {"x":2011,"y":1986,"w":33,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":299,"y":556,"w":65,"h":71}, + "spriteSourceSize": {"x":361,"y":606,"w":33,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/SockLeftHogtie.png": +{ + "frame": {"x":1203,"y":1290,"w":65,"h":209}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":669,"y":962,"w":65,"h":209}, "sourceSize": {"w":1240,"h":1754} }, "Models/Ninja/TopChestTied.png": @@ -170,20 +162,12 @@ }, "Models/SteelCuffs/RimAnkleLeftKneel.png": { - "frame": {"x":1203,"y":1431,"w":65,"h":79}, + "frame": {"x":1203,"y":1644,"w":65,"h":79}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":698,"y":924,"w":65,"h":79}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimElbowLeftWristtie.png": -{ - "frame": {"x":1949,"y":1984,"w":92,"h":61}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":641,"y":607,"w":92,"h":61}, - "sourceSize": {"w":1240,"h":1754} -}, "Models/Tails/Fox4.png": { "frame": {"x":3,"y":1290,"w":1039,"h":755}, @@ -200,12 +184,12 @@ "spriteSourceSize": {"x":445,"y":905,"w":153,"h":755}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtSplitOverKneel.png": +"Models/WolfCatsuit/TorsoUpperRim.png": { - "frame": {"x":1203,"y":1752,"w":435,"h":293}, + "frame": {"x":1790,"y":1986,"w":217,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":390,"y":799,"w":435,"h":293}, + "spriteSourceSize": {"x":478,"y":641,"w":217,"h":59}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -215,7 +199,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas10.webp b/TextureAtlas/atlas10.webp index a07d0f5ea..27cc42bf3 100644 Binary files a/TextureAtlas/atlas10.webp and b/TextureAtlas/atlas10.webp differ diff --git a/TextureAtlas/atlas11.json b/TextureAtlas/atlas11.json index 1a6b3e4b1..8f41d665b 100644 --- a/TextureAtlas/atlas11.json +++ b/TextureAtlas/atlas11.json @@ -1,19 +1,11 @@ {"frames": { -"Models/Belts/Legs2KneelClosed.png": +"Models/ArmorChain/SkirtBeltRivets.png": { - "frame": {"x":1928,"y":1472,"w":117,"h":91}, + "frame": {"x":1751,"y":2017,"w":136,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":397,"y":928,"w":117,"h":91}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Blindfold/KittyEyes.png": -{ - "frame": {"x":1065,"y":2017,"w":133,"h":28}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":535,"y":275,"w":133,"h":28}, + "spriteSourceSize": {"x":505,"y":787,"w":136,"h":26}, "sourceSize": {"w":1240,"h":1754} }, "Models/Bubble/Bubble.png": @@ -24,17 +16,17 @@ "spriteSourceSize": {"x":0,"y":41,"w":1232,"h":1269}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ForeArmRightFront.png": +"Models/Collars/FutureDisplay.png": { - "frame": {"x":1800,"y":873,"w":124,"h":186}, + "frame": {"x":1510,"y":2017,"w":43,"h":27}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":417,"y":543,"w":124,"h":186}, + "spriteSourceSize": {"x":591,"y":399,"w":43,"h":27}, "sourceSize": {"w":1240,"h":1754} }, "Models/Cuffs/ThighLinkSpread.png": { - "frame": {"x":1800,"y":1137,"w":80,"h":27}, + "frame": {"x":970,"y":2018,"w":80,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":560,"y":1035,"w":80,"h":27}, @@ -42,122 +34,58 @@ }, "Models/Cuffs/ThighLinkSpreadHigh.png": { - "frame": {"x":980,"y":2018,"w":81,"h":27}, + "frame": {"x":885,"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/CyberArms/CuffLongMittenRightBoxtie.png": -{ - "frame": {"x":2024,"y":1953,"w":21,"h":30}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":461,"y":508,"w":21,"h":30}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/DisplayWristRightFree.png": -{ - "frame": {"x":1884,"y":1137,"w":40,"h":20}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":368,"y":601,"w":40,"h":20}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/ElbowLeftUp.png": -{ - "frame": {"x":1928,"y":1653,"w":117,"h":75}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":709,"y":262,"w":117,"h":75}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/ElbowRightBoxtie.png": +"Models/CyberCuffs/LockWristLeftFree.png": { - "frame": {"x":1789,"y":2017,"w":28,"h":28}, + "frame": {"x":1557,"y":2017,"w":23,"h":27}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":455,"y":602,"w":28,"h":28}, + "spriteSourceSize": {"x":833,"y":750,"w":23,"h":27}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockThighLeftKneel.png": +"Models/DivineBelt/LockBraShackle.png": { - "frame": {"x":1638,"y":2017,"w":35,"h":28}, + "frame": {"x":1969,"y":1802,"w":76,"h":195}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":583,"y":876,"w":35,"h":28}, + "spriteSourceSize": {"x":544,"y":444,"w":76,"h":195}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockThighLeftKneelClosed.png": +"Models/DivineCuffs/WristRightDecoCleanYoked.png": { - "frame": {"x":1638,"y":2017,"w":35,"h":28}, + "frame": {"x":1212,"y":2017,"w":61,"h":27}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":583,"y":876,"w":35,"h":28}, + "spriteSourceSize": {"x":310,"y":406,"w":61,"h":27}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockWristLeftFront.png": +"Models/DivineCuffs/WristRightDecoYoked.png": { - "frame": {"x":2024,"y":1987,"w":21,"h":30}, + "frame": {"x":1277,"y":2017,"w":61,"h":27}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":670,"y":543,"w":21,"h":30}, + "spriteSourceSize": {"x":310,"y":406,"w":61,"h":27}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenElbowRightFront.png": +"Models/DivineGag/MuzzleCollar.png": { - "frame": {"x":2012,"y":1169,"w":33,"h":62}, + "frame": {"x":1054,"y":2017,"w":80,"h":27}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":421,"y":586,"w":33,"h":62}, + "spriteSourceSize": {"x":588,"y":378,"w":80,"h":27}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenWristRightFree.png": +"Models/Dress/BlouseArmRightBoxtie.png": { - "frame": {"x":1350,"y":2017,"w":51,"h":28}, + "frame": {"x":1928,"y":1802,"w":37,"h":243}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":363,"y":599,"w":51,"h":28}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/UpperCuffLongMittenRightBoxtie.png": -{ - "frame": {"x":2024,"y":1953,"w":21,"h":30}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":461,"y":508,"w":21,"h":30}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineBelt/BeltPin.png": -{ - "frame": {"x":1821,"y":2017,"w":23,"h":28}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":558,"y":790,"w":23,"h":28}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighRightLockBandKneel.png": -{ - "frame": {"x":1459,"y":2017,"w":45,"h":28}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":426,"y":849,"w":45,"h":28}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/WristLeftLockBandFree.png": -{ - "frame": {"x":2024,"y":2021,"w":21,"h":23}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":833,"y":732,"w":21,"h":23}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Dress/LaceChestDecoHardware.png": -{ - "frame": {"x":1677,"y":2017,"w":34,"h":28}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":557,"y":557,"w":34,"h":28}, + "spriteSourceSize": {"x":460,"y":440,"w":37,"h":243}, "sourceSize": {"w":1240,"h":1754} }, "Models/Dress/Skirt.png": @@ -176,53 +104,53 @@ "spriteSourceSize": {"x":366,"y":755,"w":496,"h":763}, "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesDai1/BrowsAngry.png": +"Models/Ears/Earrings.png": { - "frame": {"x":1405,"y":2017,"w":50,"h":28}, + "frame": {"x":1908,"y":1128,"w":14,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":539,"y":252,"w":50,"h":28}, - "sourceSize": {"w":693,"h":407} + "spriteSourceSize": {"x":689,"y":329,"w":14,"h":37}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesDai2/BrowsSad.png": +"Models/Ears/ElfLongFront.png": { - "frame": {"x":1556,"y":2017,"w":37,"h":28}, + "frame": {"x":1677,"y":1194,"w":139,"h":78}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":539,"y":247,"w":37,"h":28}, - "sourceSize": {"w":806,"h":515} + "spriteSourceSize": {"x":677,"y":259,"w":139,"h":78}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceDask/EyesClosed.png": +"Models/EyesK3/EyesClosed.png": { - "frame": {"x":830,"y":2018,"w":146,"h":27}, + "frame": {"x":1458,"y":2017,"w":48,"h":27}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":55,"y":185,"w":146,"h":27}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":528,"y":285,"w":48,"h":27}, + "sourceSize": {"w":781,"h":560} }, -"Models/FaceKjus/MouthFrown.png": +"Models/EyesK3/WhitesEyesClosed.png": { - "frame": {"x":2012,"y":1235,"w":33,"h":35}, + "frame": {"x":1458,"y":2017,"w":48,"h":27}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":591,"y":322,"w":33,"h":35}, - "sourceSize": {"w":754,"h":461} + "spriteSourceSize": {"x":528,"y":285,"w":48,"h":27}, + "sourceSize": {"w":781,"h":560} }, -"Models/FaceKoi/BrowsSad.png": +"Models/EyesK4/Eyes2Neutral.png": { - "frame": {"x":1597,"y":2017,"w":37,"h":28}, + "frame": {"x":1969,"y":2001,"w":70,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":61,"y":137,"w":37,"h":28}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":614,"y":264,"w":70,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/Fiddle/FiddleBody.png": +"Models/FaceDask/Brows2Sad.png": { - "frame": {"x":1793,"y":1169,"w":215,"h":103}, + "frame": {"x":1891,"y":2017,"w":33,"h":17}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":476,"y":523,"w":215,"h":103}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":620,"y":235,"w":33,"h":17}, + "sourceSize": {"w":700,"h":400} }, "Models/Furniture/OneBarFrontClosed.png": { @@ -240,21 +168,21 @@ "spriteSourceSize": {"x":570,"y":872,"w":62,"h":745}, "sourceSize": {"w":1240,"h":1754} }, -"Models/FutureHarness/LockChest.png": +"Models/FutureHarness/DisplayLower.png": { - "frame": {"x":2024,"y":1918,"w":21,"h":31}, + "frame": {"x":1584,"y":2017,"w":163,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":570,"y":497,"w":21,"h":31}, + "spriteSourceSize": {"x":489,"y":807,"w":163,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Gothic/Buttons.png": +"Models/GagLatex/NeckCorsetGagRim2.png": { - "frame": {"x":676,"y":2025,"w":150,"h":20}, + "frame": {"x":1528,"y":1194,"w":145,"h":78}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":491,"y":685,"w":150,"h":20}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":538,"y":306,"w":145,"h":78}, + "sourceSize": {"w":763,"h":476} }, "Models/Hair/BraidCustomBraid.png": { @@ -266,148 +194,164 @@ }, "Models/Handcuffs/Irish8AnkleRightClosed.png": { - "frame": {"x":1848,"y":2017,"w":70,"h":27}, + "frame": {"x":1138,"y":2017,"w":70,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":538,"y":1432,"w":70,"h":27}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Handcuffs/LegironsRightClosed.png": +"Models/Heels/TallRightSpread.png": { - "frame": {"x":1202,"y":2017,"w":70,"h":28}, + "frame": {"x":503,"y":1276,"w":169,"h":762}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":538,"y":1432,"w":70,"h":28}, + "spriteSourceSize": {"x":440,"y":902,"w":169,"h":762}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Handcuffs/LegironsRightSpread.png": +"Models/LeatherCuffs/HardwareElbowLeftBoxtie.png": { - "frame": {"x":1276,"y":2017,"w":70,"h":28}, + "frame": {"x":1342,"y":2017,"w":54,"h":27}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":1432,"w":70,"h":28}, + "spriteSourceSize": {"x":700,"y":592,"w":54,"h":27}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/TallRightSpread.png": +"Models/LeatherCuffs/HardwareElbowLeftFree.png": { - "frame": {"x":503,"y":1276,"w":169,"h":762}, + "frame": {"x":1400,"y":2017,"w":54,"h":27}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":902,"w":169,"h":762}, + "spriteSourceSize": {"x":709,"y":601,"w":54,"h":27}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BowCollar.png": +"Models/Maid/StripeSockLeftSpread.png": { - "frame": {"x":1928,"y":1807,"w":117,"h":52}, + "frame": {"x":1649,"y":1128,"w":149,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":548,"y":398,"w":117,"h":52}, + "spriteSourceSize": {"x":609,"y":973,"w":149,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/ElbowRightUp.png": +"Models/MaidKnightLight/ArmLeftWristtie.png": { - "frame": {"x":1800,"y":1063,"w":124,"h":70}, + "frame": {"x":1928,"y":626,"w":117,"h":275}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":443,"y":252,"w":124,"h":70}, + "spriteSourceSize": {"x":674,"y":432,"w":117,"h":275}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareElbowLeftUp.png": +"Models/MaidKnightLight/ArmRightCrossed.png": { - "frame": {"x":1928,"y":1863,"w":117,"h":51}, + "frame": {"x":1928,"y":905,"w":117,"h":260}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":714,"y":263,"w":117,"h":51}, + "spriteSourceSize": {"x":432,"y":424,"w":117,"h":260}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/ThighRightClosed.png": +"Models/Nipples/Rings.png": { - "frame": {"x":1928,"y":1732,"w":117,"h":71}, + "frame": {"x":676,"y":2025,"w":205,"h":20}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":472,"y":1030,"w":117,"h":71}, + "spriteSourceSize": {"x":464,"y":562,"w":205,"h":20}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ArmLeftWristtie.png": +"Models/Panties/Lace.png": { - "frame": {"x":1928,"y":626,"w":117,"h":275}, + "frame": {"x":1239,"y":1169,"w":285,"h":103}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":674,"y":432,"w":117,"h":275}, + "spriteSourceSize": {"x":449,"y":783,"w":285,"h":103}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ArmRightCrossed.png": +"Models/Ribbon/TopRightThigh1KneelClosed.png": { - "frame": {"x":1928,"y":905,"w":117,"h":260}, + "frame": {"x":1802,"y":1128,"w":102,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":432,"y":424,"w":117,"h":260}, + "spriteSourceSize": {"x":335,"y":911,"w":102,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LockLeftFront.png": +"Models/Robes/SleeveLeftWristtie.png": { - "frame": {"x":1715,"y":2017,"w":33,"h":28}, + "frame": {"x":1942,"y":1233,"w":103,"h":283}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":627,"y":561,"w":33,"h":28}, + "spriteSourceSize": {"x":676,"y":495,"w":103,"h":283}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LockRightFront.png": +"Models/Robes/SleeveLeftWristtieTight.png": { - "frame": {"x":1752,"y":2017,"w":33,"h":28}, + "frame": {"x":1942,"y":1233,"w":103,"h":283}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":503,"y":557,"w":33,"h":28}, + "spriteSourceSize": {"x":676,"y":495,"w":103,"h":283}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/Lace.png": +"Models/Rope/Suspension.png": { - "frame": {"x":1239,"y":1169,"w":285,"h":103}, + "frame": {"x":742,"y":1276,"w":307,"h":738}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":783,"w":285,"h":103}, + "spriteSourceSize": {"x":500,"y":0,"w":307,"h":738}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Crotch.png": +"Models/RopeOld/ChestLower.png": { - "frame": {"x":1528,"y":1169,"w":261,"h":103}, + "frame": {"x":1820,"y":1194,"w":225,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":737,"w":261,"h":103}, + "spriteSourceSize": {"x":478,"y":600,"w":225,"h":35}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/ForeArm2Wristtie.png": +"Models/Rubber/LegRightKneel.png": { - "frame": {"x":1508,"y":2017,"w":44,"h":28}, + "frame": {"x":1239,"y":873,"w":219,"h":292}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":679,"y":633,"w":44,"h":28}, + "spriteSourceSize": {"x":319,"y":768,"w":219,"h":292}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Suspension.png": +"Models/Skirts/StripedSkirtUnderClosedCrotchStrap.png": { - "frame": {"x":742,"y":1276,"w":307,"h":738}, + "frame": {"x":1649,"y":873,"w":275,"h":251}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":500,"y":0,"w":307,"h":738}, + "spriteSourceSize": {"x":468,"y":768,"w":275,"h":251}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/HandRightYoked.png": +"Models/Skirts/StripedSkirtUnderCrotchStrap.png": { - "frame": {"x":1928,"y":1918,"w":92,"h":127}, + "frame": {"x":1649,"y":873,"w":275,"h":251}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":299,"y":287,"w":92,"h":127}, + "spriteSourceSize": {"x":468,"y":768,"w":275,"h":251}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtUnderHogtieCrotchStrap.png": +{ + "frame": {"x":1649,"y":873,"w":275,"h":251}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":768,"w":275,"h":251}, "sourceSize": {"w":1240,"h":1754} }, "Models/SteelCuffs/ElbowLeftUp.png": { - "frame": {"x":1928,"y":1567,"w":117,"h":82}, + "frame": {"x":1928,"y":1716,"w":117,"h":82}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":707,"y":282,"w":117,"h":82}, "sourceSize": {"w":1240,"h":1754} }, +"Models/Succubus/bac/SuccubusClawRightFront.png": +{ + "frame": {"x":1820,"y":1233,"w":118,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":511,"y":479,"w":118,"h":39}, + "sourceSize": {"w":1240,"h":1754} +}, "Models/Tails/Fox2.png": { "frame": {"x":1239,"y":154,"w":682,"h":715}, @@ -424,6 +368,14 @@ "spriteSourceSize": {"x":275,"y":724,"w":871,"h":737}, "sourceSize": {"w":1240,"h":1754} }, +"Models/TapeHeavy/AnklesClosed.png": +{ + "frame": {"x":1462,"y":873,"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":1928,"y":332,"w":117,"h":290}, @@ -458,18 +410,18 @@ }, "Models/WolfCatsuit/ShoeLeftSpread.png": { - "frame": {"x":1928,"y":1276,"w":117,"h":192}, + "frame": {"x":1928,"y":1520,"w":117,"h":192}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":635,"y":1451,"w":117,"h":192}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/SkirtKneelCrotchStrap.png": +"Models/Yoke/SteelBar.png": { - "frame": {"x":1239,"y":873,"w":557,"h":292}, + "frame": {"x":1528,"y":1169,"w":517,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":312,"y":713,"w":557,"h":292}, + "spriteSourceSize": {"x":355,"y":401,"w":517,"h":21}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -479,7 +431,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas11.webp b/TextureAtlas/atlas11.webp index dc1bad33c..cf1c6c5cc 100644 Binary files a/TextureAtlas/atlas11.webp and b/TextureAtlas/atlas11.webp differ diff --git a/TextureAtlas/atlas12.json b/TextureAtlas/atlas12.json index 596949687..64787c462 100644 --- a/TextureAtlas/atlas12.json +++ b/TextureAtlas/atlas12.json @@ -1,163 +1,307 @@ {"frames": { -"Models/ArmorPlate/PauldronsHogtie.png": +"Models/Bandit/WristLeftFront.png": { - "frame": {"x":1706,"y":511,"w":339,"h":167}, + "frame": {"x":1579,"y":724,"w":58,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":387,"w":339,"h":167}, + "spriteSourceSize": {"x":622,"y":543,"w":58,"h":40}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/ForeArmLeftFront.png": +"Models/Belts/Feet2Closed.png": { - "frame": {"x":1515,"y":1227,"w":529,"h":639}, + "frame": {"x":1362,"y":1863,"w":136,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":529,"h":639}, + "spriteSourceSize": {"x":526,"y":1468,"w":136,"h":53}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bra/Cherry.png": +"Models/Bubble/BubbleSquishy.png": { - "frame": {"x":1706,"y":1113,"w":265,"h":110}, + "frame": {"x":3,"y":3,"w":1210,"h":1235}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":514,"w":265,"h":110}, + "spriteSourceSize": {"x":5,"y":56,"w":1210,"h":1235}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bubble/Arms.png": +"Models/Catsuit/ArmRightYoked.png": { - "frame": {"x":1540,"y":92,"w":497,"h":415}, + "frame": {"x":1362,"y":1519,"w":213,"h":241}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":357,"y":392,"w":497,"h":415}, + "spriteSourceSize": {"x":311,"y":389,"w":213,"h":241}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bubble/BubbleSquishy.png": +"Models/CyberArms/LongMittenRightBoxtie.png": { - "frame": {"x":3,"y":3,"w":1210,"h":1235}, + "frame": {"x":1729,"y":3,"w":316,"h":1220}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":56,"w":1210,"h":1235}, + "spriteSourceSize": {"x":451,"y":392,"w":316,"h":1220}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LongMittenRightBoxtie.png": +{ + "frame": {"x":1729,"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/Bunny/SockRightSpread.png": +"Models/DivineCuffs/ThighLeftLockPlateKneel.png": { - "frame": {"x":1540,"y":511,"w":162,"h":706}, + "frame": {"x":1579,"y":1025,"w":55,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":919,"w":162,"h":706}, + "spriteSourceSize": {"x":520,"y":839,"w":55,"h":47}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/FootRightKneel.png": +"Models/DivineCuffs/ThighLeftLockPlateKneelClosed.png": { - "frame": {"x":1975,"y":1113,"w":70,"h":101}, + "frame": {"x":1579,"y":1025,"w":55,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":323,"y":856,"w":70,"h":101}, + "spriteSourceSize": {"x":520,"y":839,"w":55,"h":47}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/LongMittenLeftBoxtie.png": +"Models/Dress/BlouseArmRightYoked.png": { - "frame": {"x":1217,"y":3,"w":319,"h":1220}, + "frame": {"x":1362,"y":1242,"w":213,"h":273}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":392,"w":319,"h":1220}, + "spriteSourceSize": {"x":286,"y":356,"w":213,"h":273}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/ArmLongMittenLeftBoxtie.png": +"Models/Dress/MageCollarTie.png": { - "frame": {"x":1217,"y":3,"w":319,"h":1220}, + "frame": {"x":1362,"y":1764,"w":213,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":392,"w":319,"h":1220}, + "spriteSourceSize": {"x":496,"y":415,"w":213,"h":95}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/LongMittenLeftBoxtie.png": +"Models/Elf/Collar.png": { - "frame": {"x":1217,"y":3,"w":319,"h":1220}, + "frame": {"x":1064,"y":2020,"w":86,"h":25}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":392,"w":319,"h":1220}, + "spriteSourceSize": {"x":584,"y":393,"w":86,"h":25}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/ShoeRightSpread.png": +"Models/EyesDai1/Brows2Surprised.png": +{ + "frame": {"x":674,"y":2026,"w":61,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":610,"y":234,"w":61,"h":19}, + "sourceSize": {"w":813,"h":502} +}, +"Models/EyesDai2/Brows2Sad.png": +{ + "frame": {"x":739,"y":2026,"w":61,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":592,"y":244,"w":61,"h":19}, + "sourceSize": {"w":726,"h":532} +}, +"Models/EyesDai2/BrowsNeutral.png": +{ + "frame": {"x":1645,"y":1993,"w":41,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":245,"w":41,"h":22}, + "sourceSize": {"w":744,"h":461} +}, +"Models/FaceKjus/BrowsSad.png": +{ + "frame": {"x":804,"y":2026,"w":50,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":524,"y":254,"w":50,"h":19}, + "sourceSize": {"w":806,"h":515} +}, +"Models/Furniture/OneBarFrontClosedHeels.png": { - "frame": {"x":1653,"y":1870,"w":111,"h":175}, + "frame": {"x":674,"y":1242,"w":62,"h":780}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":491,"y":1467,"w":111,"h":175}, + "spriteSourceSize": {"x":560,"y":872,"w":62,"h":780}, "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKjus/MouthDazed.png": +"Models/Furniture/OneBarFrontSpreadHeels.png": { - "frame": {"x":1238,"y":2032,"w":39,"h":11}, + "frame": {"x":740,"y":1242,"w":62,"h":780}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":588,"y":342,"w":39,"h":11}, - "sourceSize": {"w":706,"h":455} + "spriteSourceSize": {"x":570,"y":872,"w":62,"h":780}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/Brows2Neutral.png": +"Models/GagLeather/BigBall.png": { - "frame": {"x":1186,"y":2032,"w":48,"h":11}, + "frame": {"x":1579,"y":677,"w":58,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":142,"y":139,"w":48,"h":11}, + "spriteSourceSize": {"x":103,"y":234,"w":58,"h":43}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoi/MouthSurprised.png": +"Models/GagMetal/BigBall.png": { - "frame": {"x":1281,"y":2032,"w":27,"h":11}, + "frame": {"x":1579,"y":629,"w":58,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":121,"y":243,"w":27,"h":11}, + "spriteSourceSize": {"x":103,"y":233,"w":58,"h":44}, "sourceSize": {"w":321,"h":332} }, -"Models/Hair2/Hair5_FrontE.png": +"Models/Hair/Braid.png": +{ + "frame": {"x":1729,"y":1227,"w":316,"h":558}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":104,"w":316,"h":558}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hair/TwintailLeft.png": { - "frame": {"x":1515,"y":1870,"w":134,"h":175}, + "frame": {"x":1641,"y":470,"w":84,"h":602}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":489,"y":127,"w":134,"h":175}, + "spriteSourceSize": {"x":480,"y":141,"w":84,"h":602}, "sourceSize": {"w":1240,"h":1754} }, "Models/Heels/TallLeftSpread.png": { - "frame": {"x":1186,"y":1242,"w":163,"h":786}, + "frame": {"x":507,"y":1242,"w":163,"h":786}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":605,"y":896,"w":163,"h":786}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeClosed.png": +"Models/LeatherCuffs/AnkleRightSpread.png": +{ + "frame": {"x":1502,"y":1863,"w":73,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":491,"y":1422,"w":73,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/Bow.png": +{ + "frame": {"x":1592,"y":1920,"w":133,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":547,"y":393,"w":133,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/SockRightHogtie.png": +{ + "frame": {"x":1217,"y":45,"w":141,"h":580}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":931,"w":141,"h":580}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/Top.png": +{ + "frame": {"x":1362,"y":1920,"w":226,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":474,"y":573,"w":226,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Nipples/VibePiercingsBullet.png": +{ + "frame": {"x":858,"y":2023,"w":202,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":576,"w":202,"h":22}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/InvertedRose.png": +{ + "frame": {"x":1362,"y":470,"w":275,"h":155}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":761,"w":275,"h":155}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/RobeOfChastity/GoldKneel.png": +{ + "frame": {"x":1729,"y":1789,"w":316,"h":248}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":441,"y":605,"w":316,"h":248}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/ArmStrapCrossed.png": +{ + "frame": {"x":1579,"y":931,"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":1579,"y":931,"w":57,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":561,"y":602,"w":57,"h":90}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/ToeClosed.png": +{ + "frame": {"x":1592,"y":1993,"w":49,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":526,"y":1570,"w":49,"h":22}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderLeftUp.png": +{ + "frame": {"x":1579,"y":810,"w":57,"h":117}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":670,"y":297,"w":57,"h":117}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/PostureCollarHardware.png": { - "frame": {"x":1706,"y":682,"w":339,"h":59}, + "frame": {"x":1690,"y":1993,"w":22,"h":22}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":422,"y":858,"w":339,"h":59}, + "spriteSourceSize": {"x":596,"y":411,"w":22,"h":22}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/Base.png": +"Models/SteelCuffs/WristLeftFree.png": { - "frame": {"x":1768,"y":1870,"w":277,"h":163}, + "frame": {"x":1579,"y":768,"w":58,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":756,"w":277,"h":163}, + "spriteSourceSize": {"x":797,"y":765,"w":58,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/TorsoLowerKneel.png": +"Models/TallBallet/TallLeftClosed.png": { - "frame": {"x":1706,"y":745,"w":338,"h":364}, + "frame": {"x":806,"y":1242,"w":169,"h":777}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":416,"y":537,"w":338,"h":364}, + "spriteSourceSize": {"x":575,"y":906,"w":169,"h":777}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallBallet/TallRightSpread.png": +"Models/TallBallet/TallRightClosed.png": { - "frame": {"x":1353,"y":1227,"w":158,"h":812}, + "frame": {"x":1206,"y":1242,"w":152,"h":773}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":899,"w":158,"h":812}, + "spriteSourceSize": {"x":448,"y":909,"w":152,"h":773}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallSmoothHeels/TallLeftClosed.png": +{ + "frame": {"x":979,"y":1242,"w":223,"h":774}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":519,"y":902,"w":223,"h":774}, "sourceSize": {"w":1240,"h":1754} }, "Models/TallSmoothHeels/TallLeftSpread.png": @@ -168,28 +312,84 @@ "spriteSourceSize": {"x":605,"y":895,"w":163,"h":796}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Weapon/NightWhipLightFree.png": +"Models/TapeHeavy/RightLegsKneelClosed.png": +{ + "frame": {"x":1362,"y":45,"w":362,"h":421}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":652,"w":362,"h":421}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/BottomClosed.png": +{ + "frame": {"x":1217,"y":629,"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":1217,"y":629,"w":358,"h":609}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":735,"w":358,"h":609}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ShoeRightClosed.png": +{ + "frame": {"x":1579,"y":1076,"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":1579,"y":1498,"w":146,"h":418}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":1206,"w":146,"h":418}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/BandAnkleLeftClosed.png": +{ + "frame": {"x":1154,"y":2020,"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":1154,"y":2020,"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":507,"y":1242,"w":675,"h":790}, + "frame": {"x":1154,"y":2020,"w":63,"h":25}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":274,"y":467,"w":675,"h":790}, + "spriteSourceSize": {"x":497,"y":1434,"w":63,"h":25}, "sourceSize": {"w":1240,"h":1754} }, "Models/Yoke/HeavySteelHardware.png": { - "frame": {"x":1540,"y":62,"w":504,"h":26}, + "frame": {"x":1221,"y":2019,"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": +"Models/Yoke/HeavySteelLock.png": { - "frame": {"x":1540,"y":3,"w":504,"h":55}, + "frame": {"x":1217,"y":3,"w":507,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":374,"y":379,"w":504,"h":55}, + "spriteSourceSize": {"x":371,"y":426,"w":507,"h":38}, "sourceSize": {"w":1240,"h":1754} }, "Models/Yukata/SkirtClosed.png": @@ -207,7 +407,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas12.webp b/TextureAtlas/atlas12.webp index 0bf847748..0d4e9036e 100644 Binary files a/TextureAtlas/atlas12.webp and b/TextureAtlas/atlas12.webp differ diff --git a/TextureAtlas/atlas13.json b/TextureAtlas/atlas13.json index 5a70a7253..f8e3b924a 100644 --- a/TextureAtlas/atlas13.json +++ b/TextureAtlas/atlas13.json @@ -1,32 +1,16 @@ {"frames": { -"Models/Bunny/LegSockRightClosed.png": +"Models/Corsets/HeavyCorsetKneel.png": { - "frame": {"x":1731,"y":2024,"w":146,"h":14}, + "frame": {"x":1755,"y":1691,"w":290,"h":349}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":907,"w":146,"h":14}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Catsuit/ShoulderLeftUp.png": -{ - "frame": {"x":1881,"y":1877,"w":162,"h":168}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":626,"y":394,"w":162,"h":168}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Chastity/BraChain.png": -{ - "frame": {"x":700,"y":1227,"w":259,"h":238}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":506,"y":401,"w":259,"h":238}, + "spriteSourceSize": {"x":449,"y":508,"w":290,"h":349}, "sourceSize": {"w":1240,"h":1754} }, "Models/CyberArms/DisplayLongMittenLeftCrossed.png": { - "frame": {"x":1212,"y":2024,"w":13,"h":21}, + "frame": {"x":1044,"y":2024,"w":13,"h":21}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":757,"y":536,"w":13,"h":21}, @@ -34,191 +18,159 @@ }, "Models/CyberArms/DisplayLongMittenLeftFront.png": { - "frame": {"x":1229,"y":2024,"w":13,"h":21}, + "frame": {"x":1061,"y":2024,"w":13,"h":21}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":756,"y":536,"w":13,"h":21}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/DisplayLongMittenLeftYoked.png": +"Models/CyberArms/DisplayLongMittenRightYoked.png": { - "frame": {"x":1409,"y":2024,"w":17,"h":20}, + "frame": {"x":1416,"y":2024,"w":19,"h":20}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":793,"y":486,"w":17,"h":20}, + "spriteSourceSize": {"x":441,"y":493,"w":19,"h":20}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/DisplayLongMittenRightYoked.png": +"Models/CyberArms/LongMittenLeftBoxtie.png": { - "frame": {"x":1386,"y":2024,"w":19,"h":20}, + "frame": {"x":3,"y":3,"w":319,"h":1220}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":441,"y":493,"w":19,"h":20}, + "spriteSourceSize": {"x":451,"y":392,"w":319,"h":1220}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/LongMittenRightBoxtie.png": +"Models/CyberCuffs/DisplayWristRightFree.png": { - "frame": {"x":3,"y":3,"w":316,"h":1220}, + "frame": {"x":1341,"y":2024,"w":40,"h":20}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":392,"w":316,"h":1220}, + "spriteSourceSize": {"x":368,"y":601,"w":40,"h":20}, "sourceSize": {"w":1240,"h":1754} }, "Models/CyberCuffs/LockCollar.png": { - "frame": {"x":1134,"y":2024,"w":16,"h":21}, + "frame": {"x":966,"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/ArmLongMittenRightBoxtie.png": +"Models/CyberHeels/ShinyBalletLeftClosed.png": { - "frame": {"x":323,"y":3,"w":316,"h":1220}, + "frame": {"x":1639,"y":1691,"w":112,"h":354}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":392,"w":316,"h":1220}, + "spriteSourceSize": {"x":585,"y":1331,"w":112,"h":354}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/LongMittenRightBoxtie.png": +"Models/CyberHeels/ShinyBalletLeftSpread.png": { - "frame": {"x":3,"y":3,"w":316,"h":1220}, + "frame": {"x":1639,"y":1691,"w":112,"h":354}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":392,"w":316,"h":1220}, + "spriteSourceSize": {"x":668,"y":1344,"w":112,"h":354}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/MittenRightBoxtie.png": +"Models/CyberHeels/ShinyBalletRightClosed.png": { - "frame": {"x":643,"y":3,"w":316,"h":1220}, + "frame": {"x":1522,"y":1691,"w":113,"h":354}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":392,"w":316,"h":1220}, + "spriteSourceSize": {"x":522,"y":1328,"w":113,"h":354}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/MittenRightYoked.png": +"Models/CyberMitts/ArmLongMittenLeftBoxtie.png": { - "frame": {"x":874,"y":1869,"w":85,"h":99}, + "frame": {"x":3,"y":3,"w":319,"h":1220}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":292,"y":311,"w":85,"h":99}, + "spriteSourceSize": {"x":451,"y":392,"w":319,"h":1220}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperDisplayLongMittenLeftCrossed.png": +"Models/CyberMitts/ArmLongMittenRightBoxtie.png": { - "frame": {"x":1212,"y":2024,"w":13,"h":21}, + "frame": {"x":326,"y":3,"w":316,"h":1220}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":757,"y":536,"w":13,"h":21}, + "spriteSourceSize": {"x":451,"y":392,"w":316,"h":1220}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperDisplayLongMittenLeftFree.png": +"Models/CyberMitts/LongMittenLeftBoxtie.png": { - "frame": {"x":1430,"y":2024,"w":14,"h":20}, + "frame": {"x":3,"y":3,"w":319,"h":1220}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":762,"y":520,"w":14,"h":20}, + "spriteSourceSize": {"x":451,"y":392,"w":319,"h":1220}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperDisplayLongMittenLeftFront.png": +"Models/CyberMitts/MittenRightBoxtie.png": { - "frame": {"x":1229,"y":2024,"w":13,"h":21}, + "frame": {"x":646,"y":3,"w":316,"h":1220}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":756,"y":536,"w":13,"h":21}, + "spriteSourceSize": {"x":451,"y":392,"w":316,"h":1220}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperDisplayLongMittenLeftYoked.png": +"Models/CyberMitts/UpperDisplayLongMittenLeftCrossed.png": { - "frame": {"x":1409,"y":2024,"w":17,"h":20}, + "frame": {"x":1044,"y":2024,"w":13,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":793,"y":486,"w":17,"h":20}, + "spriteSourceSize": {"x":757,"y":536,"w":13,"h":21}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperDisplayLongMittenRightYoked.png": +"Models/CyberMitts/UpperDisplayLongMittenLeftFront.png": { - "frame": {"x":1386,"y":2024,"w":19,"h":20}, + "frame": {"x":1061,"y":2024,"w":13,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":441,"y":493,"w":19,"h":20}, + "spriteSourceSize": {"x":756,"y":536,"w":13,"h":21}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BraBase2.png": +"Models/CyberMitts/UpperDisplayLongMittenRightYoked.png": { - "frame": {"x":874,"y":1972,"w":83,"h":73}, + "frame": {"x":1416,"y":2024,"w":19,"h":20}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":557,"y":440,"w":83,"h":73}, + "spriteSourceSize": {"x":441,"y":493,"w":19,"h":20}, "sourceSize": {"w":1240,"h":1754} }, "Models/DivineCuffs/ElbowRightDecoCleanFront.png": { - "frame": {"x":1154,"y":2024,"w":16,"h":21}, + "frame": {"x":986,"y":2024,"w":16,"h":21}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":430,"y":622,"w":16,"h":21}, "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesDai1/Brows2Neutral.png": -{ - "frame": {"x":961,"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/EyesDai1/Brows2Surprised.png": -{ - "frame": {"x":1448,"y":2024,"w":61,"h":19}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":610,"y":234,"w":61,"h":19}, - "sourceSize": {"w":813,"h":502} -}, -"Models/EyesDai1/BrowsNeutral.png": -{ - "frame": {"x":1683,"y":2024,"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": +"Models/EyesDai1/Brows2Sad.png": { - "frame": {"x":1513,"y":2024,"w":61,"h":19}, + "frame": {"x":1439,"y":2024,"w":79,"h":17}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":592,"y":244,"w":61,"h":19}, + "spriteSourceSize": {"x":592,"y":248,"w":79,"h":17}, "sourceSize": {"w":726,"h":532} }, -"Models/EyesDai2/Brows2Surprised.png": +"Models/EyesDai2/BrowsAngry.png": { - "frame": {"x":1025,"y":2024,"w":51,"h":21}, + "frame": {"x":916,"y":2018,"w":46,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":611,"y":230,"w":51,"h":21}, - "sourceSize": {"w":813,"h":502} + "spriteSourceSize": {"x":543,"y":254,"w":46,"h":26}, + "sourceSize": {"w":693,"h":407} }, "Models/FaceDask/BrowsSad.png": { - "frame": {"x":1355,"y":2024,"w":27,"h":20}, + "frame": {"x":1385,"y":2024,"w":27,"h":20}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":537,"y":243,"w":27,"h":20}, "sourceSize": {"w":700,"h":400} }, -"Models/FaceKjus/BrowsSad.png": -{ - "frame": {"x":1578,"y":2024,"w":50,"h":19}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":524,"y":254,"w":50,"h":19}, - "sourceSize": {"w":806,"h":515} -}, "Models/FaceKjus/Eyes2Closed.png": { - "frame": {"x":1246,"y":2024,"w":52,"h":20}, + "frame": {"x":1232,"y":2024,"w":52,"h":20}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":621,"y":284,"w":52,"h":20}, @@ -226,39 +178,39 @@ }, "Models/FaceKjus/WhitesEyes2Closed.png": { - "frame": {"x":1246,"y":2024,"w":52,"h":20}, + "frame": {"x":1232,"y":2024,"w":52,"h":20}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":621,"y":284,"w":52,"h":20}, "sourceSize": {"w":759,"h":425} }, -"Models/FutureHarness/DisplayMid.png": +"Models/Gothic/Buttons.png": { - "frame": {"x":1632,"y":2024,"w":47,"h":19}, + "frame": {"x":1078,"y":2024,"w":150,"h":20}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":539,"y":731,"w":47,"h":19}, + "spriteSourceSize": {"x":491,"y":685,"w":150,"h":20}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/LeatherRightKneel.png": +"Models/Heels/BalletRightClosed.png": { - "frame": {"x":874,"y":1651,"w":85,"h":105}, + "frame": {"x":862,"y":1227,"w":100,"h":325}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":311,"y":834,"w":85,"h":105}, + "spriteSourceSize": {"x":510,"y":1359,"w":100,"h":325}, "sourceSize": {"w":1240,"h":1754} }, -"Models/KittyLatex/KittyLatexEarMuffLight2.png": +"Models/Heels/BalletSoleRightClosed.png": { - "frame": {"x":700,"y":1469,"w":259,"h":178}, + "frame": {"x":862,"y":1849,"w":100,"h":165}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":476,"y":222,"w":259,"h":178}, + "spriteSourceSize": {"x":510,"y":1519,"w":100,"h":165}, "sourceSize": {"w":1240,"h":1754} }, "Models/Labcoat/CoatYoked.png": { - "frame": {"x":963,"y":1065,"w":552,"h":955}, + "frame": {"x":966,"y":1065,"w":552,"h":955}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":395,"y":568,"w":552,"h":955}, @@ -266,7 +218,7 @@ }, "Models/LatexPetsuit/GlowLeftLegsKneelClosed.png": { - "frame": {"x":1519,"y":1065,"w":522,"h":452}, + "frame": {"x":1522,"y":1065,"w":522,"h":452}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":321,"y":702,"w":522,"h":452}, @@ -274,7 +226,7 @@ }, "Models/LeatherCuffs/BandElbowRightFront.png": { - "frame": {"x":1194,"y":2024,"w":14,"h":21}, + "frame": {"x":1026,"y":2024,"w":14,"h":21}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":431,"y":614,"w":14,"h":21}, @@ -282,7 +234,7 @@ }, "Models/LeatherCuffs/ElbowRightBoxtie.png": { - "frame": {"x":1080,"y":2024,"w":25,"h":21}, + "frame": {"x":862,"y":2024,"w":25,"h":21}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":460,"y":608,"w":25,"h":21}, @@ -290,63 +242,55 @@ }, "Models/LeatherCuffs/HardwareWristRightFront.png": { - "frame": {"x":1174,"y":2024,"w":16,"h":21}, + "frame": {"x":1006,"y":2024,"w":16,"h":21}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":471,"y":543,"w":16,"h":21}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ArmLeftUp.png": -{ - "frame": {"x":700,"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/Ninja/ThighLeftSpread.png": +"Models/Legbinder/LacesLegbinderClosed.png": { - "frame": {"x":1881,"y":1521,"w":164,"h":352}, + "frame": {"x":862,"y":1556,"w":100,"h":289}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":606,"y":973,"w":164,"h":352}, + "spriteSourceSize": {"x":522,"y":947,"w":100,"h":289}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SmoothHeels/RightKneel.png": +"Models/Succubus/SuccubusClawRightFront.png": { - "frame": {"x":874,"y":1760,"w":85,"h":105}, + "frame": {"x":1288,"y":2024,"w":49,"h":20}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":311,"y":834,"w":85,"h":105}, + "spriteSourceSize": {"x":506,"y":488,"w":49,"h":20}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SuccubusClawRightFront.png": +"Models/Tails/Fox6.png": { - "frame": {"x":1302,"y":2024,"w":49,"h":20}, + "frame": {"x":966,"y":3,"w":1068,"h":1058}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":506,"y":488,"w":49,"h":20}, + "spriteSourceSize": {"x":114,"y":447,"w":1068,"h":1058}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Tails/Fox6.png": +"Models/TallBallet/TallLeftKneelClosed.png": { - "frame": {"x":963,"y":3,"w":1068,"h":1058}, + "frame": {"x":1522,"y":1521,"w":522,"h":166}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":114,"y":447,"w":1068,"h":1058}, + "spriteSourceSize": {"x":394,"y":916,"w":522,"h":166}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/LegsHogtie.png": +"Models/TallBallet/TallRightSpread.png": { - "frame": {"x":1519,"y":1521,"w":358,"h":499}, + "frame": {"x":3,"y":1227,"w":158,"h":812}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":428,"y":652,"w":358,"h":499}, + "spriteSourceSize": {"x":440,"y":899,"w":158,"h":812}, "sourceSize": {"w":1240,"h":1754} }, "Models/Warrior/ArmbandWristtie.png": { - "frame": {"x":1109,"y":2024,"w":21,"h":21}, + "frame": {"x":891,"y":2024,"w":21,"h":21}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":467,"y":510,"w":21,"h":21}, @@ -354,7 +298,7 @@ }, "Models/Weapon/LatexWhipFree.png": { - "frame": {"x":3,"y":1227,"w":693,"h":809}, + "frame": {"x":165,"y":1227,"w":693,"h":809}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":270,"y":465,"w":693,"h":809}, @@ -367,7 +311,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas13.webp b/TextureAtlas/atlas13.webp index be8a1dfe3..aa222e236 100644 Binary files a/TextureAtlas/atlas13.webp and b/TextureAtlas/atlas13.webp differ diff --git a/TextureAtlas/atlas14.json b/TextureAtlas/atlas14.json index 292e4685d..f83d70a1a 100644 --- a/TextureAtlas/atlas14.json +++ b/TextureAtlas/atlas14.json @@ -1,11 +1,11 @@ {"frames": { -"Models/ArmorChain/SkirtBeltRivetsKneel.png": +"Models/Body/ForeArmLeftFront.png": { - "frame": {"x":615,"y":2007,"w":137,"h":38}, + "frame": {"x":1511,"y":250,"w":529,"h":639}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":471,"y":779,"w":137,"h":38}, + "spriteSourceSize": {"x":216,"y":91,"w":529,"h":639}, "sourceSize": {"w":1240,"h":1754} }, "Models/Bubble/LatexSphere.png": @@ -18,50 +18,18 @@ }, "Models/Bunny/ForeGloveLeftFront.png": { - "frame": {"x":1511,"y":250,"w":529,"h":639}, + "frame": {"x":1511,"y":893,"w":529,"h":639}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":216,"y":91,"w":529,"h":639}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockAnkleRightClosed.png": -{ - "frame": {"x":2023,"y":2010,"w":20,"h":35}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":543,"y":1440,"w":20,"h":35}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/LockBelt.png": -{ - "frame": {"x":2023,"y":1975,"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": +"Models/CyberCuffs/LockElbowRightBoxtie.png": { - "frame": {"x":2023,"y":1939,"w":22,"h":32}, + "frame": {"x":2031,"y":2026,"w":14,"h":18}, "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":1939,"w":22,"h":32}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":385,"y":830,"w":22,"h":32}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberLink/ThighLinkSpread.png": -{ - "frame": {"x":1379,"y":2011,"w":128,"h":23}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":538,"y":1036,"w":128,"h":23}, + "spriteSourceSize": {"x":456,"y":603,"w":14,"h":18}, "sourceSize": {"w":1240,"h":1754} }, "Models/CyberMitts/MittenLeftBoxtie.png": @@ -72,252 +40,244 @@ "spriteSourceSize": {"x":451,"y":392,"w":290,"h":1220}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/SkirtClosedCrotchStrap.png": +"Models/EyesDai1/BrowsNeutral.png": { - "frame": {"x":308,"y":1536,"w":458,"h":467}, + "frame": {"x":1921,"y":2026,"w":44,"h":19}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":383,"y":754,"w":458,"h":467}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":527,"y":250,"w":44,"h":19}, + "sourceSize": {"w":744,"h":461} }, -"Models/Dress/SkirtCrotchStrap.png": +"Models/EyesDai2/BrowsAnnoyed.png": { - "frame": {"x":308,"y":1536,"w":458,"h":467}, + "frame": {"x":1469,"y":1726,"w":38,"h":25}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":383,"y":754,"w":458,"h":467}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":539,"y":246,"w":38,"h":25}, + "sourceSize": {"w":765,"h":427} }, -"Models/Furniture/OneBarFrontClosedHeels.png": +"Models/FaceDask/Brows2Annoyed.png": { - "frame": {"x":3,"y":1227,"w":62,"h":780}, + "frame": {"x":1969,"y":2026,"w":31,"h":19}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":560,"y":872,"w":62,"h":780}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":614,"y":254,"w":31,"h":19}, + "sourceSize": {"w":700,"h":400} }, -"Models/Furniture/OneBarFrontSpreadHeels.png": +"Models/FaceKjus/MouthPout.png": { - "frame": {"x":69,"y":1227,"w":62,"h":780}, + "frame": {"x":2004,"y":2026,"w":23,"h":19}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":570,"y":872,"w":62,"h":780}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":594,"y":333,"w":23,"h":19}, + "sourceSize": {"w":750,"h":458} }, -"Models/Hair/Curly_Overstrap.png": +"Models/FutureHarness/DisplayMid.png": { - "frame": {"x":1268,"y":1631,"w":239,"h":376}, + "frame": {"x":1870,"y":2026,"w":47,"h":19}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":478,"y":143,"w":239,"h":376}, + "spriteSourceSize": {"x":539,"y":731,"w":47,"h":19}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Handcuffs/WolfCuffsChainFront.png": +"Models/GagLeather/BallStrap.png": { - "frame": {"x":1268,"y":2011,"w":107,"h":34}, + "frame": {"x":3,"y":2003,"w":149,"h":42}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":527,"y":557,"w":107,"h":34}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":68,"y":233,"w":149,"h":42}, + "sourceSize": {"w":321,"h":332} }, -"Models/LatexPetsuit/LeftLegsKneel.png": +"Models/GagLeather/BigBallStrap.png": { - "frame": {"x":308,"y":1217,"w":388,"h":315}, + "frame": {"x":156,"y":2003,"w":149,"h":42}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":388,"y":769,"w":388,"h":315}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":68,"y":233,"w":149,"h":42}, + "sourceSize": {"w":321,"h":332} }, -"Models/LatexPetsuit/LeftLegsKneelClosed.png": +"Models/GagMetal/BallStrap.png": { - "frame": {"x":700,"y":1217,"w":388,"h":315}, + "frame": {"x":309,"y":2003,"w":149,"h":42}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":388,"y":769,"w":388,"h":315}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":68,"y":233,"w":149,"h":42}, + "sourceSize": {"w":321,"h":332} }, -"Models/LeatherCuffs/BandThighLeftClosed.png": +"Models/GagMetal/BigBallStrap.png": { - "frame": {"x":3,"y":2011,"w":138,"h":34}, + "frame": {"x":462,"y":2003,"w":149,"h":42}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":574,"y":1049,"w":138,"h":34}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":68,"y":233,"w":149,"h":42}, + "sourceSize": {"w":321,"h":332} }, -"Models/Maid/StripeSockLeftSpread.png": +"Models/GagTape/Full.png": { - "frame": {"x":145,"y":2008,"w":149,"h":37}, + "frame": {"x":1870,"y":1934,"w":175,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":609,"y":973,"w":149,"h":37}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":54,"y":205,"w":175,"h":88}, + "sourceSize": {"w":321,"h":332} }, -"Models/Mittens/ForeLongMittenLeftFront.png": +"Models/GagTape/Stuffing.png": { - "frame": {"x":1511,"y":893,"w":529,"h":639}, + "frame": {"x":1387,"y":1543,"w":120,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":529,"h":639}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":103,"y":225,"w":120,"h":52}, + "sourceSize": {"w":321,"h":332} }, -"Models/Ninja/SkirtKneel.png": +"Models/Gothic/LaceUpper.png": { - "frame": {"x":1092,"y":1217,"w":415,"h":204}, + "frame": {"x":1237,"y":1758,"w":553,"h":287}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":364,"y":738,"w":415,"h":204}, + "spriteSourceSize": {"x":318,"y":721,"w":553,"h":287}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/SkirtOverKneelCrotchStrap.png": +"Models/Gothic/Skirt.png": { - "frame": {"x":1092,"y":1425,"w":415,"h":202}, + "frame": {"x":591,"y":1536,"w":642,"h":462}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":364,"y":739,"w":415,"h":202}, + "spriteSourceSize": {"x":277,"y":671,"w":642,"h":462}, "sourceSize": {"w":1240,"h":1754} }, -"Models/OperaGloves/GloveRightUp.png": +"Models/Hair2/Hair6_FrontB.png": { - "frame": {"x":1904,"y":1536,"w":141,"h":223}, + "frame": {"x":1387,"y":1599,"w":78,"h":155}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":163,"w":141,"h":223}, + "spriteSourceSize": {"x":541,"y":124,"w":78,"h":155}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Calf2Hogtie.png": +"Models/Heels/TallRightClosed.png": { - "frame": {"x":2023,"y":1831,"w":22,"h":53}, + "frame": {"x":3,"y":1227,"w":296,"h":772}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":704,"y":1023,"w":22,"h":53}, + "spriteSourceSize": {"x":445,"y":902,"w":296,"h":772}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopRightThigh1KneelClosed.png": -{ - "frame": {"x":298,"y":2008,"w":102,"h":37}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":335,"y":911,"w":102,"h":37}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/RobeOfChastity/GoldBaseKneel.png": +"Models/LatexPetsuit/LeftLegsKneel.png": { - "frame": {"x":770,"y":1798,"w":317,"h":247}, + "frame": {"x":303,"y":1217,"w":388,"h":315}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":441,"y":606,"w":317,"h":247}, + "spriteSourceSize": {"x":388,"y":769,"w":388,"h":315}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/RibbonBackKneel.png": +"Models/LatexPetsuit/LeftLegsKneelClosed.png": { - "frame": {"x":1511,"y":3,"w":534,"h":243}, + "frame": {"x":695,"y":1217,"w":388,"h":315}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":342,"y":623,"w":534,"h":243}, + "spriteSourceSize": {"x":388,"y":769,"w":388,"h":315}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveRightFront.png": +"Models/Legbinder/LegbinderKneelClosed.png": { - "frame": {"x":1904,"y":1763,"w":115,"h":282}, + "frame": {"x":303,"y":1536,"w":284,"h":463}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":420,"y":488,"w":115,"h":282}, + "spriteSourceSize": {"x":400,"y":640,"w":284,"h":463}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveRightFrontTight.png": +"Models/Legbinder/LegLacesLegbinderClosed.png": { - "frame": {"x":1904,"y":1763,"w":115,"h":282}, + "frame": {"x":1794,"y":1758,"w":72,"h":287}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":420,"y":488,"w":115,"h":282}, + "spriteSourceSize": {"x":551,"y":1226,"w":72,"h":287}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Calf2Hogtie.png": +"Models/Maid/ShoeRightSpread.png": { - "frame": {"x":2023,"y":1831,"w":22,"h":53}, + "frame": {"x":1387,"y":1388,"w":120,"h":151}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":704,"y":1023,"w":22,"h":53}, + "spriteSourceSize": {"x":492,"y":1493,"w":120,"h":151}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Calf2HogtieOver.png": +"Models/MaidKnightLight/ArmLeftUp.png": { - "frame": {"x":2023,"y":1831,"w":22,"h":53}, + "frame": {"x":1875,"y":1536,"w":170,"h":394}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":704,"y":1023,"w":22,"h":53}, + "spriteSourceSize": {"x":663,"y":167,"w":170,"h":394}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Thigh1Closed.png": +"Models/MaidKnightLight/PauldronLeftBoxtie.png": { - "frame": {"x":404,"y":2007,"w":207,"h":38}, + "frame": {"x":1387,"y":1217,"w":120,"h":167}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":492,"y":1097,"w":207,"h":38}, + "spriteSourceSize": {"x":707,"y":390,"w":120,"h":167}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Spats/SpatsSpread.png": +"Models/MaidKnightLight/PauldronLeftFront.png": { - "frame": {"x":770,"y":1536,"w":318,"h":258}, + "frame": {"x":1387,"y":1217,"w":120,"h":167}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":738,"w":318,"h":258}, + "spriteSourceSize": {"x":707,"y":393,"w":120,"h":167}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallBallet/TallLeftClosed.png": +"Models/Robes/RibbonBackKneel.png": { - "frame": {"x":135,"y":1227,"w":169,"h":777}, + "frame": {"x":1511,"y":3,"w":534,"h":243}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":575,"y":906,"w":169,"h":777}, + "spriteSourceSize": {"x":342,"y":623,"w":534,"h":243}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/ArmRightBoxtie.png": +"Models/Rope/ArmHarnessUnder.png": { - "frame": {"x":2023,"y":1763,"w":22,"h":64}, + "frame": {"x":1511,"y":1536,"w":360,"h":218}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":613,"w":22,"h":64}, + "spriteSourceSize": {"x":477,"y":411,"w":360,"h":218}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/CollarHardware.png": +"Models/Rope/Calf2Closed.png": { - "frame": {"x":2023,"y":1888,"w":22,"h":47}, + "frame": {"x":1013,"y":2002,"w":210,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":591,"y":402,"w":22,"h":47}, + "spriteSourceSize": {"x":470,"y":1327,"w":210,"h":43}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/FCollarHardware.png": +"Models/Rubber/TorsoLowerKneel.png": { - "frame": {"x":2023,"y":1888,"w":22,"h":47}, + "frame": {"x":1087,"y":1217,"w":296,"h":315}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":602,"y":407,"w":22,"h":47}, + "spriteSourceSize": {"x":437,"y":541,"w":296,"h":315}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegLeftHogtie.png": +"Models/SteelChastity/BeltSegu.png": { - "frame": {"x":1092,"y":1631,"w":172,"h":414}, + "frame": {"x":1469,"y":1599,"w":38,"h":123}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":577,"y":792,"w":172,"h":414}, + "spriteSourceSize": {"x":553,"y":732,"w":38,"h":123}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/SkirtCrotchStrap.png": +"Models/Succubus/SuccubusWingLight.png": { - "frame": {"x":1511,"y":1536,"w":389,"h":507}, + "frame": {"x":615,"y":2002,"w":394,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":409,"y":713,"w":389,"h":507}, + "spriteSourceSize": {"x":425,"y":379,"w":394,"h":43}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/SkirtHogtieCrotchStrap.png": +"Models/WolfCatsuit/GloveRightUp.png": { - "frame": {"x":1511,"y":1536,"w":389,"h":507}, + "frame": {"x":1237,"y":1536,"w":146,"h":218}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":409,"y":713,"w":389,"h":507}, + "spriteSourceSize": {"x":446,"y":164,"w":146,"h":218}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -327,7 +287,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas14.webp b/TextureAtlas/atlas14.webp index fb42b58a7..636b65919 100644 Binary files a/TextureAtlas/atlas14.webp and b/TextureAtlas/atlas14.webp differ diff --git a/TextureAtlas/atlas15.json b/TextureAtlas/atlas15.json index a45f87ac9..77026573c 100644 --- a/TextureAtlas/atlas15.json +++ b/TextureAtlas/atlas15.json @@ -1,459 +1,283 @@ {"frames": { -"Models/Blindfold/Basic.png": +"Models/Body/ArmRightFree.png": { - "frame": {"x":1851,"y":598,"w":194,"h":72}, + "frame": {"x":1414,"y":422,"w":308,"h":624}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":47,"y":152,"w":194,"h":72}, - "sourceSize": {"w":321,"h":332} -}, -"Models/Body/HandRightFront.png": -{ - "frame": {"x":1217,"y":878,"w":265,"h":335}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":354,"y":244,"w":265,"h":335}, - "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/Leotard.png": -{ - "frame": {"x":1776,"y":1449,"w":269,"h":397}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":446,"y":518,"w":269,"h":397}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/Collar.png": -{ - "frame": {"x":1515,"y":1754,"w":89,"h":56}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":583,"y":374,"w":89,"h":56}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/ElbowRightFront.png": -{ - "frame": {"x":1486,"y":1037,"w":24,"h":48}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":429,"y":599,"w":24,"h":48}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Cuffs/Collar.png": -{ - "frame": {"x":1515,"y":1814,"w":89,"h":56}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":583,"y":374,"w":89,"h":56}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Cuffs/ElbowRightFront.png": -{ - "frame": {"x":1486,"y":1089,"w":24,"h":48}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":429,"y":599,"w":24,"h":48}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/CuffForeLongMittenRightCrossed.png": -{ - "frame": {"x":1831,"y":1309,"w":16,"h":39}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":682,"y":598,"w":16,"h":39}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/CuffLongMittenRightCrossed.png": -{ - "frame": {"x":1486,"y":1141,"w":24,"h":44}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":451,"y":510,"w":24,"h":44}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/DisplayLongMittenLeftBoxtie.png": -{ - "frame": {"x":1591,"y":1874,"w":13,"h":18}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":755,"y":526,"w":13,"h":18}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/LockLongMittenLeftYoked.png": -{ - "frame": {"x":1591,"y":1896,"w":13,"h":15}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":795,"y":489,"w":13,"h":15}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/StrapsForeLongMittenRightFront.png": -{ - "frame": {"x":1515,"y":1874,"w":72,"h":77}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":421,"y":637,"w":72,"h":77}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/ElbowLeftBoxtie.png": -{ - "frame": {"x":1515,"y":1688,"w":89,"h":62}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":686,"y":568,"w":89,"h":62}, + "spriteSourceSize": {"x":216,"y":91,"w":308,"h":624}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockElbowLeftFree.png": +"Models/Body/Torso.png": { - "frame": {"x":1831,"y":1352,"w":16,"h":32}, + "frame": {"x":1726,"y":3,"w":319,"h":564}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":766,"y":596,"w":16,"h":32}, + "spriteSourceSize": {"x":446,"y":359,"w":319,"h":564}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockWristLeftYoked.png": +"Models/Body/TorsoChastity.png": { - "frame": {"x":1831,"y":1388,"w":16,"h":30}, + "frame": {"x":1726,"y":571,"w":319,"h":564}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":919,"y":409,"w":16,"h":30}, + "spriteSourceSize": {"x":446,"y":359,"w":319,"h":564}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CuffForeLongMittenRightCrossed.png": +"Models/Bubble/Arms.png": { - "frame": {"x":1831,"y":1309,"w":16,"h":39}, + "frame": {"x":1217,"y":3,"w":497,"h":415}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":682,"y":598,"w":16,"h":39}, + "spriteSourceSize": {"x":357,"y":392,"w":497,"h":415}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/StrapsForeLongMittenRightFront.png": +"Models/Bubble/BallSuitSeam.png": { - "frame": {"x":1515,"y":1874,"w":72,"h":77}, + "frame": {"x":396,"y":1217,"w":771,"h":770}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":421,"y":637,"w":72,"h":77}, + "spriteSourceSize": {"x":221,"y":387,"w":771,"h":770}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperCuffLongMittenRightCrossed.png": -{ - "frame": {"x":1486,"y":1141,"w":24,"h":44}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":451,"y":510,"w":24,"h":44}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/UpperDisplayLongMittenLeftBoxtie.png": -{ - "frame": {"x":1591,"y":1874,"w":13,"h":18}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":755,"y":526,"w":13,"h":18}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/UpperLockLongMittenLeftYoked.png": -{ - "frame": {"x":1591,"y":1896,"w":13,"h":15}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":795,"y":489,"w":13,"h":15}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/AnkleLeftDecoCleanKneel.png": -{ - "frame": {"x":1831,"y":1215,"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":1831,"y":1262,"w":16,"h":43}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":737,"y":946,"w":16,"h":43}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/AnkleRightDecoCleanClosed.png": -{ - "frame": {"x":1079,"y":1955,"w":57,"h":34}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":532,"y":1444,"w":57,"h":34}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ElbowLeftFront.png": +"Models/Bubble/LatexSphereCutaway.png": { - "frame": {"x":1515,"y":1620,"w":89,"h":64}, + "frame": {"x":3,"y":3,"w":1210,"h":1210}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":680,"y":586,"w":89,"h":64}, + "spriteSourceSize": {"x":5,"y":77,"w":1210,"h":1210}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftLockPlateFree.png": +"Models/Chastity/BraCups.png": { - "frame": {"x":1486,"y":983,"w":24,"h":50}, + "frame": {"x":1726,"y":1469,"w":319,"h":233}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":768,"y":590,"w":24,"h":50}, + "spriteSourceSize": {"x":446,"y":406,"w":319,"h":233}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowRightLockBandFront.png": +"Models/Collars/Simple.png": { - "frame": {"x":1831,"y":1422,"w":16,"h":18}, + "frame": {"x":1607,"y":1638,"w":105,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":419,"y":619,"w":16,"h":18}, + "spriteSourceSize": {"x":574,"y":370,"w":105,"h":64}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BowCorsetBustRuffle.png": +"Models/CyberCuffs/DisplayWristRightCrossed.png": { - "frame": {"x":269,"y":1994,"w":249,"h":51}, + "frame": {"x":2001,"y":2029,"w":40,"h":16}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":475,"y":485,"w":249,"h":51}, + "spriteSourceSize": {"x":655,"y":591,"w":40,"h":16}, "sourceSize": {"w":1240,"h":1754} }, "Models/Dress/ShoeLeftHogtie.png": { - "frame": {"x":1851,"y":732,"w":193,"h":713}, + "frame": {"x":1217,"y":422,"w":193,"h":713}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":586,"y":796,"w":193,"h":713}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/SkirtKneelCrotchStrap.png": +"Models/FaceKjus/Eyes2Dazed.png": { - "frame": {"x":1515,"y":3,"w":529,"h":356}, + "frame": {"x":1171,"y":1955,"w":61,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":275,"y":737,"w":529,"h":356}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":618,"y":272,"w":61,"h":32}, + "sourceSize": {"w":753,"h":414} }, -"Models/FaceKjus/BlushLow.png": +"Models/GagLatex/NeckCorset2.png": { - "frame": {"x":982,"y":1993,"w":154,"h":52}, + "frame": {"x":1607,"y":1544,"w":115,"h":90}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":530,"y":295,"w":154,"h":52}, - "sourceSize": {"w":744,"h":433} + "spriteSourceSize": {"x":562,"y":354,"w":115,"h":90}, + "sourceSize": {"w":784,"h":486} }, -"Models/FutureBox/Display.png": +"Models/GagMetal/BallSideStrap.png": { - "frame": {"x":1486,"y":878,"w":24,"h":101}, + "frame": {"x":2001,"y":1825,"w":44,"h":200}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":187,"y":749,"w":24,"h":101}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":199,"y":46,"w":44,"h":200}, + "sourceSize": {"w":321,"h":332} }, "Models/GagTape/Cleave.png": { - "frame": {"x":821,"y":1993,"w":157,"h":52}, + "frame": {"x":302,"y":1993,"w":157,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":66,"y":225,"w":157,"h":52}, "sourceSize": {"w":321,"h":332} }, -"Models/Hair/Ponytail.png": +"Models/Hair/BraidBack.png": { - "frame": {"x":1608,"y":1449,"w":164,"h":596}, + "frame": {"x":1607,"y":1825,"w":102,"h":126}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":601,"y":93,"w":164,"h":596}, + "spriteSourceSize": {"x":493,"y":278,"w":102,"h":126}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair5_FrontC.png": +"Models/Heels/BalletRightSpread.png": { - "frame": {"x":1486,"y":1189,"w":24,"h":22}, + "frame": {"x":1618,"y":1198,"w":104,"h":342}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":536,"y":173,"w":24,"h":22}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Harness/BeltsStrap.png": -{ - "frame": {"x":1774,"y":1215,"w":53,"h":230}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":552,"y":690,"w":53,"h":230}, + "spriteSourceSize": {"x":472,"y":1334,"w":104,"h":342}, "sourceSize": {"w":1240,"h":1754} }, "Models/Heels/TallLeftClosed.png": { - "frame": {"x":686,"y":1217,"w":223,"h":772}, + "frame": {"x":3,"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/Heels/TallRightClosed.png": +"Models/LeatherCuffs/AnkleLeftClosed.png": { - "frame": {"x":386,"y":1217,"w":296,"h":772}, + "frame": {"x":1137,"y":1991,"w":96,"h":54}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":902,"w":296,"h":772}, + "spriteSourceSize": {"x":579,"y":1427,"w":96,"h":54}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Kigu/Lock.png": +"Models/Maid/StripeCrotchStrap.png": { - "frame": {"x":1515,"y":1215,"w":255,"h":230}, + "frame": {"x":1217,"y":1139,"w":320,"h":74}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":604,"y":199,"w":255,"h":230}, + "spriteSourceSize": {"x":438,"y":832,"w":320,"h":74}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/TopBandRimChestUp.png": +"Models/MaidKnightLight/GuardLeftCrossed.png": { - "frame": {"x":1851,"y":363,"w":194,"h":231}, + "frame": {"x":1237,"y":1955,"w":171,"h":90}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":492,"y":397,"w":194,"h":231}, + "spriteSourceSize": {"x":534,"y":624,"w":171,"h":90}, "sourceSize": {"w":1240,"h":1754} }, "Models/Ribbon/Cuffs.png": { - "frame": {"x":1851,"y":674,"w":194,"h":54}, + "frame": {"x":463,"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/Rope/Thigh3ClosedOver.png": +"Models/Ribbon/TopCuffs.png": { - "frame": {"x":522,"y":1993,"w":295,"h":52}, + "frame": {"x":661,"y":1991,"w":193,"h":54}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":926,"w":295,"h":52}, + "spriteSourceSize": {"x":484,"y":532,"w":193,"h":54}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimThighRightKneel.png": +"Models/RobeOfChastity/BaseKneel.png": { - "frame": {"x":1454,"y":1955,"w":150,"h":90}, + "frame": {"x":1726,"y":1198,"w":319,"h":267}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":367,"y":812,"w":150,"h":90}, + "spriteSourceSize": {"x":439,"y":587,"w":319,"h":267}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimThighRightKneelClosed.png": +"Models/Rope/Thigh3ClosedOver.png": { - "frame": {"x":1454,"y":1955,"w":150,"h":90}, + "frame": {"x":3,"y":1993,"w":295,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":367,"y":812,"w":150,"h":90}, + "spriteSourceSize": {"x":447,"y":926,"w":295,"h":52}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ThighRightKneel.png": +"Models/Sailor/HemLeftYoked.png": { - "frame": {"x":1140,"y":1955,"w":153,"h":90}, + "frame": {"x":1030,"y":1991,"w":103,"h":54}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":366,"y":811,"w":153,"h":90}, + "spriteSourceSize": {"x":730,"y":521,"w":103,"h":54}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ThighRightKneelClosed.png": +"Models/Shades/GlassesLens.png": { - "frame": {"x":1297,"y":1955,"w":153,"h":90}, + "frame": {"x":858,"y":1991,"w":168,"h":54}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":366,"y":811,"w":153,"h":90}, + "spriteSourceSize": {"x":521,"y":264,"w":168,"h":54}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Tails/Kitty2.png": +"Models/Slayer/CapeStripeYoked.png": { - "frame": {"x":1079,"y":1217,"w":432,"h":734}, + "frame": {"x":1607,"y":1706,"w":438,"h":115}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":539,"y":746,"w":432,"h":734}, + "spriteSourceSize": {"x":401,"y":425,"w":438,"h":115}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallBallet/TallRightClosed.png": +"Models/SteelCuffs/ThighRightKneel.png": { - "frame": {"x":230,"y":1217,"w":152,"h":773}, + "frame": {"x":1412,"y":1955,"w":153,"h":90}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":909,"w":152,"h":773}, + "spriteSourceSize": {"x":366,"y":811,"w":153,"h":90}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallBallet/TallRightKneel.png": +"Models/SteelCuffs/ThighRightKneelClosed.png": { - "frame": {"x":1515,"y":1449,"w":89,"h":85}, + "frame": {"x":1569,"y":1955,"w":153,"h":90}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":309,"y":850,"w":89,"h":85}, + "spriteSourceSize": {"x":366,"y":811,"w":153,"h":90}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallSmoothHeels/TallLeftClosed.png": +"Models/Tails/Kitty2.png": { - "frame": {"x":3,"y":1217,"w":223,"h":774}, + "frame": {"x":1171,"y":1217,"w":432,"h":734}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":519,"y":902,"w":223,"h":774}, + "spriteSourceSize": {"x":539,"y":746,"w":432,"h":734}, "sourceSize": {"w":1240,"h":1754} }, "Models/TallSmoothHeels/TallRightSpread.png": { - "frame": {"x":913,"y":1217,"w":162,"h":772}, + "frame": {"x":230,"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/TapeLight/HandLeftFree.png": -{ - "frame": {"x":1515,"y":1538,"w":89,"h":78}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":822,"y":785,"w":89,"h":78}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/TapeMed/FeetClosed.png": -{ - "frame": {"x":1217,"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/Wolf/BeltHardwareMid.png": +"Models/TapeMed/TopStrapBoxtie.png": { - "frame": {"x":3,"y":1995,"w":262,"h":50}, + "frame": {"x":1414,"y":1050,"w":308,"h":74}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":689,"w":262,"h":50}, + "spriteSourceSize": {"x":461,"y":438,"w":308,"h":74}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/PantiesClosed.png": +"Models/Warrior/Bra.png": { - "frame": {"x":1217,"y":630,"w":293,"h":244}, + "frame": {"x":1726,"y":1825,"w":271,"h":220}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":673,"w":293,"h":244}, + "spriteSourceSize": {"x":445,"y":408,"w":271,"h":220}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/GloveRightCrossed.png": +"Models/WolfCatsuit/ChestBand.png": { - "frame": {"x":1776,"y":1850,"w":269,"h":192}, + "frame": {"x":1541,"y":1198,"w":73,"h":15}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":432,"y":491,"w":269,"h":192}, + "spriteSourceSize": {"x":592,"y":400,"w":73,"h":15}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/Skirt.png": +"Models/Yoke/HeavySteelPins.png": { - "frame": {"x":1514,"y":363,"w":333,"h":848}, + "frame": {"x":1541,"y":1139,"w":504,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":713,"w":333,"h":848}, + "spriteSourceSize": {"x":374,"y":379,"w":504,"h":55}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -463,7 +287,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas15.webp b/TextureAtlas/atlas15.webp index 7bd6329d7..95ed2b136 100644 Binary files a/TextureAtlas/atlas15.webp and b/TextureAtlas/atlas15.webp differ diff --git a/TextureAtlas/atlas16.json b/TextureAtlas/atlas16.json index ffc2789d9..fda214fbd 100644 --- a/TextureAtlas/atlas16.json +++ b/TextureAtlas/atlas16.json @@ -1,331 +1,619 @@ {"frames": { -"Models/ArmorChain/ShirtHogtie.png": +"Models/Belts/LeftArm1Boxtie.png": { - "frame": {"x":474,"y":1640,"w":278,"h":401}, + "frame": {"x":726,"y":1965,"w":71,"h":54}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":417,"w":278,"h":401}, + "spriteSourceSize": {"x":702,"y":491,"w":71,"h":54}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/Legs1Closed.png": +"Models/Body/LegRightClosed.png": { - "frame": {"x":1593,"y":1215,"w":277,"h":74}, + "frame": {"x":668,"y":1267,"w":159,"h":694}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":457,"y":964,"w":277,"h":74}, + "spriteSourceSize": {"x":449,"y":919,"w":159,"h":694}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bubble/Collar.png": +"Models/Bra/StrapsTied.png": { - "frame": {"x":782,"y":1171,"w":111,"h":40}, + "frame": {"x":1833,"y":1349,"w":212,"h":100}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":569,"y":382,"w":111,"h":40}, + "spriteSourceSize": {"x":484,"y":423,"w":212,"h":100}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/Proto.png": +"Models/Bunny/LegSockLeftSpread.png": { - "frame": {"x":756,"y":1640,"w":316,"h":400}, + "frame": {"x":668,"y":2023,"w":159,"h":17}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":523,"w":316,"h":400}, + "spriteSourceSize": {"x":602,"y":904,"w":159,"h":17}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/LockBraHighlight.png": +"Models/Bunny/LegSockRightClosed.png": { - "frame": {"x":817,"y":1215,"w":76,"h":168}, + "frame": {"x":1683,"y":2023,"w":146,"h":14}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":545,"y":456,"w":76,"h":168}, + "spriteSourceSize": {"x":447,"y":907,"w":146,"h":14}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowRightDecoYoked.png": +"Models/Cape/CapeYoked.png": { - "frame": {"x":817,"y":1557,"w":67,"h":79}, + "frame": {"x":1260,"y":925,"w":569,"h":1094}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":391,"y":525,"w":67,"h":79}, + "spriteSourceSize": {"x":363,"y":413,"w":569,"h":1094}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BandKneel.png": +"Models/Chastity/BraProtoLock.png": { - "frame": {"x":1102,"y":1215,"w":278,"h":77}, + "frame": {"x":647,"y":1926,"w":17,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":748,"w":278,"h":77}, + "spriteSourceSize": {"x":560,"y":573,"w":17,"h":30}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BandKneelCrotchStrap.png": +"Models/Chastity/ProtoLock.png": { - "frame": {"x":1102,"y":1215,"w":278,"h":77}, + "frame": {"x":1236,"y":1833,"w":20,"h":31}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":748,"w":278,"h":77}, + "spriteSourceSize": {"x":558,"y":820,"w":20,"h":31}, "sourceSize": {"w":1240,"h":1754} }, -"Models/FutureBox/DoorNumeral.png": +"Models/Chastity/ProtoPlug.png": { - "frame": {"x":1102,"y":293,"w":768,"h":918}, + "frame": {"x":1361,"y":2023,"w":37,"h":17}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":231,"y":675,"w":768,"h":918}, + "spriteSourceSize": {"x":558,"y":906,"w":37,"h":17}, "sourceSize": {"w":1240,"h":1754} }, -"Models/GagCloth/CleaveThick.png": +"Models/CyberArms/CuffLongMittenLeftBoxtie.png": { - "frame": {"x":347,"y":1171,"w":158,"h":40}, + "frame": {"x":647,"y":1965,"w":75,"h":54}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":69,"y":236,"w":158,"h":40}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":700,"y":503,"w":75,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/DisplayLongMittenLeftBoxtie.png": +{ + "frame": {"x":2032,"y":3,"w":13,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":755,"y":526,"w":13,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/DisplayLongMittenLeftYoked.png": +{ + "frame": {"x":3,"y":2024,"w":17,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":793,"y":486,"w":17,"h":20}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/LockLongMittenLeftYoked.png": +{ + "frame": {"x":2032,"y":25,"w":13,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":795,"y":489,"w":13,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayElbowLeftBoxtie.png": +{ + "frame": {"x":2015,"y":1849,"w":28,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":749,"y":579,"w":28,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayElbowLeftFront.png": +{ + "frame": {"x":2015,"y":1899,"w":28,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":751,"y":604,"w":28,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayElbowRightBoxtie.png": +{ + "frame": {"x":1236,"y":1903,"w":20,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":452,"y":597,"w":20,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayWristRightYoked.png": +{ + "frame": {"x":1236,"y":1965,"w":18,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":307,"y":403,"w":18,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockAnkleRightClosed.png": +{ + "frame": {"x":1236,"y":1755,"w":20,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":543,"y":1440,"w":20,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockElbowLeftBoxtie.png": +{ + "frame": {"x":647,"y":1889,"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":1236,"y":2012,"w":16,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":766,"y":596,"w":16,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockElbowLeftWristtie.png": +{ + "frame": {"x":1236,"y":1868,"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":1236,"y":1794,"w":20,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":426,"y":602,"w":20,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LockThighRightClosed.png": +{ + "frame": {"x":2015,"y":1949,"w":28,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":487,"y":1033,"w":28,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CuffLongMittenLeftBoxtie.png": +{ + "frame": {"x":647,"y":1965,"w":75,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":503,"w":75,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/DisplayLongMittenLeftFree.png": +{ + "frame": {"x":313,"y":2024,"w":19,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":833,"y":756,"w":19,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenLeftBoxtie.png": +{ + "frame": {"x":647,"y":1965,"w":75,"h":54}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":503,"w":75,"h":54}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperDisplayLongMittenLeftBoxtie.png": +{ + "frame": {"x":2032,"y":3,"w":13,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":755,"y":526,"w":13,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperDisplayLongMittenLeftFree.png": +{ + "frame": {"x":24,"y":2024,"w":14,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":762,"y":520,"w":14,"h":20}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperDisplayLongMittenLeftYoked.png": +{ + "frame": {"x":3,"y":2024,"w":17,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":793,"y":486,"w":17,"h":20}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperLockLongMittenLeftYoked.png": +{ + "frame": {"x":2032,"y":25,"w":13,"h":15}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":795,"y":489,"w":13,"h":15}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftLockSpread.png": +{ + "frame": {"x":2015,"y":1729,"w":28,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":738,"y":1422,"w":28,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightLockSpread.png": +{ + "frame": {"x":2015,"y":1789,"w":28,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":1422,"w":28,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightLockBandBoxtie.png": +{ + "frame": {"x":650,"y":2023,"w":14,"h":22}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":454,"y":604,"w":14,"h":22}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightLockBandFront.png": +{ + "frame": {"x":336,"y":2024,"w":16,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":419,"y":619,"w":16,"h":18}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceCorsetCrystal.png": +{ + "frame": {"x":647,"y":1720,"w":17,"h":165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":568,"y":634,"w":17,"h":165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceDask/Brows2Surprised.png": +{ + "frame": {"x":277,"y":2024,"w":32,"h":18}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":244,"w":32,"h":18}, + "sourceSize": {"w":700,"h":400} +}, +"Models/FaceDask/BrowsAnnoyed.png": +{ + "frame": {"x":1402,"y":2023,"w":31,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":545,"y":261,"w":31,"h":17}, + "sourceSize": {"w":700,"h":400} +}, +"Models/FaceKjus/Brows2Annoyed.png": +{ + "frame": {"x":1641,"y":2023,"w":38,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":609,"y":261,"w":38,"h":16}, + "sourceSize": {"w":717,"h":405} }, -"Models/GagCloth/Knot.png": +"Models/FaceKjus/BrowsNeutral.png": { - "frame": {"x":3,"y":1171,"w":177,"h":40}, + "frame": {"x":1256,"y":2023,"w":49,"h":17}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":65,"y":231,"w":177,"h":40}, + "spriteSourceSize": {"x":529,"y":250,"w":49,"h":17}, + "sourceSize": {"w":744,"h":461} +}, +"Models/FaceKjus/EyesClosed.png": +{ + "frame": {"x":1309,"y":2023,"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":1309,"y":2023,"w":48,"h":17}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":294,"w":48,"h":17}, + "sourceSize": {"w":852,"h":524} +}, +"Models/FaceKoi/Brows2Sad.png": +{ + "frame": {"x":1546,"y":2023,"w":48,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":140,"y":130,"w":48,"h":16}, "sourceSize": {"w":321,"h":332} }, -"Models/GagFrilly/FrillyPanel.png": +"Models/FaceKoi/BrowsNeutral.png": { - "frame": {"x":817,"y":1387,"w":76,"h":166}, + "frame": {"x":231,"y":2024,"w":42,"h":18}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":96,"y":106,"w":76,"h":166}, + "spriteSourceSize": {"x":60,"y":150,"w":42,"h":18}, "sourceSize": {"w":321,"h":332} }, -"Models/Gothic/HemUpperKneel.png": +"Models/FutureBox/DoorNumeral.png": { - "frame": {"x":1355,"y":1296,"w":515,"h":108}, + "frame": {"x":1260,"y":3,"w":768,"h":918}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":336,"y":839,"w":515,"h":108}, + "spriteSourceSize": {"x":231,"y":675,"w":768,"h":918}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Gothic/HemUpperKneelCrotchStrap..png": +"Models/FutureBox/Lock.png": { - "frame": {"x":1355,"y":1408,"w":514,"h":115}, + "frame": {"x":1236,"y":1936,"w":19,"h":25}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":336,"y":823,"w":514,"h":115}, + "spriteSourceSize": {"x":189,"y":782,"w":19,"h":25}, "sourceSize": {"w":1240,"h":1754} }, -"Models/KittyLatex/KittyLatexEarLight.png": +"Models/FutureHarness/LockLower.png": { - "frame": {"x":897,"y":1171,"w":201,"h":121}, + "frame": {"x":66,"y":2024,"w":161,"h":18}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":498,"y":64,"w":201,"h":121}, + "spriteSourceSize": {"x":489,"y":811,"w":161,"h":18}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Leash/LeashKneelPulled.png": +"Models/Gothic/LaceLowerKneel.png": { - "frame": {"x":1355,"y":1527,"w":512,"h":309}, + "frame": {"x":668,"y":1171,"w":584,"h":92}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":91,"y":129,"w":512,"h":309}, + "spriteSourceSize": {"x":305,"y":915,"w":584,"h":92}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareBelt.png": +"Models/Hair/BackShortCurlyUnderlight.png": { - "frame": {"x":184,"y":1171,"w":159,"h":40}, + "frame": {"x":340,"y":1720,"w":303,"h":299}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":492,"y":692,"w":159,"h":40}, + "spriteSourceSize": {"x":488,"y":115,"w":303,"h":299}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ArmRightUp.png": +"Models/Hair2/Hair5_Right.png": { - "frame": {"x":3,"y":1640,"w":165,"h":405}, + "frame": {"x":3,"y":3,"w":154,"h":1165}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":441,"y":156,"w":165,"h":405}, + "spriteSourceSize": {"x":400,"y":171,"w":154,"h":1165}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/DressSkirtKneel.png": +"Models/Heels/FlatBalletLeftClosed.png": { - "frame": {"x":897,"y":1296,"w":454,"h":340}, + "frame": {"x":1020,"y":1703,"w":104,"h":342}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":364,"y":650,"w":454,"h":340}, + "spriteSourceSize": {"x":578,"y":1337,"w":104,"h":342}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/BandLeftYoked.png": +"Models/Heels/FlatBalletRightSpread.png": { - "frame": {"x":1874,"y":293,"w":57,"h":36}, + "frame": {"x":1128,"y":1703,"w":104,"h":342}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":875,"y":385,"w":57,"h":36}, + "spriteSourceSize": {"x":472,"y":1334,"w":104,"h":342}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LatexLeftFront.png": +"Models/Labcoat/CapeYoked.png": { - "frame": {"x":1871,"y":1640,"w":174,"h":204}, + "frame": {"x":1260,"y":925,"w":569,"h":1094}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":561,"y":468,"w":174,"h":204}, + "spriteSourceSize": {"x":363,"y":413,"w":569,"h":1094}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/LegLeftHogtie.png": +"Models/Leash/LeashHogtiePulled.png": { - "frame": {"x":1874,"y":1032,"w":171,"h":604}, + "frame": {"x":831,"y":1267,"w":424,"h":432}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":563,"y":962,"w":171,"h":604}, + "spriteSourceSize": {"x":596,"y":26,"w":424,"h":432}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/TopBand.png": +"Models/LeatherCuffs/BandAnkleLeftKneelClosed.png": { - "frame": {"x":1935,"y":238,"w":110,"h":94}, + "frame": {"x":1236,"y":1703,"w":20,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":492,"y":574,"w":110,"h":94}, + "spriteSourceSize": {"x":727,"y":949,"w":20,"h":48}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/Cherry.png": +"Models/LeatherCuffs/HardwareAnkleLeftKneel.png": { - "frame": {"x":1076,"y":1895,"w":275,"h":148}, + "frame": {"x":42,"y":2024,"w":20,"h":19}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":768,"w":275,"h":148}, + "spriteSourceSize": {"x":709,"y":950,"w":20,"h":19}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Arm2Wristtie.png": +"Models/LeatherCuffs/HardwareAnkleLeftKneelClosed.png": { - "frame": {"x":1719,"y":1848,"w":326,"h":181}, + "frame": {"x":42,"y":2024,"w":20,"h":19}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":484,"w":326,"h":181}, + "spriteSourceSize": {"x":709,"y":950,"w":20,"h":19}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/RightThigh2KneelClosed.png": +"Models/LeatherCuffs/HardwareWristRightCrossed.png": { - "frame": {"x":660,"y":1171,"w":118,"h":40}, + "frame": {"x":1598,"y":2023,"w":39,"h":16}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":372,"y":859,"w":118,"h":40}, + "spriteSourceSize": {"x":639,"y":598,"w":39,"h":16}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/RightThigh3KneelClosed.png": +"Models/LeatherCuffs/HardwareWristRightFree.png": { - "frame": {"x":509,"y":1171,"w":147,"h":40}, + "frame": {"x":1437,"y":2023,"w":27,"h":17}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":400,"y":812,"w":147,"h":40}, + "spriteSourceSize": {"x":376,"y":635,"w":27,"h":17}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/ShoeLeftSpread.png": +"Models/Maid/StripeSockLeftClosed.png": { - "frame": {"x":1935,"y":3,"w":110,"h":129}, + "frame": {"x":356,"y":2023,"w":143,"h":22}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":641,"y":1507,"w":110,"h":129}, + "spriteSourceSize": {"x":584,"y":978,"w":143,"h":22}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/LegRightHogtie.png": +"Models/Maid/StripeSockLeftHogtie.png": { - "frame": {"x":172,"y":1640,"w":147,"h":404}, + "frame": {"x":503,"y":2023,"w":143,"h":22}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":802,"w":147,"h":404}, + "spriteSourceSize": {"x":584,"y":978,"w":143,"h":22}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/StripedSkirtUnderClosedCrotchStrap.png": +"Models/Mittens/LeatherLeftFront.png": { - "frame": {"x":1076,"y":1640,"w":275,"h":251}, + "frame": {"x":1833,"y":1220,"w":212,"h":125}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":468,"y":768,"w":275,"h":251}, + "spriteSourceSize": {"x":475,"y":469,"w":212,"h":125}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/StripedSkirtUnderCrotchStrap.png": +"Models/Mittens/LongMittenRightFree.png": { - "frame": {"x":1076,"y":1640,"w":275,"h":251}, + "frame": {"x":1833,"y":925,"w":212,"h":153}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":468,"y":768,"w":275,"h":251}, + "spriteSourceSize": {"x":276,"y":551,"w":212,"h":153}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/StripedSkirtUnderHogtieCrotchStrap.png": +"Models/OperaGloves/GloveRightYoked.png": { - "frame": {"x":1076,"y":1640,"w":275,"h":251}, + "frame": {"x":831,"y":1703,"w":185,"h":342}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":468,"y":768,"w":275,"h":251}, + "spriteSourceSize": {"x":299,"y":287,"w":185,"h":342}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/StripedSkirtUnderKneelCrotchStrap.png": +"Models/Ribbon/Calf2Hogtie.png": { - "frame": {"x":1384,"y":1215,"w":205,"h":77}, + "frame": {"x":801,"y":1965,"w":22,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":769,"w":205,"h":77}, + "spriteSourceSize": {"x":704,"y":1023,"w":22,"h":53}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeBackUp.png": +"Models/Ribbon/TopRightThigh3KneelClosed.png": { - "frame": {"x":1355,"y":1840,"w":360,"h":205}, + "frame": {"x":1833,"y":1082,"w":212,"h":134}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":353,"w":360,"h":205}, + "spriteSourceSize": {"x":335,"y":812,"w":212,"h":134}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/LegRightHogtie.png": +"Models/Rope/Calf2Hogtie.png": { - "frame": {"x":323,"y":1640,"w":147,"h":404}, + "frame": {"x":801,"y":1965,"w":22,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":802,"w":147,"h":404}, + "spriteSourceSize": {"x":704,"y":1023,"w":22,"h":53}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SuccubusWingBase.png": +"Models/Rope/Calf2HogtieOver.png": { - "frame": {"x":1102,"y":3,"w":829,"h":286}, + "frame": {"x":801,"y":1965,"w":22,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":219,"y":380,"w":829,"h":286}, + "spriteSourceSize": {"x":704,"y":1023,"w":22,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ChestBoxtie.png": +{ + "frame": {"x":340,"y":1448,"w":324,"h":268}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":360,"w":324,"h":268}, "sourceSize": {"w":1240,"h":1754} }, "Models/Tails/Fox7.png": { - "frame": {"x":3,"y":3,"w":1095,"h":1164}, + "frame": {"x":161,"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/TapeHeavy/RightLegsKneelClosed.png": +"Models/TallBallet/TallLegLeftHogtie.png": +{ + "frame": {"x":1833,"y":1729,"w":178,"h":316}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":577,"y":902,"w":178,"h":316}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/RightLegsKneel.png": +{ + "frame": {"x":1833,"y":1453,"w":211,"h":272}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":314,"y":798,"w":211,"h":272}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/TopFullBoxtie.png": +{ + "frame": {"x":340,"y":1171,"w":324,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":384,"w":324,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/TopFullBoxtie.png": +{ + "frame": {"x":340,"y":1171,"w":324,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":384,"w":324,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/CollarHardware.png": { - "frame": {"x":451,"y":1215,"w":362,"h":421}, + "frame": {"x":2015,"y":1998,"w":22,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":322,"y":652,"w":362,"h":421}, + "spriteSourceSize": {"x":591,"y":402,"w":22,"h":47}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/ShoeRightSpread.png": +"Models/Wolf/FCollarBand.png": { - "frame": {"x":1935,"y":136,"w":110,"h":98}, + "frame": {"x":1468,"y":2023,"w":74,"h":16}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":498,"y":1537,"w":110,"h":98}, + "spriteSourceSize": {"x":592,"y":399,"w":74,"h":16}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtSplit.png": +"Models/Wolf/FCollarHardware.png": { - "frame": {"x":3,"y":1215,"w":444,"h":421}, + "frame": {"x":2015,"y":1998,"w":22,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":393,"y":772,"w":444,"h":421}, + "spriteSourceSize": {"x":602,"y":407,"w":22,"h":47}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegLeftClosed.png": +"Models/Yukata/Skirt.png": { - "frame": {"x":1874,"y":336,"w":171,"h":692}, + "frame": {"x":3,"y":1172,"w":333,"h":848}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":578,"y":792,"w":171,"h":692}, + "spriteSourceSize": {"x":447,"y":713,"w":333,"h":848}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -335,7 +623,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas16.webp b/TextureAtlas/atlas16.webp index c39adf26a..e828016a3 100644 Binary files a/TextureAtlas/atlas16.webp and b/TextureAtlas/atlas16.webp differ diff --git a/TextureAtlas/atlas17.json b/TextureAtlas/atlas17.json index 568f6d027..37f99d994 100644 --- a/TextureAtlas/atlas17.json +++ b/TextureAtlas/atlas17.json @@ -1,296 +1,296 @@ {"frames": { -"Models/ArmorChain/SkirtKneel.png": +"Models/Armbinder/BinderLeftBoxtie.png": { - "frame": {"x":974,"y":3,"w":418,"h":219}, + "frame": {"x":1833,"y":270,"w":92,"h":167}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":362,"y":748,"w":418,"h":219}, + "spriteSourceSize": {"x":678,"y":526,"w":92,"h":167}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorChain/SkirtKneelCrotchStrap.png": +"Models/ArmorPlate/GauntletRightCrossed.png": { - "frame": {"x":974,"y":3,"w":418,"h":219}, + "frame": {"x":1929,"y":1990,"w":95,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":362,"y":748,"w":418,"h":219}, + "spriteSourceSize": {"x":609,"y":601,"w":95,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/GauntletLeftFree.png": +"Models/Body/ArmLeftFree.png": { - "frame": {"x":1284,"y":1880,"w":153,"h":165}, + "frame": {"x":979,"y":1171,"w":641,"h":715}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":764,"y":698,"w":153,"h":165}, + "spriteSourceSize": {"x":216,"y":91,"w":641,"h":715}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ChokerHogtie.png": +"Models/Catsuit/ArmLeftWristtie.png": { - "frame": {"x":773,"y":1128,"w":80,"h":29}, + "frame": {"x":1929,"y":449,"w":116,"h":353}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":590,"y":396,"w":80,"h":29}, + "spriteSourceSize": {"x":663,"y":407,"w":116,"h":353}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Blindfold/Tape.png": +"Models/CyberArms/GlowForeLongMittenRightFront.png": { - "frame": {"x":1845,"y":1043,"w":200,"h":81}, + "frame": {"x":1297,"y":1089,"w":56,"h":78}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":44,"y":147,"w":200,"h":81}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":453,"y":502,"w":56,"h":78}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/ArmLeftFree.png": +"Models/CyberArms/LongMittenRightFree.png": { - "frame": {"x":979,"y":1161,"w":641,"h":715}, + "frame": {"x":1929,"y":1402,"w":116,"h":90}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":641,"h":715}, + "spriteSourceSize": {"x":372,"y":613,"w":116,"h":90}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/ArmRightBoxtie.png": +"Models/CyberCuffs/LockBelt.png": { - "frame": {"x":1845,"y":1241,"w":126,"h":281}, + "frame": {"x":783,"y":1093,"w":22,"h":31}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":411,"w":126,"h":281}, + "spriteSourceSize": {"x":557,"y":703,"w":22,"h":31}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraProto.png": +"Models/CyberLink/ThighLinkSpread.png": { - "frame": {"x":1530,"y":893,"w":311,"h":263}, + "frame": {"x":1624,"y":1752,"w":128,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":411,"y":404,"w":311,"h":263}, + "spriteSourceSize": {"x":538,"y":1036,"w":128,"h":23}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraProtoLock.png": +"Models/CyberMitts/ArmLongMittenRightFree.png": { - "frame": {"x":974,"y":1057,"w":17,"h":30}, + "frame": {"x":1929,"y":1402,"w":116,"h":90}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":560,"y":573,"w":17,"h":30}, + "spriteSourceSize": {"x":372,"y":613,"w":116,"h":90}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/CyberDisplay.png": +"Models/CyberMitts/GlowForeLongMittenRightFront.png": { - "frame": {"x":857,"y":1128,"w":48,"h":29}, + "frame": {"x":1297,"y":1089,"w":56,"h":78}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":550,"y":841,"w":48,"h":29}, + "spriteSourceSize": {"x":453,"y":502,"w":56,"h":78}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/CuffLongMittenLeftWristtie.png": +"Models/CyberMitts/GlowLongMittenLeftYoked.png": { - "frame": {"x":1624,"y":226,"w":56,"h":42}, + "frame": {"x":1227,"y":1089,"w":66,"h":78}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":707,"y":533,"w":56,"h":42}, + "spriteSourceSize": {"x":903,"y":383,"w":66,"h":78}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/GlowForeLongMittenRightFront.png": +"Models/DivineBelt/BraPins.png": { - "frame": {"x":1624,"y":3,"w":56,"h":78}, + "frame": {"x":1878,"y":506,"w":47,"h":159}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":502,"w":56,"h":78}, + "spriteSourceSize": {"x":562,"y":441,"w":47,"h":159}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/LongMittenRightCrossed.png": +"Models/DivineCuffs/ElbowLeftLockBandFront.png": { - "frame": {"x":1441,"y":1880,"w":122,"h":165}, + "frame": {"x":2028,"y":1990,"w":17,"h":15}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":430,"y":520,"w":122,"h":165}, + "spriteSourceSize": {"x":758,"y":633,"w":17,"h":15}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayWristRightYoked.png": +"Models/DivineCuffs/ElbowLeftLockUp.png": { - "frame": {"x":974,"y":893,"w":18,"h":43}, + "frame": {"x":1357,"y":1089,"w":42,"h":78}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":307,"y":403,"w":18,"h":43}, + "spriteSourceSize": {"x":708,"y":216,"w":42,"h":78}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockElbowLeftBoxtie.png": +"Models/DivineCuffs/ElbowRightLockUp.png": { - "frame": {"x":974,"y":1020,"w":17,"h":33}, + "frame": {"x":1403,"y":1089,"w":41,"h":78}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":755,"y":586,"w":17,"h":33}, + "spriteSourceSize": {"x":527,"y":232,"w":41,"h":78}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockElbowLeftFront.png": +"Models/DivineGag/MuzzleGold.png": { - "frame": {"x":974,"y":940,"w":18,"h":35}, + "frame": {"x":1931,"y":1784,"w":114,"h":84}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":757,"y":610,"w":18,"h":35}, + "spriteSourceSize": {"x":572,"y":281,"w":114,"h":84}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/ArmLongMittenRightCrossed.png": +"Models/Dress/BlouseArmLeftWristtie.png": { - "frame": {"x":1441,"y":1880,"w":122,"h":165}, + "frame": {"x":1929,"y":806,"w":116,"h":294}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":430,"y":520,"w":122,"h":165}, + "spriteSourceSize": {"x":664,"y":441,"w":116,"h":294}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CapLongMittenRightFree.png": +"Models/Dress/BlouseBustBoxtie.png": { - "frame": {"x":1984,"y":1522,"w":61,"h":88}, + "frame": {"x":3,"y":1905,"w":274,"h":140}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":260,"y":550,"w":61,"h":88}, + "spriteSourceSize": {"x":444,"y":489,"w":274,"h":140}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CuffLongMittenLeftFree.png": +"Models/Ears/EarringsBack.png": { - "frame": {"x":1624,"y":85,"w":56,"h":67}, + "frame": {"x":2028,"y":2009,"w":14,"h":36}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":803,"y":738,"w":56,"h":67}, + "spriteSourceSize": {"x":549,"y":335,"w":14,"h":36}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/GlowForeLongMittenRightFront.png": +"Models/Ears/ElfEarringsBack.png": { - "frame": {"x":1624,"y":3,"w":56,"h":78}, + "frame": {"x":2028,"y":2009,"w":14,"h":36}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":502,"w":56,"h":78}, + "spriteSourceSize": {"x":523,"y":323,"w":14,"h":36}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/LongMittenRightCrossed.png": +"Models/Elf/SkirtBackKneel.png": { - "frame": {"x":1441,"y":1880,"w":122,"h":165}, + "frame": {"x":1929,"y":1104,"w":116,"h":198}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":430,"y":520,"w":122,"h":165}, + "spriteSourceSize": {"x":702,"y":773,"w":116,"h":198}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperCuffLongMittenLeftWristtie.png": +"Models/EyesK2/Eyes2Angry.png": { - "frame": {"x":1624,"y":226,"w":56,"h":42}, + "frame": {"x":160,"y":1128,"w":70,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":707,"y":533,"w":56,"h":42}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":613,"y":265,"w":70,"h":39}, + "sourceSize": {"w":781,"h":560} }, -"Models/DivineCuffs/ElbowLeftLockBandFront.png": +"Models/EyesK2/Eyes2Dazed.png": { - "frame": {"x":974,"y":1091,"w":17,"h":15}, + "frame": {"x":234,"y":1128,"w":70,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":758,"y":633,"w":17,"h":15}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":613,"y":265,"w":70,"h":39}, + "sourceSize": {"w":781,"h":560} }, -"Models/DivineCuffs/ElbowRightLockBoxtie.png": +"Models/EyesK2/Eyes2Neutral.png": { - "frame": {"x":974,"y":979,"w":17,"h":37}, + "frame": {"x":308,"y":1128,"w":70,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":601,"w":17,"h":37}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":613,"y":265,"w":70,"h":39}, + "sourceSize": {"w":781,"h":560} }, -"Models/DivineCuffs/ThighLeftLockClosed.png": +"Models/EyesK2/WhitesEyes2Angry.png": { - "frame": {"x":1975,"y":1393,"w":70,"h":95}, + "frame": {"x":382,"y":1128,"w":70,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":622,"y":1033,"w":70,"h":95}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":613,"y":265,"w":70,"h":39}, + "sourceSize": {"w":781,"h":560} }, -"Models/Dress/LaceCrotchPanel.png": +"Models/EyesK2/WhitesEyes2Dazed.png": { - "frame": {"x":1788,"y":1880,"w":257,"h":158}, + "frame": {"x":456,"y":1128,"w":70,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":460,"y":760,"w":257,"h":158}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":613,"y":265,"w":70,"h":39}, + "sourceSize": {"w":781,"h":560} }, -"Models/Dress/LaceCrotchPanelLace.png": +"Models/EyesK2/WhitesEyes2Neutral.png": { - "frame": {"x":1131,"y":721,"w":261,"h":168}, + "frame": {"x":530,"y":1128,"w":70,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":756,"w":261,"h":168}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":613,"y":265,"w":70,"h":39}, + "sourceSize": {"w":781,"h":560} }, -"Models/FaceKjus/MouthNeutral.png": +"Models/FaceKjus/BrowsSurprised.png": { - "frame": {"x":953,"y":1128,"w":39,"h":29}, + "frame": {"x":1931,"y":1872,"w":46,"h":14}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":587,"y":322,"w":39,"h":29}, - "sourceSize": {"w":763,"h":461} + "spriteSourceSize": {"x":524,"y":259,"w":46,"h":14}, + "sourceSize": {"w":738,"h":409} }, -"Models/FutureHarness/MetalChest.png": +"Models/FaceKjus/Eyes2Angry.png": { - "frame": {"x":1624,"y":156,"w":56,"h":66}, + "frame": {"x":604,"y":1128,"w":66,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":553,"y":481,"w":56,"h":66}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":618,"y":265,"w":66,"h":39}, + "sourceSize": {"w":753,"h":414} }, -"Models/GagTape/Face.png": +"Models/FaceKjus/Eyes2Neutral.png": { - "frame": {"x":1845,"y":893,"w":200,"h":146}, + "frame": {"x":744,"y":1128,"w":65,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":44,"y":147,"w":200,"h":146}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":614,"y":265,"w":65,"h":39}, + "sourceSize": {"w":807,"h":551} }, -"Models/Gasmask/Center.png": +"Models/FaceKjus/WhitesEyes2Angry.png": { - "frame": {"x":1984,"y":1614,"w":61,"h":85}, + "frame": {"x":674,"y":1128,"w":66,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":98,"y":209,"w":61,"h":85}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":618,"y":265,"w":66,"h":39}, + "sourceSize": {"w":753,"h":414} }, -"Models/Hair2/Hair4_Left.png": +"Models/GagLatex/NeckCorsetRim2.png": { - "frame": {"x":3,"y":3,"w":344,"h":1154}, + "frame": {"x":1929,"y":1695,"w":114,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":700,"y":132,"w":344,"h":1154}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":562,"y":358,"w":114,"h":85}, + "sourceSize": {"w":763,"h":476} }, -"Models/Handcuffs/Irish8AnkleLeftClosed.png": +"Models/Hair2/Hair4_LeftB.png": { - "frame": {"x":591,"y":1128,"w":87,"h":29}, + "frame": {"x":1130,"y":3,"w":152,"h":1082}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":593,"y":1431,"w":87,"h":29}, + "spriteSourceSize": {"x":701,"y":134,"w":152,"h":1082}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Handcuffs/LegironsLeftClosed.png": +"Models/Hair2/Hair4_Right.png": { - "frame": {"x":682,"y":1128,"w":87,"h":29}, + "frame": {"x":783,"y":3,"w":343,"h":1086}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":593,"y":1431,"w":87,"h":29}, + "spriteSourceSize": {"x":196,"y":132,"w":343,"h":1086}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Handcuffs/LegironsLeftSpread.png": +"Models/Hair2/Hair4_RightB.png": { - "frame": {"x":682,"y":1128,"w":87,"h":29}, + "frame": {"x":1286,"y":3,"w":150,"h":1082}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":680,"y":1431,"w":87,"h":29}, + "spriteSourceSize": {"x":387,"y":134,"w":150,"h":1082}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/BalletSoleRightClosed.png": +"Models/Hair2/Hair5_Left.png": { - "frame": {"x":1684,"y":1880,"w":100,"h":165}, + "frame": {"x":3,"y":3,"w":153,"h":1164}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":510,"y":1519,"w":100,"h":165}, + "spriteSourceSize": {"x":711,"y":171,"w":153,"h":1164}, "sourceSize": {"w":1240,"h":1754} }, "Models/Heels/LeatherLeftClosed.png": { - "frame": {"x":317,"y":1161,"w":172,"h":724}, + "frame": {"x":317,"y":1171,"w":172,"h":724}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":520,"y":950,"w":172,"h":724}, @@ -298,7 +298,7 @@ }, "Models/Heels/LeatherRightClosed.png": { - "frame": {"x":669,"y":1161,"w":151,"h":724}, + "frame": {"x":669,"y":1171,"w":151,"h":724}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":449,"y":950,"w":151,"h":724}, @@ -306,7 +306,7 @@ }, "Models/KittyLatex/KittyLatexTail2.png": { - "frame": {"x":3,"y":1161,"w":310,"h":730}, + "frame": {"x":3,"y":1171,"w":310,"h":730}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":539,"y":750,"w":310,"h":730}, @@ -314,282 +314,242 @@ }, "Models/Labcoat/CoatSpread.png": { - "frame": {"x":351,"y":3,"w":619,"h":1121}, + "frame": {"x":160,"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/LeatherCuffs/BandAnkleRightSpread.png": -{ - "frame": {"x":1975,"y":1492,"w":70,"h":26}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":492,"y":1433,"w":70,"h":26}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/LeatherCuffs/HardwareThighRightKneel.png": -{ - "frame": {"x":351,"y":1128,"w":116,"h":29}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":373,"y":850,"w":116,"h":29}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/LeatherCuffs/HardwareThighRightKneelClosed.png": +"Models/Labcoat/ShouldersKneel.png": { - "frame": {"x":471,"y":1128,"w":116,"h":29}, + "frame": {"x":527,"y":1899,"w":366,"h":146}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":373,"y":850,"w":116,"h":29}, + "spriteSourceSize": {"x":462,"y":407,"w":366,"h":146}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherLeotard/LeotardChest.png": +"Models/LeatherCuffs/BandAnkleLeftKneel.png": { - "frame": {"x":996,"y":893,"w":304,"h":264}, + "frame": {"x":1878,"y":742,"w":41,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":423,"y":387,"w":304,"h":264}, + "spriteSourceSize": {"x":714,"y":964,"w":41,"h":60}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherLeotard/LeotardClosed.png": +"Models/Maid/SockLeftSpread.png": { - "frame": {"x":1131,"y":479,"w":261,"h":238}, + "frame": {"x":1756,"y":1089,"w":169,"h":691}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":457,"y":719,"w":261,"h":238}, + "spriteSourceSize": {"x":603,"y":945,"w":169,"h":691}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/ArmsHardware.png": +"Models/Maid/StripeClosedCrotchStrap.png": { - "frame": {"x":119,"y":1895,"w":374,"h":149}, + "frame": {"x":813,"y":1093,"w":317,"h":74}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":418,"y":534,"w":374,"h":149}, + "spriteSourceSize": {"x":438,"y":832,"w":317,"h":74}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Legbinder/LegbinderKneelClosed.png": +"Models/MaidKnightLight/ApronBack.png": { - "frame": {"x":1396,"y":275,"w":284,"h":463}, + "frame": {"x":1878,"y":669,"w":47,"h":69}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":400,"y":640,"w":284,"h":463}, + "spriteSourceSize": {"x":676,"y":645,"w":47,"h":69}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/Apron.png": +"Models/MaidKnightLight/BootRightClosed.png": { - "frame": {"x":1131,"y":226,"w":261,"h":249}, + "frame": {"x":1929,"y":3,"w":116,"h":442}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":457,"y":741,"w":261,"h":249}, + "spriteSourceSize": {"x":480,"y":1209,"w":116,"h":442}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/DressDecoSpread.png": +"Models/MaidKnightLight/PauldronLeft.png": { - "frame": {"x":1975,"y":1241,"w":70,"h":148}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":715,"y":806,"w":70,"h":148}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/MaidKnightLight/PauldronLeftFree.png": -{ - "frame": {"x":767,"y":1889,"w":128,"h":156}, + "frame": {"x":1624,"y":1592,"w":128,"h":156}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":700,"y":384,"w":128,"h":156}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/SockLeftSpread.png": +"Models/MaidKnightLight/PauldronLeftCrossed.png": { - "frame": {"x":974,"y":226,"w":153,"h":663}, + "frame": {"x":1421,"y":1890,"w":129,"h":155}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":614,"y":995,"w":153,"h":663}, + "spriteSourceSize": {"x":690,"y":394,"w":129,"h":155}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/ForeLongMittenRightFront.png": +"Models/Ninja/KneeLeftHogtie.png": { - "frame": {"x":1304,"y":893,"w":222,"h":264}, + "frame": {"x":1624,"y":1171,"w":128,"h":417}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":417,"y":465,"w":222,"h":264}, + "spriteSourceSize": {"x":563,"y":1149,"w":128,"h":417}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/PawLeftYoked.png": +"Models/Ninja/SkirtBandKneel.png": { - "frame": {"x":1984,"y":1703,"w":61,"h":73}, + "frame": {"x":1250,"y":1890,"w":167,"h":155}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":859,"y":313,"w":61,"h":73}, + "spriteSourceSize": {"x":367,"y":759,"w":167,"h":155}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/KneeRightClosed.png": +"Models/Panties/LinesKneel.png": { - "frame": {"x":899,"y":1889,"w":98,"h":156}, + "frame": {"x":1624,"y":1784,"w":303,"h":102}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":496,"y":1152,"w":98,"h":156}, + "spriteSourceSize": {"x":445,"y":753,"w":303,"h":102}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/CherryClosed.png": +"Models/Ribbon/HarnessLower.png": { - "frame": {"x":1396,"y":742,"w":275,"h":147}, + "frame": {"x":897,"y":1899,"w":349,"h":146}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":768,"w":275,"h":147}, + "spriteSourceSize": {"x":440,"y":696,"w":349,"h":146}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/LinesClosed.png": +"Models/Rope/Arm2Wristtie.png": { - "frame": {"x":1001,"y":1880,"w":279,"h":165}, + "frame": {"x":1448,"y":1104,"w":304,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":452,"y":755,"w":279,"h":165}, + "spriteSourceSize": {"x":465,"y":484,"w":304,"h":63}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Petsuit/LegsKneel.png": +"Models/Rope/Thigh1KneelClosed.png": { - "frame": {"x":1396,"y":3,"w":224,"h":268}, + "frame": {"x":1929,"y":1890,"w":116,"h":96}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":303,"y":800,"w":224,"h":268}, + "spriteSourceSize": {"x":402,"y":922,"w":116,"h":96}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Petsuit/LegsKneelClosed.png": +"Models/Rubber/HandLeftYoked.png": { - "frame": {"x":1396,"y":3,"w":224,"h":268}, + "frame": {"x":1833,"y":806,"w":92,"h":128}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":303,"y":800,"w":224,"h":268}, + "spriteSourceSize": {"x":857,"y":278,"w":92,"h":128}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopHarness.png": +"Models/Slayer/CapeBackYoked.png": { - "frame": {"x":1624,"y":1526,"w":356,"h":350}, + "frame": {"x":1554,"y":1890,"w":371,"h":154}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":433,"y":394,"w":356,"h":350}, + "spriteSourceSize": {"x":423,"y":530,"w":371,"h":154}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Calf3Closed.png": +"Models/Slime/ArmLeftBoxtie.png": { - "frame": {"x":1845,"y":1190,"w":200,"h":47}, + "frame": {"x":1833,"y":3,"w":92,"h":263}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":513,"y":1235,"w":200,"h":47}, + "spriteSourceSize": {"x":678,"y":423,"w":92,"h":263}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Calf3ClosedOver.png": -{ - "frame": {"x":1845,"y":1128,"w":200,"h":58}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":513,"y":1234,"w":200,"h":58}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Rope/Calf3KneelClosed.png": -{ - "frame": {"x":1984,"y":1780,"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": +"Models/SmoothHeels/LeftClosed.png": { - "frame": {"x":1984,"y":1780,"w":61,"h":70}, + "frame": {"x":493,"y":1171,"w":172,"h":724}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":515,"y":998,"w":61,"h":70}, + "spriteSourceSize": {"x":520,"y":950,"w":172,"h":724}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/ToeClosed.png": +"Models/SmoothHeels/RightClosed.png": { - "frame": {"x":1984,"y":1854,"w":49,"h":22}, + "frame": {"x":824,"y":1171,"w":151,"h":724}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":526,"y":1570,"w":49,"h":22}, + "spriteSourceSize": {"x":449,"y":950,"w":151,"h":724}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/SleeveLeftYoked.png": +"Models/SteelCuffs/RimElbowLeftWristtie.png": { - "frame": {"x":3,"y":1895,"w":112,"h":150}, + "frame": {"x":1833,"y":441,"w":92,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":717,"y":410,"w":112,"h":150}, + "spriteSourceSize": {"x":641,"y":607,"w":92,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/Crotch.png": +"Models/TapeLight/HandLeftFree.png": { - "frame": {"x":497,"y":1889,"w":266,"h":156}, + "frame": {"x":1134,"y":1089,"w":89,"h":78}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":682,"w":266,"h":156}, + "spriteSourceSize": {"x":822,"y":785,"w":89,"h":78}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/StripedSkirtUnderOverKneel.png": +"Models/TapeMed/RightLegsKneel.png": { - "frame": {"x":1567,"y":1880,"w":113,"h":165}, + "frame": {"x":1440,"y":514,"w":434,"h":288}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":542,"y":802,"w":113,"h":165}, + "spriteSourceSize": {"x":345,"y":798,"w":434,"h":288}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SmoothHeels/LeftClosed.png": +"Models/Warrior/ShoeRightKneel.png": { - "frame": {"x":493,"y":1161,"w":172,"h":724}, + "frame": {"x":1833,"y":938,"w":85,"h":147}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":520,"y":950,"w":172,"h":724}, + "spriteSourceSize": {"x":311,"y":855,"w":85,"h":147}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SmoothHeels/RightClosed.png": +"Models/Witch/ShoeLeftSpread.png": { - "frame": {"x":824,"y":1161,"w":151,"h":724}, + "frame": {"x":1929,"y":1306,"w":116,"h":92}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":950,"w":151,"h":724}, + "spriteSourceSize": {"x":635,"y":1544,"w":116,"h":92}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/BottomClosed.png": +"Models/Wolf/HarnessBandUpper.png": { - "frame": {"x":1684,"y":197,"w":358,"h":692}, + "frame": {"x":281,"y":1905,"w":242,"h":140}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":428,"y":652,"w":358,"h":692}, + "spriteSourceSize": {"x":479,"y":414,"w":242,"h":140}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/BottomHogtie.png": +"Models/WolfCatsuit/LegLeftKneelClosed.png": { - "frame": {"x":1684,"y":197,"w":358,"h":692}, + "frame": {"x":1440,"y":806,"w":389,"h":279}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":428,"y":652,"w":358,"h":692}, + "spriteSourceSize": {"x":386,"y":799,"w":389,"h":279}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtRuffleOverKneelCrotchStrap.png": +"Models/WolfCatsuit/ShoeRightSpread.png": { - "frame": {"x":1684,"y":3,"w":359,"h":190}, + "frame": {"x":1931,"y":1496,"w":114,"h":195}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":481,"y":786,"w":359,"h":190}, + "spriteSourceSize": {"x":495,"y":1456,"w":114,"h":195}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/GloveLeftYoked.png": +"Models/Yukata/SkirtCrotchStrap.png": { - "frame": {"x":1624,"y":1160,"w":217,"h":362}, + "frame": {"x":1440,"y":3,"w":389,"h":507}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":734,"y":278,"w":217,"h":362}, + "spriteSourceSize": {"x":409,"y":713,"w":389,"h":507}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/GloveRightWristtie.png": +"Models/Yukata/SkirtHogtieCrotchStrap.png": { - "frame": {"x":909,"y":1128,"w":40,"h":29}, + "frame": {"x":1440,"y":3,"w":389,"h":507}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":498,"w":40,"h":29}, + "spriteSourceSize": {"x":409,"y":713,"w":389,"h":507}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -599,7 +559,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas17.webp b/TextureAtlas/atlas17.webp index 8af2b7b9f..a3156a5a6 100644 Binary files a/TextureAtlas/atlas17.webp and b/TextureAtlas/atlas17.webp differ diff --git a/TextureAtlas/atlas18.json b/TextureAtlas/atlas18.json index 4931afc16..0fe555d6a 100644 --- a/TextureAtlas/atlas18.json +++ b/TextureAtlas/atlas18.json @@ -1,264 +1,160 @@ {"frames": { -"Models/Belts/Feet1KneelClosed.png": +"Models/Body/ArmRightBoxtie.png": { - "frame": {"x":1714,"y":1294,"w":36,"h":46}, + "frame": {"x":1862,"y":1764,"w":126,"h":281}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":705,"y":954,"w":36,"h":46}, + "spriteSourceSize": {"x":456,"y":411,"w":126,"h":281}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/RightArm2Boxtie.png": +"Models/Body/LegRightSpread.png": { - "frame": {"x":1714,"y":1179,"w":36,"h":54}, + "frame": {"x":566,"y":1064,"w":181,"h":706}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":606,"w":36,"h":54}, + "spriteSourceSize": {"x":443,"y":919,"w":181,"h":706}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/ArmRightYoked.png": +"Models/Bunny/GloveLeftFree.png": { - "frame": {"x":1233,"y":543,"w":308,"h":539}, + "frame": {"x":1639,"y":609,"w":219,"h":352}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":308,"h":539}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Body/HandRightFree.png": -{ - "frame": {"x":1377,"y":1086,"w":164,"h":573}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":164,"h":573}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Body/LegRightClosed.png": -{ - "frame": {"x":1043,"y":1089,"w":159,"h":694}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":449,"y":919,"w":159,"h":694}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Bra/BraUnder.png": -{ - "frame": {"x":1757,"y":1977,"w":220,"h":68}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":478,"y":570,"w":220,"h":68}, + "spriteSourceSize": {"x":700,"y":512,"w":219,"h":352}, "sourceSize": {"w":1240,"h":1754} }, "Models/Bunny/SockLeftClosed.png": { - "frame": {"x":397,"y":1101,"w":206,"h":700}, + "frame": {"x":917,"y":1064,"w":206,"h":700}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":533,"y":918,"w":206,"h":700}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/SockRightClosed.png": +"Models/Bunny/SockLeftSpread.png": { - "frame": {"x":1206,"y":1089,"w":167,"h":693}, + "frame": {"x":397,"y":1064,"w":165,"h":707}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":919,"w":167,"h":693}, + "spriteSourceSize": {"x":602,"y":918,"w":165,"h":707}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cape/CapeYoked.png": +"Models/Bunny/SockRightSpread.png": { - "frame": {"x":3,"y":3,"w":569,"h":1094}, + "frame": {"x":751,"y":1064,"w":162,"h":706}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":363,"y":413,"w":569,"h":1094}, + "spriteSourceSize": {"x":444,"y":919,"w":162,"h":706}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/HandRightFree.png": +"Models/Cape/CapeSpread.png": { - "frame": {"x":1545,"y":543,"w":165,"h":572}, + "frame": {"x":3,"y":3,"w":483,"h":1057}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":165,"h":572}, + "spriteSourceSize": {"x":400,"y":409,"w":483,"h":1057}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayElbowLeftYoked.png": +"Models/Catsuit/HandRightYoked.png": { - "frame": {"x":1714,"y":1344,"w":36,"h":46}, + "frame": {"x":1862,"y":609,"w":183,"h":326}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":798,"y":492,"w":36,"h":46}, + "spriteSourceSize": {"x":216,"y":91,"w":183,"h":326}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayElbowRightUp.png": +"Models/Catsuit/LegLeftKneelClosed.png": { - "frame": {"x":1714,"y":1554,"w":35,"h":55}, + "frame": {"x":1470,"y":1764,"w":388,"h":281}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":521,"y":251,"w":35,"h":55}, + "spriteSourceSize": {"x":386,"y":801,"w":388,"h":281}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenCollar.png": +"Models/Chastity/BraProto.png": { - "frame": {"x":1714,"y":1438,"w":36,"h":39}, + "frame": {"x":229,"y":1781,"w":311,"h":263}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":599,"y":394,"w":36,"h":39}, + "spriteSourceSize": {"x":411,"y":404,"w":311,"h":263}, "sourceSize": {"w":1240,"h":1754} }, "Models/DivineCuffs/ElbowRightDecoBoxtie.png": { - "frame": {"x":1477,"y":1767,"w":21,"h":16}, + "frame": {"x":1862,"y":1458,"w":21,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":461,"y":611,"w":21,"h":16}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighRightLockKneel.png": -{ - "frame": {"x":1981,"y":1977,"w":64,"h":66}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":420,"y":826,"w":64,"h":66}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/WristLeftLockPlateFree.png": -{ - "frame": {"x":1714,"y":1394,"w":36,"h":40}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":826,"y":743,"w":36,"h":40}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Dress/BlouseArmRightWristtie.png": -{ - "frame": {"x":1477,"y":1663,"w":37,"h":100}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":460,"y":437,"w":37,"h":100}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Dress/BlouseForeArmLeftFront.png": -{ - "frame": {"x":480,"y":1805,"w":187,"h":239}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":590,"y":480,"w":187,"h":239}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Ears/Earrings.png": -{ - "frame": {"x":2030,"y":1576,"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":2030,"y":1617,"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":2030,"y":1617,"w":14,"h":36}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":523,"y":323,"w":14,"h":36}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/EyesDai2/BrowsSurprised.png": -{ - "frame": {"x":1714,"y":1524,"w":36,"h":26}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":528,"y":241,"w":36,"h":26}, - "sourceSize": {"w":738,"h":409} -}, -"Models/GagLatex/MuteLogo.png": -{ - "frame": {"x":1714,"y":1237,"w":36,"h":53}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":111,"y":225,"w":36,"h":53}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagLeather/BallSideStrap.png": +"Models/Gasmask/Nose.png": { - "frame": {"x":3,"y":1818,"w":206,"h":227}, + "frame": {"x":1992,"y":1986,"w":43,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":56,"y":31,"w":206,"h":227}, + "spriteSourceSize": {"x":106,"y":206,"w":43,"h":59}, "sourceSize": {"w":321,"h":332} }, -"Models/GagLeather/PanelHarness.png": +"Models/Hair/Straight.png": { - "frame": {"x":1377,"y":3,"w":137,"h":278}, + "frame": {"x":1563,"y":1064,"w":295,"h":410}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":39,"y":9,"w":137,"h":278}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagLeather/PanelSideStrap.png": -{ - "frame": {"x":3,"y":1818,"w":206,"h":227}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":56,"y":31,"w":206,"h":227}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":493,"y":110,"w":295,"h":410}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair4_LeftB.png": +"Models/Harness/BeltsStrap.png": { - "frame": {"x":923,"y":3,"w":152,"h":1082}, + "frame": {"x":1992,"y":1752,"w":53,"h":230}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":701,"y":134,"w":152,"h":1082}, + "spriteSourceSize": {"x":552,"y":690,"w":53,"h":230}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair4_Right.png": +"Models/Heels/LeatherLeftKneel.png": { - "frame": {"x":576,"y":3,"w":343,"h":1086}, + "frame": {"x":930,"y":1768,"w":536,"h":277}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":196,"y":132,"w":343,"h":1086}, + "spriteSourceSize": {"x":384,"y":811,"w":536,"h":277}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair4_RightB.png": +"Models/KittyLatex/KittyLatexTail.png": { - "frame": {"x":1079,"y":3,"w":150,"h":1082}, + "frame": {"x":1127,"y":1064,"w":432,"h":696}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":387,"y":134,"w":150,"h":1082}, + "spriteSourceSize": {"x":539,"y":746,"w":432,"h":696}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Harness/BeltsMid.png": +"Models/Labcoat/CapeSpread.png": { - "frame": {"x":1545,"y":1613,"w":205,"h":46}, + "frame": {"x":490,"y":3,"w":483,"h":1057}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":480,"y":654,"w":205,"h":46}, + "spriteSourceSize": {"x":400,"y":409,"w":483,"h":1057}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/ChestWristtie.png": +"Models/LeatherPetsuit/LeftLegsBeltsKneel.png": { - "frame": {"x":1377,"y":285,"w":333,"h":254}, + "frame": {"x":1563,"y":1478,"w":333,"h":282}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":375,"w":333,"h":254}, + "spriteSourceSize": {"x":393,"y":812,"w":333,"h":282}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Labcoat/CapeYoked.png": +"Models/Legbinder/LegbinderHogtie.png": { - "frame": {"x":3,"y":3,"w":569,"h":1094}, + "frame": {"x":1304,"y":497,"w":162,"h":303}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":363,"y":413,"w":569,"h":1094}, + "spriteSourceSize": {"x":580,"y":909,"w":162,"h":303}, "sourceSize": {"w":1240,"h":1754} }, "Models/Maid/FootSockLeftHogtie.png": { - "frame": {"x":3,"y":1101,"w":193,"h":713}, + "frame": {"x":3,"y":1064,"w":193,"h":713}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":586,"y":796,"w":193,"h":713}, @@ -266,186 +162,106 @@ }, "Models/Maid/ShoeLeftHogtie.png": { - "frame": {"x":200,"y":1101,"w":193,"h":713}, + "frame": {"x":200,"y":1064,"w":193,"h":713}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":586,"y":796,"w":193,"h":713}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/SockLeftKneel.png": -{ - "frame": {"x":671,"y":1792,"w":528,"h":253}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":366,"y":832,"w":528,"h":253}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Maid/SockLeftKneelClosed.png": -{ - "frame": {"x":1518,"y":3,"w":522,"h":268}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":366,"y":832,"w":522,"h":268}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/MaidKnightLight/ArmRightWristtie.png": -{ - "frame": {"x":1377,"y":1663,"w":96,"h":120}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":453,"y":424,"w":96,"h":120}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Ninja/SkirtOverKneel.png": -{ - "frame": {"x":1714,"y":1034,"w":331,"h":141}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":448,"y":801,"w":331,"h":141}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/OperaGloves/ForeGloveRightCrossed.png": -{ - "frame": {"x":1754,"y":1576,"w":272,"h":83}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":431,"y":602,"w":272,"h":83}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/RobeOfChastity/GoldBaseClosed.png": -{ - "frame": {"x":1757,"y":1663,"w":288,"h":310}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":448,"y":606,"w":288,"h":310}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Rubber/ArmLeftFront.png": +"Models/MaidKnightLight/ForeArmLeftCrossed.png": { - "frame": {"x":381,"y":1818,"w":95,"h":227}, + "frame": {"x":1639,"y":965,"w":208,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":429,"y":432,"w":95,"h":227}, + "spriteSourceSize": {"x":549,"y":617,"w":208,"h":95}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/LegLeftClosed.png": +"Models/MaidKnightLight/SockRightHogtie.png": { - "frame": {"x":1545,"y":1119,"w":165,"h":490}, + "frame": {"x":1900,"y":1458,"w":145,"h":290}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":577,"y":755,"w":165,"h":490}, + "spriteSourceSize": {"x":451,"y":929,"w":145,"h":290}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/CollarUp.png": +"Models/Mittens/ForeLongMittenRightFront.png": { - "frame": {"x":213,"y":1818,"w":164,"h":227}, + "frame": {"x":3,"y":1781,"w":222,"h":264}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":548,"y":303,"w":164,"h":227}, + "spriteSourceSize": {"x":417,"y":465,"w":222,"h":264}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/AnkleRightClosed.png": +"Models/OperaGloves/GloveRightFront.png": { - "frame": {"x":1654,"y":1663,"w":99,"h":382}, + "frame": {"x":1292,"y":804,"w":169,"h":256}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":501,"y":1131,"w":99,"h":382}, + "spriteSourceSize": {"x":423,"y":461,"w":169,"h":256}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/TorsoLower.png": +"Models/RobeOfChastity/ChestGoldBaseTied.png": { - "frame": {"x":1754,"y":1179,"w":291,"h":393}, + "frame": {"x":1862,"y":1199,"w":183,"h":255}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":537,"w":291,"h":393}, + "spriteSourceSize": {"x":521,"y":405,"w":183,"h":255}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Tails/Kitty.png": +"Models/RobeOfChastity/ChestGoldTied.png": { - "frame": {"x":607,"y":1093,"w":432,"h":695}, + "frame": {"x":1862,"y":939,"w":183,"h":256}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":539,"y":746,"w":432,"h":695}, + "spriteSourceSize": {"x":521,"y":405,"w":183,"h":256}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallSmoothHeels/TallLegLeftKneel.png": +"Models/Rubber/LegLeftHogtie.png": { - "frame": {"x":1714,"y":275,"w":331,"h":273}, + "frame": {"x":1470,"y":609,"w":165,"h":451}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":385,"y":816,"w":331,"h":273}, + "spriteSourceSize": {"x":578,"y":755,"w":165,"h":451}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/HandRightBoxtie.png": +"Models/Slime/LegLeftClosed.png": { - "frame": {"x":1714,"y":1481,"w":36,"h":39}, + "frame": {"x":1304,"y":3,"w":162,"h":490}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":681,"y":679,"w":36,"h":39}, + "spriteSourceSize": {"x":580,"y":755,"w":162,"h":490}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/LegsKneel.png": +"Models/SMoonlight/RPArmbinder Back.png": { - "frame": {"x":1203,"y":1787,"w":311,"h":258}, + "frame": {"x":977,"y":609,"w":311,"h":451}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":808,"w":311,"h":258}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Vibe/Band.png": -{ - "frame": {"x":1545,"y":1613,"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":1545,"y":1613,"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":1545,"y":1613,"w":205,"h":46}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":480,"y":654,"w":205,"h":46}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/WolfCatsuit/LegPadsRightClosed.png": -{ - "frame": {"x":1233,"y":3,"w":140,"h":536}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":458,"y":942,"w":140,"h":536}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":63,"y":75,"w":311,"h":451}, + "sourceSize": {"w":500,"h":600} }, -"Models/Yukata/ShirtChest.png": +"Models/TapeHeavy/LegsClosed.png": { - "frame": {"x":1714,"y":552,"w":331,"h":237}, + "frame": {"x":977,"y":3,"w":323,"h":602}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":392,"w":331,"h":237}, + "spriteSourceSize": {"x":463,"y":652,"w":323,"h":602}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/ShirtChestYoked.png": +"Models/TapeHeavy/PetsuitTopArms.png": { - "frame": {"x":1714,"y":793,"w":331,"h":237}, + "frame": {"x":544,"y":1775,"w":382,"h":270}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":392,"w":331,"h":237}, + "spriteSourceSize": {"x":398,"y":439,"w":382,"h":270}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/SleeveRightFree.png": +"Models/Witch/Skirt.png": { - "frame": {"x":1518,"y":1663,"w":132,"h":382}, + "frame": {"x":1470,"y":3,"w":567,"h":602}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":357,"y":442,"w":132,"h":382}, + "spriteSourceSize": {"x":319,"y":788,"w":567,"h":602}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -455,7 +271,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas18.webp b/TextureAtlas/atlas18.webp index e33bc3003..08b90a4e2 100644 Binary files a/TextureAtlas/atlas18.webp and b/TextureAtlas/atlas18.webp differ diff --git a/TextureAtlas/atlas19.json b/TextureAtlas/atlas19.json index 62271e999..85a1728c3 100644 --- a/TextureAtlas/atlas19.json +++ b/TextureAtlas/atlas19.json @@ -1,507 +1,499 @@ {"frames": { -"Models/Belts/Feet2KneelClosed.png": +"Models/ArmorChain/Shirt.png": { - "frame": {"x":1293,"y":292,"w":51,"h":71}, + "frame": {"x":1305,"y":1557,"w":278,"h":418}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":585,"y":984,"w":51,"h":71}, + "spriteSourceSize": {"x":444,"y":400,"w":278,"h":418}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/ArmRightUp.png": +"Models/Belts/Belt.png": { - "frame": {"x":1627,"y":625,"w":145,"h":344}, + "frame": {"x":311,"y":1983,"w":265,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":162,"w":145,"h":344}, + "spriteSourceSize": {"x":458,"y":735,"w":265,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bubble/LatexSphereCutawayBack.png": +"Models/Belts/RightLegs1Kneel.png": { - "frame": {"x":977,"y":3,"w":312,"h":986}, + "frame": {"x":1355,"y":1979,"w":143,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":139,"w":312,"h":986}, + "spriteSourceSize": {"x":393,"y":803,"w":143,"h":66}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cape/CapeSpread.png": +"Models/Belts/RightLegs1KneelClosed.png": { - "frame": {"x":3,"y":3,"w":483,"h":1057}, + "frame": {"x":1355,"y":1979,"w":143,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":400,"y":409,"w":483,"h":1057}, + "spriteSourceSize": {"x":393,"y":803,"w":143,"h":66}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/GlowLongMittenRightBoxtie.png": +"Models/Body/ArmLeftYoked.png": { - "frame": {"x":1293,"y":131,"w":51,"h":79}, + "frame": {"x":1317,"y":556,"w":721,"h":545}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":423,"y":484,"w":51,"h":79}, + "spriteSourceSize": {"x":216,"y":91,"w":721,"h":545}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/StrapsLongMittenRightFree.png": +"Models/Body/HandLeftYoked.png": { - "frame": {"x":2006,"y":1787,"w":39,"h":43}, + "frame": {"x":580,"y":617,"w":732,"h":318}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":658,"w":39,"h":43}, + "spriteSourceSize": {"x":216,"y":91,"w":732,"h":318}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenElbowLeftUp.png": +"Models/Bubble/BubbleSquishyBack.png": { - "frame": {"x":1293,"y":214,"w":51,"h":74}, + "frame": {"x":3,"y":3,"w":312,"h":986}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":709,"y":252,"w":51,"h":74}, + "spriteSourceSize": {"x":444,"y":139,"w":312,"h":986}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenElbowLeftWristtie.png": +"Models/Bubble/LatexSphereCutawayBack.png": { - "frame": {"x":2006,"y":1727,"w":39,"h":56}, + "frame": {"x":3,"y":993,"w":312,"h":986}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":703,"y":605,"w":39,"h":56}, + "spriteSourceSize": {"x":444,"y":139,"w":312,"h":986}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenElbowRightYoked.png": +"Models/Bunny/LegSockLeftClosed.png": { - "frame": {"x":1293,"y":754,"w":51,"h":57}, + "frame": {"x":1690,"y":2028,"w":151,"h":14}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":394,"y":496,"w":51,"h":57}, + "spriteSourceSize": {"x":590,"y":907,"w":151,"h":14}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ThighLeftClosed.png": +"Models/Bunny/LegSockLeftHogtie.png": { - "frame": {"x":1627,"y":973,"w":143,"h":87}, + "frame": {"x":1690,"y":2028,"w":151,"h":14}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":577,"y":1011,"w":143,"h":87}, + "spriteSourceSize": {"x":590,"y":907,"w":151,"h":14}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/StrapsLongMittenRightFree.png": +"Models/Bunny/LegSockRightSpread.png": { - "frame": {"x":2006,"y":1787,"w":39,"h":43}, + "frame": {"x":1845,"y":2028,"w":147,"h":14}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":658,"w":39,"h":43}, + "spriteSourceSize": {"x":444,"y":907,"w":147,"h":14}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperGlowLongMittenRightBoxtie.png": +"Models/Catsuit/ForeArmLeftCrossed.png": { - "frame": {"x":1293,"y":131,"w":51,"h":79}, + "frame": {"x":1413,"y":482,"w":195,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":423,"y":484,"w":51,"h":79}, + "spriteSourceSize": {"x":549,"y":629,"w":195,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftDecoCleanWristtie.png": +"Models/Catsuit/HandLeftYoked.png": { - "frame": {"x":1293,"y":955,"w":51,"h":31}, + "frame": {"x":580,"y":293,"w":733,"h":320}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":681,"y":629,"w":51,"h":31}, + "spriteSourceSize": {"x":216,"y":92,"w":733,"h":320}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftLockPlateBoxtie.png": +"Models/CyberArms/DisplayLongMittenLeftWristtie.png": { - "frame": {"x":2006,"y":1963,"w":39,"h":37}, + "frame": {"x":1654,"y":2028,"w":14,"h":15}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":745,"y":577,"w":39,"h":37}, + "spriteSourceSize": {"x":739,"y":552,"w":14,"h":15}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighRightKneel.png": +"Models/CyberMitts/CapLongMittenRightFree.png": { - "frame": {"x":977,"y":993,"w":156,"h":67}, + "frame": {"x":1252,"y":939,"w":61,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":366,"y":834,"w":156,"h":67}, + "spriteSourceSize": {"x":260,"y":550,"w":61,"h":88}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighRightKneelClosed.png": +"Models/CyberMitts/UpperDisplayLongMittenLeftWristtie.png": { - "frame": {"x":977,"y":993,"w":156,"h":67}, + "frame": {"x":1654,"y":2028,"w":14,"h":15}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":366,"y":834,"w":156,"h":67}, + "spriteSourceSize": {"x":739,"y":552,"w":14,"h":15}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristRightCrossed.png": +"Models/DivineCuffs/ElbowLeftFront.png": { - "frame": {"x":1293,"y":815,"w":51,"h":43}, + "frame": {"x":1026,"y":1981,"w":89,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":644,"y":601,"w":51,"h":43}, + "spriteSourceSize": {"x":680,"y":586,"w":89,"h":64}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/LaceChestDeco.png": +"Models/DivineCuffs/ElbowLeftLockBandFree.png": { - "frame": {"x":1137,"y":993,"w":102,"h":67}, + "frame": {"x":1672,"y":2028,"w":14,"h":15}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":522,"y":551,"w":102,"h":67}, + "spriteSourceSize": {"x":778,"y":619,"w":14,"h":15}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/BandRightBoxtie.png": +"Models/DivineCuffs/ElbowRightDecoCleanBoxtie.png": { - "frame": {"x":2006,"y":1834,"w":39,"h":40}, + "frame": {"x":1586,"y":2028,"w":21,"h":16}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":464,"y":494,"w":39,"h":40}, + "spriteSourceSize": {"x":461,"y":611,"w":21,"h":16}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/BandRightFree.png": +"Models/DivineCuffs/ThighLeftLockSpread.png": { - "frame": {"x":2006,"y":2004,"w":38,"h":41}, + "frame": {"x":495,"y":1454,"w":79,"h":99}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":493,"w":38,"h":41}, + "spriteSourceSize": {"x":653,"y":1023,"w":79,"h":99}, "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceDask/Brows2Annoyed.png": -{ - "frame": {"x":1708,"y":1727,"w":31,"h":19}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":614,"y":254,"w":31,"h":19}, - "sourceSize": {"w":700,"h":400} -}, -"Models/FaceDask/EyesSurprised.png": +"Models/DivineGag/MuzzleRim.png": { - "frame": {"x":1293,"y":862,"w":51,"h":43}, + "frame": {"x":1848,"y":1429,"w":156,"h":124}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":52,"y":168,"w":51,"h":43}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":534,"y":280,"w":156,"h":124}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKjus/MouthPout.png": +"Models/Dress/BlouseArmLeftYoked.png": { - "frame": {"x":1743,"y":1727,"w":23,"h":19}, + "frame": {"x":319,"y":3,"w":257,"h":294}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":594,"y":333,"w":23,"h":19}, - "sourceSize": {"w":750,"h":458} + "spriteSourceSize": {"x":710,"y":353,"w":257,"h":294}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/GagLeather/Ball_Teeth.png": +"Models/Dress/BlouseArmRightWristtie.png": { - "frame": {"x":1293,"y":909,"w":51,"h":42}, + "frame": {"x":2008,"y":1429,"w":37,"h":100}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":107,"y":233,"w":51,"h":42}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":460,"y":437,"w":37,"h":100}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/TallLeftKneel.png": +"Models/Dress/GlassesLens.png": { - "frame": {"x":1293,"y":439,"w":479,"h":182}, + "frame": {"x":752,"y":1982,"w":153,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":441,"y":906,"w":479,"h":182}, + "spriteSourceSize": {"x":519,"y":268,"w":153,"h":63}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hood/Hood.png": +"Models/Dress/LaceChestStripes.png": { - "frame": {"x":3,"y":1760,"w":214,"h":285}, + "frame": {"x":319,"y":1043,"w":256,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":505,"y":120,"w":214,"h":285}, - "sourceSize": {"w":752,"h":420} + "spriteSourceSize": {"x":456,"y":513,"w":256,"h":63}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/Labcoat/CapeSpread.png": +"Models/Dress/LaceCrotchPanel.png": { - "frame": {"x":490,"y":3,"w":483,"h":1057}, + "frame": {"x":319,"y":301,"w":257,"h":158}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":400,"y":409,"w":483,"h":1057}, + "spriteSourceSize": {"x":460,"y":760,"w":257,"h":158}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Leash/LeashHogtie.png": +"Models/Dress/ShoeRightKneel.png": { - "frame": {"x":1776,"y":631,"w":269,"h":247}, + "frame": {"x":495,"y":1110,"w":81,"h":118}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":343,"y":436,"w":269,"h":247}, + "spriteSourceSize": {"x":319,"y":836,"w":81,"h":118}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Leash/LeashHogtiePulled.png": +"Models/Dress/SkirtClosedCrotchStrap.png": { - "frame": {"x":1348,"y":3,"w":424,"h":432}, + "frame": {"x":1587,"y":1557,"w":458,"h":467}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":596,"y":26,"w":424,"h":432}, + "spriteSourceSize": {"x":383,"y":754,"w":458,"h":467}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareThighLeftKneel.png": +"Models/Dress/SkirtCrotchStrap.png": { - "frame": {"x":1293,"y":690,"w":51,"h":60}, + "frame": {"x":1587,"y":1557,"w":458,"h":467}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":571,"y":877,"w":51,"h":60}, + "spriteSourceSize": {"x":383,"y":754,"w":458,"h":467}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareThighLeftKneelClosed.png": +"Models/FaceKjus/BlushExtreme.png": { - "frame": {"x":1293,"y":690,"w":51,"h":60}, + "frame": {"x":580,"y":1982,"w":168,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":571,"y":877,"w":51,"h":60}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":529,"y":288,"w":168,"h":63}, + "sourceSize": {"w":858,"h":486} }, -"Models/LeatherLeotard/StrapsLower.png": +"Models/Furniture/BedStrapsHogtieBoxtie.png": { - "frame": {"x":1776,"y":1727,"w":226,"h":318}, + "frame": {"x":580,"y":939,"w":668,"h":614}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":473,"y":639,"w":226,"h":318}, + "spriteSourceSize": {"x":172,"y":468,"w":668,"h":614}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/Blouse.png": +"Models/FutureHarness/LockMid.png": { - "frame": {"x":934,"y":1755,"w":274,"h":290}, + "frame": {"x":1611,"y":2028,"w":39,"h":15}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":442,"y":494,"w":274,"h":290}, + "spriteSourceSize": {"x":543,"y":733,"w":39,"h":15}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/SockLeftClosed.png": +"Models/Gasmask/Center.png": { - "frame": {"x":1345,"y":1064,"w":206,"h":683}, + "frame": {"x":1252,"y":1031,"w":61,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":532,"y":940,"w":206,"h":683}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":98,"y":209,"w":61,"h":85}, + "sourceSize": {"w":321,"h":332} }, -"Models/Maid/SockLeftSpread.png": +"Models/Gothic/HemUpperKneel.png": { - "frame": {"x":518,"y":1064,"w":169,"h":691}, + "frame": {"x":1530,"y":1105,"w":515,"h":108}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":603,"y":945,"w":169,"h":691}, + "spriteSourceSize": {"x":336,"y":839,"w":515,"h":108}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/SockRightClosed.png": +"Models/Gothic/HemUpperKneelCrotchStrap..png": { - "frame": {"x":365,"y":1064,"w":149,"h":692}, + "frame": {"x":1530,"y":1217,"w":514,"h":115}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":931,"w":149,"h":692}, + "spriteSourceSize": {"x":336,"y":823,"w":514,"h":115}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/SockRightSpread.png": +"Models/Gothic/LaceLower.png": { - "frame": {"x":691,"y":1064,"w":166,"h":689}, + "frame": {"x":1413,"y":3,"w":631,"h":92}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":948,"w":166,"h":689}, + "spriteSourceSize": {"x":283,"y":1029,"w":631,"h":92}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/ChestBase.png": +"Models/Handcuffs/HandCuffsFront.png": { - "frame": {"x":1776,"y":1124,"w":265,"h":256}, + "frame": {"x":1807,"y":482,"w":238,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":404,"w":265,"h":256}, + "spriteSourceSize": {"x":466,"y":526,"w":238,"h":65}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/ShoeLeftHogtie.png": +"Models/Harness/HardwareTop.png": { - "frame": {"x":1293,"y":3,"w":51,"h":124}, + "frame": {"x":1203,"y":1981,"w":74,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":731,"y":798,"w":51,"h":124}, + "spriteSourceSize": {"x":555,"y":462,"w":74,"h":64}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveLeftBoxtie.png": +"Models/Jacket/LatexLower.png": { - "frame": {"x":435,"y":1760,"w":98,"h":283}, + "frame": {"x":319,"y":463,"w":256,"h":259}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, + "spriteSourceSize": {"x":459,"y":656,"w":256,"h":259}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveLeftBoxtieTight.png": +"Models/LatexPetsuit/GlowLegsKneel.png": { - "frame": {"x":435,"y":1760,"w":98,"h":283}, + "frame": {"x":928,"y":1557,"w":373,"h":420}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, + "spriteSourceSize": {"x":246,"y":712,"w":373,"h":420}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveLeftWristtie.png": +"Models/LatexPetsuit/GlowLegsKneelClosed.png": { - "frame": {"x":221,"y":1760,"w":103,"h":283}, + "frame": {"x":928,"y":1557,"w":373,"h":420}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":676,"y":495,"w":103,"h":283}, + "spriteSourceSize": {"x":246,"y":712,"w":373,"h":420}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveLeftWristtieRopesUpper.png": +"Models/MaidKnightLight/PauldronStrapYoked.png": { - "frame": {"x":328,"y":1760,"w":103,"h":283}, + "frame": {"x":495,"y":1232,"w":81,"h":107}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":676,"y":495,"w":103,"h":283}, + "spriteSourceSize": {"x":697,"y":450,"w":81,"h":107}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveLeftWristtieTight.png": +"Models/Ninja/Collar.png": { - "frame": {"x":221,"y":1760,"w":103,"h":283}, + "frame": {"x":909,"y":1982,"w":113,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":676,"y":495,"w":103,"h":283}, + "spriteSourceSize": {"x":571,"y":371,"w":113,"h":63}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/ChestCrossed.png": +"Models/Ninja/SkirtBandOverKneel.png": { - "frame": {"x":1708,"y":1384,"w":337,"h":339}, + "frame": {"x":1502,"y":1979,"w":80,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":433,"y":360,"w":337,"h":339}, + "spriteSourceSize": {"x":450,"y":848,"w":80,"h":66}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/LegRightKneel.png": +"Models/Rope/Crotchrope.png": { - "frame": {"x":1212,"y":1753,"w":219,"h":292}, + "frame": {"x":319,"y":956,"w":256,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":319,"y":768,"w":219,"h":292}, + "spriteSourceSize": {"x":459,"y":740,"w":256,"h":83}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/TorsoUpper.png": +"Models/Rope/CrotchropeKneel.png": { - "frame": {"x":1348,"y":625,"w":275,"h":435}, + "frame": {"x":319,"y":863,"w":256,"h":89}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":360,"w":275,"h":435}, + "spriteSourceSize": {"x":459,"y":740,"w":256,"h":89}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/Arms1.png": +"Models/Rubber/HandRightYoked.png": { - "frame": {"x":1435,"y":1751,"w":337,"h":294}, + "frame": {"x":1317,"y":425,"w":92,"h":127}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":441,"y":415,"w":337,"h":294}, + "spriteSourceSize": {"x":299,"y":287,"w":92,"h":127}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/bac/SuccubusClawRightYoked.png": +"Models/Sailor/CollarStripeTied.png": { - "frame": {"x":1243,"y":993,"w":101,"h":67}, + "frame": {"x":1848,"y":1336,"w":197,"h":89}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":298,"y":286,"w":101,"h":67}, + "spriteSourceSize": {"x":510,"y":430,"w":197,"h":89}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/HandRightBoxtie.png": +"Models/Slime/HandLeftYoked.png": { - "frame": {"x":2006,"y":1878,"w":39,"h":39}, + "frame": {"x":1317,"y":293,"w":92,"h":128}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":681,"y":679,"w":39,"h":39}, + "spriteSourceSize": {"x":857,"y":278,"w":92,"h":128}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/LegsHogtie.png": +"Models/Slime/TorsoUpper.png": { - "frame": {"x":861,"y":1064,"w":302,"h":687}, + "frame": {"x":1252,"y":1120,"w":274,"h":433}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":484,"y":657,"w":302,"h":687}, + "spriteSourceSize": {"x":446,"y":360,"w":274,"h":433}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/RightLegsHogtie.png": +"Models/Succubus/FootSockLeftHogtie.png": { - "frame": {"x":3,"y":1064,"w":358,"h":692}, + "frame": {"x":1281,"y":1981,"w":70,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":428,"y":652,"w":358,"h":692}, + "spriteSourceSize": {"x":712,"y":785,"w":70,"h":64}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/FeetKneel.png": +"Models/Succubus/SockLeftKneelClosed.png": { - "frame": {"x":1293,"y":625,"w":51,"h":61}, + "frame": {"x":1119,"y":1981,"w":80,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":789,"y":922,"w":51,"h":61}, + "spriteSourceSize": {"x":812,"y":917,"w":80,"h":64}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/HandRightBoxtie.png": +"Models/Succubus/SuccubusWingBase.png": { - "frame": {"x":2006,"y":1878,"w":39,"h":39}, + "frame": {"x":580,"y":3,"w":829,"h":286}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":681,"y":679,"w":39,"h":39}, + "spriteSourceSize": {"x":219,"y":380,"w":829,"h":286}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/GloveRightBoxtie.png": +"Models/TapeLight/HandRightFree.png": { - "frame": {"x":2006,"y":1921,"w":39,"h":38}, + "frame": {"x":495,"y":1343,"w":81,"h":107}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":678,"y":678,"w":39,"h":38}, + "spriteSourceSize": {"x":276,"y":546,"w":81,"h":107}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/AnkleLeftKneelClosed.png": +"Models/TapeMed/ArmLeftBoxtie.png": { - "frame": {"x":1293,"y":367,"w":51,"h":68}, + "frame": {"x":1530,"y":1336,"w":314,"h":217}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":712,"y":942,"w":51,"h":68}, + "spriteSourceSize": {"x":456,"y":465,"w":314,"h":217}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/Chest.png": +"Models/TapeMed/TopStrapCrossed.png": { - "frame": {"x":1776,"y":882,"w":269,"h":238}, + "frame": {"x":3,"y":1983,"w":304,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":390,"w":269,"h":238}, + "spriteSourceSize": {"x":465,"y":439,"w":304,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegLeftKneel.png": +"Models/Warrior/ShoeRightSpread.png": { - "frame": {"x":537,"y":1759,"w":393,"h":286}, + "frame": {"x":767,"y":1557,"w":157,"h":421}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":386,"y":799,"w":393,"h":286}, + "spriteSourceSize": {"x":453,"y":1224,"w":157,"h":421}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegLeftSpread.png": +"Models/Witch/SkirtSplit.png": { - "frame": {"x":1167,"y":1064,"w":174,"h":685}, + "frame": {"x":319,"y":1557,"w":444,"h":421}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":597,"y":792,"w":174,"h":685}, + "spriteSourceSize": {"x":393,"y":772,"w":444,"h":421}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegRightHogtie.png": +"Models/WolfCatsuit/ForeGloveLeftCrossed.png": { - "frame": {"x":1555,"y":1384,"w":149,"h":363}, + "frame": {"x":1612,"y":482,"w":191,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":844,"w":149,"h":363}, + "spriteSourceSize": {"x":552,"y":629,"w":191,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegRightKneel.png": +"Models/Yukata/SkirtKneel.png": { - "frame": {"x":1555,"y":1064,"w":217,"h":316}, + "frame": {"x":1413,"y":99,"w":619,"h":379}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":312,"y":746,"w":217,"h":316}, + "spriteSourceSize": {"x":273,"y":713,"w":619,"h":379}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/TorsoUpper.png": +"Models/Yukata/SleeveLeftUp.png": { - "frame": {"x":1776,"y":3,"w":269,"h":310}, + "frame": {"x":319,"y":1110,"w":172,"h":442}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":390,"w":269,"h":310}, + "spriteSourceSize": {"x":659,"y":163,"w":172,"h":442}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/TorsoUpper2.png": +"Models/Yukata/WaistBand.png": { - "frame": {"x":1776,"y":317,"w":269,"h":310}, + "frame": {"x":319,"y":726,"w":256,"h":133}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":390,"w":269,"h":310}, + "spriteSourceSize": {"x":453,"y":659,"w":256,"h":133}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -511,7 +503,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas19.webp b/TextureAtlas/atlas19.webp index 549cc9011..d3b7acfdb 100644 Binary files a/TextureAtlas/atlas19.webp and b/TextureAtlas/atlas19.webp differ diff --git a/TextureAtlas/atlas2.json b/TextureAtlas/atlas2.json index 9c084f1ca..89f87d738 100644 --- a/TextureAtlas/atlas2.json +++ b/TextureAtlas/atlas2.json @@ -1,5 +1,13 @@ {"frames": { +"Models/Armbinder/StrapsRightBoxtie.png": +{ + "frame": {"x":1136,"y":2032,"w":14,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":518,"w":14,"h":13}, + "sourceSize": {"w":1240,"h":1754} +}, "Models/Chastity/CyberLock.png": { "frame": {"x":2034,"y":60,"w":11,"h":17}, @@ -8,6 +16,22 @@ "spriteSourceSize": {"x":570,"y":851,"w":11,"h":17}, "sourceSize": {"w":1240,"h":1754} }, +"Models/Chastity/CyberPlug.png": +{ + "frame": {"x":1076,"y":2032,"w":35,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":911,"w":35,"h":13}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/LockLongMittenLeftFree.png": +{ + "frame": {"x":1154,"y":2032,"w":13,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":838,"y":759,"w":13,"h":13}, + "sourceSize": {"w":1240,"h":1754} +}, "Models/DivineGag/Teeth.png": { "frame": {"x":1717,"y":2035,"w":43,"h":10}, @@ -16,6 +40,30 @@ "spriteSourceSize": {"x":584,"y":331,"w":43,"h":10}, "sourceSize": {"w":1240,"h":1754} }, +"Models/EyesDai1/RidgeAngry.png": +{ + "frame": {"x":1115,"y":2032,"w":17,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":584,"y":267,"w":17,"h":13}, + "sourceSize": {"w":703,"h":355} +}, +"Models/FaceKjus/Brows2Surprised.png": +{ + "frame": {"x":1171,"y":2032,"w":49,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":253,"w":49,"h":12}, + "sourceSize": {"w":813,"h":502} +}, +"Models/FaceKjus/BrowsAnnoyed.png": +{ + "frame": {"x":1033,"y":2032,"w":39,"h":13}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":268,"w":39,"h":13}, + "sourceSize": {"w":765,"h":427} +}, "Models/FaceKoi/Brows2Surprised.png": { "frame": {"x":1663,"y":2035,"w":50,"h":10}, @@ -26,7 +74,7 @@ }, "Models/FaceKoi/BrowsAngry.png": { - "frame": {"x":1881,"y":2035,"w":45,"h":8}, + "frame": {"x":1909,"y":2035,"w":45,"h":8}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":56,"y":148,"w":45,"h":8}, @@ -34,7 +82,7 @@ }, "Models/FaceKoi/BrowsAnnoyed.png": { - "frame": {"x":1963,"y":2035,"w":46,"h":7}, + "frame": {"x":1991,"y":2035,"w":46,"h":7}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":56,"y":151,"w":46,"h":7}, @@ -42,7 +90,7 @@ }, "Models/FaceKoi/MouthDazed.png": { - "frame": {"x":1806,"y":2035,"w":37,"h":9}, + "frame": {"x":1834,"y":2035,"w":37,"h":9}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":117,"y":244,"w":37,"h":9}, @@ -50,7 +98,7 @@ }, "Models/FaceKoi/MouthFrown.png": { - "frame": {"x":1847,"y":2035,"w":30,"h":9}, + "frame": {"x":1875,"y":2035,"w":30,"h":9}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":121,"y":247,"w":30,"h":9}, @@ -58,7 +106,7 @@ }, "Models/FaceKoi/MouthSmile.png": { - "frame": {"x":1930,"y":2035,"w":29,"h":8}, + "frame": {"x":1958,"y":2035,"w":29,"h":8}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":121,"y":244,"w":29,"h":8}, @@ -74,18 +122,26 @@ }, "Models/GagLeather/KittyMouth.png": { - "frame": {"x":1764,"y":2035,"w":38,"h":9}, + "frame": {"x":1792,"y":2035,"w":38,"h":9}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":111,"y":255,"w":38,"h":9}, "sourceSize": {"w":321,"h":332} }, -"Models/Hair/StraightBangs_Overstrap.png": +"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/HardwareUnderbustOver.png": { - "frame": {"x":803,"y":1677,"w":292,"h":366}, + "frame": {"x":1764,"y":2035,"w":24,"h":10}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":154,"w":292,"h":366}, + "spriteSourceSize": {"x":571,"y":520,"w":24,"h":10}, "sourceSize": {"w":1240,"h":1754} }, "Models/Heels/LeatherLegRightKneelClosed.png": @@ -120,20 +176,20 @@ "spriteSourceSize": {"x":395,"y":741,"w":323,"h":159}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeSockRightSpread.png": +"Models/Mittens/LongMittenLeftFree.png": { - "frame": {"x":1099,"y":2008,"w":141,"h":37}, + "frame": {"x":1033,"y":1677,"w":213,"h":351}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":974,"w":141,"h":37}, + "spriteSourceSize": {"x":700,"y":512,"w":213,"h":351}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/ThighRightSpread.png": +"Models/Panties/Bow.png": { - "frame": {"x":1099,"y":1677,"w":147,"h":327}, + "frame": {"x":1224,"y":2032,"w":21,"h":12}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":979,"w":147,"h":327}, + "spriteSourceSize": {"x":561,"y":810,"w":21,"h":12}, "sourceSize": {"w":1240,"h":1754} }, "Models/Robes/RibbonBack.png": @@ -223,7 +279,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas2.webp b/TextureAtlas/atlas2.webp index b347ec7e9..dca2da5ae 100644 Binary files a/TextureAtlas/atlas2.webp and b/TextureAtlas/atlas2.webp differ diff --git a/TextureAtlas/atlas20.json b/TextureAtlas/atlas20.json index ed89a31e2..e44cf2b58 100644 --- a/TextureAtlas/atlas20.json +++ b/TextureAtlas/atlas20.json @@ -1,451 +1,475 @@ {"frames": { -"Models/ArmorChain/Shirt.png": +"Models/Bandit/PouchSpread.png": { - "frame": {"x":1685,"y":1627,"w":278,"h":418}, + "frame": {"x":1359,"y":260,"w":186,"h":179}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":400,"w":278,"h":418}, + "spriteSourceSize": {"x":403,"y":938,"w":186,"h":179}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/GauntletRightYoked.png": +"Models/Body/ArmLeftFront.png": { - "frame": {"x":868,"y":1823,"w":96,"h":205}, + "frame": {"x":3,"y":1399,"w":555,"h":639}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":300,"y":289,"w":96,"h":205}, + "spriteSourceSize": {"x":216,"y":91,"w":555,"h":639}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ShoeRightKneel.png": +"Models/Bunny/LegSockRightHogtie.png": { - "frame": {"x":664,"y":722,"w":72,"h":95}, + "frame": {"x":1095,"y":2030,"w":142,"h":14}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":321,"y":856,"w":72,"h":95}, + "spriteSourceSize": {"x":447,"y":907,"w":142,"h":14}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/ArmLeftYoked.png": +"Models/Bunny/SockRightClosed.png": { - "frame": {"x":740,"y":325,"w":721,"h":545}, + "frame": {"x":3,"y":702,"w":167,"h":693}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":721,"h":545}, + "spriteSourceSize": {"x":448,"y":919,"w":167,"h":693}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/HandLeftYoked.png": +"Models/Chastity/BraCyberLock.png": { - "frame": {"x":740,"y":3,"w":732,"h":318}, + "frame": {"x":2025,"y":1911,"w":14,"h":132}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":732,"h":318}, + "spriteSourceSize": {"x":567,"y":555,"w":14,"h":132}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cape/CapeKneel.png": +"Models/CyberArms/CuffForeLongMittenRightCrossed.png": { - "frame": {"x":1351,"y":1505,"w":330,"h":533}, + "frame": {"x":2025,"y":1868,"w":16,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":495,"y":409,"w":330,"h":533}, + "spriteSourceSize": {"x":682,"y":598,"w":16,"h":39}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ArmRightFront.png": +"Models/CyberCuffs/LockAnkleLeftSpread.png": { - "frame": {"x":868,"y":1591,"w":96,"h":228}, + "frame": {"x":1332,"y":749,"w":23,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":428,"y":432,"w":96,"h":228}, + "spriteSourceSize": {"x":713,"y":1444,"w":23,"h":35}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/HandLeftYoked.png": +"Models/CyberCuffs/LockAnkleRightSpread.png": { - "frame": {"x":3,"y":3,"w":733,"h":320}, + "frame": {"x":1332,"y":788,"w":23,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":92,"w":733,"h":320}, + "spriteSourceSize": {"x":511,"y":1444,"w":23,"h":35}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Collars/FutureDisplay.png": +"Models/CyberCuffs/LockElbowLeftFront.png": { - "frame": {"x":597,"y":1129,"w":43,"h":27}, + "frame": {"x":2025,"y":1735,"w":18,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":591,"y":399,"w":43,"h":27}, + "spriteSourceSize": {"x":757,"y":610,"w":18,"h":35}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Collars/Simple.png": +"Models/CyberCuffs/LockThighLeftSpread.png": { - "frame": {"x":1465,"y":1215,"w":105,"h":64}, + "frame": {"x":1332,"y":827,"w":23,"h":34}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":574,"y":370,"w":105,"h":64}, + "spriteSourceSize": {"x":697,"y":1014,"w":23,"h":34}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/AnkleLeftKneel.png": +"Models/CyberCuffs/LockThighRightKneel.png": { - "frame": {"x":664,"y":918,"w":72,"h":80}, + "frame": {"x":1332,"y":971,"w":22,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":697,"y":955,"w":72,"h":80}, + "spriteSourceSize": {"x":385,"y":830,"w":22,"h":32}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberHeels/GlowBalletLeftHogtie.png": +"Models/CyberCuffs/LockThighRightKneelClosed.png": { - "frame": {"x":1685,"y":1505,"w":47,"h":65}, + "frame": {"x":1332,"y":971,"w":22,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":730,"y":798,"w":47,"h":65}, + "spriteSourceSize": {"x":385,"y":830,"w":22,"h":32}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftDecoCleanYoked.png": +"Models/CyberCuffs/LockThighRightSpread.png": { - "frame": {"x":664,"y":1002,"w":72,"h":75}, + "frame": {"x":1332,"y":865,"w":23,"h":34}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":764,"y":523,"w":72,"h":75}, + "spriteSourceSize": {"x":486,"y":1016,"w":23,"h":34}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftDecoYoked.png": +"Models/CyberCuffs/LockWristLeftFront.png": { - "frame": {"x":664,"y":1081,"w":72,"h":75}, + "frame": {"x":1332,"y":1007,"w":21,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":764,"y":523,"w":72,"h":75}, + "spriteSourceSize": {"x":670,"y":543,"w":21,"h":30}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftLockBandWristtie.png": +"Models/CyberCuffs/LockWristLeftYoked.png": { - "frame": {"x":644,"y":1129,"w":16,"h":16}, + "frame": {"x":1332,"y":1167,"w":16,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":727,"y":643,"w":16,"h":16}, + "spriteSourceSize": {"x":919,"y":409,"w":16,"h":30}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftYoked.png": +"Models/CyberCuffs/LockWristRightFront.png": { - "frame": {"x":1386,"y":1091,"w":75,"h":93}, + "frame": {"x":1332,"y":1041,"w":21,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":760,"y":513,"w":75,"h":93}, + "spriteSourceSize": {"x":472,"y":541,"w":21,"h":30}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristRightDecoCleanYoked.png": +"Models/CyberMitts/CapLongMittenLeftFree.png": { - "frame": {"x":299,"y":1129,"w":61,"h":27}, + "frame": {"x":1703,"y":1179,"w":62,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":310,"y":406,"w":61,"h":27}, + "spriteSourceSize": {"x":861,"y":798,"w":62,"h":72}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristRightDecoYoked.png": +"Models/CyberMitts/CuffForeLongMittenRightCrossed.png": { - "frame": {"x":364,"y":1129,"w":61,"h":27}, + "frame": {"x":2025,"y":1868,"w":16,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":310,"y":406,"w":61,"h":27}, + "spriteSourceSize": {"x":682,"y":598,"w":16,"h":39}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineGag/MuzzleCollar.png": +"Models/DivineBelt/LockBeltShackle.png": { - "frame": {"x":215,"y":1129,"w":80,"h":27}, + "frame": {"x":1703,"y":1092,"w":62,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":588,"y":378,"w":80,"h":27}, + "spriteSourceSize": {"x":539,"y":780,"w":62,"h":83}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MonocleLeft.png": +"Models/DivineCuffs/AnkleLeftDecoCleanKneel.png": { - "frame": {"x":1967,"y":1979,"w":75,"h":66}, + "frame": {"x":2025,"y":1774,"w":16,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":605,"y":264,"w":75,"h":66}, + "spriteSourceSize": {"x":737,"y":946,"w":16,"h":43}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/Circlet.png": +"Models/DivineCuffs/AnkleLeftDecoKneel.png": { - "frame": {"x":740,"y":1505,"w":224,"h":82}, + "frame": {"x":2025,"y":1821,"w":16,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":501,"y":161,"w":224,"h":82}, + "spriteSourceSize": {"x":737,"y":946,"w":16,"h":43}, "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK3/EyesClosed.png": +"Models/DivineCuffs/AnkleRightClosed.png": { - "frame": {"x":545,"y":1129,"w":48,"h":27}, + "frame": {"x":1703,"y":1329,"w":62,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":528,"y":285,"w":48,"h":27}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":530,"y":1415,"w":62,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftLockBandFree.png": +{ + "frame": {"x":1332,"y":1104,"w":21,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":833,"y":732,"w":21,"h":23}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/LaceChestDecoCrystal.png": +{ + "frame": {"x":1332,"y":690,"w":23,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":560,"w":23,"h":55}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK3/WhitesEyesClosed.png": +"Models/Ears/ElfEarringsFront.png": { - "frame": {"x":545,"y":1129,"w":48,"h":27}, + "frame": {"x":1332,"y":1201,"w":14,"h":36}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":528,"y":285,"w":48,"h":27}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":702,"y":326,"w":14,"h":36}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKjus/MouthDistracted.png": +"Models/GagMetal/Display.png": { - "frame": {"x":1685,"y":1574,"w":44,"h":49}, + "frame": {"x":1332,"y":1075,"w":21,"h":25}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":585,"y":322,"w":44,"h":49}, - "sourceSize": {"w":745,"h":474} + "spriteSourceSize": {"x":114,"y":156,"w":21,"h":25}, + "sourceSize": {"w":321,"h":332} }, -"Models/Gothic/HemLower.png": +"Models/Gothic/HemLowerBackCrotchStrap.png": { - "frame": {"x":740,"y":874,"w":657,"h":101}, + "frame": {"x":1703,"y":807,"w":62,"h":189}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":270,"y":1069,"w":657,"h":101}, + "spriteSourceSize": {"x":576,"y":911,"w":62,"h":189}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Gothic/HemLowerCrotchStrap.png": +"Models/Hair/StraightBangs_Overstrap.png": { - "frame": {"x":3,"y":830,"w":657,"h":295}, + "frame": {"x":1549,"y":1399,"w":216,"h":355}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":270,"y":860,"w":657,"h":295}, + "spriteSourceSize": {"x":493,"y":154,"w":216,"h":355}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Gothic/Lines.png": +"Models/Jacket/BeltsTorsoLower.png": { - "frame": {"x":3,"y":327,"w":657,"h":499}, + "frame": {"x":1769,"y":512,"w":276,"h":282}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":270,"y":671,"w":657,"h":499}, + "spriteSourceSize": {"x":449,"y":602,"w":276,"h":282}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Gothic/Skirt.png": +"Models/Jacket/BeltsTorsoLowerBoxtie.png": { - "frame": {"x":740,"y":1039,"w":642,"h":462}, + "frame": {"x":1769,"y":798,"w":276,"h":282}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":277,"y":671,"w":642,"h":462}, + "spriteSourceSize": {"x":449,"y":602,"w":276,"h":282}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair6_FrontB.png": +"Models/Jacket/BeltsTorsoLowerWristtie.png": { - "frame": {"x":1967,"y":1820,"w":78,"h":155}, + "frame": {"x":1769,"y":1084,"w":276,"h":282}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":541,"y":124,"w":78,"h":155}, + "spriteSourceSize": {"x":449,"y":602,"w":276,"h":282}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Harness/HardwareTop.png": +"Models/Legbinder/LegRightLegbinderClosed.png": { - "frame": {"x":1658,"y":1215,"w":74,"h":64}, + "frame": {"x":1942,"y":1735,"w":79,"h":310}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":555,"y":462,"w":74,"h":64}, + "spriteSourceSize": {"x":504,"y":1213,"w":79,"h":310}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/StrapsChestWristtie.png": +"Models/Maid/SockLeftClosed.png": { - "frame": {"x":1736,"y":1215,"w":309,"h":408}, + "frame": {"x":1149,"y":3,"w":206,"h":683}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":385,"w":309,"h":408}, + "spriteSourceSize": {"x":532,"y":940,"w":206,"h":683}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Labcoat/CapeKneel.png": +"Models/Maid/SockRightClosed.png": { - "frame": {"x":1351,"y":1505,"w":330,"h":533}, + "frame": {"x":711,"y":699,"w":149,"h":692}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":495,"y":409,"w":330,"h":533}, + "spriteSourceSize": {"x":450,"y":931,"w":149,"h":692}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/ElbowLeftYoked.png": +"Models/Maid/SockRightSpread.png": { - "frame": {"x":1386,"y":1188,"w":75,"h":91}, + "frame": {"x":801,"y":3,"w":166,"h":689}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":763,"y":507,"w":75,"h":91}, + "spriteSourceSize": {"x":446,"y":948,"w":166,"h":689}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareElbowLeftBoxtie.png": +"Models/MaidKnightLight/DressChestUp.png": { - "frame": {"x":429,"y":1129,"w":54,"h":27}, + "frame": {"x":1769,"y":1370,"w":276,"h":259}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":700,"y":592,"w":54,"h":27}, + "spriteSourceSize": {"x":443,"y":389,"w":276,"h":259}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareElbowLeftFree.png": +"Models/MaidKnightLight/GloveRightCrossed.png": { - "frame": {"x":487,"y":1129,"w":54,"h":27}, + "frame": {"x":1332,"y":1131,"w":16,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":709,"y":601,"w":54,"h":27}, + "spriteSourceSize": {"x":685,"y":606,"w":16,"h":32}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Legbinder/LegLacesLegbinderClosed.png": +"Models/Mittens/ForeLongMittenLeftFront.png": { - "frame": {"x":664,"y":327,"w":72,"h":287}, + "frame": {"x":562,"y":1395,"w":529,"h":639}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":551,"y":1226,"w":72,"h":287}, + "spriteSourceSize": {"x":216,"y":91,"w":529,"h":639}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Legbinder/LegLegbinderHogtie.png": +"Models/Ribbon/ArmStrapCrossed.png": { - "frame": {"x":1401,"y":874,"w":60,"h":213}, + "frame": {"x":1703,"y":1000,"w":62,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":675,"y":970,"w":60,"h":213}, + "spriteSourceSize": {"x":553,"y":602,"w":62,"h":88}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SkirtCrotchStrap.png": +"Models/Rubber/LegRightKneelClosed.png": { - "frame": {"x":1386,"y":1283,"w":338,"h":218}, + "frame": {"x":1548,"y":512,"w":217,"h":291}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":437,"y":713,"w":338,"h":218}, + "spriteSourceSize": {"x":323,"y":768,"w":217,"h":291}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveDecoLeftFree.png": +"Models/Slayer/CapeTied.png": { - "frame": {"x":968,"y":1505,"w":73,"h":536}, + "frame": {"x":1549,"y":1758,"w":389,"h":287}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":783,"y":704,"w":73,"h":536}, + "spriteSourceSize": {"x":418,"y":410,"w":389,"h":287}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveLeftFree.png": +"Models/Tails/Fox.png": { - "frame": {"x":3,"y":1505,"w":208,"h":538}, + "frame": {"x":1095,"y":1387,"w":450,"h":639}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":676,"y":480,"w":208,"h":538}, + "spriteSourceSize": {"x":507,"y":779,"w":450,"h":639}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveLeftFreeTight.png": +"Models/Tails/Kitty.png": { - "frame": {"x":3,"y":1505,"w":208,"h":538}, + "frame": {"x":3,"y":3,"w":432,"h":695}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":676,"y":480,"w":208,"h":538}, + "spriteSourceSize": {"x":539,"y":746,"w":432,"h":695}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/FootRightKneel.png": +"Models/TallSmoothHeels/TallLeftKneel.png": { - "frame": {"x":664,"y":618,"w":72,"h":100}, + "frame": {"x":1549,"y":321,"w":481,"h":187}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":325,"y":854,"w":72,"h":100}, + "spriteSourceSize": {"x":451,"y":901,"w":481,"h":187}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/LegLeftHogtie.png": +"Models/TapeHeavy/BottomClosed.png": { - "frame": {"x":530,"y":1591,"w":165,"h":451}, + "frame": {"x":174,"y":702,"w":358,"h":692}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":578,"y":755,"w":165,"h":451}, + "spriteSourceSize": {"x":428,"y":652,"w":358,"h":692}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/FootRightKneel.png": +"Models/TapeHeavy/BottomHogtie.png": { - "frame": {"x":664,"y":618,"w":72,"h":100}, + "frame": {"x":174,"y":702,"w":358,"h":692}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":325,"y":854,"w":72,"h":100}, + "spriteSourceSize": {"x":428,"y":652,"w":358,"h":692}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/LegLeftHogtie.png": +"Models/TapeHeavy/LegsHogtie.png": { - "frame": {"x":699,"y":1591,"w":165,"h":451}, + "frame": {"x":864,"y":696,"w":302,"h":687}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":578,"y":755,"w":165,"h":451}, + "spriteSourceSize": {"x":484,"y":657,"w":302,"h":687}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SMoonlight/RPArmbinder Back.png": +"Models/TapeHeavy/RightLegsHogtie.png": { - "frame": {"x":215,"y":1591,"w":311,"h":451}, + "frame": {"x":439,"y":3,"w":358,"h":692}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":63,"y":75,"w":311,"h":451}, - "sourceSize": {"w":500,"h":600} + "spriteSourceSize": {"x":428,"y":652,"w":358,"h":692}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmRightBoxtie.png": +{ + "frame": {"x":1332,"y":903,"w":22,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":463,"y":613,"w":22,"h":64}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SockLeftKneelClosed.png": +"Models/Visors/DollmakerFull.png": { - "frame": {"x":1574,"y":1215,"w":80,"h":64}, + "frame": {"x":1359,"y":3,"w":186,"h":253}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":812,"y":917,"w":80,"h":64}, + "spriteSourceSize": {"x":506,"y":142,"w":186,"h":253}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Tails/Wolf.png": +"Models/Warrior/RimGloveRightFree.png": { - "frame": {"x":1045,"y":1505,"w":302,"h":534}, + "frame": {"x":1703,"y":1255,"w":62,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":595,"y":412,"w":302,"h":534}, + "spriteSourceSize": {"x":338,"y":599,"w":62,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ArmRightBoxtie.png": +"Models/Witch/SkirtKneel.png": { - "frame": {"x":1967,"y":1627,"w":78,"h":189}, + "frame": {"x":1549,"y":3,"w":483,"h":314}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":493,"w":78,"h":189}, + "spriteSourceSize": {"x":302,"y":775,"w":483,"h":314}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/BlouseLeftBoxtie.png": +"Models/Wolf/HarnessBandLowerKneel.png": { - "frame": {"x":3,"y":1129,"w":208,"h":366}, + "frame": {"x":1769,"y":1633,"w":276,"h":98}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":585,"y":418,"w":208,"h":366}, + "spriteSourceSize": {"x":453,"y":757,"w":276,"h":98}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/ShoeRightKneel.png": +"Models/WolfCatsuit/LegLeftClosed.png": { - "frame": {"x":664,"y":821,"w":72,"h":93}, + "frame": {"x":536,"y":699,"w":171,"h":692}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":322,"y":857,"w":72,"h":93}, + "spriteSourceSize": {"x":578,"y":792,"w":171,"h":692}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/Skirt.png": +"Models/WolfCatsuit/LegLeftSpread.png": { - "frame": {"x":1476,"y":3,"w":567,"h":602}, + "frame": {"x":971,"y":3,"w":174,"h":685}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":319,"y":788,"w":567,"h":602}, + "spriteSourceSize": {"x":597,"y":792,"w":174,"h":685}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtClosed.png": +"Models/WolfCatsuit/LegRightSpread.png": { - "frame": {"x":1465,"y":609,"w":563,"h":602}, + "frame": {"x":1170,"y":690,"w":158,"h":681}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":321,"y":788,"w":563,"h":602}, + "spriteSourceSize": {"x":444,"y":803,"w":158,"h":681}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtClosedCrotchStrap.png": +"Models/WolfCatsuit/RimGloveRightFree.png": { - "frame": {"x":215,"y":1160,"w":521,"h":427}, + "frame": {"x":1703,"y":1255,"w":62,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":349,"y":792,"w":521,"h":427}, + "spriteSourceSize": {"x":338,"y":599,"w":62,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtCrotchStrap.png": +"Models/WolfCatsuit/TorsoLowerKneel.png": { - "frame": {"x":215,"y":1160,"w":521,"h":427}, + "frame": {"x":1359,"y":808,"w":340,"h":574}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":349,"y":792,"w":521,"h":427}, + "spriteSourceSize": {"x":435,"y":390,"w":340,"h":574}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yoke/HeavySteel.png": +"Models/Yukata/SleeveRightUp.png": { - "frame": {"x":740,"y":979,"w":655,"h":56}, + "frame": {"x":1359,"y":443,"w":185,"h":361}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":299,"y":379,"w":655,"h":56}, + "spriteSourceSize": {"x":409,"y":160,"w":185,"h":361}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -455,7 +479,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas20.webp b/TextureAtlas/atlas20.webp index 11f62b3b2..d09fcc880 100644 Binary files a/TextureAtlas/atlas20.webp and b/TextureAtlas/atlas20.webp differ diff --git a/TextureAtlas/atlas21.json b/TextureAtlas/atlas21.json index 8ac496de9..30e41d0db 100644 --- a/TextureAtlas/atlas21.json +++ b/TextureAtlas/atlas21.json @@ -1,547 +1,675 @@ {"frames": { -"Models/Bandit/ShoeRightSpread.png": +"Models/Armbinder/StrapsLeftBoxtie.png": { - "frame": {"x":1916,"y":1084,"w":129,"h":195}, + "frame": {"x":776,"y":372,"w":66,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":486,"y":1448,"w":129,"h":195}, + "spriteSourceSize": {"x":704,"y":526,"w":66,"h":24}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ShoulderPadHogtie.png": +"Models/ArmorChain/SkirtBeltRivetsKneel.png": { - "frame": {"x":1799,"y":533,"w":112,"h":132}, + "frame": {"x":1262,"y":1319,"w":137,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":685,"y":409,"w":112,"h":132}, + "spriteSourceSize": {"x":471,"y":779,"w":137,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/RightLegs1Kneel.png": +"Models/Belts/Legs2Closed.png": { - "frame": {"x":923,"y":316,"w":143,"h":66}, + "frame": {"x":1278,"y":1990,"w":190,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":393,"y":803,"w":143,"h":66}, + "spriteSourceSize": {"x":491,"y":1150,"w":190,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/RightLegs1KneelClosed.png": +"Models/Body/ArmRightWristtie.png": { - "frame": {"x":923,"y":316,"w":143,"h":66}, + "frame": {"x":1265,"y":829,"w":134,"h":204}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":393,"y":803,"w":143,"h":66}, + "spriteSourceSize": {"x":465,"y":430,"w":134,"h":204}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Blindfold/Cloth.png": +"Models/Body/ForeArmLeftCrossed.png": { - "frame": {"x":1060,"y":586,"w":225,"h":79}, + "frame": {"x":357,"y":1361,"w":528,"h":637}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":48,"y":152,"w":225,"h":79}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":216,"y":91,"w":528,"h":637}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/ArmLeftFront.png": +"Models/Bunny/ForeGloveLeftCrossed.png": { - "frame": {"x":270,"y":1356,"w":555,"h":639}, + "frame": {"x":427,"y":678,"w":528,"h":637}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":555,"h":639}, + "spriteSourceSize": {"x":216,"y":91,"w":528,"h":637}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/ForeArmLeftCrossed.png": +"Models/Cape/CapeKneel.png": { - "frame": {"x":829,"y":1356,"w":528,"h":637}, + "frame": {"x":1345,"y":222,"w":330,"h":533}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":528,"h":637}, + "spriteSourceSize": {"x":495,"y":409,"w":330,"h":533}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/HeadBigGag.png": +"Models/Catsuit/TorsoBand.png": { - "frame": {"x":1424,"y":386,"w":218,"h":279}, + "frame": {"x":723,"y":1319,"w":200,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":505,"y":120,"w":218,"h":279}, + "spriteSourceSize": {"x":484,"y":656,"w":200,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/ForeGloveLeftCrossed.png": +"Models/Chastity/BraProtoDisplay.png": { - "frame": {"x":1045,"y":669,"w":528,"h":637}, + "frame": {"x":1624,"y":1990,"w":123,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":528,"h":637}, + "spriteSourceSize": {"x":509,"y":562,"w":123,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cape/CapeHogtie.png": +"Models/Collars/FutureBand.png": { - "frame": {"x":3,"y":1368,"w":263,"h":674}, + "frame": {"x":1943,"y":1680,"w":96,"h":34}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":336,"y":415,"w":263,"h":674}, + "spriteSourceSize": {"x":580,"y":390,"w":96,"h":34}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/ElbowRightBoxtie.png": +"Models/Collars/NeckCorsetRim.png": { - "frame": {"x":1361,"y":1440,"w":28,"h":26}, + "frame": {"x":240,"y":2003,"w":131,"h":42}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":460,"y":604,"w":28,"h":26}, + "spriteSourceSize": {"x":561,"y":424,"w":131,"h":42}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/ElbowRightBoxtie.png": +"Models/CrystalCuffs/AnkleRightClosed.png": { - "frame": {"x":1361,"y":1470,"w":28,"h":26}, + "frame": {"x":1970,"y":1990,"w":75,"h":51}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":460,"y":604,"w":28,"h":26}, + "spriteSourceSize": {"x":540,"y":1424,"w":75,"h":51}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/CuffLongMittenLeftFree.png": +"Models/CrystalCuffs/ElbowRightBoxtie.png": { - "frame": {"x":923,"y":3,"w":160,"h":309}, + "frame": {"x":2017,"y":1786,"w":28,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":699,"y":496,"w":160,"h":309}, + "spriteSourceSize": {"x":460,"y":604,"w":28,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/LongMittenRightFree.png": +"Models/CrystalCuffs/ThighRightSpread.png": { - "frame": {"x":1289,"y":575,"w":116,"h":90}, + "frame": {"x":1265,"y":1216,"w":134,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":372,"y":613,"w":116,"h":90}, + "spriteSourceSize": {"x":456,"y":1020,"w":134,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/StrapsLongMittenRightBoxtie.png": +"Models/Cuffs/ElbowRightBoxtie.png": { - "frame": {"x":1060,"y":386,"w":23,"h":59}, + "frame": {"x":2017,"y":1816,"w":28,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":464,"y":620,"w":23,"h":59}, + "spriteSourceSize": {"x":460,"y":604,"w":28,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayElbowLeftFree.png": +"Models/Cuffs/WristLeftFront.png": { - "frame": {"x":1361,"y":1500,"w":27,"h":45}, + "frame": {"x":1900,"y":1990,"w":66,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":759,"y":589,"w":27,"h":45}, + "spriteSourceSize": {"x":623,"y":542,"w":66,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockAnkleLeftSpread.png": +"Models/CyberCuffs/DisplayLinkCollar.png": { - "frame": {"x":1060,"y":508,"w":23,"h":35}, + "frame": {"x":693,"y":372,"w":79,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":713,"y":1444,"w":23,"h":35}, + "spriteSourceSize": {"x":584,"y":398,"w":79,"h":24}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockAnkleRightSpread.png": +"Models/CyberCuffs/ElbowRightYoked.png": { - "frame": {"x":1060,"y":547,"w":23,"h":35}, + "frame": {"x":1271,"y":222,"w":70,"h":91}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":511,"y":1444,"w":23,"h":35}, + "spriteSourceSize": {"x":394,"y":505,"w":70,"h":91}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockThighRightClosed.png": +"Models/CyberLink/AnkleLinkSpread.png": { - "frame": {"x":1361,"y":1356,"w":28,"h":45}, + "frame": {"x":846,"y":372,"w":129,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":487,"y":1033,"w":28,"h":45}, + "spriteSourceSize": {"x":558,"y":1446,"w":129,"h":23}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberLink/AnkleLinkSpread.png": +"Models/CyberMitts/MittenRightFree.png": { - "frame": {"x":1916,"y":1283,"w":129,"h":23}, + "frame": {"x":1679,"y":302,"w":68,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":558,"y":1446,"w":129,"h":23}, + "spriteSourceSize": {"x":299,"y":557,"w":68,"h":95}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/ArmLongMittenRightFree.png": +"Models/DivineBelt/LockBeltPlate.png": { - "frame": {"x":1289,"y":575,"w":116,"h":90}, + "frame": {"x":1679,"y":491,"w":68,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":372,"y":613,"w":116,"h":90}, + "spriteSourceSize": {"x":538,"y":770,"w":68,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/StrapsLongMittenRightBoxtie.png": +"Models/DivineCuffs/ElbowLeftLockWristtie.png": { - "frame": {"x":1060,"y":386,"w":23,"h":59}, + "frame": {"x":2017,"y":1912,"w":27,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":464,"y":620,"w":23,"h":59}, + "spriteSourceSize": {"x":720,"y":611,"w":27,"h":59}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BraMetal1.png": +"Models/DivineCuffs/ThighLeftLockClosed.png": { - "frame": {"x":1750,"y":1974,"w":277,"h":71}, + "frame": {"x":1271,"y":678,"w":70,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":436,"y":569,"w":277,"h":71}, + "spriteSourceSize": {"x":622,"y":1033,"w":70,"h":95}, "sourceSize": {"w":1240,"h":1754} }, "Models/DivineCuffs/WristRightDecoFront.png": { - "frame": {"x":1600,"y":1997,"w":146,"h":42}, + "frame": {"x":90,"y":2003,"w":146,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":392,"y":541,"w":146,"h":42}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/LaceChestDecoCrystal.png": +"Models/Dress/MageSkirt.png": { - "frame": {"x":1060,"y":449,"w":23,"h":55}, + "frame": {"x":591,"y":3,"w":384,"h":365}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":563,"y":560,"w":23,"h":55}, + "spriteSourceSize": {"x":404,"y":747,"w":384,"h":365}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MageCollarHardware.png": +"Models/Elf/CrystalShoeLeftSpread.png": { - "frame": {"x":591,"y":1312,"w":100,"h":40}, + "frame": {"x":2017,"y":1846,"w":27,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":573,"y":408,"w":100,"h":40}, + "spriteSourceSize": {"x":678,"y":1497,"w":27,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ears/ElfEarringsFront.png": +"Models/EyesDai1/BrowsSurprised.png": { - "frame": {"x":2031,"y":1974,"w":14,"h":36}, + "frame": {"x":650,"y":372,"w":39,"h":25}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":702,"y":326,"w":14,"h":36}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":526,"y":247,"w":39,"h":25}, + "sourceSize": {"w":738,"h":409} }, -"Models/FaceDask/EyesNeutral.png": +"Models/EyesK4/Eyes2Dazed.png": { - "frame": {"x":1153,"y":1997,"w":160,"h":48}, + "frame": {"x":1679,"y":685,"w":68,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":52,"y":168,"w":160,"h":48}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":614,"y":264,"w":68,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/GagCloth/Cleave.png": +"Models/EyesK4/WhitesEyes2Dazed.png": { - "frame": {"x":479,"y":1999,"w":157,"h":46}, + "frame": {"x":1679,"y":733,"w":68,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":68,"y":238,"w":157,"h":46}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":614,"y":264,"w":68,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/GagLeather/BallStrap.png": +"Models/FaceDask/EyesDazed.png": { - "frame": {"x":1087,"y":1310,"w":149,"h":42}, + "frame": {"x":765,"y":2002,"w":147,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":68,"y":233,"w":149,"h":42}, + "spriteSourceSize": {"x":54,"y":173,"w":147,"h":43}, "sourceSize": {"w":321,"h":332} }, -"Models/GagLeather/BigBallStrap.png": +"Models/FutureHarness/MetalLower.png": { - "frame": {"x":1240,"y":1310,"w":149,"h":42}, + "frame": {"x":1459,"y":781,"w":173,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":68,"y":233,"w":149,"h":42}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":485,"y":799,"w":173,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FutureHarness/MetalMid.png": +{ + "frame": {"x":415,"y":1320,"w":93,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":519,"y":713,"w":93,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLatex/NeckCorsetRim.png": +{ + "frame": {"x":240,"y":2003,"w":131,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":561,"y":424,"w":131,"h":42}, + "sourceSize": {"w":1240,"h":1754} }, "Models/GagMetal/Rim.png": { - "frame": {"x":1361,"y":1405,"w":28,"h":31}, + "frame": {"x":2017,"y":1718,"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":916,"y":2002,"w":139,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":71,"y":240,"w":139,"h":43}, + "sourceSize": {"w":321,"h":332} +}, "Models/Gothic/LaceLowerCrotchStrap.png": { - "frame": {"x":1393,"y":1310,"w":642,"h":246}, + "frame": {"x":1403,"y":829,"w":642,"h":246}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":277,"y":861,"w":642,"h":246}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/BowFrills.png": +"Models/Hair/Bow.png": { - "frame": {"x":1646,"y":386,"w":399,"h":143}, + "frame": {"x":979,"y":317,"w":362,"h":357}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":103,"w":399,"h":143}, + "spriteSourceSize": {"x":454,"y":97,"w":362,"h":357}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/Straight.png": +"Models/Hair2/Hair5_FrontE.png": { - "frame": {"x":1750,"y":1560,"w":295,"h":410}, + "frame": {"x":1265,"y":1037,"w":134,"h":175}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":110,"w":295,"h":410}, + "spriteSourceSize": {"x":489,"y":127,"w":134,"h":175}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair3_FrontA.png": +"Models/Jacket/LatexBand.png": { - "frame": {"x":1361,"y":1560,"w":385,"h":433}, + "frame": {"x":723,"y":1319,"w":200,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":421,"y":97,"w":385,"h":433}, + "spriteSourceSize": {"x":484,"y":656,"w":200,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/TallLeftKneelClosed.png": +"Models/Kigu/Brows.png": { - "frame": {"x":1577,"y":898,"w":460,"h":182}, + "frame": {"x":1265,"y":1291,"w":127,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":460,"y":906,"w":460,"h":182}, + "spriteSourceSize": {"x":529,"y":243,"w":127,"h":24}, "sourceSize": {"w":1240,"h":1754} }, "Models/Labcoat/CapeHogtie.png": { - "frame": {"x":165,"y":3,"w":263,"h":674}, + "frame": {"x":3,"y":683,"w":263,"h":674}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":336,"y":415,"w":263,"h":674}, "sourceSize": {"w":1240,"h":1754} }, +"Models/Labcoat/CapeKneel.png": +{ + "frame": {"x":1345,"y":222,"w":330,"h":533}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":495,"y":409,"w":330,"h":533}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/CoatKneel.png": +{ + "frame": {"x":1038,"y":1361,"w":637,"h":625}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":407,"w":637,"h":625}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/ArmsBelts.png": +{ + "frame": {"x":1271,"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/Leash/Leash.png": { - "frame": {"x":432,"y":3,"w":83,"h":671}, + "frame": {"x":3,"y":1361,"w":83,"h":671}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":556,"y":436,"w":83,"h":671}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/AnkleRightSpread.png": +"Models/LeatherCuffs/BandWristLeftYoked.png": { - "frame": {"x":1523,"y":1997,"w":73,"h":48}, + "frame": {"x":591,"y":372,"w":55,"h":25}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":491,"y":1422,"w":73,"h":48}, + "spriteSourceSize": {"x":879,"y":402,"w":55,"h":25}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandThighLeftKneelClosed.png": +"Models/LeatherCuffs/WristLeftFront.png": { - "frame": {"x":1646,"y":533,"w":149,"h":132}, + "frame": {"x":1679,"y":566,"w":68,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":488,"y":860,"w":149,"h":132}, + "spriteSourceSize": {"x":623,"y":540,"w":68,"h":58}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareThighLeftSpread.png": +"Models/LeatherCuffs/WristRightFront.png": { - "frame": {"x":1317,"y":1997,"w":103,"h":48}, + "frame": {"x":1827,"y":1990,"w":69,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":642,"y":1031,"w":103,"h":48}, + "spriteSourceSize": {"x":469,"y":541,"w":69,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LeftLegsBeltsKneel.png": +"Models/LeatherLeotard/StrapsHardware.png": { - "frame": {"x":1087,"y":3,"w":333,"h":282}, + "frame": {"x":927,"y":1319,"w":175,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":393,"y":812,"w":333,"h":282}, + "spriteSourceSize": {"x":481,"y":764,"w":175,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LeftLegsBeltsKneelClosed.png": +"Models/Maid/StripeSockRightSpread.png": { - "frame": {"x":1087,"y":289,"w":333,"h":282}, + "frame": {"x":270,"y":1320,"w":141,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":393,"y":812,"w":333,"h":282}, + "spriteSourceSize": {"x":451,"y":974,"w":141,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeSockRightKneel.png": +"Models/MaidKnightLight/SockLeftClosed.png": { - "frame": {"x":799,"y":1312,"w":95,"h":40}, + "frame": {"x":90,"y":1361,"w":263,"h":638}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":398,"y":840,"w":95,"h":40}, + "spriteSourceSize": {"x":461,"y":986,"w":263,"h":638}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeSockRightKneelClosed.png": +"Models/MaidKnightLight/SockLeftSpread.png": { - "frame": {"x":898,"y":1312,"w":95,"h":40}, + "frame": {"x":270,"y":678,"w":153,"h":638}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":398,"y":840,"w":95,"h":40}, + "spriteSourceSize": {"x":614,"y":995,"w":153,"h":638}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/SockRightSpread.png": +"Models/MaidKnightLight/SockRightClosed.png": { - "frame": {"x":519,"y":3,"w":144,"h":662}, + "frame": {"x":889,"y":1361,"w":145,"h":637}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":994,"w":144,"h":662}, + "spriteSourceSize": {"x":456,"y":986,"w":145,"h":637}, "sourceSize": {"w":1240,"h":1754} }, "Models/Mittens/ForeLongMittenLeftCrossed.png": { - "frame": {"x":1045,"y":669,"w":528,"h":637}, + "frame": {"x":427,"y":678,"w":528,"h":637}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":216,"y":91,"w":528,"h":637}, "sourceSize": {"w":1240,"h":1754} }, +"Models/Petsuit/ArmsBelts.png": +{ + "frame": {"x":1271,"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/TopArmHarnessUnderbust.png": +{ + "frame": {"x":375,"y":2002,"w":233,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":583,"w":233,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopArmsUp.png": +{ + "frame": {"x":1679,"y":3,"w":366,"h":195}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":240,"w":366,"h":195}, + "sourceSize": {"w":1240,"h":1754} +}, "Models/RobeOfChastity/Cape.png": { - "frame": {"x":165,"y":681,"w":422,"h":671}, + "frame": {"x":165,"y":3,"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": +"Models/RobeOfChastity/GoldBaseClosed.png": { - "frame": {"x":270,"y":1999,"w":205,"h":46}, + "frame": {"x":979,"y":3,"w":288,"h":310}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":479,"y":660,"w":205,"h":46}, + "spriteSourceSize": {"x":448,"y":606,"w":288,"h":310}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/LeftFrogtieHogtie.png": +"Models/Robes/SleeveRightYoked.png": { - "frame": {"x":854,"y":1997,"w":295,"h":48}, + "frame": {"x":1679,"y":1361,"w":260,"h":353}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":930,"w":295,"h":48}, + "spriteSourceSize": {"x":243,"y":372,"w":260,"h":353}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Thigh2KneelClosedOver.png": +"Models/Robes/SleeveRightYokedTight.png": { - "frame": {"x":1915,"y":533,"w":130,"h":130}, + "frame": {"x":1679,"y":1361,"w":260,"h":353}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":468,"y":871,"w":130,"h":130}, + "spriteSourceSize": {"x":243,"y":372,"w":260,"h":353}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Thigh3Closed.png": +"Models/Rope/AnklesClosed.png": { - "frame": {"x":854,"y":1997,"w":295,"h":48}, + "frame": {"x":1472,"y":1990,"w":148,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":930,"w":295,"h":48}, + "spriteSourceSize": {"x":514,"y":1519,"w":148,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/HemLeftTied.png": +"Models/Rope/Calf2ClosedOver.png": { - "frame": {"x":695,"y":1312,"w":100,"h":40}, + "frame": {"x":612,"y":2002,"w":149,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":707,"y":556,"w":100,"h":40}, + "spriteSourceSize": {"x":531,"y":1333,"w":149,"h":43}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/MaidSkirtKneel.png": +"Models/Rope/CuffsFront.png": { - "frame": {"x":1577,"y":669,"w":468,"h":225}, + "frame": {"x":1265,"y":781,"w":190,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":339,"y":731,"w":468,"h":225}, + "spriteSourceSize": {"x":486,"y":536,"w":190,"h":44}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/MaidSkirtKneelCrotchStrap.png": +"Models/Rope/HarnessLowerStrap.png": { - "frame": {"x":1577,"y":669,"w":468,"h":225}, + "frame": {"x":1679,"y":202,"w":68,"h":96}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":339,"y":731,"w":468,"h":225}, + "spriteSourceSize": {"x":540,"y":825,"w":68,"h":96}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SMoonlight/PostureCollarLoop.png": +"Models/Rope/RightThigh3KneelClosedOver.png": { - "frame": {"x":2031,"y":2014,"w":14,"h":29}, + "frame": {"x":1106,"y":1319,"w":152,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":600,"y":399,"w":14,"h":29}, + "spriteSourceSize": {"x":399,"y":812,"w":152,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ElbowRightBoxtie.png": +"Models/Rope/Thigh1Closed.png": { - "frame": {"x":1424,"y":1997,"w":95,"h":48}, + "frame": {"x":512,"y":1319,"w":207,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":589,"w":95,"h":48}, + "spriteSourceSize": {"x":492,"y":1097,"w":207,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimElbowLeftBoxtie.png": +"Models/Rubber/ArmLeftWristtie.png": { - "frame": {"x":764,"y":1999,"w":86,"h":46}, + "frame": {"x":1943,"y":1079,"w":102,"h":320}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":687,"y":583,"w":86,"h":46}, + "spriteSourceSize": {"x":678,"y":424,"w":102,"h":320}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimThighRightClosed.png": +"Models/Rubber/ChestWristtie.png": { - "frame": {"x":640,"y":1999,"w":120,"h":46}, + "frame": {"x":1679,"y":1718,"w":334,"h":268}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":995,"w":120,"h":46}, + "spriteSourceSize": {"x":446,"y":360,"w":334,"h":268}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Tails/Fox.png": +"Models/Sailor/HemLeftUp.png": { - "frame": {"x":591,"y":669,"w":450,"h":639}, + "frame": {"x":1679,"y":401,"w":68,"h":86}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":507,"y":779,"w":450,"h":639}, + "spriteSourceSize": {"x":707,"y":350,"w":68,"h":86}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/BlouseLeftYoked.png": +"Models/Slayer/CapeStripeTied.png": { - "frame": {"x":667,"y":3,"w":252,"h":379}, + "frame": {"x":591,"y":401,"w":384,"h":273}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":585,"y":405,"w":252,"h":379}, + "spriteSourceSize": {"x":421,"y":422,"w":384,"h":273}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/FCollar.png": +"Models/SmoothHeels/LeftKneelClosed.png": { - "frame": {"x":997,"y":1312,"w":86,"h":40}, + "frame": {"x":1403,"y":1079,"w":536,"h":278}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":586,"y":390,"w":86,"h":40}, + "spriteSourceSize": {"x":384,"y":811,"w":536,"h":278}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegLeftKneelClosed.png": +"Models/SteelCuffs/RimWristRightFront.png": { - "frame": {"x":667,"y":386,"w":389,"h":279}, + "frame": {"x":1751,"y":1990,"w":72,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":386,"y":799,"w":389,"h":279}, + "spriteSourceSize": {"x":471,"y":540,"w":72,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegRightClosed.png": +"Models/Tails/Wolf.png": { - "frame": {"x":3,"y":688,"w":158,"h":676}, + "frame": {"x":959,"y":781,"w":302,"h":534}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":805,"w":158,"h":676}, + "spriteSourceSize": {"x":595,"y":412,"w":302,"h":534}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/StrapCover.png": +{ + "frame": {"x":1636,"y":781,"w":111,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":894,"w":111,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/FeetClosed.png": +{ + "frame": {"x":1751,"y":202,"w":293,"h":623}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":493,"y":976,"w":293,"h":623}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/TopBoxtie.png": +{ + "frame": {"x":959,"y":678,"w":308,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":587,"w":308,"h":99}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmLeftWristtie.png": +{ + "frame": {"x":1943,"y":1403,"w":102,"h":273}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":678,"y":487,"w":102,"h":273}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/StrapCover.png": +{ + "frame": {"x":1636,"y":781,"w":111,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":894,"w":111,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/Belt.png": +{ + "frame": {"x":1059,"y":1990,"w":215,"h":55}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":477,"y":665,"w":215,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegRightSpread.png": +"Models/Warrior/RimGloveLeftFree.png": { - "frame": {"x":3,"y":3,"w":158,"h":681}, + "frame": {"x":1679,"y":628,"w":68,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":803,"w":158,"h":681}, + "spriteSourceSize": {"x":789,"y":744,"w":68,"h":53}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/SkirtKneel.png": +"Models/Wolf/Module.png": { - "frame": {"x":1424,"y":3,"w":619,"h":379}, + "frame": {"x":2017,"y":1753,"w":28,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":273,"y":713,"w":619,"h":379}, + "spriteSourceSize": {"x":631,"y":402,"w":28,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRightClosed.png": +{ + "frame": {"x":3,"y":3,"w":158,"h":676}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":805,"w":158,"h":676}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/SkirtOverKneel.png": +"Models/WolfCatsuit/RimGloveLeftFree.png": { - "frame": {"x":1577,"y":1084,"w":335,"h":222}, + "frame": {"x":1679,"y":628,"w":68,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":489,"y":750,"w":335,"h":222}, + "spriteSourceSize": {"x":789,"y":744,"w":68,"h":53}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -551,7 +679,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas21.webp b/TextureAtlas/atlas21.webp index 2d1457430..aae38952a 100644 Binary files a/TextureAtlas/atlas21.webp and b/TextureAtlas/atlas21.webp differ diff --git a/TextureAtlas/atlas22.json b/TextureAtlas/atlas22.json index 9162a0a51..ef73c5053 100644 --- a/TextureAtlas/atlas22.json +++ b/TextureAtlas/atlas22.json @@ -1,376 +1,160 @@ {"frames": { -"Models/Armbinder/WolfHarness.png": +"Models/CrystalCuffs/ElbowLeftUp.png": { - "frame": {"x":330,"y":1439,"w":246,"h":146}, + "frame": {"x":1931,"y":490,"w":114,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":477,"y":412,"w":246,"h":146}, + "spriteSourceSize": {"x":717,"y":249,"w":114,"h":72}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/LegRightHogtie.png": +"Models/CyberCuffs/ElbowLeftUp.png": { - "frame": {"x":1885,"y":3,"w":160,"h":288}, + "frame": {"x":1928,"y":566,"w":117,"h":75}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":918,"w":160,"h":288}, + "spriteSourceSize": {"x":709,"y":262,"w":117,"h":75}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bra/StrapsTied.png": +"Models/CyberCuffs/ScreenAnkleLeftKneel.png": { - "frame": {"x":1352,"y":1805,"w":212,"h":100}, + "frame": {"x":266,"y":2022,"w":67,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":484,"y":423,"w":212,"h":100}, + "spriteSourceSize": {"x":701,"y":1012,"w":67,"h":23}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/HandRightYoked.png": +"Models/CyberCuffs/ScreenElbowLeftBoxtie.png": { - "frame": {"x":1828,"y":1719,"w":183,"h":326}, + "frame": {"x":1712,"y":1460,"w":37,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":183,"h":326}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Catsuit/SleevelessTopChest.png": -{ - "frame": {"x":310,"y":1190,"w":267,"h":245}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":446,"y":382,"w":267,"h":245}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Catsuit/TorsoUpperCrop.png": -{ - "frame": {"x":3,"y":1190,"w":303,"h":245}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":446,"y":382,"w":303,"h":245}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Chastity/ProtoLock.png": -{ - "frame": {"x":1208,"y":631,"w":20,"h":31}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":558,"y":820,"w":20,"h":31}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Collars/TrackingModule.png": -{ - "frame": {"x":2015,"y":1792,"w":27,"h":29}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":567,"y":402,"w":27,"h":29}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/CuffLongMittenRightFront.png": -{ - "frame": {"x":1247,"y":352,"w":27,"h":44}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":451,"y":510,"w":27,"h":44}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/StrapsForeLongMittenRightCrossed.png": -{ - "frame": {"x":1189,"y":985,"w":85,"h":83}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":430,"y":600,"w":85,"h":83}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/StrapsLongMittenRightCrossed.png": -{ - "frame": {"x":1189,"y":890,"w":85,"h":91}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":430,"y":592,"w":85,"h":91}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/DisplayThighRightClosed.png": -{ - "frame": {"x":1835,"y":762,"w":40,"h":55}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":479,"y":1028,"w":40,"h":55}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/DisplayWristRightCrossed.png": -{ - "frame": {"x":1482,"y":1909,"w":40,"h":16}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":655,"y":591,"w":40,"h":16}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/DisplayWristRightFront.png": -{ - "frame": {"x":2015,"y":1950,"w":25,"h":40}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":471,"y":536,"w":25,"h":40}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/ElbowRightFront.png": -{ - "frame": {"x":1247,"y":228,"w":27,"h":58}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":431,"y":588,"w":27,"h":58}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/LockElbowLeftUp.png": -{ - "frame": {"x":1199,"y":666,"w":27,"h":40}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":718,"y":267,"w":27,"h":40}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/LockElbowRightFront.png": -{ - "frame": {"x":1208,"y":554,"w":20,"h":35}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":426,"y":602,"w":20,"h":35}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/LockElbowRightUp.png": -{ - "frame": {"x":2015,"y":1994,"w":25,"h":40}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":526,"y":258,"w":25,"h":40}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/ScreenElbowRightBoxtie.png": -{ - "frame": {"x":1247,"y":400,"w":27,"h":41}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":450,"y":591,"w":27,"h":41}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/ScreenThighRightSpread.png": -{ - "frame": {"x":580,"y":1514,"w":57,"h":71}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":470,"y":998,"w":57,"h":71}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberHeels/GlowBalletRightSpread.png": -{ - "frame": {"x":1232,"y":445,"w":42,"h":212}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":472,"y":1431,"w":42,"h":212}, + "spriteSourceSize": {"x":742,"y":570,"w":37,"h":62}, "sourceSize": {"w":1240,"h":1754} }, "Models/CyberHeels/ShinyBalletLeftHogtie.png": { - "frame": {"x":581,"y":1190,"w":59,"h":116}, + "frame": {"x":1986,"y":3,"w":59,"h":116}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":728,"y":785,"w":59,"h":116}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CapForeLongMittenRightFront.png": -{ - "frame": {"x":1199,"y":812,"w":75,"h":74}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":513,"y":449,"w":75,"h":74}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/StrapsForeLongMittenRightCrossed.png": -{ - "frame": {"x":1189,"y":985,"w":85,"h":83}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":430,"y":600,"w":85,"h":83}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/StrapsLongMittenRightCrossed.png": +"Models/DivineGag/MuzzleGoldClean.png": { - "frame": {"x":1189,"y":890,"w":85,"h":91}, + "frame": {"x":1931,"y":402,"w":114,"h":84}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":430,"y":592,"w":85,"h":91}, + "spriteSourceSize": {"x":572,"y":281,"w":114,"h":84}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperCuffLongMittenRightFront.png": -{ - "frame": {"x":1247,"y":352,"w":27,"h":44}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":451,"y":510,"w":27,"h":44}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/AnkleLeftLockBandClosed.png": -{ - "frame": {"x":1199,"y":753,"w":27,"h":36}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":661,"y":1458,"w":27,"h":36}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/AnkleRightLockBandClosed.png": -{ - "frame": {"x":2015,"y":1719,"w":27,"h":35}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":514,"y":1454,"w":27,"h":35}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ElbowLeftDecoCleanFree.png": -{ - "frame": {"x":559,"y":865,"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": +"Models/Dress/BlouseSkirtLoneKneel.png": { - "frame": {"x":559,"y":904,"w":81,"h":35}, + "frame": {"x":1042,"y":1395,"w":541,"h":600}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":699,"y":605,"w":81,"h":35}, + "spriteSourceSize": {"x":288,"y":390,"w":541,"h":600}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftLockBandFree.png": +"Models/Elf/ShoeRightKneel.png": { - "frame": {"x":1199,"y":793,"w":14,"h":15}, + "frame": {"x":1245,"y":1251,"w":76,"h":108}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":778,"y":619,"w":14,"h":15}, + "spriteSourceSize": {"x":320,"y":849,"w":76,"h":108}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftLockBoxtie.png": +"Models/EyesK2/EyesAngry.png": { - "frame": {"x":1306,"y":1284,"w":42,"h":77}, + "frame": {"x":930,"y":2001,"w":63,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":744,"y":574,"w":42,"h":77}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":517,"y":269,"w":63,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/DivineCuffs/ElbowLeftLockFree.png": +"Models/EyesK2/EyesDazed.png": { - "frame": {"x":1247,"y":290,"w":27,"h":58}, + "frame": {"x":997,"y":2001,"w":63,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":766,"y":588,"w":27,"h":58}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":516,"y":269,"w":63,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/DivineCuffs/ElbowLeftLockUp.png": +"Models/EyesK3/Eyes2Neutral.png": { - "frame": {"x":1306,"y":1202,"w":42,"h":78}, + "frame": {"x":794,"y":2001,"w":64,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":708,"y":216,"w":42,"h":78}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":616,"y":260,"w":64,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/DivineCuffs/ElbowLeftLockWristtie.png": +"Models/EyesK3/WhitesEyes2Neutral.png": { - "frame": {"x":1248,"y":165,"w":27,"h":59}, + "frame": {"x":862,"y":2001,"w":64,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":720,"y":611,"w":27,"h":59}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":616,"y":260,"w":64,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/Dress/BlouseSkirtKneel.png": +"Models/EyesK4/Eyes2Surprised.png": { - "frame": {"x":732,"y":1439,"w":541,"h":599}, + "frame": {"x":572,"y":2001,"w":70,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":288,"y":391,"w":541,"h":599}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":614,"y":264,"w":70,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/Dress/BlouseSkirtLoneKneel.png": +"Models/EyesK4/WhitesEyes2Neutral.png": { - "frame": {"x":644,"y":835,"w":541,"h":600}, + "frame": {"x":646,"y":2001,"w":70,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":288,"y":390,"w":541,"h":600}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":614,"y":264,"w":70,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/Dress/MageCollarCrystal.png": +"Models/EyesK4/WhitesEyes2Surprised.png": { - "frame": {"x":2015,"y":1855,"w":27,"h":23}, + "frame": {"x":720,"y":2001,"w":70,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":597,"y":421,"w":27,"h":23}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":614,"y":264,"w":70,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/Dress/ShoeRightKneel.png": +"Models/FaceKjus/BlushHigh.png": { - "frame": {"x":559,"y":632,"w":81,"h":118}, + "frame": {"x":1587,"y":1395,"w":162,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":319,"y":836,"w":81,"h":118}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":529,"y":289,"w":162,"h":61}, + "sourceSize": {"w":858,"h":486} }, -"Models/Dress/SkirtKneel.png": +"Models/Furniture/BedStrapsHogtie.png": { - "frame": {"x":3,"y":632,"w":552,"h":352}, + "frame": {"x":664,"y":302,"w":599,"h":614}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":273,"y":740,"w":552,"h":352}, + "spriteSourceSize": {"x":172,"y":468,"w":599,"h":614}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/CrystalShoeLeftSpread.png": +"Models/Gothic/HemLower.png": { - "frame": {"x":1248,"y":99,"w":27,"h":62}, + "frame": {"x":1325,"y":3,"w":657,"h":101}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":678,"y":1497,"w":27,"h":62}, + "spriteSourceSize": {"x":270,"y":1069,"w":657,"h":101}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/Skirt.png": +"Models/Gothic/HemLowerCrotchStrap.png": { - "frame": {"x":1831,"y":1079,"w":214,"h":316}, + "frame": {"x":664,"y":3,"w":657,"h":295}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":436,"y":781,"w":214,"h":316}, + "spriteSourceSize": {"x":270,"y":860,"w":657,"h":295}, "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceDask/Eyes2Angry.png": -{ - "frame": {"x":1278,"y":1035,"w":70,"h":40}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":147,"y":168,"w":70,"h":40}, - "sourceSize": {"w":321,"h":332} -}, -"Models/FaceKjus/Brows2Annoyed.png": -{ - "frame": {"x":1526,"y":1909,"w":38,"h":16}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":609,"y":261,"w":38,"h":16}, - "sourceSize": {"w":717,"h":405} -}, -"Models/FaceKjus/Brows2Neutral.png": -{ - "frame": {"x":559,"y":943,"w":81,"h":24}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":575,"y":243,"w":81,"h":24}, - "sourceSize": {"w":725,"h":424} -}, -"Models/FaceKoi/Brows2Sad.png": -{ - "frame": {"x":1430,"y":1909,"w":48,"h":16}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":140,"y":130,"w":48,"h":16}, - "sourceSize": {"w":321,"h":332} -}, "Models/Gothic/HemLowerKneel.png": { - "frame": {"x":644,"y":219,"w":599,"h":183}, + "frame": {"x":1325,"y":564,"w":599,"h":183}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":296,"y":905,"w":599,"h":183}, @@ -378,418 +162,402 @@ }, "Models/Gothic/HemLowerKneelCrotchStrap.png": { - "frame": {"x":1278,"y":399,"w":598,"h":236}, + "frame": {"x":1325,"y":751,"w":598,"h":236}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":297,"y":825,"w":598,"h":236}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Gothic/HemUpper.png": -{ - "frame": {"x":644,"y":99,"w":600,"h":116}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":287,"y":941,"w":600,"h":116}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Gothic/LaceLower.png": +"Models/Gothic/LaceLowerKneelCrotchStrap..png": { - "frame": {"x":644,"y":3,"w":631,"h":92}, + "frame": {"x":1325,"y":991,"w":593,"h":148}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":283,"y":1029,"w":631,"h":92}, + "spriteSourceSize": {"x":296,"y":847,"w":593,"h":148}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Gothic/LaceLowerKneel.png": +"Models/Gothic/Lines.png": { - "frame": {"x":644,"y":406,"w":584,"h":92}, + "frame": {"x":3,"y":3,"w":657,"h":499}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":305,"y":915,"w":584,"h":92}, + "spriteSourceSize": {"x":270,"y":671,"w":657,"h":499}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Gothic/LaceUpper.png": -{ - "frame": {"x":1278,"y":744,"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": +"Models/Gothic/LinesKneelCrotchStrap..png": { - "frame": {"x":644,"y":659,"w":551,"h":172}, + "frame": {"x":1325,"y":168,"w":602,"h":392}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":322,"y":821,"w":551,"h":172}, + "spriteSourceSize": {"x":295,"y":669,"w":602,"h":392}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Gothic/LinesKneelCrotchStrap..png": +"Models/Hair/StraightBangs.png": { - "frame": {"x":1279,"y":3,"w":602,"h":392}, + "frame": {"x":3,"y":506,"w":295,"h":399}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":295,"y":669,"w":602,"h":392}, + "spriteSourceSize": {"x":493,"y":110,"w":295,"h":399}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/Curly.png": +"Models/Hair/TwintailRight.png": { - "frame": {"x":330,"y":1589,"w":310,"h":408}, + "frame": {"x":1927,"y":776,"w":118,"h":615}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":478,"y":112,"w":310,"h":408}, + "spriteSourceSize": {"x":662,"y":131,"w":118,"h":615}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/TwintailLeft.png": +"Models/Hair2/Hair3_Back.png": { - "frame": {"x":644,"y":1439,"w":84,"h":602}, + "frame": {"x":1587,"y":1540,"w":446,"h":505}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":480,"y":141,"w":84,"h":602}, + "spriteSourceSize": {"x":423,"y":124,"w":446,"h":505}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair2_FrontC.png": +"Models/Harness/BeltsMid.png": { - "frame": {"x":1277,"y":1756,"w":71,"h":169}, + "frame": {"x":1064,"y":1999,"w":205,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":157,"w":71,"h":169}, + "spriteSourceSize": {"x":480,"y":654,"w":205,"h":46}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/FlatBalletRightClosed.png": +"Models/Harness/BeltsStrapClosed.png": { - "frame": {"x":1277,"y":1438,"w":71,"h":314}, + "frame": {"x":1931,"y":168,"w":49,"h":230}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":525,"y":1365,"w":71,"h":314}, + "spriteSourceSize": {"x":552,"y":690,"w":49,"h":230}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/CrotchBeltExtra.png": +"Models/Heels/BalletLeftKneelClosed.png": { - "frame": {"x":1306,"y":1079,"w":42,"h":119}, + "frame": {"x":664,"y":920,"w":263,"h":146}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":554,"y":797,"w":42,"h":119}, + "spriteSourceSize": {"x":667,"y":906,"w":263,"h":146}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Labcoat/CoatKneel.png": +"Models/Heels/FlatBalletLeftKneelClosed.png": { - "frame": {"x":3,"y":3,"w":637,"h":625}, + "frame": {"x":664,"y":920,"w":263,"h":146}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":407,"w":637,"h":625}, + "spriteSourceSize": {"x":667,"y":906,"w":263,"h":146}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LatexPetsuit/GlowLegsHogtie.png": +"Models/Jacket/BeltsArmsBoxtie.png": { - "frame": {"x":1352,"y":1215,"w":472,"h":586}, + "frame": {"x":931,"y":1191,"w":310,"h":200}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":376,"y":689,"w":472,"h":586}, + "spriteSourceSize": {"x":463,"y":518,"w":310,"h":200}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LatexPetsuit/LegsBeltsKneel.png": +"Models/LeatherCuffs/BandAnkleRightSpread.png": { - "frame": {"x":1835,"y":821,"w":210,"h":254}, + "frame": {"x":1245,"y":1363,"w":70,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":305,"y":812,"w":210,"h":254}, + "spriteSourceSize": {"x":492,"y":1433,"w":70,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LatexPetsuit/LegsBeltsKneelClosed.png": +"Models/LeatherCuffs/BowCollar.png": { - "frame": {"x":1835,"y":821,"w":210,"h":254}, + "frame": {"x":1928,"y":720,"w":117,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":305,"y":812,"w":210,"h":254}, + "spriteSourceSize": {"x":548,"y":398,"w":117,"h":52}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Leash/LeashPulled.png": +"Models/LeatherCuffs/ThighRightClosed.png": { - "frame": {"x":1278,"y":639,"w":560,"h":101}, + "frame": {"x":1928,"y":645,"w":117,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":49,"y":435,"w":560,"h":101}, + "spriteSourceSize": {"x":472,"y":1030,"w":117,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/AnkleLeftKneel.png": +"Models/LeatherPetsuit/Arms.png": { - "frame": {"x":581,"y":1429,"w":59,"h":81}, + "frame": {"x":524,"y":1070,"w":403,"h":321}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":705,"y":947,"w":59,"h":81}, + "spriteSourceSize": {"x":396,"y":400,"w":403,"h":321}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandAnkleLeftKneelClosed.png": +"Models/Maid/SkirtOverKneel.png": { - "frame": {"x":1208,"y":502,"w":20,"h":48}, + "frame": {"x":302,"y":736,"w":358,"h":176}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":727,"y":949,"w":20,"h":48}, + "spriteSourceSize": {"x":445,"y":801,"w":358,"h":176}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BowBellCollar.png": +"Models/MaidKnightLight/HeadbandRibbon.png": { - "frame": {"x":2015,"y":1825,"w":27,"h":26}, + "frame": {"x":1267,"y":862,"w":54,"h":138}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":595,"y":399,"w":27,"h":26}, + "spriteSourceSize": {"x":701,"y":196,"w":54,"h":138}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareWristRightFree.png": +"Models/Mittens/LeatherRightYoked.png": { - "frame": {"x":2015,"y":1882,"w":27,"h":17}, + "frame": {"x":1927,"y":1395,"w":90,"h":141}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":376,"y":635,"w":27,"h":17}, + "spriteSourceSize": {"x":298,"y":294,"w":90,"h":141}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/ArmsLaces.png": +"Models/Mittens/PawLeftYoked.png": { - "frame": {"x":1232,"y":661,"w":42,"h":147}, + "frame": {"x":1984,"y":123,"w":61,"h":73}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":729,"y":507,"w":42,"h":147}, + "spriteSourceSize": {"x":859,"y":313,"w":61,"h":73}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LockRightFree.png": +"Models/Ninja/LegLeftHogtie.png": { - "frame": {"x":2015,"y":1758,"w":27,"h":30}, + "frame": {"x":300,"y":1395,"w":171,"h":604}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":371,"y":607,"w":27,"h":30}, + "spriteSourceSize": {"x":563,"y":962,"w":171,"h":604}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/ZipperLeftFree.png": +"Models/Robes/ShoeLeftHogtie.png": { - "frame": {"x":581,"y":1310,"w":59,"h":115}, + "frame": {"x":1984,"y":274,"w":51,"h":124}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":796,"y":669,"w":59,"h":115}, + "spriteSourceSize": {"x":731,"y":798,"w":51,"h":124}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/KneeRightKneel.png": +"Models/Robes/SkirtKneel.png": { - "frame": {"x":1885,"y":295,"w":160,"h":258}, + "frame": {"x":1325,"y":1143,"w":424,"h":248}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":308,"y":806,"w":160,"h":258}, + "spriteSourceSize": {"x":377,"y":716,"w":424,"h":248}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/KneeRightKneelClosed.png": +"Models/Robes/SleeveRightBoxtie.png": { - "frame": {"x":1885,"y":295,"w":160,"h":258}, + "frame": {"x":1267,"y":302,"w":54,"h":276}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":308,"y":806,"w":160,"h":258}, + "spriteSourceSize": {"x":450,"y":491,"w":54,"h":276}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Petsuit/LegsBeltsKneel.png": +"Models/Robes/SleeveRightBoxtieRopesUpper.png": { - "frame": {"x":1835,"y":821,"w":210,"h":254}, + "frame": {"x":1267,"y":582,"w":54,"h":276}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":305,"y":812,"w":210,"h":254}, + "spriteSourceSize": {"x":450,"y":491,"w":54,"h":276}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Petsuit/LegsBeltsKneelClosed.png": +"Models/Robes/SleeveRightBoxtieTight.png": { - "frame": {"x":1835,"y":821,"w":210,"h":254}, + "frame": {"x":1267,"y":302,"w":54,"h":276}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":305,"y":812,"w":210,"h":254}, + "spriteSourceSize": {"x":450,"y":491,"w":54,"h":276}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/CrotchropeKneel.png": +"Models/Rope/Belt.png": { - "frame": {"x":1568,"y":1942,"w":256,"h":89}, + "frame": {"x":1273,"y":1999,"w":205,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":740,"w":256,"h":89}, + "spriteSourceSize": {"x":479,"y":660,"w":205,"h":46}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/CuffsFront.png": +"Models/Rope/Calf3KneelClosed.png": { - "frame": {"x":330,"y":2001,"w":190,"h":44}, + "frame": {"x":1984,"y":200,"w":61,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":486,"y":536,"w":190,"h":44}, + "spriteSourceSize": {"x":515,"y":998,"w":61,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/AnkleLeftClosed.png": +"Models/Rope/Calf3KneelClosedOver.png": { - "frame": {"x":1189,"y":1079,"w":113,"h":355}, + "frame": {"x":1984,"y":200,"w":61,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":579,"y":1145,"w":113,"h":355}, + "spriteSourceSize": {"x":515,"y":998,"w":61,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/HemRight.png": +"Models/Rope/FrogThigh3Kneel.png": { - "frame": {"x":1199,"y":710,"w":27,"h":39}, + "frame": {"x":302,"y":506,"w":358,"h":226}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":490,"w":27,"h":39}, + "spriteSourceSize": {"x":372,"y":842,"w":358,"h":226}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/RibbonUp.png": +"Models/Rope/RightThigh1KneelClosedOver.png": { - "frame": {"x":1880,"y":557,"w":165,"h":260}, + "frame": {"x":461,"y":2003,"w":107,"h":42}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":525,"y":350,"w":165,"h":260}, + "spriteSourceSize": {"x":332,"y":908,"w":107,"h":42}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/Arms2.png": +"Models/Rubber/ArmLeftUp.png": { - "frame": {"x":3,"y":988,"w":322,"h":198}, + "frame": {"x":1753,"y":1143,"w":170,"h":393}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":452,"y":556,"w":322,"h":198}, + "spriteSourceSize": {"x":663,"y":167,"w":170,"h":393}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelChastity/BeltPadlockPin.png": +"Models/Rubber/FootLeftHogtie.png": { - "frame": {"x":1842,"y":639,"w":34,"h":119}, + "frame": {"x":1267,"y":1135,"w":54,"h":112}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":553,"y":734,"w":34,"h":119}, + "spriteSourceSize": {"x":727,"y":802,"w":54,"h":112}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/WristRightCrossed.png": +"Models/Sailor/SleeveLeftYoked.png": { - "frame": {"x":1306,"y":1365,"w":42,"h":69}, + "frame": {"x":548,"y":916,"w":112,"h":150}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":631,"y":596,"w":42,"h":69}, + "spriteSourceSize": {"x":717,"y":410,"w":112,"h":150}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallBallet/TallLeftKneel.png": +"Models/Slayer/CapeShoulderRight.png": { - "frame": {"x":1352,"y":1035,"w":475,"h":176}, + "frame": {"x":1587,"y":1460,"w":121,"h":76}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":911,"w":475,"h":176}, + "spriteSourceSize": {"x":460,"y":417,"w":121,"h":76}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/LegsClosed.png": +"Models/SteelCuffs/RimElbowLeftBoxtie.png": { - "frame": {"x":3,"y":1439,"w":323,"h":602}, + "frame": {"x":1482,"y":1999,"w":86,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":652,"w":323,"h":602}, + "spriteSourceSize": {"x":687,"y":583,"w":86,"h":46}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/StrapCover.png": +"Models/Succubus/SuccubusClawLeftFront.png": { - "frame": {"x":524,"y":2001,"w":111,"h":44}, + "frame": {"x":337,"y":2003,"w":120,"h":42}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":521,"y":894,"w":111,"h":44}, + "spriteSourceSize": {"x":531,"y":487,"w":120,"h":42}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/HandRightFree.png": +"Models/Succubus/SuccubusHornLight.png": { - "frame": {"x":559,"y":754,"w":81,"h":107}, + "frame": {"x":3,"y":2022,"w":259,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":276,"y":546,"w":81,"h":107}, + "spriteSourceSize": {"x":484,"y":152,"w":259,"h":23}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/StrapCover.png": +"Models/TallBallet/TallLegLeftKneel.png": { - "frame": {"x":524,"y":2001,"w":111,"h":44}, + "frame": {"x":931,"y":920,"w":332,"h":267}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":521,"y":894,"w":111,"h":44}, + "spriteSourceSize": {"x":382,"y":817,"w":332,"h":267}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/ArmbandFree.png": +"Models/TallSmoothHeels/TallLeftHogtie.png": { - "frame": {"x":1208,"y":593,"w":20,"h":34}, + "frame": {"x":1267,"y":1004,"w":54,"h":127}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":506,"w":20,"h":34}, + "spriteSourceSize": {"x":730,"y":792,"w":54,"h":127}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtRuffle.png": +"Models/TapeMed/FeetClosed.png": { - "frame": {"x":644,"y":502,"w":560,"h":153}, + "frame": {"x":3,"y":1395,"w":293,"h":623}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":322,"y":1234,"w":560,"h":153}, + "spriteSourceSize": {"x":493,"y":976,"w":293,"h":623}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtSplitKneel.png": +"Models/TapeMed/PetsuitTopTapedHands.png": { - "frame": {"x":3,"y":632,"w":552,"h":352}, + "frame": {"x":302,"y":916,"w":242,"h":84}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":273,"y":740,"w":552,"h":352}, + "spriteSourceSize": {"x":475,"y":408,"w":242,"h":84}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/BandAnkleLeftKneelClosed.png": +"Models/Vibe/Band.png": { - "frame": {"x":2015,"y":1903,"w":25,"h":43}, + "frame": {"x":1064,"y":1999,"w":205,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":723,"y":950,"w":25,"h":43}, + "spriteSourceSize": {"x":480,"y":654,"w":205,"h":46}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/FCollarBand.png": +"Models/Vibe/Remote.png": { - "frame": {"x":1352,"y":1909,"w":74,"h":16}, + "frame": {"x":1064,"y":1999,"w":205,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":592,"y":399,"w":74,"h":16}, + "spriteSourceSize": {"x":480,"y":654,"w":205,"h":46}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/HarnessHardwareLowerKneel.png": +"Models/Vibe/Wire.png": { - "frame": {"x":1277,"y":1929,"w":287,"h":116}, + "frame": {"x":1064,"y":1999,"w":205,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":745,"w":287,"h":116}, + "spriteSourceSize": {"x":480,"y":654,"w":205,"h":46}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/HarnessUpper.png": +"Models/Witch/SkirtBeltKneel.png": { - "frame": {"x":330,"y":1439,"w":246,"h":146}, + "frame": {"x":3,"y":920,"w":295,"h":80}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":477,"y":412,"w":246,"h":146}, + "spriteSourceSize": {"x":448,"y":735,"w":295,"h":80}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/GloveLeftCrossed.png": +"Models/Witch/SkirtClosed.png": { - "frame": {"x":329,"y":988,"w":221,"h":198}, + "frame": {"x":475,"y":1395,"w":563,"h":602}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":552,"y":503,"w":221,"h":198}, + "spriteSourceSize": {"x":321,"y":788,"w":563,"h":602}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegRightKneelClosed.png": +"Models/Witch/SkirtRuffleClosedCrotchStrap.png": { - "frame": {"x":1828,"y":1399,"w":217,"h":316}, + "frame": {"x":3,"y":1004,"w":517,"h":387}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":312,"y":746,"w":217,"h":316}, + "spriteSourceSize": {"x":351,"y":830,"w":517,"h":387}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/TorsoUpperBeltStrap.png": +"Models/Witch/SkirtRuffleCrotchStrap.png": { - "frame": {"x":559,"y":971,"w":80,"h":215}, + "frame": {"x":3,"y":1004,"w":517,"h":387}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":550,"y":418,"w":80,"h":215}, + "spriteSourceSize": {"x":351,"y":830,"w":517,"h":387}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/WaistBand.png": +"Models/Yoke/HeavySteel.png": { - "frame": {"x":1568,"y":1805,"w":256,"h":133}, + "frame": {"x":1325,"y":108,"w":655,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":659,"w":256,"h":133}, + "spriteSourceSize": {"x":299,"y":379,"w":655,"h":56}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -799,7 +567,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas22.webp b/TextureAtlas/atlas22.webp index 570846151..7edaada42 100644 Binary files a/TextureAtlas/atlas22.webp and b/TextureAtlas/atlas22.webp differ diff --git a/TextureAtlas/atlas23.json b/TextureAtlas/atlas23.json index 5ad76bd80..c1212fa9c 100644 --- a/TextureAtlas/atlas23.json +++ b/TextureAtlas/atlas23.json @@ -2,55 +2,39 @@ "Models/Armbinder/StrapsLeftWristtie.png": { - "frame": {"x":1351,"y":1544,"w":83,"h":195}, + "frame": {"x":1962,"y":1450,"w":83,"h":195}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":680,"y":531,"w":83,"h":195}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/Feet2Closed.png": +"Models/Blindfold/LeatherBase.png": { - "frame": {"x":855,"y":574,"w":136,"h":53}, + "frame": {"x":1813,"y":1093,"w":201,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":526,"y":1468,"w":136,"h":53}, + "spriteSourceSize": {"x":513,"y":254,"w":201,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/ArmRightFree.png": +"Models/Body/HandRightFree.png": { - "frame": {"x":3,"y":3,"w":308,"h":624}, + "frame": {"x":717,"y":586,"w":164,"h":573}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":308,"h":624}, + "spriteSourceSize": {"x":216,"y":91,"w":164,"h":573}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/HandLeftFront.png": +"Models/Body/LegRightKneel.png": { - "frame": {"x":1438,"y":1544,"w":470,"h":501}, + "frame": {"x":1499,"y":221,"w":310,"h":335}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":470,"h":501}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Body/Torso.png": -{ - "frame": {"x":705,"y":1248,"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":1028,"y":1248,"w":319,"h":564}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":446,"y":359,"w":319,"h":564}, + "spriteSourceSize": {"x":244,"y":760,"w":310,"h":335}, "sourceSize": {"w":1240,"h":1754} }, "Models/Body/TorsoClosed.png": { - "frame": {"x":125,"y":631,"w":336,"h":591}, + "frame": {"x":3,"y":1206,"w":336,"h":591}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":429,"y":359,"w":336,"h":591}, @@ -58,715 +42,507 @@ }, "Models/Body/TorsoClosedChastity.png": { - "frame": {"x":365,"y":1248,"w":336,"h":591}, + "frame": {"x":171,"y":606,"w":336,"h":591}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":429,"y":359,"w":336,"h":591}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bra/BraRim.png": +"Models/Catsuit/ArmLeftYoked.png": { - "frame": {"x":1807,"y":578,"w":238,"h":72}, + "frame": {"x":1684,"y":1790,"w":273,"h":255}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":476,"y":510,"w":238,"h":72}, + "spriteSourceSize": {"x":663,"y":381,"w":273,"h":255}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/LegSockLeftSpread.png": +"Models/Catsuit/HandRightFree.png": { - "frame": {"x":437,"y":1226,"w":159,"h":17}, + "frame": {"x":819,"y":1201,"w":165,"h":572}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":602,"y":904,"w":159,"h":17}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Bunny/SockLeftKneel.png": -{ - "frame": {"x":1538,"y":1235,"w":506,"h":276}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":388,"y":808,"w":506,"h":276}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Cape/ShouldersHogtieFree.png": -{ - "frame": {"x":3,"y":1863,"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":3,"y":1863,"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":3,"y":1863,"w":368,"h":182}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":454,"y":396,"w":368,"h":182}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Catsuit/ArmRightWristtie.png": -{ - "frame": {"x":1996,"y":888,"w":49,"h":95}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":466,"y":432,"w":49,"h":95}, + "spriteSourceSize": {"x":216,"y":91,"w":165,"h":572}, "sourceSize": {"w":1240,"h":1754} }, "Models/Catsuit/LegLeftClosed.png": { - "frame": {"x":976,"y":631,"w":163,"h":559}, + "frame": {"x":885,"y":586,"w":163,"h":559}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":578,"y":919,"w":163,"h":559}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraProtoLiningMidRim.png": +"Models/Catsuit/LegLeftSpread.png": { - "frame": {"x":1091,"y":1194,"w":230,"h":50}, + "frame": {"x":1191,"y":3,"w":168,"h":551}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":466,"y":616,"w":230,"h":50}, + "spriteSourceSize": {"x":601,"y":919,"w":168,"h":551}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Collars/FutureBand.png": +"Models/Catsuit/LegRightKneelClosed.png": { - "frame": {"x":315,"y":593,"w":96,"h":34}, + "frame": {"x":1813,"y":221,"w":232,"h":300}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":580,"y":390,"w":96,"h":34}, + "spriteSourceSize": {"x":322,"y":759,"w":232,"h":300}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/AnkleLeftKneel.png": +"Models/Catsuit/TorsoLower.png": { - "frame": {"x":1985,"y":1111,"w":60,"h":67}, + "frame": {"x":1095,"y":1791,"w":290,"h":254}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":705,"y":961,"w":60,"h":67}, + "spriteSourceSize": {"x":448,"y":670,"w":290,"h":254}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayLinkCollar.png": +"Models/CyberArms/GlowLongMittenLeftFront.png": { - "frame": {"x":1820,"y":1515,"w":79,"h":24}, + "frame": {"x":1962,"y":1649,"w":83,"h":108}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":584,"y":398,"w":79,"h":24}, + "spriteSourceSize": {"x":724,"y":500,"w":83,"h":108}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockElbowRightBoxtie.png": +"Models/CyberCuffs/ElbowRightFront.png": { - "frame": {"x":419,"y":1226,"w":14,"h":18}, + "frame": {"x":2018,"y":1093,"w":27,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":603,"w":14,"h":18}, + "spriteSourceSize": {"x":431,"y":588,"w":27,"h":58}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenAnkleLeftKneel.png": +"Models/CyberMitts/MittenLeftYoked.png": { - "frame": {"x":705,"y":1816,"w":67,"h":23}, + "frame": {"x":1961,"y":1790,"w":84,"h":98}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":701,"y":1012,"w":67,"h":23}, + "spriteSourceSize": {"x":869,"y":312,"w":84,"h":98}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/DisplayLongMittenLeftFree.png": +"Models/CyberMitts/UpperGlowLongMittenLeftFront.png": { - "frame": {"x":396,"y":1226,"w":19,"h":18}, + "frame": {"x":1962,"y":1649,"w":83,"h":108}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":833,"y":756,"w":19,"h":18}, + "spriteSourceSize": {"x":724,"y":500,"w":83,"h":108}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperCuffLongMittenLeftFree.png": +"Models/CyberMitts/UpperGlowLongMittenRightYoked.png": { - "frame": {"x":1351,"y":1743,"w":83,"h":60}, + "frame": {"x":1961,"y":1892,"w":84,"h":96}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":699,"y":496,"w":83,"h":60}, + "spriteSourceSize": {"x":409,"y":460,"w":84,"h":96}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleLeftSpread.png": +"Models/CyberPetsuit/LegsBeltsHogtie.png": { - "frame": {"x":1558,"y":574,"w":74,"h":53}, + "frame": {"x":1389,"y":1790,"w":291,"h":255}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":678,"y":1417,"w":74,"h":53}, + "spriteSourceSize": {"x":447,"y":914,"w":291,"h":255}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighRightDecoKneel.png": +"Models/CyberPetsuit/Petsuit.png": { - "frame": {"x":1912,"y":1988,"w":133,"h":45}, + "frame": {"x":1389,"y":1790,"w":291,"h":255}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":369,"y":854,"w":133,"h":45}, + "spriteSourceSize": {"x":447,"y":914,"w":291,"h":255}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighRightDecoKneelClosed.png": +"Models/DivineCuffs/AnkleLeftDecoCleanClosed.png": { - "frame": {"x":1912,"y":1988,"w":133,"h":45}, + "frame": {"x":1847,"y":183,"w":68,"h":34}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":369,"y":854,"w":133,"h":45}, + "spriteSourceSize": {"x":605,"y":1449,"w":68,"h":34}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseForeArmRightFront.png": +"Models/Dress/BlouseSkirtKneel.png": { - "frame": {"x":1365,"y":3,"w":154,"h":197}, + "frame": {"x":3,"y":3,"w":541,"h":599}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":409,"y":523,"w":154,"h":197}, + "spriteSourceSize": {"x":288,"y":391,"w":541,"h":599}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/Collar.png": +"Models/Dress/SkirtOverKneelCrotchStrap.png": { - "frame": {"x":1538,"y":1515,"w":86,"h":25}, + "frame": {"x":1631,"y":1466,"w":327,"h":320}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":584,"y":393,"w":86,"h":25}, + "spriteSourceSize": {"x":477,"y":773,"w":327,"h":320}, "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesDai1/BrowsSurprised.png": -{ - "frame": {"x":1687,"y":1515,"w":39,"h":25}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":526,"y":247,"w":39,"h":25}, - "sourceSize": {"w":738,"h":409} -}, -"Models/EyesDai2/BrowsAnnoyed.png": -{ - "frame": {"x":1730,"y":1515,"w":38,"h":25}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":539,"y":246,"w":38,"h":25}, - "sourceSize": {"w":765,"h":427} -}, -"Models/FaceDask/Brows2Surprised.png": +"Models/FaceDask/Eyes2Closed.png": { - "frame": {"x":360,"y":1226,"w":32,"h":18}, + "frame": {"x":1962,"y":1761,"w":65,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":614,"y":244,"w":32,"h":18}, - "sourceSize": {"w":700,"h":400} + "spriteSourceSize": {"x":152,"y":182,"w":65,"h":24}, + "sourceSize": {"w":321,"h":332} }, -"Models/FaceDask/WhitesEyes2Angry.png": +"Models/FaceDask/WhitesEyes2Closed.png": { - "frame": {"x":605,"y":587,"w":70,"h":40}, + "frame": {"x":1962,"y":1761,"w":65,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":147,"y":168,"w":70,"h":40}, + "spriteSourceSize": {"x":152,"y":182,"w":65,"h":24}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKjus/Brows2Angry.png": +"Models/FutureHarness/StrapsChest.png": { - "frame": {"x":1996,"y":987,"w":49,"h":24}, + "frame": {"x":1813,"y":723,"w":232,"h":146}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":606,"y":249,"w":49,"h":24}, + "spriteSourceSize": {"x":483,"y":404,"w":232,"h":146}, "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/BrowsNeutral.png": +"Models/GagLeather/PanelHarness.png": { - "frame": {"x":314,"y":1226,"w":42,"h":18}, + "frame": {"x":1908,"y":1168,"w":137,"h":278}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":60,"y":150,"w":42,"h":18}, + "spriteSourceSize": {"x":39,"y":9,"w":137,"h":278}, "sourceSize": {"w":321,"h":332} }, -"Models/FutureBox/Lock.png": +"Models/Hair/Ponytail.png": { - "frame": {"x":1797,"y":1515,"w":19,"h":25}, + "frame": {"x":3,"y":606,"w":164,"h":596}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":189,"y":782,"w":19,"h":25}, + "spriteSourceSize": {"x":601,"y":93,"w":164,"h":596}, "sourceSize": {"w":1240,"h":1754} }, -"Models/FutureHarness/LockLower.png": +"Models/Hair2/Hair5_FrontB.png": { - "frame": {"x":149,"y":1226,"w":161,"h":18}, + "frame": {"x":1813,"y":873,"w":231,"h":216}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":489,"y":811,"w":161,"h":18}, + "spriteSourceSize": {"x":489,"y":116,"w":231,"h":216}, "sourceSize": {"w":1240,"h":1754} }, -"Models/GagLeather/Whiskers.png": +"Models/Handcuffs/WolfCuffsChainFront.png": { - "frame": {"x":960,"y":1209,"w":127,"h":35}, + "frame": {"x":859,"y":1163,"w":107,"h":34}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":76,"y":222,"w":127,"h":35}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagMetal/Display.png": -{ - "frame": {"x":1772,"y":1515,"w":21,"h":25}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":114,"y":156,"w":21,"h":25}, - "sourceSize": {"w":321,"h":332} -}, -"Models/Gasmask/Valves.png": -{ - "frame": {"x":1134,"y":574,"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.png": -{ - "frame": {"x":1308,"y":631,"w":316,"h":558}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":469,"y":104,"w":316,"h":558}, + "spriteSourceSize": {"x":527,"y":557,"w":107,"h":34}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/Straight_Overstrap.png": +"Models/Harness/BeltsTopUp.png": { - "frame": {"x":1365,"y":204,"w":226,"h":366}, + "frame": {"x":1567,"y":1017,"w":242,"h":147}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":154,"w":226,"h":366}, + "spriteSourceSize": {"x":483,"y":409,"w":242,"h":147}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/TwintailRight.png": +"Models/Heels/LeatherLeftSpread.png": { - "frame": {"x":3,"y":631,"w":118,"h":615}, + "frame": {"x":1052,"y":566,"w":125,"h":553}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":662,"y":131,"w":118,"h":615}, + "spriteSourceSize": {"x":643,"y":1129,"w":125,"h":553}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair2_Left.png": +"Models/Jacket/ChestCrossed.png": { - "frame": {"x":1912,"y":1847,"w":133,"h":137}, + "frame": {"x":767,"y":1791,"w":324,"h":254}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":650,"y":82,"w":133,"h":137}, + "spriteSourceSize": {"x":446,"y":375,"w":324,"h":254}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair4_FrontB.png": +"Models/Jacket/ChestWristtie.png": { - "frame": {"x":1302,"y":1816,"w":132,"h":229}, + "frame": {"x":430,"y":1791,"w":333,"h":254}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":120,"w":132,"h":229}, + "spriteSourceSize": {"x":446,"y":375,"w":333,"h":254}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Handcuffs/HingedCuffsFront.png": +"Models/Jacket/StrapsTorsoLowerWristtie.png": { - "frame": {"x":1807,"y":499,"w":238,"h":75}, + "frame": {"x":988,"y":1466,"w":282,"h":321}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":466,"y":526,"w":238,"h":75}, + "spriteSourceSize": {"x":449,"y":602,"w":282,"h":321}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Harness/BeltsStrapClosed.png": +"Models/LatexPetsuit/GlowLegsHogtie.png": { - "frame": {"x":1996,"y":654,"w":49,"h":230}, + "frame": {"x":343,"y":1201,"w":472,"h":586}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":552,"y":690,"w":49,"h":230}, + "spriteSourceSize": {"x":376,"y":689,"w":472,"h":586}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Kigu/Brows.png": +"Models/LatexPetsuit/GlowTorso.png": { - "frame": {"x":600,"y":1220,"w":127,"h":24}, + "frame": {"x":1181,"y":560,"w":382,"h":551}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":529,"y":243,"w":127,"h":24}, + "spriteSourceSize": {"x":392,"y":341,"w":382,"h":551}, "sourceSize": {"w":1240,"h":1754} }, "Models/LeatherCuffs/BandCollar.png": { - "frame": {"x":415,"y":593,"w":96,"h":34}, + "frame": {"x":1567,"y":183,"w":96,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":580,"y":390,"w":96,"h":34}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandThighLeftSpread.png": -{ - "frame": {"x":995,"y":574,"w":135,"h":53}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":624,"y":1022,"w":135,"h":53}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/LeatherCuffs/BandWristLeftYoked.png": +"Models/LeatherCuffs/BandThighLeftClosed.png": { - "frame": {"x":1628,"y":1515,"w":55,"h":25}, + "frame": {"x":717,"y":1163,"w":138,"h":34}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":879,"y":402,"w":55,"h":25}, + "spriteSourceSize": {"x":574,"y":1049,"w":138,"h":34}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareAnkleLeftKneel.png": +"Models/LeatherCuffs/HardwareThighLeftSpread.png": { - "frame": {"x":125,"y":1226,"w":20,"h":19}, + "frame": {"x":1269,"y":1149,"w":103,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":709,"y":950,"w":20,"h":19}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/LeatherCuffs/HardwareAnkleLeftKneelClosed.png": -{ - "frame": {"x":125,"y":1226,"w":20,"h":19}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":709,"y":950,"w":20,"h":19}, + "spriteSourceSize": {"x":642,"y":1031,"w":103,"h":48}, "sourceSize": {"w":1240,"h":1754} }, "Models/Maid/SockLeftHogtie.png": { - "frame": {"x":1143,"y":631,"w":161,"h":559}, + "frame": {"x":897,"y":3,"w":161,"h":559}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":577,"y":952,"w":161,"h":559}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/SockRightHogtie.png": +"Models/Maid/StripeSockRightClosed.png": { - "frame": {"x":521,"y":3,"w":141,"h":580}, + "frame": {"x":1919,"y":183,"w":126,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":931,"w":141,"h":580}, + "spriteSourceSize": {"x":458,"y":965,"w":126,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeSockLeftClosed.png": +"Models/Mittens/LongMittenRightYoked.png": { - "frame": {"x":776,"y":1816,"w":143,"h":22}, + "frame": {"x":1390,"y":1115,"w":173,"h":335}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":584,"y":978,"w":143,"h":22}, + "spriteSourceSize": {"x":298,"y":294,"w":173,"h":335}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/KneeRightHogtie.png": +"Models/Mittens/PawRightYoked.png": { - "frame": {"x":666,"y":3,"w":178,"h":579}, + "frame": {"x":1499,"y":145,"w":64,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":485,"y":987,"w":178,"h":579}, + "spriteSourceSize": {"x":323,"y":320,"w":64,"h":72}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/SkirtKneelCrotchStrap.png": +"Models/Ninja/KneeRightHogtie.png": { - "frame": {"x":1628,"y":3,"w":415,"h":197}, + "frame": {"x":715,"y":3,"w":178,"h":579}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":364,"y":738,"w":415,"h":197}, + "spriteSourceSize": {"x":485,"y":987,"w":178,"h":579}, "sourceSize": {"w":1240,"h":1754} }, "Models/Ninja/ThighLeftHogtie.png": { - "frame": {"x":465,"y":631,"w":163,"h":585}, + "frame": {"x":548,"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/Ninja/ThighRightClosed.png": -{ - "frame": {"x":1912,"y":1515,"w":133,"h":328}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":461,"y":980,"w":133,"h":328}, - "sourceSize": {"w":1240,"h":1754} -}, "Models/Ninja/ThighRightHogtie.png": { - "frame": {"x":315,"y":3,"w":202,"h":586}, + "frame": {"x":511,"y":606,"w":202,"h":586}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":461,"y":980,"w":202,"h":586}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Nipples/Weights.png": -{ - "frame": {"x":1325,"y":1193,"w":209,"h":51}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":461,"y":567,"w":209,"h":51}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Ribbon/HarnessMidFlattened.png": -{ - "frame": {"x":1628,"y":1019,"w":353,"h":170}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":436,"y":572,"w":353,"h":170}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Ribbon/TopArmStrapCrossed.png": -{ - "frame": {"x":1985,"y":1019,"w":60,"h":88}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":554,"y":602,"w":60,"h":88}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Robes/SkirtOverKneelCrotchStrap.png": -{ - "frame": {"x":1807,"y":204,"w":238,"h":105}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":538,"y":801,"w":238,"h":105}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/RopeOld/ChestLower.png": -{ - "frame": {"x":731,"y":1209,"w":225,"h":35}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":478,"y":600,"w":225,"h":35}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Shades/Glasses.png": -{ - "frame": {"x":679,"y":586,"w":172,"h":41}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":519,"y":263,"w":172,"h":41}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Skirts/ApronSkirt.png": -{ - "frame": {"x":653,"y":1843,"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":653,"y":1843,"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": +"Models/Ninja/TopShouldersTied.png": { - "frame": {"x":653,"y":1843,"w":266,"h":202}, + "frame": {"x":1813,"y":525,"w":232,"h":194}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, + "spriteSourceSize": {"x":496,"y":422,"w":232,"h":194}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/ApronSkirtCrotchStrap.png": +"Models/Nipples/VibePiercings.png": { - "frame": {"x":653,"y":1843,"w":266,"h":202}, + "frame": {"x":1181,"y":1115,"w":205,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, + "spriteSourceSize": {"x":463,"y":569,"w":205,"h":30}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/ApronSkirtHogtie.png": +"Models/PantiesHigh/BaseClosed.png": { - "frame": {"x":653,"y":1843,"w":266,"h":202}, + "frame": {"x":1567,"y":805,"w":242,"h":208}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, + "spriteSourceSize": {"x":467,"y":711,"w":242,"h":208}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/ApronSkirtHogtieCrotchStrap.png": +"Models/Ribbon/HarnessLowerStrap.png": { - "frame": {"x":653,"y":1843,"w":266,"h":202}, + "frame": {"x":1274,"y":1466,"w":353,"h":320}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, + "spriteSourceSize": {"x":436,"y":606,"w":353,"h":320}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeCollar.png": +"Models/Ribbon/TopThigh3KneelClosed.png": { - "frame": {"x":1262,"y":574,"w":97,"h":53}, + "frame": {"x":1567,"y":560,"w":242,"h":241}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":576,"y":384,"w":97,"h":53}, + "spriteSourceSize": {"x":443,"y":826,"w":242,"h":241}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeCollarRim.png": +"Models/Robes/SleeveDecoRightFront.png": { - "frame": {"x":1363,"y":574,"w":97,"h":53}, + "frame": {"x":1363,"y":3,"w":132,"h":551}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":576,"y":384,"w":97,"h":53}, + "spriteSourceSize": {"x":359,"y":618,"w":132,"h":551}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ElbowLeftFree.png": +"Models/Rope/LeftFrogtieHogtie.png": { - "frame": {"x":515,"y":593,"w":86,"h":34}, + "frame": {"x":970,"y":1149,"w":295,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":692,"y":601,"w":86,"h":34}, + "spriteSourceSize": {"x":447,"y":930,"w":295,"h":48}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimElbowLeftFront.png": +"Models/Rope/Thigh3Closed.png": { - "frame": {"x":1464,"y":574,"w":90,"h":53}, + "frame": {"x":970,"y":1149,"w":295,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":681,"y":591,"w":90,"h":53}, + "spriteSourceSize": {"x":447,"y":930,"w":295,"h":48}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/AnklesClosed.png": +"Models/Sailor/SleeveRightTied.png": { - "frame": {"x":1351,"y":1248,"w":183,"h":292}, + "frame": {"x":1499,"y":3,"w":64,"h":138}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":513,"y":1216,"w":183,"h":292}, + "spriteSourceSize": {"x":430,"y":440,"w":64,"h":138}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/ArmRightCrossed.png": +"Models/ShadowHands/Arms1.png": { - "frame": {"x":1807,"y":410,"w":238,"h":85}, + "frame": {"x":1567,"y":1168,"w":337,"h":294}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":605,"w":238,"h":85}, + "spriteSourceSize": {"x":441,"y":415,"w":337,"h":294}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/PetsuitTopHands.png": +"Models/Skirts/MaidSkirt.png": { - "frame": {"x":1807,"y":313,"w":238,"h":93}, + "frame": {"x":988,"y":1201,"w":398,"h":261}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":477,"y":413,"w":238,"h":93}, + "spriteSourceSize": {"x":394,"y":731,"w":398,"h":261}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/ArmRightCrossed.png": +"Models/Skirts/MaidSkirtClosed.png": { - "frame": {"x":1807,"y":410,"w":238,"h":85}, + "frame": {"x":988,"y":1201,"w":398,"h":261}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":605,"w":238,"h":85}, + "spriteSourceSize": {"x":394,"y":731,"w":398,"h":261}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/PetsuitTopHands.png": +"Models/Skirts/MaidSkirtClosedCrotchStrap.png": { - "frame": {"x":1807,"y":313,"w":238,"h":93}, + "frame": {"x":988,"y":1201,"w":398,"h":261}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":477,"y":413,"w":238,"h":93}, + "spriteSourceSize": {"x":394,"y":731,"w":398,"h":261}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ArmRightCrossed.png": +"Models/Skirts/MaidSkirtCrotchStrap.png": { - "frame": {"x":1807,"y":410,"w":238,"h":85}, + "frame": {"x":988,"y":1201,"w":398,"h":261}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":605,"w":238,"h":85}, + "spriteSourceSize": {"x":394,"y":731,"w":398,"h":261}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/BottomClosed.png": +"Models/Skirts/MaidSkirtHogtie.png": { - "frame": {"x":3,"y":1250,"w":358,"h":609}, + "frame": {"x":988,"y":1201,"w":398,"h":261}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":428,"y":735,"w":358,"h":609}, + "spriteSourceSize": {"x":394,"y":731,"w":398,"h":261}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/BottomHogtie.png": +"Models/Skirts/MaidSkirtHogtieCrotchStrap.png": { - "frame": {"x":3,"y":1250,"w":358,"h":609}, + "frame": {"x":988,"y":1201,"w":398,"h":261}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":428,"y":735,"w":358,"h":609}, + "spriteSourceSize": {"x":394,"y":731,"w":398,"h":261}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/PetsuitTopHands.png": +"Models/SmoothHeels/LeftSpread.png": { - "frame": {"x":1807,"y":313,"w":238,"h":93}, + "frame": {"x":1062,"y":3,"w":125,"h":553}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":477,"y":413,"w":238,"h":93}, + "spriteSourceSize": {"x":643,"y":1129,"w":125,"h":553}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/Bustier.png": +"Models/SteelCuffs/ElbowLeftBoxtie.png": { - "frame": {"x":375,"y":1843,"w":274,"h":202}, + "frame": {"x":1961,"y":1992,"w":84,"h":49}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":442,"y":482,"w":274,"h":202}, + "spriteSourceSize": {"x":691,"y":581,"w":84,"h":49}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/GloveRightYoked.png": -{ - "frame": {"x":1523,"y":3,"w":101,"h":159}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":299,"y":286,"w":101,"h":159}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Warrior/ShoeLeftClosed.png": +"Models/SteelCuffs/ElbowLeftFree.png": { - "frame": {"x":1636,"y":574,"w":167,"h":441}, + "frame": {"x":1667,"y":183,"w":86,"h":34}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":530,"y":1193,"w":167,"h":441}, + "spriteSourceSize": {"x":692,"y":601,"w":86,"h":34}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/BlouseLeftWristtie.png": +"Models/TallBallet/TallLeftKneel.png": { - "frame": {"x":1595,"y":204,"w":208,"h":366}, + "frame": {"x":1567,"y":3,"w":475,"h":176}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":585,"y":418,"w":208,"h":366}, + "spriteSourceSize": {"x":440,"y":911,"w":475,"h":176}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtRuffleClosed.png": +"Models/Warrior/SkirtKneel.png": { - "frame": {"x":848,"y":3,"w":513,"h":567}, + "frame": {"x":3,"y":1801,"w":423,"h":244}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":347,"y":821,"w":513,"h":567}, + "spriteSourceSize": {"x":389,"y":687,"w":423,"h":244}, "sourceSize": {"w":1240,"h":1754} }, "Models/WolfCatsuit/ChestRim.png": { - "frame": {"x":1523,"y":166,"w":86,"h":34}, + "frame": {"x":1757,"y":183,"w":86,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":586,"y":390,"w":86,"h":34}, "sourceSize": {"w":1240,"h":1754} -}, -"Models/WolfCatsuit/LegPadsLeftKneelClosed.png": -{ - "frame": {"x":923,"y":1816,"w":375,"h":229}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":388,"y":827,"w":375,"h":229}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/WolfCatsuit/TorsoLowerKneel.png": -{ - "frame": {"x":632,"y":631,"w":340,"h":574}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":435,"y":390,"w":340,"h":574}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Yoke/HeavySteelLock.png": -{ - "frame": {"x":1538,"y":1193,"w":507,"h":38}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":371,"y":426,"w":507,"h":38}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Yukata/SleeveRightUp.png": -{ - "frame": {"x":1807,"y":654,"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", @@ -775,7 +551,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas23.webp b/TextureAtlas/atlas23.webp index 8ffc67ef0..263919dca 100644 Binary files a/TextureAtlas/atlas23.webp and b/TextureAtlas/atlas23.webp differ diff --git a/TextureAtlas/atlas24.json b/TextureAtlas/atlas24.json index 991a71b22..4bf81ad07 100644 --- a/TextureAtlas/atlas24.json +++ b/TextureAtlas/atlas24.json @@ -1,659 +1,515 @@ {"frames": { -"Models/Armbinder/StrapsLeftBoxtie.png": +"Models/ArmorPlate/BootLeftSpread.png": { - "frame": {"x":799,"y":1063,"w":66,"h":24}, + "frame": {"x":996,"y":1214,"w":132,"h":436}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":704,"y":526,"w":66,"h":24}, + "spriteSourceSize": {"x":635,"y":1191,"w":132,"h":436}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorChain/ShirtUp.png": +"Models/ArmorPlate/FootBootLeftHogtie.png": { - "frame": {"x":1291,"y":1625,"w":278,"h":418}, + "frame": {"x":1075,"y":686,"w":53,"h":128}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":400,"w":278,"h":418}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/ArmorPlate/BootRightClosed.png": -{ - "frame": {"x":1837,"y":1625,"w":135,"h":409}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":462,"y":1208,"w":135,"h":409}, + "spriteSourceSize": {"x":729,"y":787,"w":53,"h":128}, "sourceSize": {"w":1240,"h":1754} }, "Models/ArmorPlate/GauntletRightBoxtie.png": { - "frame": {"x":2010,"y":1438,"w":35,"h":40}, + "frame": {"x":1093,"y":395,"w":35,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":681,"y":676,"w":35,"h":40}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/RightLegs2Kneel.png": +"Models/Belts/RightArm2Boxtie.png": { - "frame": {"x":1573,"y":1700,"w":260,"h":344}, + "frame": {"x":299,"y":1503,"w":36,"h":54}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":260,"y":750,"w":260,"h":344}, + "spriteSourceSize": {"x":459,"y":606,"w":36,"h":54}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/RightLegs2KneelClosed.png": +"Models/Bunny/FootSockLeftHogtie.png": { - "frame": {"x":1573,"y":1700,"w":260,"h":344}, + "frame": {"x":1075,"y":818,"w":53,"h":120}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":260,"y":750,"w":260,"h":344}, + "spriteSourceSize": {"x":728,"y":792,"w":53,"h":120}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Blindfold/LeatherBase.png": +"Models/Bunny/HighLeotard.png": { - "frame": {"x":1573,"y":1625,"w":201,"h":71}, + "frame": {"x":129,"y":1561,"w":266,"h":397}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":513,"y":254,"w":201,"h":71}, + "spriteSourceSize": {"x":446,"y":518,"w":266,"h":397}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bra/StrapsUp.png": +"Models/Bunny/HighLeotardClosed.png": { - "frame": {"x":1851,"y":211,"w":193,"h":112}, + "frame": {"x":1132,"y":1255,"w":266,"h":395}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":485,"y":412,"w":193,"h":112}, + "spriteSourceSize": {"x":446,"y":518,"w":266,"h":395}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bubble/Head.png": +"Models/Corsets/HeavyCorset.png": { - "frame": {"x":1535,"y":554,"w":312,"h":312}, + "frame": {"x":707,"y":1635,"w":285,"h":350}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":457,"y":85,"w":312,"h":312}, + "spriteSourceSize": {"x":447,"y":508,"w":285,"h":350}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/LegSockLeftClosed.png": +"Models/CyberCuffs/DisplayElbowRightUp.png": { - "frame": {"x":759,"y":1625,"w":151,"h":14}, + "frame": {"x":1093,"y":336,"w":35,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":590,"y":907,"w":151,"h":14}, + "spriteSourceSize": {"x":521,"y":251,"w":35,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/LegSockLeftHogtie.png": +"Models/CyberCuffs/ScreenWristRightFront.png": { - "frame": {"x":759,"y":1625,"w":151,"h":14}, + "frame": {"x":258,"y":1503,"w":37,"h":54}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":590,"y":907,"w":151,"h":14}, + "spriteSourceSize": {"x":467,"y":530,"w":37,"h":54}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/LegSockRightSpread.png": +"Models/CyberCuffs/WristLeftYoked.png": { - "frame": {"x":762,"y":1092,"w":147,"h":14}, + "frame": {"x":1063,"y":1151,"w":65,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":907,"w":147,"h":14}, + "spriteSourceSize": {"x":870,"y":385,"w":65,"h":59}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ForeArmLeftCrossed.png": +"Models/CyberHeels/GlowBalletRightKneel.png": { - "frame": {"x":1850,"y":1270,"w":195,"h":70}, + "frame": {"x":199,"y":1503,"w":55,"h":54}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":549,"y":629,"w":195,"h":70}, + "spriteSourceSize": {"x":335,"y":870,"w":55,"h":54}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/LegLeftSpread.png": +"Models/DivineCuffs/ThighLeftLockPlateClosed.png": { - "frame": {"x":3,"y":558,"w":168,"h":551}, + "frame": {"x":1063,"y":1017,"w":65,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":601,"y":919,"w":168,"h":551}, + "spriteSourceSize": {"x":623,"y":1034,"w":65,"h":63}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/LegRightClosed.png": +"Models/DivineCuffs/ThighRightLockPlateClosed.png": { - "frame": {"x":642,"y":555,"w":153,"h":533}, + "frame": {"x":1063,"y":1084,"w":65,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":919,"w":153,"h":533}, + "spriteSourceSize": {"x":490,"y":1034,"w":65,"h":63}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/ElbowLeftYoked.png": +"Models/DivineCuffs/WristLeftDecoCleanFree.png": { - "frame": {"x":1976,"y":1700,"w":69,"h":91}, + "frame": {"x":996,"y":1179,"w":60,"h":31}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":764,"y":509,"w":69,"h":91}, + "spriteSourceSize": {"x":800,"y":766,"w":60,"h":31}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/ElbowLeftYoked.png": +"Models/Dress/BlouseTorsoKneel.png": { - "frame": {"x":1976,"y":1795,"w":69,"h":91}, + "frame": {"x":548,"y":336,"w":541,"h":319}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":764,"y":509,"w":69,"h":91}, + "spriteSourceSize": {"x":288,"y":390,"w":541,"h":319}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/CuffLongMittenLeftYoked.png": +"Models/Dress/CroppedBlouseTorsoKneel.png": { - "frame": {"x":1850,"y":1107,"w":195,"h":159}, + "frame": {"x":3,"y":267,"w":541,"h":349}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":736,"y":388,"w":195,"h":159}, + "spriteSourceSize": {"x":288,"y":390,"w":541,"h":349}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayElbowRightBoxtie.png": +"Models/Dress/SkirtKneel.png": { - "frame": {"x":1511,"y":1425,"w":20,"h":29}, + "frame": {"x":1132,"y":108,"w":552,"h":352}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":452,"y":597,"w":20,"h":29}, + "spriteSourceSize": {"x":273,"y":740,"w":552,"h":352}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayWristLeftYoked.png": +"Models/Dress/SkirtKneelCrotchStrap.png": { - "frame": {"x":1511,"y":1458,"w":19,"h":41}, + "frame": {"x":1132,"y":464,"w":529,"h":356}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":918,"y":404,"w":19,"h":41}, + "spriteSourceSize": {"x":275,"y":737,"w":529,"h":356}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockElbowLeftWristtie.png": +"Models/FaceDask/EyesNeutral.png": { - "frame": {"x":1511,"y":1062,"w":20,"h":31}, + "frame": {"x":1280,"y":1997,"w":160,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":714,"y":619,"w":20,"h":31}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":52,"y":168,"w":160,"h":48}, + "sourceSize": {"w":321,"h":332} }, -"Models/CyberCuffs/ScreenThighRightClosed.png": +"Models/Gothic/LaceUpperCrotchStrap.png": { - "frame": {"x":1778,"y":1625,"w":55,"h":71}, + "frame": {"x":568,"y":160,"w":551,"h":172}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":474,"y":1020,"w":55,"h":71}, + "spriteSourceSize": {"x":322,"y":821,"w":551,"h":172}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowRightDecoCleanBoxtie.png": +"Models/Gothic/LaceUpperKneelCrotchStrap..png": { - "frame": {"x":802,"y":1643,"w":21,"h":16}, + "frame": {"x":543,"y":1179,"w":449,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":611,"w":21,"h":16}, + "spriteSourceSize": {"x":369,"y":802,"w":449,"h":72}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowRightLockFront.png": +"Models/Hair2/HairAura_Left.png": { - "frame": {"x":2010,"y":1378,"w":35,"h":56}, + "frame": {"x":3,"y":1255,"w":192,"h":302}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":416,"y":592,"w":35,"h":56}, + "spriteSourceSize": {"x":603,"y":109,"w":192,"h":302}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighLeftDecoCleanSpread.png": +"Models/Heels/LeatherLeftKneelClosed.png": { - "frame": {"x":1416,"y":1062,"w":91,"h":45}, + "frame": {"x":3,"y":620,"w":536,"h":277}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":675,"y":1034,"w":91,"h":45}, + "spriteSourceSize": {"x":384,"y":811,"w":536,"h":277}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineGag/MuzzleRim.png": +"Models/Jacket/BeltsChestCrossed.png": { - "frame": {"x":1850,"y":1378,"w":156,"h":124}, + "frame": {"x":399,"y":1635,"w":304,"h":410}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":534,"y":280,"w":156,"h":124}, + "spriteSourceSize": {"x":461,"y":383,"w":304,"h":410}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ears/Kitty.png": +"Models/Leash/LeashPulled.png": { - "frame": {"x":1243,"y":1425,"w":264,"h":196}, + "frame": {"x":1132,"y":3,"w":560,"h":101}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":483,"y":45,"w":264,"h":196}, + "spriteSourceSize": {"x":49,"y":435,"w":560,"h":101}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ears/KittyInner.png": +"Models/LeatherLeotard/LeotardCorset.png": { - "frame": {"x":1851,"y":416,"w":193,"h":75}, + "frame": {"x":543,"y":1255,"w":284,"h":376}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":505,"y":89,"w":193,"h":75}, + "spriteSourceSize": {"x":447,"y":581,"w":284,"h":376}, "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK2/Eyes2Angry.png": -{ - "frame": {"x":822,"y":512,"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":896,"y":512,"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":970,"y":512,"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":1044,"y":512,"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":1118,"y":512,"w":70,"h":39}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":613,"y":265,"w":70,"h":39}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK2/WhitesEyes2Neutral.png": -{ - "frame": {"x":1192,"y":512,"w":70,"h":39}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":613,"y":265,"w":70,"h":39}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK4/Eyes2Neutral.png": -{ - "frame": {"x":1090,"y":1063,"w":70,"h":44}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":614,"y":264,"w":70,"h":44}, - "sourceSize": {"w":781,"h":560} -}, -"Models/FaceDask/Brows2Angry.png": -{ - "frame": {"x":869,"y":1063,"w":25,"h":23}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":612,"y":252,"w":25,"h":23}, - "sourceSize": {"w":700,"h":400} -}, -"Models/FaceDask/Brows2Sad.png": -{ - "frame": {"x":2010,"y":1482,"w":33,"h":17}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":620,"y":235,"w":33,"h":17}, - "sourceSize": {"w":700,"h":400} -}, -"Models/FaceKjus/Eyes2Angry.png": -{ - "frame": {"x":1266,"y":512,"w":66,"h":39}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":618,"y":265,"w":66,"h":39}, - "sourceSize": {"w":753,"h":414} -}, -"Models/FaceKjus/Eyes2Neutral.png": +"Models/Maid/SockLeftKneel.png": { - "frame": {"x":1406,"y":512,"w":65,"h":39}, + "frame": {"x":543,"y":659,"w":528,"h":253}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":614,"y":265,"w":65,"h":39}, - "sourceSize": {"w":807,"h":551} -}, -"Models/FaceKjus/WhitesEyes2Angry.png": -{ - "frame": {"x":1336,"y":512,"w":66,"h":39}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":618,"y":265,"w":66,"h":39}, - "sourceSize": {"w":753,"h":414} -}, -"Models/FutureHarness/LockMid.png": -{ - "frame": {"x":719,"y":1092,"w":39,"h":15}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":543,"y":733,"w":39,"h":15}, + "spriteSourceSize": {"x":366,"y":832,"w":528,"h":253}, "sourceSize": {"w":1240,"h":1754} }, -"Models/FutureHarness/MetalLower.png": +"Models/Maid/SockRightKneelClosed.png": { - "frame": {"x":913,"y":1063,"w":173,"h":44}, + "frame": {"x":199,"y":1255,"w":196,"h":244}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":485,"y":799,"w":173,"h":44}, + "spriteSourceSize": {"x":321,"y":816,"w":196,"h":244}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair3_Back.png": +"Models/MaidKnightLight/Apron.png": { - "frame": {"x":700,"y":3,"w":446,"h":505}, + "frame": {"x":996,"y":1654,"w":280,"h":391}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":423,"y":124,"w":446,"h":505}, + "spriteSourceSize": {"x":438,"y":549,"w":280,"h":391}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair5_FrontD.png": +"Models/MaidKnightLight/BootLeftSpread.png": { - "frame": {"x":1976,"y":1506,"w":69,"h":190}, + "frame": {"x":3,"y":1561,"w":122,"h":467}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":489,"y":140,"w":69,"h":190}, + "spriteSourceSize": {"x":646,"y":1211,"w":122,"h":467}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/HairAura.png": +"Models/MaidKnightLight/SockLeftKneelClosed.png": { - "frame": {"x":1150,"y":211,"w":313,"h":297}, + "frame": {"x":3,"y":3,"w":561,"h":260}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":482,"y":109,"w":313,"h":297}, + "spriteSourceSize": {"x":328,"y":820,"w":561,"h":260}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/HairAura_Left.png": +"Models/Mittens/BandRightFront.png": { - "frame": {"x":1851,"y":553,"w":192,"h":302}, + "frame": {"x":1093,"y":439,"w":35,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":603,"y":109,"w":192,"h":302}, + "spriteSourceSize": {"x":480,"y":543,"w":35,"h":35}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/ArmsWristtie.png": +"Models/Mittens/PawRightFree.png": { - "frame": {"x":1535,"y":1266,"w":311,"h":236}, + "frame": {"x":1063,"y":942,"w":65,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":513,"w":311,"h":236}, + "spriteSourceSize": {"x":299,"y":556,"w":65,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LatexPetsuit/Arms.png": +"Models/Ninja/SockLeftClosed.png": { - "frame": {"x":3,"y":1668,"w":402,"h":375}, + "frame": {"x":831,"y":1255,"w":161,"h":374}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":388,"y":403,"w":402,"h":375}, + "spriteSourceSize": {"x":534,"y":1261,"w":161,"h":374}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LatexPetsuit/GlowLegsKneel.png": +"Models/Nipples/ClampsBullet.png": { - "frame": {"x":914,"y":1625,"w":373,"h":420}, + "frame": {"x":1444,"y":1997,"w":208,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":246,"y":712,"w":373,"h":420}, + "spriteSourceSize": {"x":460,"y":568,"w":208,"h":47}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LatexPetsuit/GlowLegsKneelClosed.png": +"Models/Petsuit/LeftLegsKneelClosed.png": { - "frame": {"x":914,"y":1625,"w":373,"h":420}, + "frame": {"x":1665,"y":610,"w":379,"h":277}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":246,"y":712,"w":373,"h":420}, + "spriteSourceSize": {"x":366,"y":816,"w":379,"h":277}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LatexPetsuit/GlowTorso.png": +"Models/Ribbon/TopRightThigh2KneelClosed.png": { - "frame": {"x":3,"y":3,"w":382,"h":551}, + "frame": {"x":863,"y":1989,"w":126,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":392,"y":341,"w":382,"h":551}, + "spriteSourceSize": {"x":364,"y":859,"w":126,"h":56}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareElbowLeftYoked.png": +"Models/RobeOfChastity/FabricClosed.png": { - "frame": {"x":1976,"y":1890,"w":69,"h":76}, + "frame": {"x":1402,"y":1255,"w":250,"h":195}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":766,"y":515,"w":69,"h":76}, + "spriteSourceSize": {"x":462,"y":657,"w":250,"h":195}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareWristRightCrossed.png": +"Models/RobeOfChastity/FabricKneel.png": { - "frame": {"x":759,"y":1643,"w":39,"h":16}, + "frame": {"x":1402,"y":1454,"w":250,"h":185}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":639,"y":598,"w":39,"h":16}, + "spriteSourceSize": {"x":462,"y":657,"w":250,"h":185}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/Skirt.png": +"Models/RobeOfChastity/FabricSpread.png": { - "frame": {"x":1150,"y":3,"w":372,"h":204}, + "frame": {"x":1402,"y":1255,"w":250,"h":195}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":415,"y":741,"w":372,"h":204}, + "spriteSourceSize": {"x":462,"y":657,"w":250,"h":195}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopCuffs.png": +"Models/Robes/SkirtKneelCrotchStrap.png": { - "frame": {"x":1851,"y":495,"w":193,"h":54}, + "frame": {"x":129,"y":901,"w":410,"h":190}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":484,"y":532,"w":193,"h":54}, + "spriteSourceSize": {"x":390,"y":716,"w":410,"h":190}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/CapeKneel.png": +"Models/Robes/SkirtOverKneel.png": { - "frame": {"x":1103,"y":555,"w":428,"h":503}, + "frame": {"x":1688,"y":443,"w":357,"h":163}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":428,"y":415,"w":428,"h":503}, + "spriteSourceSize": {"x":444,"y":801,"w":357,"h":163}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/GoldBaseSpread.png": +"Models/Rubber/LegLeftKneelClosed.png": { - "frame": {"x":1243,"y":1111,"w":288,"h":310}, + "frame": {"x":1657,"y":1227,"w":388,"h":330}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":606,"w":288,"h":310}, + "spriteSourceSize": {"x":387,"y":751,"w":388,"h":330}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveDecoRightFront.png": +"Models/Sailor/SleeveRight.png": { - "frame": {"x":3,"y":1113,"w":132,"h":551}, + "frame": {"x":1093,"y":601,"w":34,"h":81}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":359,"y":618,"w":132,"h":551}, + "spriteSourceSize": {"x":464,"y":433,"w":34,"h":81}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/ZombieChestTalisman.png": +"Models/ShadowHands/Crotch.png": { - "frame": {"x":484,"y":555,"w":154,"h":547}, + "frame": {"x":129,"y":1095,"w":266,"h":156}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":496,"y":479,"w":154,"h":547}, + "spriteSourceSize": {"x":458,"y":682,"w":266,"h":156}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Thigh2Closed.png": +"Models/Skirts/StripedSkirtKneel.png": { - "frame": {"x":1164,"y":1062,"w":248,"h":45}, + "frame": {"x":543,"y":916,"w":516,"h":259}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":470,"y":1012,"w":248,"h":45}, + "spriteSourceSize": {"x":316,"y":725,"w":516,"h":259}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/LeftArm2Boxtie.png": +"Models/Slime/LegLeftKneel.png": { - "frame": {"x":1976,"y":1970,"w":69,"h":67}, + "frame": {"x":1657,"y":891,"w":388,"h":332}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":671,"y":639,"w":69,"h":67}, + "spriteSourceSize": {"x":387,"y":751,"w":388,"h":332}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeStripeYoked.png": +"Models/SteelChastity/BeltPadlockPin.png": { - "frame": {"x":1534,"y":1506,"w":438,"h":115}, + "frame": {"x":1093,"y":478,"w":34,"h":119}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":401,"y":425,"w":438,"h":115}, + "spriteSourceSize": {"x":553,"y":734,"w":34,"h":119}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SMoonlight/RpArmbinder Secure.png": +"Models/SteelCuffs/ElbowRightBoxtie.png": { - "frame": {"x":1535,"y":993,"w":311,"h":269}, + "frame": {"x":3,"y":1203,"w":95,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":84,"y":300,"w":311,"h":269}, - "sourceSize": {"w":450,"h":675} + "spriteSourceSize": {"x":458,"y":589,"w":95,"h":48}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/bac/SuccubusClawRightFront.png": +"Models/SteelCuffs/RimThighRightSpread.png": { - "frame": {"x":700,"y":512,"w":118,"h":39}, + "frame": {"x":707,"y":1989,"w":152,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":511,"y":479,"w":118,"h":39}, + "spriteSourceSize": {"x":441,"y":995,"w":152,"h":56}, "sourceSize": {"w":1240,"h":1754} }, "Models/Succubus/SuccubusTail.png": { - "frame": {"x":1475,"y":211,"w":372,"h":339}, + "frame": {"x":1280,"y":1654,"w":372,"h":339}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":673,"y":572,"w":372,"h":339}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/SwimsuitClosed.png": -{ - "frame": {"x":799,"y":555,"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":939,"y":1111,"w":300,"h":504}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":443,"y":415,"w":300,"h":504}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/TallBallet/TallLegRightKneel.png": -{ - "frame": {"x":1851,"y":859,"w":192,"h":244}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":312,"y":819,"w":192,"h":244}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Visors/Dollmaker.png": -{ - "frame": {"x":1851,"y":327,"w":193,"h":85}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":506,"y":250,"w":193,"h":85}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Warrior/ArmbandBoxtie.png": -{ - "frame": {"x":1511,"y":1503,"w":19,"h":33}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":455,"y":510,"w":19,"h":33}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Witch/BlouseBust.png": +"Models/TapeHeavy/RightLegsClosed.png": { - "frame": {"x":409,"y":1666,"w":289,"h":375}, + "frame": {"x":1696,"y":3,"w":349,"h":436}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":438,"y":409,"w":289,"h":375}, + "spriteSourceSize": {"x":437,"y":820,"w":349,"h":436}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/BlouseLeftFree.png": +"Models/Warrior/RimGloveRightYoked.png": { - "frame": {"x":702,"y":1663,"w":208,"h":375}, + "frame": {"x":339,"y":1503,"w":56,"h":51}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":585,"y":409,"w":208,"h":375}, + "spriteSourceSize": {"x":314,"y":392,"w":56,"h":51}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtKneelCrotchStrap.png": +"Models/Witch/SkirtClosedCrotchStrap.png": { - "frame": {"x":1535,"y":3,"w":509,"h":204}, + "frame": {"x":1132,"y":824,"w":521,"h":427}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":333,"y":774,"w":509,"h":204}, + "spriteSourceSize": {"x":349,"y":792,"w":521,"h":427}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/HarnessHardwareLower.png": +"Models/Witch/SkirtCrotchStrap.png": { - "frame": {"x":1535,"y":870,"w":312,"h":119}, + "frame": {"x":1132,"y":824,"w":521,"h":427}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":439,"y":797,"w":312,"h":119}, + "spriteSourceSize": {"x":349,"y":792,"w":521,"h":427}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/HarnessHardwareLowerClosed.png": +"Models/Witch/SkirtRuffle.png": { - "frame": {"x":1535,"y":870,"w":312,"h":119}, + "frame": {"x":568,"y":3,"w":560,"h":153}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":439,"y":797,"w":312,"h":119}, + "spriteSourceSize": {"x":322,"y":1234,"w":560,"h":153}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/ChestBand.png": +"Models/Witch/SkirtSplitKneel.png": { - "frame": {"x":642,"y":1092,"w":73,"h":15}, + "frame": {"x":1132,"y":108,"w":552,"h":352}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":592,"y":400,"w":73,"h":15}, + "spriteSourceSize": {"x":273,"y":740,"w":552,"h":352}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/TorsoLower.png": +"Models/Wolf/BeltMid.png": { - "frame": {"x":389,"y":3,"w":307,"h":548}, + "frame": {"x":129,"y":1962,"w":266,"h":76}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":390,"w":307,"h":548}, + "spriteSourceSize": {"x":454,"y":685,"w":266,"h":76}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/TorsoLowerClosed.png": +"Models/WolfCatsuit/LegPadsRightClosed.png": { - "frame": {"x":139,"y":1113,"w":305,"h":549}, + "frame": {"x":399,"y":1095,"w":140,"h":536}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":390,"w":305,"h":549}, + "spriteSourceSize": {"x":458,"y":942,"w":140,"h":536}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/TorsoLowerRim.png": +"Models/WolfCatsuit/RimGloveRightYoked.png": { - "frame": {"x":448,"y":1111,"w":307,"h":548}, + "frame": {"x":339,"y":1503,"w":56,"h":51}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":390,"w":307,"h":548}, + "spriteSourceSize": {"x":314,"y":392,"w":56,"h":51}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/TorsoLowerRimClosed.png": +"Models/Yukata/SkirtClosedCrotchStrap.png": { - "frame": {"x":175,"y":558,"w":305,"h":549}, + "frame": {"x":1656,"y":1561,"w":389,"h":459}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":390,"w":305,"h":549}, + "spriteSourceSize": {"x":409,"y":761,"w":389,"h":459}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/TorsoUpperBand.png": +"Models/Yukata/SleeveLeftBoxtie.png": { - "frame": {"x":1850,"y":1344,"w":195,"h":30}, + "frame": {"x":3,"y":901,"w":122,"h":298}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":486,"y":659,"w":195,"h":30}, + "spriteSourceSize": {"x":653,"y":433,"w":122,"h":298}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/SleeveLeftFree.png": +"Models/Yukata/SleeveLeftFront.png": { - "frame": {"x":759,"y":1111,"w":176,"h":510}, + "frame": {"x":3,"y":901,"w":122,"h":298}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":699,"y":416,"w":176,"h":510}, + "spriteSourceSize": {"x":653,"y":433,"w":122,"h":298}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -663,7 +519,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas24.webp b/TextureAtlas/atlas24.webp index 9e1548ef1..e38cc8d7e 100644 Binary files a/TextureAtlas/atlas24.webp and b/TextureAtlas/atlas24.webp differ diff --git a/TextureAtlas/atlas25.json b/TextureAtlas/atlas25.json index 91fd0a19c..bcec85fd0 100644 --- a/TextureAtlas/atlas25.json +++ b/TextureAtlas/atlas25.json @@ -1,392 +1,360 @@ {"frames": { -"Models/Belts/RightArm1Boxtie.png": +"Models/ArmorChain/Skirt.png": { - "frame": {"x":1044,"y":735,"w":40,"h":43}, + "frame": {"x":1633,"y":1859,"w":336,"h":186}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":486,"w":40,"h":43}, + "spriteSourceSize": {"x":434,"y":739,"w":336,"h":186}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/RightArm1Wristtie.png": +"Models/ArmorChain/SkirtCrotchStrap.png": { - "frame": {"x":1044,"y":735,"w":40,"h":43}, + "frame": {"x":1633,"y":1859,"w":336,"h":186}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":486,"w":40,"h":43}, + "spriteSourceSize": {"x":434,"y":739,"w":336,"h":186}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/HeadNoEarBigGag.png": +"Models/Body/ArmLeftUp.png": { - "frame": {"x":1377,"y":1617,"w":216,"h":279}, + "frame": {"x":432,"y":1649,"w":207,"h":395}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":505,"y":120,"w":216,"h":279}, + "spriteSourceSize": {"x":626,"y":167,"w":207,"h":395}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/EarsInner.png": +"Models/Body/ArmRightYoked.png": { - "frame": {"x":1377,"y":1900,"w":216,"h":119}, + "frame": {"x":314,"y":1106,"w":308,"h":539}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":41,"w":216,"h":119}, + "spriteSourceSize": {"x":216,"y":91,"w":308,"h":539}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/HandLeftFront.png": +"Models/Body/HandLeftFront.png": { - "frame": {"x":1573,"y":898,"w":470,"h":501}, + "frame": {"x":1084,"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/Chastity/ProtoPlug.png": -{ - "frame": {"x":477,"y":1630,"w":37,"h":17}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":558,"y":906,"w":37,"h":17}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/AnkleLeftKneelClosed.png": +"Models/Bunny/GloveLeftBoxtie.png": { - "frame": {"x":477,"y":1397,"w":38,"h":55}, + "frame": {"x":1955,"y":1355,"w":90,"h":164}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":717,"y":945,"w":38,"h":55}, + "spriteSourceSize": {"x":679,"y":519,"w":90,"h":164}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/AnkleLeftKneelClosed.png": +"Models/Catsuit/HandLeftFront.png": { - "frame": {"x":477,"y":1456,"w":38,"h":55}, + "frame": {"x":1007,"y":1097,"w":470,"h":501}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":717,"y":945,"w":38,"h":55}, + "spriteSourceSize": {"x":216,"y":91,"w":470,"h":501}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayThighRightKneel.png": +"Models/Catsuit/LegRightClosed.png": { - "frame": {"x":2014,"y":1793,"w":31,"h":44}, + "frame": {"x":623,"y":3,"w":153,"h":533}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":381,"y":824,"w":31,"h":44}, + "spriteSourceSize": {"x":449,"y":919,"w":153,"h":533}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayThighRightKneelClosed.png": +"Models/Catsuit/TorsoLowerSpread.png": { - "frame": {"x":2014,"y":1841,"w":31,"h":44}, + "frame": {"x":1633,"y":1602,"w":318,"h":253}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":381,"y":824,"w":31,"h":44}, + "spriteSourceSize": {"x":444,"y":670,"w":318,"h":253}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayWristLeftFront.png": +"Models/Chastity/BraProtoLiningMidRim.png": { - "frame": {"x":490,"y":747,"w":25,"h":39}, + "frame": {"x":1609,"y":1043,"w":230,"h":50}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":667,"y":539,"w":25,"h":39}, + "spriteSourceSize": {"x":466,"y":616,"w":230,"h":50}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockAnkleLeftClosed.png": +"Models/CrystalCuffs/SteelCollarRunes.png": { - "frame": {"x":490,"y":790,"w":25,"h":36}, + "frame": {"x":833,"y":1605,"w":93,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":623,"y":1447,"w":25,"h":36}, + "spriteSourceSize": {"x":578,"y":396,"w":93,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockThighLeftSpread.png": +"Models/CrystalCuffs/ThighLinkSpread.png": { - "frame": {"x":490,"y":998,"w":23,"h":34}, + "frame": {"x":1099,"y":508,"w":80,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":697,"y":1014,"w":23,"h":34}, + "spriteSourceSize": {"x":566,"y":1057,"w":80,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockThighRightSpread.png": +"Models/Cuffs/SteelCollarRunes.png": { - "frame": {"x":490,"y":1036,"w":23,"h":34}, + "frame": {"x":833,"y":1605,"w":93,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":486,"y":1016,"w":23,"h":34}, + "spriteSourceSize": {"x":578,"y":396,"w":93,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockWristLeftFree.png": +"Models/CyberArms/DisplayLongMittenLeftFree.png": { - "frame": {"x":2014,"y":1958,"w":23,"h":27}, + "frame": {"x":1955,"y":1097,"w":90,"h":254}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":833,"y":750,"w":23,"h":27}, + "spriteSourceSize": {"x":762,"y":520,"w":90,"h":254}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LockWristRightFront.png": +"Models/CyberCuffs/AnkleLeftKneel.png": { - "frame": {"x":2014,"y":2015,"w":21,"h":30}, + "frame": {"x":1973,"y":1963,"w":72,"h":80}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":472,"y":541,"w":21,"h":30}, + "spriteSourceSize": {"x":697,"y":955,"w":72,"h":80}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenElbowLeftFront.png": +"Models/CyberCuffs/DisplayWristLeftFront.png": { - "frame": {"x":477,"y":1331,"w":38,"h":62}, + "frame": {"x":1558,"y":191,"w":25,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":743,"y":595,"w":38,"h":62}, + "spriteSourceSize": {"x":667,"y":539,"w":25,"h":39}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleLeftKneel.png": +"Models/CyberCuffs/DisplayWristRightFront.png": { - "frame": {"x":477,"y":1515,"w":38,"h":55}, + "frame": {"x":1558,"y":103,"w":25,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":717,"y":945,"w":38,"h":55}, + "spriteSourceSize": {"x":471,"y":536,"w":25,"h":40}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleLeftKneelClosed.png": +"Models/CyberCuffs/LockAnkleLeftClosed.png": { - "frame": {"x":477,"y":1515,"w":38,"h":55}, + "frame": {"x":1558,"y":234,"w":25,"h":36}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":717,"y":945,"w":38,"h":55}, + "spriteSourceSize": {"x":623,"y":1447,"w":25,"h":36}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleLeftLockClosed.png": +"Models/CyberCuffs/LockElbowRightUp.png": { - "frame": {"x":472,"y":1926,"w":43,"h":76}, + "frame": {"x":1558,"y":147,"w":25,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":646,"y":1428,"w":43,"h":76}, + "spriteSourceSize": {"x":526,"y":258,"w":25,"h":40}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleRightLockClosed.png": +"Models/CyberCuffs/ScreenWristRightCrossed.png": { - "frame": {"x":477,"y":1178,"w":38,"h":77}, + "frame": {"x":1530,"y":508,"w":54,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":513,"y":1422,"w":38,"h":77}, + "spriteSourceSize": {"x":648,"y":588,"w":54,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/BeltDeco.png": +"Models/DivineCuffs/AnkleRightLockPlateSpread.png": { - "frame": {"x":1633,"y":862,"w":221,"h":32}, + "frame": {"x":1558,"y":3,"w":25,"h":49}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":473,"y":699,"w":221,"h":32}, + "spriteSourceSize": {"x":481,"y":1422,"w":25,"h":49}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftLockPlateUp.png": +"Models/DivineCuffs/SteelCollarRunes.png": { - "frame": {"x":1044,"y":782,"w":40,"h":37}, + "frame": {"x":833,"y":1605,"w":93,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":709,"y":255,"w":40,"h":37}, + "spriteSourceSize": {"x":578,"y":396,"w":93,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowRightBoxtie.png": +"Models/DivineCuffs/ThighLinkSpread.png": { - "frame": {"x":490,"y":977,"w":24,"h":17}, + "frame": {"x":1183,"y":508,"w":80,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":610,"w":24,"h":17}, + "spriteSourceSize": {"x":566,"y":1057,"w":80,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowRightLockPlateUp.png": +"Models/DivineCuffs/WristRightDecoCleanFront.png": { - "frame": {"x":1044,"y":823,"w":40,"h":37}, + "frame": {"x":815,"y":1054,"w":59,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":528,"y":271,"w":40,"h":37}, + "spriteSourceSize": {"x":479,"y":544,"w":59,"h":39}, "sourceSize": {"w":1240,"h":1754} }, "Models/DivineCuffs/WristRightLockBandCrossed.png": { - "frame": {"x":490,"y":905,"w":25,"h":26}, + "frame": {"x":1558,"y":349,"w":25,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":651,"y":603,"w":25,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristRightLockPlateCrossed.png": -{ - "frame": {"x":1044,"y":864,"w":40,"h":32}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":656,"y":601,"w":40,"h":32}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Dress/BlouseArmRightBoxtie.png": +"Models/Dress/MageSkirtKneel.png": { - "frame": {"x":1003,"y":870,"w":37,"h":243}, + "frame": {"x":1588,"y":3,"w":457,"h":269}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":460,"y":440,"w":37,"h":243}, + "spriteSourceSize": {"x":322,"y":747,"w":457,"h":269}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseTorsoKneel.png": +"Models/Elf/ShoeRightClosed.png": { - "frame": {"x":548,"y":3,"w":541,"h":319}, + "frame": {"x":1910,"y":276,"w":135,"h":190}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":288,"y":390,"w":541,"h":319}, + "spriteSourceSize": {"x":462,"y":1439,"w":135,"h":190}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/CroppedBlouseTorsoKneel.png": +"Models/EyesDai1/BrowsAnnoyed.png": { - "frame": {"x":3,"y":3,"w":541,"h":349}, + "frame": {"x":999,"y":511,"w":46,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":288,"y":390,"w":541,"h":349}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":531,"y":247,"w":46,"h":24}, + "sourceSize": {"w":765,"h":427} }, -"Models/Dress/LaceCorsetCrystal.png": +"Models/EyesDai2/Brows2Neutral.png": { - "frame": {"x":524,"y":356,"w":17,"h":165}, + "frame": {"x":896,"y":511,"w":48,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":568,"y":634,"w":17,"h":165}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":604,"y":237,"w":48,"h":24}, + "sourceSize": {"w":725,"h":424} }, -"Models/Elf/CrystalShoeRightSpread.png": +"Models/EyesK4/Eyes2Closed.png": { - "frame": {"x":2014,"y":1676,"w":31,"h":63}, + "frame": {"x":780,"y":511,"w":59,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":533,"y":1497,"w":31,"h":63}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":620,"y":275,"w":59,"h":24}, + "sourceSize": {"w":781,"h":560} }, -"Models/EyesK4/EyesNeutral.png": +"Models/EyesK4/WhitesEyes2Closed.png": { - "frame": {"x":1573,"y":845,"w":56,"h":49}, + "frame": {"x":780,"y":511,"w":59,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":522,"y":268,"w":56,"h":49}, + "spriteSourceSize": {"x":620,"y":275,"w":59,"h":24}, "sourceSize": {"w":781,"h":560} }, -"Models/FaceDask/BrowsAnnoyed.png": +"Models/FaceDask/Brows2Angry.png": { - "frame": {"x":2014,"y":1937,"w":31,"h":17}, + "frame": {"x":1558,"y":379,"w":25,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":545,"y":261,"w":31,"h":17}, + "spriteSourceSize": {"x":612,"y":252,"w":25,"h":23}, "sourceSize": {"w":700,"h":400} }, -"Models/FaceKjus/MouthSurprised.png": -{ - "frame": {"x":2014,"y":1889,"w":31,"h":44}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":591,"y":322,"w":31,"h":44}, - "sourceSize": {"w":754,"h":450} -}, -"Models/Handcuffs/CuffsLockFront.png": -{ - "frame": {"x":519,"y":870,"w":480,"h":238}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":417,"y":375,"w":480,"h":238}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Harness/HardwareStrap.png": +"Models/FaceKjus/Brows2Angry.png": { - "frame": {"x":1044,"y":674,"w":40,"h":57}, + "frame": {"x":843,"y":511,"w":49,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":552,"y":693,"w":40,"h":57}, + "spriteSourceSize": {"x":606,"y":249,"w":49,"h":24}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/LeatherLeftKneel.png": +"Models/FaceKjus/WhitesEyes2Neutral.png": { - "frame": {"x":1093,"y":285,"w":536,"h":277}, + "frame": {"x":682,"y":1054,"w":65,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":384,"y":811,"w":536,"h":277}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":614,"y":265,"w":65,"h":39}, + "sourceSize": {"w":807,"h":551} }, -"Models/Heels/LeatherLeftKneelClosed.png": +"Models/FaceKoi/Brows2Angry.png": { - "frame": {"x":548,"y":326,"w":536,"h":277}, + "frame": {"x":1049,"y":511,"w":46,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":384,"y":811,"w":536,"h":277}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":142,"y":124,"w":46,"h":24}, + "sourceSize": {"w":321,"h":332} }, -"Models/Jacket/BeltsTorsoLower.png": +"Models/Hair/Curly.png": { - "frame": {"x":993,"y":1117,"w":276,"h":282}, + "frame": {"x":643,"y":1637,"w":310,"h":408}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":602,"w":276,"h":282}, + "spriteSourceSize": {"x":478,"y":112,"w":310,"h":408}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/BeltsTorsoLowerBoxtie.png": +"Models/LeatherCuffs/BandAnkleRightClosed.png": { - "frame": {"x":1273,"y":1117,"w":276,"h":282}, + "frame": {"x":1467,"y":508,"w":59,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":602,"w":276,"h":282}, + "spriteSourceSize": {"x":538,"y":1438,"w":59,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LatexPetsuit/ArmsBelts.png": +"Models/LeatherCuffs/BandElbowLeftWristtie.png": { - "frame": {"x":1633,"y":3,"w":404,"h":215}, + "frame": {"x":948,"y":511,"w":47,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":392,"y":501,"w":404,"h":215}, + "spriteSourceSize": {"x":687,"y":620,"w":47,"h":24}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandElbowLeftBoxtie.png": +"Models/LeatherCuffs/BandThighLeftSpread.png": { - "frame": {"x":1858,"y":862,"w":79,"h":32}, + "frame": {"x":1910,"y":470,"w":135,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":693,"y":585,"w":79,"h":32}, + "spriteSourceSize": {"x":624,"y":1022,"w":135,"h":53}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandThighRightKneel.png": +"Models/LeatherCuffs/HardwareAnkleLeftClosed.png": { - "frame": {"x":1941,"y":862,"w":104,"h":30}, + "frame": {"x":1267,"y":508,"w":63,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":391,"y":846,"w":104,"h":30}, + "spriteSourceSize": {"x":610,"y":1444,"w":63,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandWristRightFree.png": +"Models/LeatherCuffs/HardwareAnkleLeftSpread.png": { - "frame": {"x":477,"y":1259,"w":38,"h":68}, + "frame": {"x":1401,"y":508,"w":62,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":362,"y":603,"w":38,"h":68}, + "spriteSourceSize": {"x":698,"y":1435,"w":62,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/Arms.png": +"Models/Maid/StripeSockRightHogtie.png": { - "frame": {"x":1633,"y":222,"w":403,"h":321}, + "frame": {"x":703,"y":1605,"w":126,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":396,"y":400,"w":403,"h":321}, + "spriteSourceSize": {"x":458,"y":965,"w":126,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/BootLeftSpread.png": +"Models/Mittens/BandLeftFront.png": { - "frame": {"x":3,"y":1570,"w":122,"h":467}, + "frame": {"x":751,"y":1054,"w":60,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":646,"y":1211,"w":122,"h":467}, + "spriteSourceSize": {"x":623,"y":547,"w":60,"h":39}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LatexRightBoxtie.png": +"Models/Mittens/LeatherLeftYoked.png": { - "frame": {"x":472,"y":2006,"w":41,"h":39}, + "frame": {"x":1955,"y":1678,"w":90,"h":142}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":678,"y":678,"w":41,"h":39}, + "spriteSourceSize": {"x":859,"y":287,"w":90,"h":142}, "sourceSize": {"w":1240,"h":1754} }, "Models/Mittens/LockLeftYoked.png": { - "frame": {"x":490,"y":868,"w":25,"h":33}, + "frame": {"x":1558,"y":312,"w":25,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":878,"y":387,"w":25,"h":33}, @@ -394,362 +362,274 @@ }, "Models/Mittens/LockRightYoked.png": { - "frame": {"x":490,"y":830,"w":25,"h":34}, + "frame": {"x":1558,"y":274,"w":25,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":341,"y":392,"w":25,"h":34}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/Skirt.png": +"Models/Mittens/LongMittenLeftBoxtie.png": { - "frame": {"x":993,"y":1403,"w":333,"h":210}, + "frame": {"x":1955,"y":1355,"w":90,"h":164}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":434,"y":738,"w":333,"h":210}, + "spriteSourceSize": {"x":679,"y":519,"w":90,"h":164}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Nipples/VibePiercingsBullet.png": +"Models/Nipples/Clamps.png": { - "frame": {"x":1377,"y":2023,"w":202,"h":22}, + "frame": {"x":1130,"y":1046,"w":209,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":464,"y":576,"w":202,"h":22}, + "spriteSourceSize": {"x":460,"y":568,"w":209,"h":47}, "sourceSize": {"w":1240,"h":1754} }, -"Models/OperaGloves/GloveLeftBoxtie.png": +"Models/Panties/Base.png": { - "frame": {"x":422,"y":1662,"w":93,"h":183}, + "frame": {"x":1768,"y":868,"w":277,"h":163}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":676,"y":502,"w":93,"h":183}, + "spriteSourceSize": {"x":453,"y":756,"w":277,"h":163}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Petsuit/ArmsBelts.png": +"Models/RobeOfChastity/CapeKneel.png": { - "frame": {"x":1633,"y":3,"w":404,"h":215}, + "frame": {"x":862,"y":539,"w":428,"h":503}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":392,"y":501,"w":404,"h":215}, + "spriteSourceSize": {"x":428,"y":415,"w":428,"h":503}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Calf1KneelClosed.png": +"Models/Robes/SleeveDecoLeftFree.png": { - "frame": {"x":1044,"y":1027,"w":38,"h":50}, + "frame": {"x":626,"y":1097,"w":73,"h":536}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":703,"y":954,"w":38,"h":50}, + "spriteSourceSize": {"x":783,"y":704,"w":73,"h":536}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/LegsKneel.png": +"Models/Robes/SleeveLeftFree.png": { - "frame": {"x":1597,"y":1403,"w":448,"h":269}, + "frame": {"x":470,"y":555,"w":208,"h":538}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":316,"y":817,"w":448,"h":269}, + "spriteSourceSize": {"x":676,"y":480,"w":208,"h":538}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/PauldronsYoked.png": +"Models/Robes/SleeveLeftFreeTight.png": { - "frame": {"x":129,"y":1570,"w":344,"h":88}, + "frame": {"x":470,"y":555,"w":208,"h":538}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":455,"y":407,"w":344,"h":88}, + "spriteSourceSize": {"x":676,"y":480,"w":208,"h":538}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/AnklesKneel.png": +"Models/Robes/ZombieChestTalisman.png": { - "frame": {"x":477,"y":1574,"w":38,"h":52}, + "frame": {"x":312,"y":555,"w":154,"h":547}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":701,"y":955,"w":38,"h":52}, + "spriteSourceSize": {"x":496,"y":479,"w":154,"h":547}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/AnklesKneelOver.png": +"Models/Rope/Calf3ClosedOver.png": { - "frame": {"x":477,"y":1574,"w":38,"h":52}, + "frame": {"x":1843,"y":1035,"w":200,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":701,"y":955,"w":38,"h":52}, + "spriteSourceSize": {"x":513,"y":1234,"w":200,"h":58}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Calf1KneelClosed.png": +"Models/Rope/Thigh2ClosedOver.png": { - "frame": {"x":477,"y":1574,"w":38,"h":52}, + "frame": {"x":878,"y":1046,"w":248,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":701,"y":955,"w":38,"h":52}, + "spriteSourceSize": {"x":470,"y":1010,"w":248,"h":47}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Calf1KneelClosedOver.png": +"Models/Rubber/FootRightKneel.png": { - "frame": {"x":477,"y":1574,"w":38,"h":52}, + "frame": {"x":1973,"y":1859,"w":72,"h":100}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":701,"y":955,"w":38,"h":52}, + "spriteSourceSize": {"x":325,"y":854,"w":72,"h":100}, "sourceSize": {"w":1240,"h":1754} }, "Models/Rubber/HandLeftFront.png": { - "frame": {"x":3,"y":1065,"w":470,"h":501}, + "frame": {"x":1294,"y":538,"w":470,"h":501}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":216,"y":91,"w":470,"h":501}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/HemRightTied.png": +"Models/Rubber/LegRightClosed.png": { - "frame": {"x":490,"y":935,"w":24,"h":38}, + "frame": {"x":1307,"y":1602,"w":151,"h":442}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":428,"y":548,"w":24,"h":38}, + "spriteSourceSize": {"x":446,"y":802,"w":151,"h":442}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/StripedSkirt.png": +"Models/Sailor/ShirtChestUp.png": { - "frame": {"x":1633,"y":547,"w":403,"h":311}, + "frame": {"x":1768,"y":538,"w":277,"h":326}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":402,"y":724,"w":403,"h":311}, + "spriteSourceSize": {"x":446,"y":303,"w":277,"h":326}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/StripedSkirtClosed.png": +"Models/Slayer/CapeCollarInner.png": { - "frame": {"x":1633,"y":547,"w":403,"h":311}, + "frame": {"x":1955,"y":1824,"w":84,"h":31}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":402,"y":724,"w":403,"h":311}, + "spriteSourceSize": {"x":585,"y":373,"w":84,"h":31}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/StripedSkirtHogtie.png": +"Models/Slime/FootRightKneel.png": { - "frame": {"x":1633,"y":547,"w":403,"h":311}, + "frame": {"x":1973,"y":1859,"w":72,"h":100}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":402,"y":724,"w":403,"h":311}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Skirts/StripedSkirtKneel.png": -{ - "frame": {"x":524,"y":607,"w":516,"h":259}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":316,"y":725,"w":516,"h":259}, + "spriteSourceSize": {"x":325,"y":854,"w":72,"h":100}, "sourceSize": {"w":1240,"h":1754} }, "Models/Slime/HandLeftFront.png": { - "frame": {"x":519,"y":1112,"w":470,"h":501}, + "frame": {"x":1481,"y":1097,"w":470,"h":501}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":216,"y":91,"w":470,"h":501}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SMoonlight/PostureCollarHardware.png": -{ - "frame": {"x":2014,"y":1989,"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": +"Models/SMoonlight/ReverseBinderLeft.png": { - "frame": {"x":1093,"y":3,"w":536,"h":278}, + "frame": {"x":1955,"y":1523,"w":90,"h":151}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":384,"y":811,"w":536,"h":278}, + "spriteSourceSize": {"x":689,"y":470,"w":90,"h":151}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelChastity/BeltSegu.png": +"Models/Spats/SpatsSpread.png": { - "frame": {"x":1044,"y":900,"w":38,"h":123}, + "frame": {"x":1588,"y":276,"w":318,"h":258}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":553,"y":732,"w":38,"h":123}, + "spriteSourceSize": {"x":444,"y":738,"w":318,"h":258}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelChastity/BraSegu.png": +"Models/Swimsuit/SwimsuitClosed.png": { - "frame": {"x":1044,"y":1081,"w":33,"h":32}, + "frame": {"x":780,"y":3,"w":300,"h":504}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":555,"y":554,"w":33,"h":32}, + "spriteSourceSize": {"x":443,"y":415,"w":300,"h":504}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ElbowLeftWristtie.png": +"Models/Swimsuit/SwimsuitKneel.png": { - "frame": {"x":1573,"y":791,"w":56,"h":50}, + "frame": {"x":957,"y":1605,"w":346,"h":439}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":679,"y":619,"w":56,"h":50}, + "spriteSourceSize": {"x":418,"y":415,"w":346,"h":439}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimElbowLeftYoked.png": +"Models/Swimsuit/SwimsuitSpread.png": { - "frame": {"x":422,"y":1849,"w":93,"h":73}, + "frame": {"x":703,"y":1097,"w":300,"h":504}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":744,"y":499,"w":93,"h":73}, + "spriteSourceSize": {"x":443,"y":415,"w":300,"h":504}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SuccubusClawRightFree.png": +"Models/Warrior/ShoeLeftClosed.png": { - "frame": {"x":422,"y":1926,"w":46,"h":119}, + "frame": {"x":1462,"y":1602,"w":167,"h":441}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":286,"y":523,"w":46,"h":119}, + "spriteSourceSize": {"x":530,"y":1193,"w":167,"h":441}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallBallet/TallLeftKneelClosed.png": -{ - "frame": {"x":1088,"y":566,"w":522,"h":166}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":394,"y":916,"w":522,"h":166}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/TallSmoothHeels/TallLeftKneel.png": -{ - "frame": {"x":1088,"y":736,"w":481,"h":187}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":451,"y":901,"w":481,"h":187}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/TallSmoothHeels/TallLeftKneelClosed.png": -{ - "frame": {"x":1086,"y":927,"w":469,"h":186}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":460,"y":902,"w":469,"h":186}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/TapeHeavy/LegsKneelClosed.png": -{ - "frame": {"x":519,"y":1617,"w":393,"h":426}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":386,"y":652,"w":393,"h":426}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/TapeHeavy/TopBoxtie.png": -{ - "frame": {"x":1330,"y":1403,"w":263,"h":210}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":446,"y":500,"w":263,"h":210}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/TapeLight/TopWristtie.png": -{ - "frame": {"x":477,"y":1074,"w":38,"h":100}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":679,"y":660,"w":38,"h":100}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/TapeMed/LegsKneelClosed.png": -{ - "frame": {"x":1597,"y":1676,"w":413,"h":369}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":366,"y":652,"w":413,"h":369}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Warrior/BandGloveRightFree.png": -{ - "frame": {"x":2014,"y":1743,"w":31,"h":46}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":359,"y":613,"w":31,"h":46}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Warrior/RimGloveRightYoked.png": -{ - "frame": {"x":1573,"y":736,"w":56,"h":51}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":314,"y":392,"w":56,"h":51}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Warrior/ShoeRightClosed.png": +"Models/Witch/BlouseBustUp.png": { - "frame": {"x":1077,"y":1617,"w":146,"h":418}, + "frame": {"x":3,"y":1661,"w":289,"h":383}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":1206,"w":146,"h":418}, + "spriteSourceSize": {"x":438,"y":401,"w":289,"h":383}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/ShoeRightClosedRopesAnkle.png": +"Models/Wolf/BandAnkleLeftKneelClosed.png": { - "frame": {"x":1227,"y":1617,"w":146,"h":418}, + "frame": {"x":1558,"y":56,"w":25,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":1206,"w":146,"h":418}, + "spriteSourceSize": {"x":723,"y":950,"w":25,"h":43}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/ShoeRightSpread.png": +"Models/Wolf/BandAnkleLeftSpread.png": { - "frame": {"x":916,"y":1617,"w":157,"h":421}, + "frame": {"x":1334,"y":508,"w":63,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":1224,"w":157,"h":421}, + "spriteSourceSize": {"x":687,"y":1435,"w":63,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/BlouseBustUp.png": +"Models/Wolf/BeltHardwareMid.png": { - "frame": {"x":129,"y":1662,"w":289,"h":383}, + "frame": {"x":1343,"y":1043,"w":262,"h":50}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":438,"y":401,"w":289,"h":383}, + "spriteSourceSize": {"x":456,"y":689,"w":262,"h":50}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtKneel.png": +"Models/WolfCatsuit/TorsoLower.png": { - "frame": {"x":3,"y":747,"w":483,"h":314}, + "frame": {"x":3,"y":1109,"w":307,"h":548}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":302,"y":775,"w":483,"h":314}, + "spriteSourceSize": {"x":444,"y":390,"w":307,"h":548}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtRuffleClosedCrotchStrap.png": +"Models/WolfCatsuit/TorsoLowerClosed.png": { - "frame": {"x":3,"y":356,"w":517,"h":387}, + "frame": {"x":3,"y":3,"w":305,"h":549}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":351,"y":830,"w":517,"h":387}, + "spriteSourceSize": {"x":444,"y":390,"w":305,"h":549}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtRuffleCrotchStrap.png": +"Models/WolfCatsuit/TorsoLowerRim.png": { - "frame": {"x":3,"y":356,"w":517,"h":387}, + "frame": {"x":312,"y":3,"w":307,"h":548}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":351,"y":830,"w":517,"h":387}, + "spriteSourceSize": {"x":444,"y":390,"w":307,"h":548}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/BandAnkleLeftKneel.png": +"Models/WolfCatsuit/TorsoLowerRimClosed.png": { - "frame": {"x":1044,"y":607,"w":40,"h":63}, + "frame": {"x":3,"y":556,"w":305,"h":549}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":716,"y":958,"w":40,"h":63}, + "spriteSourceSize": {"x":444,"y":390,"w":305,"h":549}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/BandGloveRightFree.png": +"Models/Yukata/SleeveLeftFree.png": { - "frame": {"x":2014,"y":1743,"w":31,"h":46}, + "frame": {"x":682,"y":540,"w":176,"h":510}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":359,"y":613,"w":31,"h":46}, + "spriteSourceSize": {"x":699,"y":416,"w":176,"h":510}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/RimGloveRightYoked.png": +"Models/Yukata/SleeveRightFree.png": { - "frame": {"x":1573,"y":736,"w":56,"h":51}, + "frame": {"x":296,"y":1661,"w":132,"h":382}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":314,"y":392,"w":56,"h":51}, + "spriteSourceSize": {"x":357,"y":442,"w":132,"h":382}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -759,7 +639,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas25.webp b/TextureAtlas/atlas25.webp index e40e2d01a..59341e8f0 100644 Binary files a/TextureAtlas/atlas25.webp and b/TextureAtlas/atlas25.webp differ diff --git a/TextureAtlas/atlas26.json b/TextureAtlas/atlas26.json index 293eca115..cbb072dfd 100644 --- a/TextureAtlas/atlas26.json +++ b/TextureAtlas/atlas26.json @@ -1,659 +1,635 @@ {"frames": { -"Models/ArmorChain/Skirt2.png": +"Models/ArmorChain/ShirtUp.png": { - "frame": {"x":910,"y":1000,"w":228,"h":205}, + "frame": {"x":1038,"y":1605,"w":278,"h":418}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":475,"y":798,"w":228,"h":205}, + "spriteSourceSize": {"x":445,"y":400,"w":278,"h":418}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorChain/Skirt2CrotchStrap.png": +"Models/ArmorChain/SkirtBeltDecoKneel.png": { - "frame": {"x":910,"y":1209,"w":228,"h":187}, + "frame": {"x":1984,"y":916,"w":61,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":475,"y":804,"w":228,"h":187}, + "spriteSourceSize": {"x":511,"y":772,"w":61,"h":60}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/BootLeftClosed.png": +"Models/Bandit/ShoeRightClosed.png": { - "frame": {"x":3,"y":1463,"w":161,"h":444}, + "frame": {"x":813,"y":1269,"w":146,"h":189}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":535,"y":1181,"w":161,"h":444}, + "spriteSourceSize": {"x":458,"y":1433,"w":146,"h":189}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/BootLeftSpread.png": +"Models/Bandit/WristRightFree.png": { - "frame": {"x":858,"y":3,"w":132,"h":436}, + "frame": {"x":926,"y":1528,"w":33,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":635,"y":1191,"w":132,"h":436}, + "spriteSourceSize": {"x":355,"y":606,"w":33,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/GauntletLeftFront.png": +"Models/Belts/LeftArm2Wristtie.png": { - "frame": {"x":1513,"y":1878,"w":158,"h":167}, + "frame": {"x":458,"y":1126,"w":57,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":550,"y":464,"w":158,"h":167}, + "spriteSourceSize": {"x":682,"y":596,"w":57,"h":52}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bra/InnerLines.png": +"Models/Bunny/SockLeftKneel.png": { - "frame": {"x":1142,"y":1455,"w":260,"h":94}, + "frame": {"x":1032,"y":211,"w":506,"h":276}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":541,"w":260,"h":94}, + "spriteSourceSize": {"x":388,"y":808,"w":506,"h":276}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/TorsoBand.png": +"Models/Cape/ShouldersYoked.png": { - "frame": {"x":454,"y":958,"w":200,"h":38}, + "frame": {"x":519,"y":1112,"w":440,"h":153}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":484,"y":656,"w":200,"h":38}, + "spriteSourceSize": {"x":413,"y":386,"w":440,"h":153}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraProtoLiningMidZipRim.png": +"Models/CyberArms/CuffLongMittenRightFront.png": { - "frame": {"x":906,"y":946,"w":230,"h":50}, + "frame": {"x":2015,"y":594,"w":27,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":466,"y":616,"w":230,"h":50}, + "spriteSourceSize": {"x":451,"y":510,"w":27,"h":44}, "sourceSize": {"w":1240,"h":1754} }, -"Models/China/Dress.png": +"Models/CyberArms/GlowLongMittenRightBoxtie.png": { - "frame": {"x":282,"y":1911,"w":246,"h":134}, + "frame": {"x":977,"y":516,"w":51,"h":79}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":603,"w":246,"h":134}, + "spriteSourceSize": {"x":423,"y":484,"w":51,"h":79}, "sourceSize": {"w":1240,"h":1754} }, -"Models/China/DressSkirtOverKneel.png": +"Models/CyberCuffs/DisplayElbowLeftFree.png": { - "frame": {"x":1406,"y":1303,"w":301,"h":159}, + "frame": {"x":2015,"y":545,"w":27,"h":45}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":476,"y":801,"w":301,"h":159}, + "spriteSourceSize": {"x":759,"y":589,"w":27,"h":45}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/GlowLongMittenLeftFree.png": +"Models/CyberCuffs/DisplayElbowRightFront.png": { - "frame": {"x":1203,"y":1553,"w":156,"h":320}, + "frame": {"x":2015,"y":493,"w":27,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":733,"y":485,"w":156,"h":320}, + "spriteSourceSize": {"x":423,"y":595,"w":27,"h":48}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleLeftLockPlateClosed.png": +"Models/CyberCuffs/ScreenAnkleLeftClosed.png": { - "frame": {"x":1668,"y":417,"w":38,"h":37}, + "frame": {"x":458,"y":1060,"w":57,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":649,"y":1431,"w":38,"h":37}, + "spriteSourceSize": {"x":606,"y":1433,"w":57,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleLeftLockPlateKneel.png": +"Models/CyberCuffs/ScreenAnkleLeftSpread.png": { - "frame": {"x":1363,"y":1703,"w":38,"h":43}, + "frame": {"x":462,"y":490,"w":53,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":720,"y":951,"w":38,"h":43}, + "spriteSourceSize": {"x":698,"y":1430,"w":53,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/CollarDeco.png": +"Models/CyberCuffs/ScreenElbowLeftUp.png": { - "frame": {"x":266,"y":959,"w":90,"h":37}, + "frame": {"x":977,"y":599,"w":51,"h":74}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":583,"y":389,"w":90,"h":37}, + "spriteSourceSize": {"x":709,"y":252,"w":51,"h":74}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/CollarDecoClean.png": +"Models/CyberCuffs/ScreenElbowRightFront.png": { - "frame": {"x":360,"y":959,"w":90,"h":37}, + "frame": {"x":926,"y":1462,"w":33,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":583,"y":389,"w":90,"h":37}, + "spriteSourceSize": {"x":421,"y":586,"w":33,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowRightDecoCleanYoked.png": +"Models/CyberCuffs/ScreenThighRightSpread.png": { - "frame": {"x":1142,"y":1647,"w":57,"h":79}, + "frame": {"x":458,"y":985,"w":57,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":395,"y":525,"w":57,"h":79}, + "spriteSourceSize": {"x":470,"y":998,"w":57,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseArmLeftFree.png": +"Models/CyberHeels/GlowBalletRightSpread.png": { - "frame": {"x":169,"y":506,"w":209,"h":449}, + "frame": {"x":1496,"y":491,"w":42,"h":212}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":697,"y":413,"w":209,"h":449}, + "spriteSourceSize": {"x":472,"y":1431,"w":42,"h":212}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MageSkirtOverKneel.png": +"Models/CyberHeels/ShinyBalletRightKneel.png": { - "frame": {"x":1712,"y":557,"w":333,"h":215}, + "frame": {"x":439,"y":1475,"w":76,"h":104}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":801,"w":333,"h":215}, + "spriteSourceSize": {"x":321,"y":852,"w":76,"h":104}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/BandRightWristtie.png": +"Models/CyberHeels/ShinyBalletRightSpread.png": { - "frame": {"x":1363,"y":1750,"w":38,"h":39}, + "frame": {"x":1430,"y":707,"w":108,"h":350}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":495,"w":38,"h":39}, + "spriteSourceSize": {"x":465,"y":1348,"w":108,"h":350}, "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesDai1/Brows2Sad.png": +"Models/CyberMitts/UpperCuffLongMittenRightFront.png": { - "frame": {"x":1059,"y":921,"w":79,"h":17}, + "frame": {"x":2015,"y":594,"w":27,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":592,"y":248,"w":79,"h":17}, - "sourceSize": {"w":726,"h":532} -}, -"Models/FaceKjus/BrowsNeutral.png": -{ - "frame": {"x":479,"y":1889,"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":1142,"y":1730,"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":1142,"y":1730,"w":48,"h":17}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":530,"y":294,"w":48,"h":17}, - "sourceSize": {"w":852,"h":524} + "spriteSourceSize": {"x":451,"y":510,"w":27,"h":44}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FutureHarness/MetalMid.png": +"Models/CyberMitts/UpperGlowLongMittenRightBoxtie.png": { - "frame": {"x":169,"y":959,"w":93,"h":37}, + "frame": {"x":977,"y":516,"w":51,"h":79}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":519,"y":713,"w":93,"h":37}, + "spriteSourceSize": {"x":423,"y":484,"w":51,"h":79}, "sourceSize": {"w":1240,"h":1754} }, -"Models/GagCloth/OTM.png": +"Models/DivineBelt/LockBraHighlight.png": { - "frame": {"x":1459,"y":417,"w":205,"h":85}, + "frame": {"x":439,"y":1303,"w":76,"h":168}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":54,"y":209,"w":205,"h":85}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":545,"y":456,"w":76,"h":168}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/GagLatex/NeckCorsetGagRim2.png": +"Models/DivineCuffs/AnkleLeftDecoClosed.png": { - "frame": {"x":1310,"y":424,"w":145,"h":78}, + "frame": {"x":447,"y":1227,"w":68,"h":34}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":538,"y":306,"w":145,"h":78}, - "sourceSize": {"w":763,"h":476} + "spriteSourceSize": {"x":605,"y":1449,"w":68,"h":34}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/Gothic/WaistbandClips.png": +"Models/DivineCuffs/ElbowLeftLockBoxtie.png": { - "frame": {"x":910,"y":1400,"w":206,"h":36}, + "frame": {"x":1984,"y":980,"w":42,"h":77}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":480,"y":673,"w":206,"h":36}, + "spriteSourceSize": {"x":744,"y":574,"w":42,"h":77}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/BackShortCurly.png": +"Models/DivineCuffs/ElbowLeftLockFree.png": { - "frame": {"x":1406,"y":859,"w":302,"h":258}, + "frame": {"x":2015,"y":431,"w":27,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":487,"y":114,"w":302,"h":258}, + "spriteSourceSize": {"x":766,"y":588,"w":27,"h":58}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/FrontStraight.png": +"Models/DivineCuffs/ElbowRightDecoCleanYoked.png": { - "frame": {"x":1406,"y":1466,"w":300,"h":408}, + "frame": {"x":458,"y":902,"w":57,"h":79}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":488,"y":112,"w":300,"h":408}, + "spriteSourceSize": {"x":395,"y":525,"w":57,"h":79}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/TallLegLeftKneel.png": +"Models/DivineCuffs/WristLeftLockBandKneel.png": { - "frame": {"x":1712,"y":3,"w":333,"h":273}, + "frame": {"x":1542,"y":916,"w":343,"h":141}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":384,"y":815,"w":333,"h":273}, + "spriteSourceSize": {"x":426,"y":849,"w":343,"h":141}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/TallLegLeftKneelClosed.png": +"Models/DivineCuffs/WristLeftLockFree.png": { - "frame": {"x":1712,"y":280,"w":333,"h":273}, + "frame": {"x":991,"y":450,"w":37,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":384,"y":815,"w":333,"h":273}, + "spriteSourceSize": {"x":826,"y":724,"w":37,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/BeltsChestCrossed.png": +"Models/Dress/BlouseArmRightFront.png": { - "frame": {"x":1404,"y":3,"w":304,"h":410}, + "frame": {"x":1873,"y":1765,"w":153,"h":280}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":383,"w":304,"h":410}, + "spriteSourceSize": {"x":409,"y":440,"w":153,"h":280}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/ChestBoleroBoxtie.png": +"Models/Dress/BlouseSkirt.png": { - "frame": {"x":829,"y":1440,"w":309,"h":310}, + "frame": {"x":3,"y":1295,"w":432,"h":307}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":375,"w":309,"h":310}, + "spriteSourceSize": {"x":397,"y":638,"w":432,"h":307}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/LatexBand.png": +"Models/Dress/MageSkirtKneelCrotchStrap.png": { - "frame": {"x":454,"y":958,"w":200,"h":38}, + "frame": {"x":1542,"y":621,"w":457,"h":269}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":484,"y":656,"w":200,"h":38}, + "spriteSourceSize": {"x":322,"y":747,"w":457,"h":269}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Kigu/Mouth.png": +"Models/GagLatex/SideStrap.png": { - "frame": {"x":1668,"y":458,"w":37,"h":43}, + "frame": {"x":991,"y":266,"w":37,"h":180}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":585,"y":322,"w":37,"h":43}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":206,"y":46,"w":37,"h":180}, + "sourceSize": {"w":321,"h":332} }, -"Models/LatexPetsuit/LegsBeltsHogtie.png": +"Models/Gothic/LaceUpperKneel.png": { - "frame": {"x":1406,"y":506,"w":302,"h":349}, + "frame": {"x":977,"y":677,"w":449,"h":100}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":443,"y":858,"w":302,"h":349}, + "spriteSourceSize": {"x":369,"y":799,"w":449,"h":100}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LatexPetsuit/LegsHogtie.png": +"Models/Hair2/Hair3_FrontD.png": { - "frame": {"x":365,"y":3,"w":337,"h":448}, + "frame": {"x":447,"y":1182,"w":68,"h":41}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":758,"w":337,"h":448}, + "spriteSourceSize": {"x":553,"y":145,"w":68,"h":41}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Legbinder/LegLegbinderKneelClosed.png": +"Models/Hair2/HairAura_LeftB.png": { - "frame": {"x":551,"y":1000,"w":355,"h":436}, + "frame": {"x":1856,"y":1395,"w":189,"h":366}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":411,"y":640,"w":355,"h":436}, + "spriteSourceSize": {"x":533,"y":403,"w":189,"h":366}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/KneeLeftHogtie.png": +"Models/Handcuffs/CuffsLockFront.png": { - "frame": {"x":1272,"y":3,"w":128,"h":417}, + "frame": {"x":1545,"y":3,"w":480,"h":238}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":563,"y":1149,"w":128,"h":417}, + "spriteSourceSize": {"x":417,"y":375,"w":480,"h":238}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/SkirtBandKneel.png": +"Models/Heels/TallLeftKneel.png": { - "frame": {"x":811,"y":1889,"w":167,"h":155}, + "frame": {"x":1542,"y":245,"w":479,"h":182}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":367,"y":759,"w":167,"h":155}, + "spriteSourceSize": {"x":441,"y":906,"w":479,"h":182}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/SkirtCrotchStrap.png": +"Models/Heels/TallLeftKneelClosed.png": { - "frame": {"x":1712,"y":776,"w":333,"h":207}, + "frame": {"x":1032,"y":491,"w":460,"h":182}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":434,"y":738,"w":333,"h":207}, + "spriteSourceSize": {"x":460,"y":906,"w":460,"h":182}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Nipples/Clamps.png": +"Models/Jacket/BeltsChestWristtie.png": { - "frame": {"x":617,"y":455,"w":209,"h":47}, + "frame": {"x":963,"y":1195,"w":307,"h":406}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":460,"y":568,"w":209,"h":47}, + "spriteSourceSize": {"x":466,"y":387,"w":307,"h":406}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/InvertedRose.png": +"Models/Jacket/CrotchBeltExtra.png": { - "frame": {"x":532,"y":1889,"w":275,"h":155}, + "frame": {"x":2003,"y":793,"w":42,"h":119}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":761,"w":275,"h":155}, + "spriteSourceSize": {"x":554,"y":797,"w":42,"h":119}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Petsuit/LegsBeltsHogtie.png": +"Models/Labcoat/ShouldersYoked.png": { - "frame": {"x":1406,"y":506,"w":302,"h":349}, + "frame": {"x":3,"y":1138,"w":440,"h":153}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":443,"y":858,"w":302,"h":349}, + "spriteSourceSize": {"x":413,"y":386,"w":440,"h":153}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Petsuit/Petsuit.png": +"Models/Leash/LeashKneelPulled.png": { - "frame": {"x":1406,"y":506,"w":302,"h":349}, + "frame": {"x":3,"y":3,"w":512,"h":309}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":443,"y":858,"w":302,"h":349}, + "spriteSourceSize": {"x":91,"y":129,"w":512,"h":309}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/ArmHarnessUnderbust.png": +"Models/LeatherCuffs/WristRightFree.png": { - "frame": {"x":658,"y":951,"w":244,"h":45}, + "frame": {"x":462,"y":414,"w":53,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":464,"y":581,"w":244,"h":45}, + "spriteSourceSize": {"x":355,"y":601,"w":53,"h":72}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopCalf1KneelClosed.png": +"Models/LeatherLeotard/StrapsLowerCleanClosed.png": { - "frame": {"x":1363,"y":1553,"w":38,"h":50}, + "frame": {"x":1643,"y":1765,"w":226,"h":280}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":703,"y":954,"w":38,"h":50}, + "spriteSourceSize": {"x":473,"y":639,"w":226,"h":280}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/PantsSpread.png": +"Models/LeatherPetsuit/ArmsLaces.png": { - "frame": {"x":1059,"y":506,"w":343,"h":411}, + "frame": {"x":2003,"y":642,"w":42,"h":147}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":434,"y":710,"w":343,"h":411}, + "spriteSourceSize": {"x":729,"y":507,"w":42,"h":147}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveRightYoked.png": +"Models/Legbinder/LegLegbinderKneelClosed.png": { - "frame": {"x":1142,"y":921,"w":260,"h":353}, + "frame": {"x":3,"y":1606,"w":355,"h":436}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":243,"y":372,"w":260,"h":353}, + "spriteSourceSize": {"x":411,"y":640,"w":355,"h":436}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveRightYokedTight.png": +"Models/Maid/SkirtKneel.png": { - "frame": {"x":1142,"y":921,"w":260,"h":353}, + "frame": {"x":3,"y":569,"w":453,"h":238}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":243,"y":372,"w":260,"h":353}, + "spriteSourceSize": {"x":350,"y":739,"w":453,"h":238}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/ArmStrapCrossed.png": +"Models/MaidKnightLight/ArmRightUp.png": { - "frame": {"x":1142,"y":1553,"w":57,"h":90}, + "frame": {"x":1274,"y":1195,"w":165,"h":405}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":561,"y":602,"w":57,"h":90}, + "spriteSourceSize": {"x":441,"y":156,"w":165,"h":405}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Calf2ClosedOver.png": +"Models/MaidKnightLight/DressSkirtKneel.png": { - "frame": {"x":829,"y":1754,"w":149,"h":43}, + "frame": {"x":519,"y":495,"w":454,"h":340}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":531,"y":1333,"w":149,"h":43}, + "spriteSourceSize": {"x":364,"y":650,"w":454,"h":340}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/CuffsCrossed.png": +"Models/MaidKnightLight/FootSockRightKneel.png": { - "frame": {"x":1142,"y":1553,"w":57,"h":90}, + "frame": {"x":1443,"y":1395,"w":409,"h":205}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":561,"y":602,"w":57,"h":90}, + "spriteSourceSize": {"x":322,"y":856,"w":409,"h":205}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/FrogThigh1Kneel.png": +"Models/MaidKnightLight/PauldronStrapBoxtie.png": { - "frame": {"x":1710,"y":1535,"w":335,"h":244}, + "frame": {"x":462,"y":316,"w":53,"h":94}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":317,"y":842,"w":335,"h":244}, + "spriteSourceSize": {"x":698,"y":463,"w":53,"h":94}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Thigh2ClosedOver.png": +"Models/MaidKnightLight/PauldronStrapFront.png": { - "frame": {"x":365,"y":455,"w":248,"h":47}, + "frame": {"x":462,"y":316,"w":53,"h":94}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":470,"y":1010,"w":248,"h":47}, + "spriteSourceSize": {"x":698,"y":463,"w":53,"h":94}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/HandRightBoxtie.png": +"Models/MaidKnightLight/SockLeftKneel.png": { - "frame": {"x":1363,"y":1607,"w":38,"h":44}, + "frame": {"x":519,"y":3,"w":509,"h":259}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":678,"y":671,"w":38,"h":44}, + "spriteSourceSize": {"x":388,"y":828,"w":509,"h":259}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/LegRightClosed.png": +"Models/Ninja/CollarTag.png": { - "frame": {"x":396,"y":1000,"w":151,"h":442}, + "frame": {"x":447,"y":1265,"w":68,"h":34}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":802,"w":151,"h":442}, + "spriteSourceSize": {"x":582,"y":392,"w":68,"h":34}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/LegRightKneelClosed.png": +"Models/Ninja/ShoeRightKneel.png": { - "frame": {"x":982,"y":1754,"w":217,"h":291}, + "frame": {"x":462,"y":556,"w":53,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":323,"y":768,"w":217,"h":291}, + "spriteSourceSize": {"x":313,"y":882,"w":53,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/Collar.png": +"Models/Ribbon/LegsKneel.png": { - "frame": {"x":3,"y":1911,"w":275,"h":134}, + "frame": {"x":977,"y":781,"w":448,"h":269}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":395,"w":275,"h":134}, + "spriteSourceSize": {"x":316,"y":817,"w":448,"h":269}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/SleeveRight.png": +"Models/Ribbon/ToeClosed.png": { - "frame": {"x":1363,"y":1793,"w":34,"h":81}, + "frame": {"x":1430,"y":677,"w":53,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":464,"y":433,"w":34,"h":81}, + "spriteSourceSize": {"x":519,"y":1571,"w":53,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Shades/GlassesLens.png": +"Models/Ribbon/TopLegsKneel.png": { - "frame": {"x":830,"y":448,"w":168,"h":54}, + "frame": {"x":519,"y":839,"w":448,"h":269}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":521,"y":264,"w":168,"h":54}, + "spriteSourceSize": {"x":316,"y":817,"w":448,"h":269}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/ApronSkirtKneel.png": +"Models/RobeOfChastity/BaseClosed.png": { - "frame": {"x":1406,"y":1121,"w":301,"h":178}, + "frame": {"x":519,"y":1269,"w":290,"h":333}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":411,"y":735,"w":301,"h":178}, + "spriteSourceSize": {"x":447,"y":587,"w":290,"h":333}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/ApronSkirtKneelCrotchStrap.png": +"Models/RobeOfChastity/BaseSpread.png": { - "frame": {"x":1406,"y":1121,"w":301,"h":178}, + "frame": {"x":1755,"y":1061,"w":290,"h":330}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":411,"y":735,"w":301,"h":178}, + "spriteSourceSize": {"x":447,"y":587,"w":290,"h":330}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/HandRightBoxtie.png": +"Models/Robes/SleeveRightWristtie.png": { - "frame": {"x":1363,"y":1655,"w":38,"h":44}, + "frame": {"x":460,"y":622,"w":55,"h":276}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":678,"y":671,"w":38,"h":44}, + "spriteSourceSize": {"x":449,"y":491,"w":55,"h":276}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/LegLeftClosed.png": +"Models/Robes/SleeveRightWristtieTight.png": { - "frame": {"x":3,"y":506,"w":162,"h":490}, + "frame": {"x":460,"y":622,"w":55,"h":276}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":580,"y":755,"w":162,"h":490}, + "spriteSourceSize": {"x":449,"y":491,"w":55,"h":276}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/LegRightClosed.png": +"Models/Robes/ZombieTalisman.png": { - "frame": {"x":706,"y":3,"w":148,"h":441}, + "frame": {"x":1889,"y":894,"w":91,"h":163}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":802,"w":148,"h":441}, + "spriteSourceSize": {"x":554,"y":91,"w":91,"h":163}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/TorsoUpper.png": +"Models/Rubber/TorsoUpper.png": { - "frame": {"x":994,"y":3,"w":274,"h":433}, + "frame": {"x":362,"y":1606,"w":275,"h":435}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":360,"w":274,"h":433}, + "spriteSourceSize": {"x":446,"y":360,"w":275,"h":435}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/SwimsuitKneel.png": +"Models/ShadowHands/RightLegs2Kneel.png": { - "frame": {"x":479,"y":1446,"w":346,"h":439}, + "frame": {"x":813,"y":1462,"w":109,"h":140}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":418,"y":415,"w":346,"h":439}, + "spriteSourceSize": {"x":370,"y":814,"w":109,"h":140}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallBallet/TallLeftHogtie.png": +"Models/ShadowHands/RightLegs2KneelClosed.png": { - "frame": {"x":382,"y":506,"w":149,"h":448}, + "frame": {"x":813,"y":1462,"w":109,"h":140}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":636,"y":770,"w":149,"h":448}, + "spriteSourceSize": {"x":370,"y":814,"w":109,"h":140}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallBallet/TallLegLeftKneel.png": +"Models/Skirts/MaidSkirtKneel.png": { - "frame": {"x":1712,"y":987,"w":332,"h":267}, + "frame": {"x":519,"y":266,"w":468,"h":225}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":382,"y":817,"w":332,"h":267}, + "spriteSourceSize": {"x":339,"y":731,"w":468,"h":225}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallBallet/TallLegLeftKneelClosed.png": +"Models/Skirts/MaidSkirtKneelCrotchStrap.png": { - "frame": {"x":1710,"y":1783,"w":330,"h":262}, + "frame": {"x":519,"y":266,"w":468,"h":225}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":382,"y":819,"w":330,"h":262}, + "spriteSourceSize": {"x":339,"y":731,"w":468,"h":225}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallSmoothHeels/TallLegleftKneelClosed.png": +"Models/Skirts/StripedSkirtKneelCrotchStrap.png": { - "frame": {"x":1711,"y":1258,"w":334,"h":273}, + "frame": {"x":3,"y":316,"w":455,"h":249}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":384,"y":815,"w":334,"h":273}, + "spriteSourceSize": {"x":365,"y":725,"w":455,"h":249}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/RightLegsClosed.png": +"Models/Slayer/CapeYoked.png": { - "frame": {"x":706,"y":506,"w":349,"h":436}, + "frame": {"x":971,"y":1054,"w":441,"h":137}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":437,"y":820,"w":349,"h":436}, + "spriteSourceSize": {"x":398,"y":404,"w":441,"h":137}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/RightLegsClosed.png": +"Models/Slime/LegRightClosed.png": { - "frame": {"x":3,"y":3,"w":358,"h":499}, + "frame": {"x":1491,"y":1604,"w":148,"h":441}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":428,"y":652,"w":358,"h":499}, + "spriteSourceSize": {"x":446,"y":802,"w":148,"h":441}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/TopStrapCrossed.png": +"Models/TallSmoothHeels/TallLeftKneelClosed.png": { - "frame": {"x":1002,"y":440,"w":304,"h":62}, + "frame": {"x":1542,"y":431,"w":469,"h":186}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":439,"w":304,"h":62}, + "spriteSourceSize": {"x":460,"y":902,"w":469,"h":186}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/ShoeLeftClosedRopesAnkle.png": +"Models/TapeHeavy/FeetClosed.png": { - "frame": {"x":535,"y":506,"w":167,"h":441}, + "frame": {"x":1643,"y":1604,"w":209,"h":136}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":530,"y":1193,"w":167,"h":441}, + "spriteSourceSize": {"x":460,"y":1483,"w":209,"h":136}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/ShoeLeftSpread.png": +"Models/TapeHeavy/LegsKneelClosed.png": { - "frame": {"x":168,"y":1463,"w":131,"h":444}, + "frame": {"x":641,"y":1606,"w":393,"h":426}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":637,"y":1200,"w":131,"h":444}, + "spriteSourceSize": {"x":386,"y":652,"w":393,"h":426}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/BlouseLiner.png": +"Models/TapeMed/RightLegsKneelClosed.png": { - "frame": {"x":1142,"y":1278,"w":260,"h":173}, + "frame": {"x":3,"y":811,"w":451,"h":323}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":611,"w":260,"h":173}, + "spriteSourceSize": {"x":328,"y":652,"w":451,"h":323}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/ShoeRightClosed.png": +"Models/Warrior/ShoeLeftClosedRopesAnkle.png": { - "frame": {"x":829,"y":1801,"w":123,"h":84}, + "frame": {"x":1320,"y":1604,"w":167,"h":441}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":1535,"w":123,"h":84}, + "spriteSourceSize": {"x":530,"y":1193,"w":167,"h":441}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/HarnessHardwareMid.png": +"Models/Warrior/SkirtOverKneel.png": { - "frame": {"x":1203,"y":1878,"w":306,"h":167}, + "frame": {"x":1416,"y":1061,"w":335,"h":130}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":438,"y":688,"w":306,"h":167}, + "spriteSourceSize": {"x":477,"y":801,"w":335,"h":130}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/SkirtClosedCrotchStrap.png": +"Models/Witch/SkirtKneelCrotchStrap.png": { - "frame": {"x":3,"y":1000,"w":389,"h":459}, + "frame": {"x":1032,"y":3,"w":509,"h":204}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":409,"y":761,"w":389,"h":459}, + "spriteSourceSize": {"x":333,"y":774,"w":509,"h":204}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/SleeveLeftUp.png": +"Models/Wolf/HarnessMid.png": { - "frame": {"x":303,"y":1463,"w":172,"h":442}, + "frame": {"x":1443,"y":1195,"w":308,"h":174}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":659,"y":163,"w":172,"h":442}, + "spriteSourceSize": {"x":437,"y":685,"w":308,"h":174}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -663,7 +639,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas26.webp b/TextureAtlas/atlas26.webp index d97c84009..cfc6d9ee0 100644 Binary files a/TextureAtlas/atlas26.webp and b/TextureAtlas/atlas26.webp differ diff --git a/TextureAtlas/atlas27.json b/TextureAtlas/atlas27.json index 7ade3b6b8..5f27cd3f5 100644 --- a/TextureAtlas/atlas27.json +++ b/TextureAtlas/atlas27.json @@ -1,312 +1,496 @@ {"frames": { -"Models/ArmorChain/Skirt.png": +"Models/Armbinder/GwenBoxtie.png": { - "frame": {"x":825,"y":1328,"w":336,"h":186}, + "frame": {"x":1324,"y":714,"w":223,"h":113}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":434,"y":739,"w":336,"h":186}, + "spriteSourceSize": {"x":489,"y":421,"w":223,"h":113}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorChain/SkirtCrotchStrap.png": +"Models/Armbinder/GwenWristtie.png": { - "frame": {"x":825,"y":1328,"w":336,"h":186}, + "frame": {"x":1324,"y":714,"w":223,"h":113}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":434,"y":739,"w":336,"h":186}, + "spriteSourceSize": {"x":489,"y":421,"w":223,"h":113}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/GloveLeftYoked.png": +"Models/ArmorChain/ShirtHogtie.png": { - "frame": {"x":1841,"y":3,"w":204,"h":357}, + "frame": {"x":964,"y":1502,"w":278,"h":401}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":744,"y":279,"w":204,"h":357}, + "spriteSourceSize": {"x":445,"y":417,"w":278,"h":401}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/SockRightKneelClosed.png": +"Models/ArmorPlate/BootLeftClosed.png": { - "frame": {"x":1733,"y":883,"w":226,"h":252}, + "frame": {"x":365,"y":455,"w":161,"h":444}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":323,"y":816,"w":226,"h":252}, + "spriteSourceSize": {"x":535,"y":1181,"w":161,"h":444}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cape/ShouldersYoked.png": +"Models/ArmorPlate/BootRightClosed.png": { - "frame": {"x":3,"y":493,"w":440,"h":153}, + "frame": {"x":653,"y":3,"w":135,"h":409}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":413,"y":386,"w":440,"h":153}, + "spriteSourceSize": {"x":462,"y":1208,"w":135,"h":409}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ChestHogtie.png": +"Models/Bandit/ShortsKneel.png": { - "frame": {"x":1678,"y":1930,"w":267,"h":115}, + "frame": {"x":1669,"y":236,"w":375,"h":220}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":513,"w":267,"h":115}, + "spriteSourceSize": {"x":400,"y":751,"w":375,"h":220}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraCyberLining.png": +"Models/Bandit/ShortsKneelClosed.png": { - "frame": {"x":294,"y":1933,"w":267,"h":112}, + "frame": {"x":1669,"y":236,"w":375,"h":220}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":515,"w":267,"h":112}, + "spriteSourceSize": {"x":400,"y":751,"w":375,"h":220}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraProtoLiningRim.png": +"Models/Body/Eyes.png": { - "frame": {"x":1775,"y":1315,"w":270,"h":226}, + "frame": {"x":1505,"y":1815,"w":160,"h":84}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":413,"w":270,"h":226}, + "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Collars/Quake.png": +"Models/Bunny/Leotard.png": { - "frame": {"x":1954,"y":1545,"w":90,"h":38}, + "frame": {"x":1318,"y":1009,"w":269,"h":397}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":578,"y":394,"w":90,"h":38}, + "spriteSourceSize": {"x":446,"y":518,"w":269,"h":397}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/WristRightFront.png": +"Models/Cape/ShouldersHogtie.png": { - "frame": {"x":1313,"y":1079,"w":67,"h":56}, + "frame": {"x":1324,"y":451,"w":341,"h":259}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":473,"y":541,"w":67,"h":56}, + "spriteSourceSize": {"x":454,"y":396,"w":341,"h":259}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/GlowLongMittenRightFree.png": +"Models/Chastity/BraCyberDisplay.png": { - "frame": {"x":1963,"y":883,"w":82,"h":71}, + "frame": {"x":1428,"y":831,"w":43,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":314,"y":630,"w":82,"h":71}, + "spriteSourceSize": {"x":554,"y":553,"w":43,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/LongMittenLeftFront.png": +"Models/Chastity/CyberPanties.png": { - "frame": {"x":587,"y":1328,"w":132,"h":187}, + "frame": {"x":1772,"y":1243,"w":273,"h":179}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":637,"y":534,"w":132,"h":187}, + "spriteSourceSize": {"x":453,"y":744,"w":273,"h":179}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayAnkleRightClosed.png": +"Models/Chastity/Proto.png": { - "frame": {"x":1346,"y":717,"w":34,"h":50}, + "frame": {"x":998,"y":1009,"w":316,"h":400}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":537,"y":1433,"w":34,"h":50}, + "spriteSourceSize": {"x":449,"y":523,"w":316,"h":400}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ElbowLeftFree.png": +"Models/CrystalCuffs/WristLeftFree.png": { - "frame": {"x":1963,"y":958,"w":82,"h":59}, + "frame": {"x":1984,"y":1486,"w":61,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":700,"y":579,"w":82,"h":59}, + "spriteSourceSize": {"x":797,"y":749,"w":61,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/ArmLongMittenLeftFront.png": +"Models/Cuffs/ElbowLeftUp.png": { - "frame": {"x":587,"y":1328,"w":132,"h":187}, + "frame": {"x":1551,"y":3,"w":114,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":637,"y":534,"w":132,"h":187}, + "spriteSourceSize": {"x":717,"y":249,"w":114,"h":72}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CapLongMittenRightCrossed.png": +"Models/Cuffs/WristLeftFree.png": { - "frame": {"x":1346,"y":517,"w":34,"h":75}, + "frame": {"x":1984,"y":1545,"w":61,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":747,"y":612,"w":34,"h":75}, + "spriteSourceSize": {"x":797,"y":749,"w":61,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/GlowLongMittenRightFree.png": +"Models/CyberArms/CuffLongMittenLeftFree.png": { - "frame": {"x":1963,"y":883,"w":82,"h":71}, + "frame": {"x":1505,"y":1502,"w":160,"h":309}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":314,"y":630,"w":82,"h":71}, + "spriteSourceSize": {"x":699,"y":496,"w":160,"h":309}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/LongMittenLeftFront.png": +"Models/CyberCuffs/ElbowRightUp.png": { - "frame": {"x":587,"y":1328,"w":132,"h":187}, + "frame": {"x":1551,"y":79,"w":114,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":637,"y":534,"w":132,"h":187}, + "spriteSourceSize": {"x":445,"y":250,"w":114,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberPetsuit/LeftLegsBeltsKneelClosed.png": +"Models/CyberCuffs/ScreenAnkleLeftKneelClosed.png": { - "frame": {"x":3,"y":650,"w":428,"h":393}, + "frame": {"x":522,"y":1462,"w":61,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":308,"y":697,"w":428,"h":393}, + "spriteSourceSize": {"x":707,"y":974,"w":61,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighLeftLockBandClosed.png": +"Models/CyberCuffs/ScreenElbowRightBoxtie.png": { - "frame": {"x":1949,"y":2013,"w":66,"h":32}, + "frame": {"x":662,"y":1911,"w":27,"h":41}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":625,"y":1083,"w":66,"h":32}, + "spriteSourceSize": {"x":450,"y":591,"w":27,"h":41}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseArmLeftCrossed.png": +"Models/DivineBelt/BraBase1.png": { - "frame": {"x":1839,"y":364,"w":206,"h":255}, + "frame": {"x":1267,"y":863,"w":280,"h":142}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":569,"y":441,"w":206,"h":255}, + "spriteSourceSize": {"x":436,"y":498,"w":280,"h":142}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseBust.png": +"Models/DivineCuffs/AnkleLeftLockPlateClosed.png": { - "frame": {"x":1400,"y":1930,"w":274,"h":115}, + "frame": {"x":701,"y":1421,"w":38,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":514,"w":274,"h":115}, + "spriteSourceSize": {"x":649,"y":1431,"w":38,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseBustChesttied.png": +"Models/DivineCuffs/BeltDeco.png": { - "frame": {"x":565,"y":1931,"w":274,"h":114}, + "frame": {"x":806,"y":415,"w":221,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":514,"w":274,"h":114}, + "spriteSourceSize": {"x":473,"y":699,"w":221,"h":32}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseBustUp.png": +"Models/DivineCuffs/BeltDecoClean.png": { - "frame": {"x":1121,"y":1930,"w":275,"h":115}, + "frame": {"x":1031,"y":415,"w":221,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":514,"w":275,"h":115}, + "spriteSourceSize": {"x":473,"y":699,"w":221,"h":32}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseBustUpChesttied.png": +"Models/DivineCuffs/CollarDeco.png": { - "frame": {"x":843,"y":1931,"w":274,"h":114}, + "frame": {"x":172,"y":1462,"w":90,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":514,"w":274,"h":114}, + "spriteSourceSize": {"x":583,"y":389,"w":90,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseSkirt.png": +"Models/DivineCuffs/CollarDecoClean.png": { - "frame": {"x":1384,"y":572,"w":432,"h":307}, + "frame": {"x":266,"y":1462,"w":90,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":397,"y":638,"w":432,"h":307}, + "spriteSourceSize": {"x":583,"y":389,"w":90,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseSkirtLone.png": +"Models/DivineCuffs/ElbowLeftLockPlateBoxtie.png": { - "frame": {"x":447,"y":549,"w":432,"h":307}, + "frame": {"x":686,"y":1462,"w":39,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":397,"y":638,"w":432,"h":307}, + "spriteSourceSize": {"x":745,"y":577,"w":39,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BowCorsetLongRuffle.png": +"Models/DivineCuffs/ElbowLeftLockPlateUp.png": { - "frame": {"x":3,"y":1933,"w":287,"h":112}, + "frame": {"x":642,"y":1462,"w":40,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":761,"w":287,"h":112}, + "spriteSourceSize": {"x":709,"y":255,"w":40,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MageSkirtKneel.png": +"Models/DivineCuffs/ElbowRightDecoFront.png": { - "frame": {"x":3,"y":3,"w":457,"h":269}, + "frame": {"x":385,"y":1421,"w":83,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":322,"y":747,"w":457,"h":269}, + "spriteSourceSize": {"x":430,"y":622,"w":83,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MageSkirtKneelCrotchStrap.png": +"Models/DivineCuffs/ElbowRightLockPlateUp.png": { - "frame": {"x":464,"y":3,"w":457,"h":269}, + "frame": {"x":657,"y":1421,"w":40,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":322,"y":747,"w":457,"h":269}, + "spriteSourceSize": {"x":528,"y":271,"w":40,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/SkirtSplitKneel.png": +"Models/DivineCuffs/ThighLeftKneel.png": { - "frame": {"x":3,"y":1299,"w":423,"h":216}, + "frame": {"x":1333,"y":1903,"w":174,"h":142}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":360,"y":761,"w":423,"h":216}, + "spriteSourceSize": {"x":482,"y":848,"w":174,"h":142}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ears/Wolf.png": +"Models/DivineCuffs/ThighLeftKneelClosed.png": { - "frame": {"x":858,"y":1139,"w":271,"h":185}, + "frame": {"x":1333,"y":1903,"w":174,"h":142}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":479,"y":27,"w":271,"h":185}, + "spriteSourceSize": {"x":482,"y":848,"w":174,"h":142}, "sourceSize": {"w":1240,"h":1754} }, -"Models/GagMetal/HarnessMask.png": +"Models/DivineCuffs/ThighLeftLockBandSpread.png": { - "frame": {"x":1949,"y":1930,"w":96,"h":79}, + "frame": {"x":472,"y":1421,"w":66,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":89,"y":208,"w":96,"h":79}, + "spriteSourceSize": {"x":663,"y":1072,"w":66,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightDecoCleanSpread.png": +{ + "frame": {"x":1071,"y":863,"w":94,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":1052,"w":94,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightDecoSpread.png": +{ + "frame": {"x":1169,"y":863,"w":94,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":1052,"w":94,"h":36}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightLockPlateKneel.png": +{ + "frame": {"x":1984,"y":1426,"w":61,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":422,"y":826,"w":61,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BandKneel.png": +{ + "frame": {"x":743,"y":1421,"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":743,"y":1421,"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":172,"y":1009,"w":209,"h":449}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":413,"w":209,"h":449}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmRightUp.png": +{ + "frame": {"x":1591,"y":1009,"w":177,"h":349}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":444,"y":156,"w":177,"h":349}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MageCorset.png": +{ + "frame": {"x":1246,"y":1502,"w":255,"h":397}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":407,"w":255,"h":397}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/CircletGem.png": +{ + "frame": {"x":1725,"y":1362,"w":43,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":560,"y":169,"w":43,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai1/BrowsSad.png": +{ + "frame": {"x":1380,"y":831,"w":44,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":254,"w":44,"h":26}, + "sourceSize": {"w":806,"h":515} +}, +"Models/EyesK2/EyesClosed.png": +{ + "frame": {"x":542,"y":1421,"w":61,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":518,"y":269,"w":61,"h":37}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/WhitesEyesAngry.png": +{ + "frame": {"x":1591,"y":1362,"w":63,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":269,"w":63,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/WhitesEyesClosed.png": +{ + "frame": {"x":542,"y":1421,"w":61,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":518,"y":269,"w":61,"h":37}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/WhitesEyesDazed.png": +{ + "frame": {"x":1658,"y":1362,"w":63,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":516,"y":269,"w":63,"h":44}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesKertasu/EyesWhitesAngry.png": +{ + "frame": {"x":1505,"y":1815,"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":1505,"y":1815,"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":1505,"y":1815,"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":1505,"y":1815,"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":1505,"y":1815,"w":160,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceKjus/Eyes2Surprised.png": +{ + "frame": {"x":1984,"y":1604,"w":61,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":617,"y":263,"w":61,"h":42}, + "sourceSize": {"w":791,"h":501} +}, +"Models/FaceKjus/WhitesEyes2Dazed.png": +{ + "frame": {"x":1342,"y":415,"w":61,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":618,"y":272,"w":61,"h":32}, + "sourceSize": {"w":753,"h":414} +}, +"Models/GagLeather/MuzzleStrap.png": +{ + "frame": {"x":1991,"y":674,"w":48,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":179,"y":214,"w":48,"h":36}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BigBallStrapSegmented.png": +{ + "frame": {"x":653,"y":416,"w":149,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":233,"w":149,"h":31}, "sourceSize": {"w":321,"h":332} }, -"Models/Gothic/LaceUpperKneel.png": +"Models/Gothic/WaistbandClips.png": { - "frame": {"x":925,"y":256,"w":449,"h":100}, + "frame": {"x":729,"y":863,"w":206,"h":36}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":369,"y":799,"w":449,"h":100}, + "spriteSourceSize": {"x":480,"y":673,"w":206,"h":36}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Gothic/LaceUpperKneelCrotchStrap..png": +"Models/Hair/BraidCustom.png": { - "frame": {"x":3,"y":276,"w":449,"h":72}, + "frame": {"x":1772,"y":714,"w":273,"h":270}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":369,"y":802,"w":449,"h":72}, + "spriteSourceSize": {"x":469,"y":117,"w":273,"h":270}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/FrontStraight_Overstrap.png": +"Models/Hair/FrontStraight.png": { - "frame": {"x":1229,"y":1518,"w":300,"h":408}, + "frame": {"x":1105,"y":3,"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": +"Models/Hair/FrontStraight_Overstrap.png": { - "frame": {"x":3,"y":1519,"w":295,"h":410}, + "frame": {"x":694,"y":1009,"w":300,"h":408}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":110,"w":295,"h":410}, + "spriteSourceSize": {"x":488,"y":112,"w":300,"h":408}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Handcuffs/HandCuffsFront.png": +"Models/Hair2/Hair6_Left.png": { - "frame": {"x":1533,"y":1518,"w":238,"h":65}, + "frame": {"x":1879,"y":460,"w":108,"h":250}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":466,"y":526,"w":238,"h":65}, + "spriteSourceSize": {"x":699,"y":107,"w":108,"h":250}, "sourceSize": {"w":1240,"h":1754} }, "Models/Jacket/BeltsChestBoxtie.png": { - "frame": {"x":612,"y":1519,"w":305,"h":408}, + "frame": {"x":385,"y":1009,"w":305,"h":408}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":465,"y":385,"w":305,"h":408}, @@ -314,7 +498,7 @@ }, "Models/Jacket/StrapsChestBoxtie.png": { - "frame": {"x":302,"y":1519,"w":306,"h":408}, + "frame": {"x":706,"y":451,"w":306,"h":408}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":465,"y":385,"w":306,"h":408}, @@ -322,282 +506,450 @@ }, "Models/Jacket/StrapsChestCrossed.png": { - "frame": {"x":921,"y":1518,"w":304,"h":408}, + "frame": {"x":1016,"y":451,"w":304,"h":408}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":461,"y":385,"w":304,"h":408}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Labcoat/ShouldersYoked.png": +"Models/Jacket/StrapsChestWristtie.png": +{ + "frame": {"x":792,"y":3,"w":309,"h":408}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":385,"w":309,"h":408}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Kigu/EyesWhites.png": +{ + "frame": {"x":1505,"y":1815,"w":160,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/LegsHogtie.png": +{ + "frame": {"x":321,"y":1503,"w":337,"h":448}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":758,"w":337,"h":448}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandElbowLeftFree.png": +{ + "frame": {"x":1256,"y":415,"w":82,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":594,"w":82,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareWristLeftFree.png": +{ + "frame": {"x":607,"y":1421,"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":587,"y":1462,"w":51,"h":37}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":631,"y":552,"w":51,"h":37}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/RightLegbinderClosed.png": +{ + "frame": {"x":1409,"y":3,"w":138,"h":319}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":445,"y":911,"w":138,"h":319}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/Apron.png": +{ + "frame": {"x":1669,"y":1796,"w":261,"h":249}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":741,"w":261,"h":249}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeKneel.png": +{ + "frame": {"x":278,"y":1958,"w":415,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":371,"y":855,"w":415,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/BootLeftClosed.png": +{ + "frame": {"x":3,"y":1503,"w":145,"h":458}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":551,"y":1206,"w":145,"h":458}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/HeadbandFrill.png": +{ + "frame": {"x":970,"y":903,"w":215,"h":102}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":102,"w":215,"h":102}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronStrap.png": +{ + "frame": {"x":1991,"y":576,"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":1991,"y":576,"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":1991,"y":576,"w":54,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":697,"y":463,"w":54,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LatexLeftYoked.png": +{ + "frame": {"x":1934,"y":1796,"w":111,"h":233}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":843,"y":285,"w":111,"h":233}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/ShoeLeftKneel.png": +{ + "frame": {"x":1409,"y":326,"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":1409,"y":326,"w":138,"h":102}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":764,"y":920,"w":138,"h":102}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/BaseKneel.png": +{ + "frame": {"x":365,"y":903,"w":300,"h":102}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":754,"w":300,"h":102}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Panties/InvertedRoseKneel.png": +{ + "frame": {"x":669,"y":903,"w":297,"h":102}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":450,"y":754,"w":297,"h":102}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Pony/CollarTagHogtie.png": +{ + "frame": {"x":1475,"y":831,"w":42,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":406,"w":42,"h":26}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/HarnessMid.png": +{ + "frame": {"x":976,"y":1907,"w":353,"h":138}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":436,"y":604,"w":353,"h":138}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopToeClosed.png": { - "frame": {"x":908,"y":360,"w":440,"h":153}, + "frame": {"x":1324,"y":831,"w":52,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":413,"y":386,"w":440,"h":153}, + "spriteSourceSize": {"x":520,"y":1571,"w":52,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherLeotard/StrapsHardware.png": +"Models/RobeOfChastity/PauldronsYoked.png": { - "frame": {"x":1775,"y":1545,"w":175,"h":38}, + "frame": {"x":1321,"y":1410,"w":344,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":481,"y":764,"w":175,"h":38}, + "spriteSourceSize": {"x":455,"y":407,"w":344,"h":88}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LegsHardwareHogtie.png": +"Models/Rope/Calf1ClosedOver.png": { - "frame": {"x":1999,"y":1021,"w":46,"h":111}, + "frame": {"x":939,"y":863,"w":128,"h":36}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":692,"y":1010,"w":46,"h":111}, + "spriteSourceSize": {"x":544,"y":1416,"w":128,"h":36}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/SkirtKneel.png": +"Models/Rope/RightFrogtieKneel.png": { - "frame": {"x":1384,"y":3,"w":453,"h":238}, + "frame": {"x":1551,"y":153,"w":114,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":350,"y":739,"w":453,"h":238}, + "spriteSourceSize": {"x":398,"y":816,"w":114,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/DressSkirt.png": +"Models/Rope/RightFrogtieKneelClosed.png": { - "frame": {"x":883,"y":809,"w":426,"h":326}, + "frame": {"x":1551,"y":153,"w":114,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":392,"y":661,"w":426,"h":326}, + "spriteSourceSize": {"x":398,"y":816,"w":114,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/BandRightFree.png": +"Models/Rubber/LegLeftClosed.png": { - "frame": {"x":1346,"y":806,"w":33,"h":59}, + "frame": {"x":3,"y":1009,"w":165,"h":490}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":361,"y":606,"w":33,"h":59}, + "spriteSourceSize": {"x":577,"y":755,"w":165,"h":490}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/ForeLongMittenRightCrossed.png": +"Models/Rubber/LegRightHogtie.png": { - "frame": {"x":1165,"y":1328,"w":314,"h":186}, + "frame": {"x":662,"y":1503,"w":147,"h":404}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":424,"y":543,"w":314,"h":186}, + "spriteSourceSize": {"x":446,"y":802,"w":147,"h":404}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LongMittenLeftFront.png": +"Models/Sailor/Collar.png": { - "frame": {"x":723,"y":1328,"w":98,"h":187}, + "frame": {"x":697,"y":1911,"w":275,"h":134}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":670,"y":527,"w":98,"h":187}, + "spriteSourceSize": {"x":493,"y":395,"w":275,"h":134}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LongMittenRightFront.png": +"Models/ShadowHands/CrotchStrap.png": { - "frame": {"x":1313,"y":869,"w":67,"h":206}, + "frame": {"x":1189,"y":903,"w":66,"h":102}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":424,"y":509,"w":67,"h":206}, + "spriteSourceSize": {"x":541,"y":818,"w":66,"h":102}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/SkirtBand.png": +"Models/Skirts/StripedSkirtUnder.png": { - "frame": {"x":1632,"y":1139,"w":96,"h":185}, + "frame": {"x":1772,"y":988,"w":273,"h":251}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":759,"w":96,"h":185}, + "spriteSourceSize": {"x":469,"y":768,"w":273,"h":251}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/SockRightClosed.png": +"Models/Skirts/StripedSkirtUnderClosed.png": { - "frame": {"x":1874,"y":1587,"w":139,"h":339}, + "frame": {"x":1772,"y":988,"w":273,"h":251}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":460,"y":1276,"w":139,"h":339}, + "spriteSourceSize": {"x":469,"y":768,"w":273,"h":251}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopCalf3Closed.png": +"Models/Skirts/StripedSkirtUnderHogtie.png": { - "frame": {"x":1387,"y":1139,"w":241,"h":185}, + "frame": {"x":1772,"y":988,"w":273,"h":251}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":507,"y":1231,"w":241,"h":185}, + "spriteSourceSize": {"x":469,"y":768,"w":273,"h":251}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopLegsKneel.png": +"Models/Slime/AnkleRightClosed.png": { - "frame": {"x":456,"y":276,"w":448,"h":269}, + "frame": {"x":1669,"y":1410,"w":99,"h":382}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":316,"y":817,"w":448,"h":269}, + "spriteSourceSize": {"x":501,"y":1131,"w":99,"h":382}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/FabricKneel.png": +"Models/Slime/FootLeftHogtie.png": { - "frame": {"x":1133,"y":1139,"w":250,"h":185}, + "frame": {"x":1991,"y":460,"w":54,"h":112}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":657,"w":250,"h":185}, + "spriteSourceSize": {"x":727,"y":802,"w":54,"h":112}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/Skirt.png": +"Models/Slime/LegLeftHogtie.png": { - "frame": {"x":1384,"y":883,"w":345,"h":252}, + "frame": {"x":152,"y":1503,"w":165,"h":451}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":431,"y":710,"w":345,"h":252}, + "spriteSourceSize": {"x":578,"y":755,"w":165,"h":451}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SkirtClosed.png": +"Models/Slime/LegRightHogtie.png": { - "frame": {"x":1384,"y":883,"w":345,"h":252}, + "frame": {"x":813,"y":1502,"w":147,"h":404}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":431,"y":710,"w":345,"h":252}, + "spriteSourceSize": {"x":446,"y":802,"w":147,"h":404}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SkirtKneel.png": +"Models/Slime/LegRightKneelClosed.png": { - "frame": {"x":3,"y":1047,"w":424,"h":248}, + "frame": {"x":1551,"y":714,"w":217,"h":291}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":377,"y":716,"w":424,"h":248}, + "spriteSourceSize": {"x":323,"y":768,"w":217,"h":291}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/FrogThigh2KneelClosed.png": +"Models/SmoothHeels/LeftHogtie.png": { - "frame": {"x":1483,"y":1328,"w":288,"h":186}, + "frame": {"x":1984,"y":1650,"w":50,"h":142}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":365,"y":861,"w":288,"h":186}, + "spriteSourceSize": {"x":730,"y":797,"w":50,"h":142}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/HemRightYoked.png": +"Models/SteelCuffs/Collar.png": { - "frame": {"x":1346,"y":596,"w":34,"h":57}, + "frame": {"x":360,"y":1462,"w":84,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":435,"y":488,"w":34,"h":57}, + "spriteSourceSize": {"x":585,"y":395,"w":84,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/StripedSkirtKneelCrotchStrap.png": +"Models/Succubus/SuccubusClawLeftFree.png": { - "frame": {"x":925,"y":3,"w":455,"h":249}, + "frame": {"x":448,"y":1462,"w":70,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":365,"y":725,"w":455,"h":249}, + "spriteSourceSize": {"x":838,"y":832,"w":70,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/StripedSkirtOverKneelCrotchStrap.png": +"Models/TallBallet/TallLeftHogtie.png": { - "frame": {"x":435,"y":860,"w":426,"h":216}, + "frame": {"x":365,"y":3,"w":149,"h":448}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":394,"y":758,"w":426,"h":216}, + "spriteSourceSize": {"x":636,"y":770,"w":149,"h":448}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeYoked.png": +"Models/TallSmoothHeels/TallLegRightKneel.png": { - "frame": {"x":3,"y":352,"w":441,"h":137}, + "frame": {"x":1669,"y":460,"w":206,"h":250}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":398,"y":404,"w":441,"h":137}, + "spriteSourceSize": {"x":313,"y":819,"w":206,"h":250}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/ChestCrossed.png": +"Models/TapeMed/LegsHogtie.png": { - "frame": {"x":1533,"y":1587,"w":337,"h":339}, + "frame": {"x":3,"y":3,"w":358,"h":499}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":433,"y":360,"w":337,"h":339}, + "spriteSourceSize": {"x":428,"y":652,"w":358,"h":499}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelChastity/BraPadlockPin.png": +"Models/TapeMed/RightLegsClosed.png": { - "frame": {"x":1346,"y":771,"w":34,"h":31}, + "frame": {"x":3,"y":506,"w":358,"h":499}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":558,"y":556,"w":34,"h":31}, + "spriteSourceSize": {"x":428,"y":652,"w":358,"h":499}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/bac/SuccubusClawRightFree.png": +"Models/Warrior/ShoeLeftSpread.png": { - "frame": {"x":1963,"y":1021,"w":32,"h":114}, + "frame": {"x":518,"y":3,"w":131,"h":444}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":289,"y":526,"w":32,"h":114}, + "spriteSourceSize": {"x":637,"y":1200,"w":131,"h":444}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/ArmStrapLeftBoxtie.png": +"Models/Witch/BlouseLeftBoxtie.png": { - "frame": {"x":1732,"y":1139,"w":313,"h":172}, + "frame": {"x":1772,"y":1426,"w":208,"h":366}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":438,"w":313,"h":172}, + "spriteSourceSize": {"x":585,"y":418,"w":208,"h":366}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ArmStrapLeftBoxtie.png": +"Models/Witch/SkirtBelt.png": { - "frame": {"x":1732,"y":1139,"w":313,"h":172}, + "frame": {"x":1025,"y":1413,"w":292,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":438,"w":313,"h":172}, + "spriteSourceSize": {"x":447,"y":735,"w":292,"h":85}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/RightLegsKneel.png": +"Models/Wolf/CollarBand.png": { - "frame": {"x":908,"y":517,"w":434,"h":288}, + "frame": {"x":1551,"y":219,"w":114,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":345,"y":798,"w":434,"h":288}, + "spriteSourceSize": {"x":571,"y":382,"w":114,"h":47}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/RightLegsKneelClosed.png": +"Models/Wolf/HarnessMidKneel.png": { - "frame": {"x":1384,"y":245,"w":451,"h":323}, + "frame": {"x":3,"y":1965,"w":271,"h":80}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":328,"y":652,"w":451,"h":323}, + "spriteSourceSize": {"x":453,"y":685,"w":271,"h":80}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/SkirtKneel.png": +"Models/WolfCatsuit/GloveLeftBoxtie.png": { - "frame": {"x":431,"y":1080,"w":423,"h":244}, + "frame": {"x":1551,"y":270,"w":96,"h":177}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":389,"y":687,"w":423,"h":244}, + "spriteSourceSize": {"x":676,"y":507,"w":96,"h":177}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/CollarTag.png": +"Models/WolfCatsuit/LegLeftHogtie.png": { - "frame": {"x":1346,"y":657,"w":34,"h":56}, + "frame": {"x":530,"y":451,"w":172,"h":414}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":575,"y":437,"w":34,"h":56}, + "spriteSourceSize": {"x":577,"y":792,"w":172,"h":414}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/FCollarTag.png": +"Models/WolfCatsuit/LegPadsLeftKneelClosed.png": { - "frame": {"x":1346,"y":657,"w":34,"h":56}, + "frame": {"x":1669,"y":3,"w":375,"h":229}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":586,"y":441,"w":34,"h":56}, + "spriteSourceSize": {"x":388,"y":827,"w":375,"h":229}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/GloveLeftFront.png": +"Models/WolfCatsuit/LegRimLeftSpread.png": { - "frame": {"x":1820,"y":623,"w":225,"h":256}, + "frame": {"x":1511,"y":1903,"w":154,"h":135}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":548,"y":465,"w":225,"h":256}, + "spriteSourceSize": {"x":597,"y":792,"w":154,"h":135}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/ShoeLeftClosed.png": +"Models/WolfCatsuit/TorsoUpperBand.png": { - "frame": {"x":430,"y":1328,"w":153,"h":187}, + "frame": {"x":530,"y":869,"w":195,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":520,"y":1456,"w":153,"h":187}, + "spriteSourceSize": {"x":486,"y":659,"w":195,"h":30}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -607,7 +959,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas27.webp b/TextureAtlas/atlas27.webp index fffa225e3..cc0ea1f38 100644 Binary files a/TextureAtlas/atlas27.webp and b/TextureAtlas/atlas27.webp differ diff --git a/TextureAtlas/atlas28.json b/TextureAtlas/atlas28.json index e99886893..b523db1f2 100644 --- a/TextureAtlas/atlas28.json +++ b/TextureAtlas/atlas28.json @@ -1,168 +1,88 @@ {"frames": { -"Models/ArmorChain/SkirtBeltRivets.png": +"Models/ArmorChain/SkirtBeltKneel.png": { - "frame": {"x":1006,"y":1351,"w":136,"h":26}, + "frame": {"x":3,"y":1599,"w":289,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":505,"y":787,"w":136,"h":26}, + "spriteSourceSize": {"x":444,"y":754,"w":289,"h":68}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/BootLeftHogtie.png": +"Models/ArmorChain/SkirtKneel.png": { - "frame": {"x":1513,"y":1381,"w":102,"h":351}, + "frame": {"x":871,"y":223,"w":418,"h":219}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":680,"y":787,"w":102,"h":351}, + "spriteSourceSize": {"x":362,"y":748,"w":418,"h":219}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/BootLeftKneel.png": +"Models/ArmorChain/SkirtKneelCrotchStrap.png": { - "frame": {"x":1231,"y":824,"w":387,"h":160}, + "frame": {"x":871,"y":223,"w":418,"h":219}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":506,"y":925,"w":387,"h":160}, + "spriteSourceSize": {"x":362,"y":748,"w":418,"h":219}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/BootLeftKneelClosed.png": +"Models/ArmorPlate/GauntletRightFree.png": { - "frame": {"x":1231,"y":988,"w":387,"h":153}, + "frame": {"x":1407,"y":1594,"w":178,"h":153}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":506,"y":932,"w":387,"h":153}, + "spriteSourceSize": {"x":269,"y":537,"w":178,"h":153}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/PauldronsYoked.png": +"Models/ArmorPlate/PauldronsFree.png": { - "frame": {"x":1245,"y":333,"w":390,"h":151}, + "frame": {"x":1066,"y":1594,"w":337,"h":164}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":433,"y":398,"w":390,"h":151}, + "spriteSourceSize": {"x":459,"y":383,"w":337,"h":164}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/WristRightFree.png": +"Models/CyberCuffs/LockElbowLeftUp.png": { - "frame": {"x":802,"y":329,"w":33,"h":55}, + "frame": {"x":261,"y":2004,"w":27,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":355,"y":606,"w":33,"h":55}, + "spriteSourceSize": {"x":718,"y":267,"w":27,"h":40}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/GloveLeftFree.png": +"Models/CyberCuffs/LockElbowRightYoked.png": { - "frame": {"x":1073,"y":1381,"w":219,"h":352}, + "frame": {"x":2013,"y":2016,"w":32,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":700,"y":512,"w":219,"h":352}, + "spriteSourceSize": {"x":401,"y":509,"w":32,"h":29}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/GloveRightFree.png": +"Models/CyberCuffs/ScreenAnkleRightSpread.png": { - "frame": {"x":1825,"y":1522,"w":220,"h":167}, + "frame": {"x":1781,"y":1351,"w":54,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":268,"y":537,"w":220,"h":167}, + "spriteSourceSize": {"x":496,"y":1430,"w":54,"h":63}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/LegLeftKneelClosed.png": +"Models/CyberCuffs/WristRightFront.png": { - "frame": {"x":3,"y":1083,"w":388,"h":281}, + "frame": {"x":1708,"y":1351,"w":69,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":386,"y":801,"w":388,"h":281}, + "spriteSourceSize": {"x":474,"y":535,"w":69,"h":63}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/TorsoUpper.png": +"Models/CyberHeels/GlowBalletLeftKneel.png": { - "frame": {"x":636,"y":1737,"w":304,"h":303}, + "frame": {"x":846,"y":1671,"w":216,"h":75}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":382,"w":304,"h":303}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/China/DressSkirtKneel.png": -{ - "frame": {"x":3,"y":853,"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":784,"y":1383,"w":285,"h":350}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":447,"y":508,"w":285,"h":350}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/ThighLinkSpread.png": -{ - "frame": {"x":1955,"y":1693,"w":80,"h":26}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":566,"y":1057,"w":80,"h":26}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/WristRightCrossed.png": -{ - "frame": {"x":793,"y":782,"w":42,"h":42}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":650,"y":602,"w":42,"h":42}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Cuffs/WristRightCrossed.png": -{ - "frame": {"x":793,"y":828,"w":42,"h":42}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":650,"y":602,"w":42,"h":42}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/GlowLongMittenRightYoked.png": -{ - "frame": {"x":1825,"y":1338,"w":220,"h":180}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":273,"y":376,"w":220,"h":180}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/DisplayBelt.png": -{ - "frame": {"x":793,"y":674,"w":42,"h":51}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":548,"y":694,"w":42,"h":51}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberLink/GlowAnkleLinkSpread.png": -{ - "frame": {"x":1831,"y":1096,"w":150,"h":45}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":547,"y":1436,"w":150,"h":45}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/MittenLeftYoked.png": -{ - "frame": {"x":1961,"y":1723,"w":84,"h":98}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":869,"y":312,"w":84,"h":98}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/UpperGlowLongMittenRightYoked.png": -{ - "frame": {"x":1961,"y":1825,"w":84,"h":96}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":409,"y":460,"w":84,"h":96}, + "spriteSourceSize": {"x":725,"y":932,"w":216,"h":75}, "sourceSize": {"w":1240,"h":1754} }, "Models/CyberPetsuit/Arms.png": { - "frame": {"x":403,"y":290,"w":395,"h":309}, + "frame": {"x":1650,"y":1038,"w":395,"h":309}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":396,"y":413,"w":395,"h":309}, @@ -170,71 +90,47 @@ }, "Models/CyberPetsuit/ArmsBelts.png": { - "frame": {"x":3,"y":200,"w":396,"h":310}, + "frame": {"x":824,"y":1026,"w":396,"h":310}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":396,"y":412,"w":396,"h":310}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberPetsuit/StrapsArms.png": +"Models/CyberPetsuit/LeftLegsBeltsKneelClosed.png": { - "frame": {"x":3,"y":200,"w":396,"h":310}, + "frame": {"x":439,"y":3,"w":428,"h":393}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":396,"y":412,"w":396,"h":310}, + "spriteSourceSize": {"x":308,"y":697,"w":428,"h":393}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/CollarLockPlate.png": -{ - "frame": {"x":793,"y":614,"w":42,"h":56}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":598,"y":380,"w":42,"h":56}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighLeftLockPlateSpread.png": -{ - "frame": {"x":711,"y":1521,"w":69,"h":66}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":654,"y":1023,"w":69,"h":66}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/WristLeftDecoCleanFront.png": +"Models/CyberPetsuit/StrapsArms.png": { - "frame": {"x":1985,"y":1096,"w":60,"h":40}, + "frame": {"x":824,"y":1026,"w":396,"h":310}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":628,"y":549,"w":60,"h":40}, + "spriteSourceSize": {"x":396,"y":412,"w":396,"h":310}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseArmLeftUp.png": +"Models/Dress/BlouseSkirtLone.png": { - "frame": {"x":1619,"y":1381,"w":202,"h":338}, + "frame": {"x":3,"y":3,"w":432,"h":307}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":637,"y":166,"w":202,"h":338}, + "spriteSourceSize": {"x":397,"y":638,"w":432,"h":307}, "sourceSize": {"w":1240,"h":1754} }, "Models/Dress/BlouseTorso.png": { - "frame": {"x":395,"y":1188,"w":385,"h":172}, + "frame": {"x":1200,"y":1418,"w":385,"h":172}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":444,"y":559,"w":385,"h":172}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MageSkirt.png": -{ - "frame": {"x":3,"y":1368,"w":384,"h":365}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":404,"y":747,"w":384,"h":365}, - "sourceSize": {"w":1240,"h":1754} -}, "Models/Dress/SkirtSplit.png": { - "frame": {"x":841,"y":3,"w":400,"h":385}, + "frame": {"x":420,"y":805,"w":400,"h":385}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":408,"y":785,"w":400,"h":385}, @@ -242,418 +138,418 @@ }, "Models/Dress/SkirtSplitClosed.png": { - "frame": {"x":841,"y":3,"w":400,"h":385}, + "frame": {"x":420,"y":805,"w":400,"h":385}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":408,"y":785,"w":400,"h":385}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/Chest.png": +"Models/Dress/SkirtSplitKneel.png": { - "frame": {"x":1554,"y":1145,"w":267,"h":232}, + "frame": {"x":871,"y":3,"w":423,"h":216}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":396,"w":267,"h":232}, + "spriteSourceSize": {"x":360,"y":761,"w":423,"h":216}, "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK3/EyesNeutral.png": +"Models/GagFrilly/FrillyHighlights.png": { - "frame": {"x":788,"y":1072,"w":47,"h":44}, + "frame": {"x":1893,"y":1405,"w":152,"h":262}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":530,"y":269,"w":47,"h":44}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":71,"y":19,"w":152,"h":262}, + "sourceSize": {"w":321,"h":332} }, -"Models/EyesK3/WhitesEyesNeutral.png": +"Models/Hair/BowFrills.png": { - "frame": {"x":788,"y":1120,"w":47,"h":44}, + "frame": {"x":1247,"y":941,"w":399,"h":143}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":530,"y":269,"w":47,"h":44}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":440,"y":103,"w":399,"h":143}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FutureHarness/DisplayChest.png": +"Models/Hair/Fuzzy.png": { - "frame": {"x":793,"y":729,"w":42,"h":49}, + "frame": {"x":1148,"y":1762,"w":249,"h":282}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":559,"y":488,"w":42,"h":49}, + "spriteSourceSize": {"x":489,"y":114,"w":249,"h":282}, "sourceSize": {"w":1240,"h":1754} }, -"Models/FutureHarness/DisplayLower.png": +"Models/Heels/LeatherLegRightKneel.png": { - "frame": {"x":839,"y":1351,"w":163,"h":26}, + "frame": {"x":1893,"y":1671,"w":152,"h":254}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":489,"y":807,"w":163,"h":26}, + "spriteSourceSize": {"x":313,"y":830,"w":152,"h":254}, "sourceSize": {"w":1240,"h":1754} }, -"Models/GagLeather/Ball.png": +"Models/LatexPetsuit/Arms.png": { - "frame": {"x":784,"y":1254,"w":51,"h":39}, + "frame": {"x":841,"y":647,"w":402,"h":375}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":388,"y":403,"w":402,"h":375}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/GagLeather/Ball_TeethDeep.png": +"Models/LeatherCuffs/HardwareThighRightKneel.png": { - "frame": {"x":784,"y":1297,"w":51,"h":39}, + "frame": {"x":1893,"y":2016,"w":116,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":373,"y":850,"w":116,"h":29}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/GagLeather/Plug.png": +"Models/LeatherPetsuit/ArmsBelts.png": { - "frame": {"x":802,"y":439,"w":33,"h":35}, + "frame": {"x":400,"y":1486,"w":390,"h":181}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":116,"y":239,"w":33,"h":35}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":401,"y":539,"w":390,"h":181}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/GagMetal/Ball.png": +"Models/LeatherPetsuit/LeftLegsBeltsKneelClosed.png": { - "frame": {"x":784,"y":1340,"w":51,"h":39}, + "frame": {"x":811,"y":1762,"w":333,"h":282}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":393,"y":812,"w":333,"h":282}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/GagMetal/Ball_Teeth.png": +"Models/Legbinder/LegbinderClosed.png": { - "frame": {"x":784,"y":1208,"w":51,"h":42}, + "frame": {"x":138,"y":1671,"w":154,"h":329}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":107,"y":233,"w":51,"h":42}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":589,"y":909,"w":154,"h":329}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/BraidCustomBack.png": +"Models/Maid/SkirtKneelCrotchStrap.png": { - "frame": {"x":1245,"y":1737,"w":290,"h":303}, + "frame": {"x":3,"y":1113,"w":400,"h":192}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":495,"y":104,"w":290,"h":303}, + "spriteSourceSize": {"x":392,"y":737,"w":400,"h":192}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/Hairband.png": +"Models/MaidKnightLight/ApronKneel.png": { - "frame": {"x":1825,"y":1145,"w":220,"h":189}, + "frame": {"x":1589,"y":1418,"w":300,"h":340}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":500,"y":124,"w":220,"h":189}, + "spriteSourceSize": {"x":417,"y":549,"w":300,"h":340}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair3_FrontB.png": +"Models/MaidKnightLight/ArmRightFree.png": { - "frame": {"x":839,"y":1017,"w":385,"h":330}, + "frame": {"x":1401,"y":1762,"w":197,"h":282}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":421,"y":97,"w":385,"h":330}, + "spriteSourceSize": {"x":352,"y":424,"w":197,"h":282}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair3_FrontE.png": +"Models/MaidKnightLight/BootLeftKneel.png": { - "frame": {"x":323,"y":1737,"w":309,"h":303}, + "frame": {"x":1293,"y":255,"w":416,"h":194}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":478,"y":114,"w":309,"h":303}, + "spriteSourceSize": {"x":509,"y":891,"w":416,"h":194}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/TallLegLeftHogtie.png": +"Models/MaidKnightLight/GuardRightYoked.png": { - "frame": {"x":1539,"y":1736,"w":169,"h":309}, + "frame": {"x":296,"y":1599,"w":100,"h":159}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":575,"y":902,"w":169,"h":309}, + "spriteSourceSize": {"x":300,"y":393,"w":100,"h":159}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/TallLegRightHogtie.png": +"Models/MaidKnightLight/SockRightKneel.png": { - "frame": {"x":174,"y":1737,"w":145,"h":304}, + "frame": {"x":1298,"y":3,"w":418,"h":248}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":905,"w":145,"h":304}, + "spriteSourceSize": {"x":313,"y":816,"w":418,"h":248}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/ArmsCrossed.png": +"Models/Ninja/SkirtKneel.png": { - "frame": {"x":391,"y":1521,"w":316,"h":212}, + "frame": {"x":433,"y":400,"w":415,"h":204}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":512,"w":316,"h":212}, + "spriteSourceSize": {"x":364,"y":738,"w":415,"h":204}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BellCollar.png": +"Models/Ninja/SkirtKneelCrotchStrap.png": { - "frame": {"x":802,"y":388,"w":33,"h":47}, + "frame": {"x":852,"y":446,"w":415,"h":197}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":589,"y":400,"w":33,"h":47}, + "spriteSourceSize": {"x":364,"y":738,"w":415,"h":197}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareAnkleLeftSpread.png": +"Models/Ninja/SkirtOverKneelCrotchStrap.png": { - "frame": {"x":1146,"y":1351,"w":62,"h":26}, + "frame": {"x":3,"y":534,"w":415,"h":202}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":698,"y":1435,"w":62,"h":26}, + "spriteSourceSize": {"x":364,"y":739,"w":415,"h":202}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareCollar.png": +"Models/Ninja/SockLeftSpread.png": { - "frame": {"x":788,"y":1007,"w":47,"h":61}, + "frame": {"x":3,"y":1671,"w":131,"h":374}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":575,"y":384,"w":47,"h":61}, + "spriteSourceSize": {"x":640,"y":1253,"w":131,"h":374}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/ArmsBelts.png": +"Models/Ribbon/Calf2KneelClosed.png": { - "frame": {"x":1641,"y":257,"w":390,"h":181}, + "frame": {"x":1602,"y":1762,"w":279,"h":163}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":401,"y":539,"w":390,"h":181}, + "spriteSourceSize": {"x":374,"y":885,"w":279,"h":163}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LegsHogtie.png": +"Models/Ribbon/Thigh2Closed.png": { - "frame": {"x":944,"y":1737,"w":297,"h":303}, + "frame": {"x":400,"y":1671,"w":275,"h":87}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":915,"w":297,"h":303}, + "spriteSourceSize": {"x":457,"y":974,"w":275,"h":87}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LegsLacesHogtie.png": +"Models/Robes/ShoeLeftKneel.png": { - "frame": {"x":802,"y":478,"w":32,"h":132}, + "frame": {"x":679,"y":1671,"w":163,"h":87}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":703,"y":957,"w":32,"h":132}, + "spriteSourceSize": {"x":730,"y":932,"w":163,"h":87}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/SkirtKneelCrotchStrap.png": +"Models/Robes/ShoeLeftKneelClosed.png": { - "frame": {"x":422,"y":94,"w":400,"h":192}, + "frame": {"x":679,"y":1671,"w":163,"h":87}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":392,"y":737,"w":400,"h":192}, + "spriteSourceSize": {"x":730,"y":932,"w":163,"h":87}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeKneel.png": +"Models/Robes/SleeveLeftBoxtie.png": { - "frame": {"x":422,"y":3,"w":415,"h":87}, + "frame": {"x":403,"y":1762,"w":98,"h":283}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":371,"y":855,"w":415,"h":87}, + "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeKneelCrotchStrap.png": +"Models/Robes/SleeveLeftBoxtieRopesUpper.png": { - "frame": {"x":1639,"y":442,"w":389,"h":98}, + "frame": {"x":505,"y":1762,"w":98,"h":283}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":393,"y":818,"w":389,"h":98}, + "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeSockRightClosed.png": +"Models/Robes/SleeveLeftBoxtieTight.png": { - "frame": {"x":1825,"y":1693,"w":126,"h":26}, + "frame": {"x":403,"y":1762,"w":98,"h":283}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":965,"w":126,"h":26}, + "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/BandRightFront.png": +"Models/Robes/SleeveLeftFront.png": { - "frame": {"x":802,"y":290,"w":35,"h":35}, + "frame": {"x":607,"y":1762,"w":98,"h":283}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":480,"y":543,"w":35,"h":35}, + "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LongMittenLeftFree.png": +"Models/Robes/SleeveLeftFrontTight.png": { - "frame": {"x":1296,"y":1381,"w":213,"h":351}, + "frame": {"x":709,"y":1762,"w":98,"h":283}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":700,"y":512,"w":213,"h":351}, + "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/SockLeftKneel.png": +"Models/Robes/SleeveLeftWristtieRopesUpper.png": { - "frame": {"x":395,"y":1364,"w":385,"h":153}, + "frame": {"x":296,"y":1762,"w":103,"h":283}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":510,"y":931,"w":385,"h":153}, + "spriteSourceSize": {"x":676,"y":495,"w":103,"h":283}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopThigh1Closed.png": +"Models/Rope/Calf1Closed.png": { - "frame": {"x":1622,"y":1096,"w":205,"h":45}, + "frame": {"x":138,"y":2004,"w":119,"h":41}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":488,"y":1094,"w":205,"h":45}, + "spriteSourceSize": {"x":544,"y":1411,"w":119,"h":41}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/PlateClosed.png": +"Models/Rope/Thigh1ClosedOver.png": { - "frame": {"x":1712,"y":1723,"w":245,"h":322}, + "frame": {"x":1839,"y":1351,"w":206,"h":50}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":595,"w":245,"h":322}, + "spriteSourceSize": {"x":492,"y":1092,"w":206,"h":50}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/LegLeftKneel.png": +"Models/Skirts/StripedSkirt.png": { - "frame": {"x":1624,"y":761,"w":387,"h":331}, + "frame": {"x":1271,"y":626,"w":403,"h":311}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":388,"y":751,"w":387,"h":331}, + "spriteSourceSize": {"x":402,"y":724,"w":403,"h":311}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/LegLeftKneelClosed.png": +"Models/Skirts/StripedSkirtClosed.png": { - "frame": {"x":839,"y":683,"w":388,"h":330}, + "frame": {"x":1271,"y":626,"w":403,"h":311}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":387,"y":751,"w":388,"h":330}, + "spriteSourceSize": {"x":402,"y":724,"w":403,"h":311}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/Legs1Closed.png": +"Models/Skirts/StripedSkirtHogtie.png": { - "frame": {"x":1228,"y":1145,"w":322,"h":232}, + "frame": {"x":1271,"y":626,"w":403,"h":311}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":433,"y":834,"w":322,"h":232}, + "spriteSourceSize": {"x":402,"y":724,"w":403,"h":311}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/StripedSkirtOverKneel.png": +"Models/Skirts/StripedSkirtOverKneelCrotchStrap.png": { - "frame": {"x":1624,"y":544,"w":388,"h":213}, + "frame": {"x":3,"y":314,"w":426,"h":216}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":771,"w":388,"h":213}, + "spriteSourceSize": {"x":394,"y":758,"w":426,"h":216}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeTied.png": +"Models/Slayer/CapeBackUp.png": { - "frame": {"x":839,"y":392,"w":389,"h":287}, + "frame": {"x":1683,"y":552,"w":360,"h":205}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":418,"y":410,"w":389,"h":287}, + "spriteSourceSize": {"x":440,"y":353,"w":360,"h":205}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/LegLeftKneel.png": +"Models/Slayer/CapeStripe.png": { - "frame": {"x":1232,"y":488,"w":388,"h":332}, + "frame": {"x":1678,"y":761,"w":365,"h":273}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":387,"y":751,"w":388,"h":332}, + "spriteSourceSize": {"x":440,"y":422,"w":365,"h":273}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/LegLeftKneelClosed.png": +"Models/Slime/ChestBoxtie.png": { - "frame": {"x":396,"y":855,"w":388,"h":329}, + "frame": {"x":1720,"y":3,"w":324,"h":268}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":387,"y":751,"w":388,"h":329}, + "spriteSourceSize": {"x":446,"y":360,"w":324,"h":268}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SmoothHeels/LeftHogtie.png": +"Models/Slime/FootLeftKneelClosed.png": { - "frame": {"x":711,"y":1591,"w":50,"h":142}, + "frame": {"x":1893,"y":1929,"w":152,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":730,"y":797,"w":50,"h":142}, + "spriteSourceSize": {"x":730,"y":902,"w":152,"h":83}, "sourceSize": {"w":1240,"h":1754} }, "Models/Spats/SpatsKneelClosed.png": { - "frame": {"x":1641,"y":3,"w":392,"h":250}, + "frame": {"x":804,"y":1340,"w":392,"h":250}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":383,"y":738,"w":392,"h":250}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ElbowRightYoked.png": +"Models/TallSmoothHeels/TallLegLeftKneel.png": { - "frame": {"x":1961,"y":1925,"w":84,"h":95}, + "frame": {"x":1713,"y":275,"w":331,"h":273}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":395,"y":504,"w":84,"h":95}, + "spriteSourceSize": {"x":385,"y":816,"w":331,"h":273}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SuccubusWingLight.png": +"Models/TapeHeavy/LegsKneel.png": { - "frame": {"x":3,"y":514,"w":394,"h":43}, + "frame": {"x":1224,"y":1088,"w":392,"h":326}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":425,"y":379,"w":394,"h":43}, + "spriteSourceSize": {"x":387,"y":760,"w":392,"h":326}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallSmoothHeels/TallLegLeftHogtie.png": +"Models/TapeMed/LegsKneelClosed.png": { - "frame": {"x":3,"y":1737,"w":167,"h":308}, + "frame": {"x":3,"y":740,"w":413,"h":369}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":575,"y":901,"w":167,"h":308}, + "spriteSourceSize": {"x":366,"y":652,"w":413,"h":369}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/LegsKneel.png": +"Models/Warrior/ShoeLeftKneel.png": { - "frame": {"x":1245,"y":3,"w":392,"h":326}, + "frame": {"x":1271,"y":453,"w":408,"h":169}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":387,"y":760,"w":392,"h":326}, + "spriteSourceSize": {"x":495,"y":921,"w":408,"h":169}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ArmRightWristtie.png": +"Models/Warrior/SkirtKneelCrotchStrap.png": { - "frame": {"x":788,"y":1168,"w":47,"h":36}, + "frame": {"x":422,"y":608,"w":415,"h":193}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":464,"y":493,"w":47,"h":36}, + "spriteSourceSize": {"x":379,"y":696,"w":415,"h":193}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/SkirtKneelCrotchStrap.png": +"Models/Witch/SkirtOverKneel.png": { - "frame": {"x":3,"y":3,"w":415,"h":193}, + "frame": {"x":407,"y":1194,"w":393,"h":288}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":379,"y":696,"w":415,"h":193}, + "spriteSourceSize": {"x":386,"y":801,"w":393,"h":288}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/ApprenticeHatPuff.png": +"Models/Wolf/AnkleLeftSpread.png": { - "frame": {"x":788,"y":941,"w":47,"h":62}, + "frame": {"x":1620,"y":1351,"w":84,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":774,"y":36,"w":47,"h":62}, + "spriteSourceSize": {"x":677,"y":1411,"w":84,"h":63}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtOverKneel.png": +"Models/Wolf/HarnessHardwareLowerKneel.png": { - "frame": {"x":3,"y":561,"w":393,"h":288}, + "frame": {"x":1602,"y":1929,"w":287,"h":116}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":386,"y":801,"w":393,"h":288}, + "spriteSourceSize": {"x":449,"y":745,"w":287,"h":116}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegPadsLeftKneel.png": +"Models/Wolf/HarnessHardwareMidKneel.png": { - "frame": {"x":400,"y":603,"w":389,"h":248}, + "frame": {"x":794,"y":1594,"w":268,"h":73}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":388,"y":827,"w":389,"h":248}, + "spriteSourceSize": {"x":455,"y":689,"w":268,"h":73}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/TorsoUpperBeltBuckle.png": +"Models/WolfCatsuit/LegLeftKneel.png": { - "frame": {"x":788,"y":874,"w":47,"h":63}, + "frame": {"x":3,"y":1309,"w":393,"h":286}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":534,"y":628,"w":47,"h":63}, + "spriteSourceSize": {"x":386,"y":799,"w":393,"h":286}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -663,7 +559,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas28.webp b/TextureAtlas/atlas28.webp index dbed8ef82..4bc20bf8b 100644 Binary files a/TextureAtlas/atlas28.webp and b/TextureAtlas/atlas28.webp differ diff --git a/TextureAtlas/atlas29.json b/TextureAtlas/atlas29.json index ed46f4b41..7bab0550b 100644 --- a/TextureAtlas/atlas29.json +++ b/TextureAtlas/atlas29.json @@ -1,448 +1,496 @@ {"frames": { -"Models/ArmorChain/SkirtBelt.png": +"Models/ArmorPlate/BootRightKneel.png": { - "frame": {"x":761,"y":1988,"w":279,"h":57}, + "frame": {"x":1972,"y":1874,"w":73,"h":100}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":763,"w":279,"h":57}, + "spriteSourceSize": {"x":321,"y":853,"w":73,"h":100}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/Breastplate.png": +"Models/Bandit/ShoeLeftClosed.png": { - "frame": {"x":1645,"y":732,"w":266,"h":207}, + "frame": {"x":1700,"y":1645,"w":139,"h":200}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":467,"w":266,"h":207}, + "spriteSourceSize": {"x":533,"y":1432,"w":139,"h":200}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ShoulderPad.png": +"Models/Bandit/ShoeRightSpread.png": { - "frame": {"x":1915,"y":773,"w":128,"h":127}, + "frame": {"x":1158,"y":739,"w":129,"h":195}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":686,"y":390,"w":128,"h":127}, + "spriteSourceSize": {"x":486,"y":1448,"w":129,"h":195}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/ArmLeftUp.png": +"Models/Body/ArmLeftWristtie.png": { - "frame": {"x":262,"y":814,"w":207,"h":395}, + "frame": {"x":992,"y":1549,"w":119,"h":353}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":626,"y":167,"w":207,"h":395}, + "spriteSourceSize": {"x":662,"y":407,"w":119,"h":353}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/ArmLeftWristtie.png": +"Models/Body/FootRightKneel.png": { - "frame": {"x":1506,"y":361,"w":119,"h":353}, + "frame": {"x":1972,"y":1654,"w":73,"h":107}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":662,"y":407,"w":119,"h":353}, + "spriteSourceSize": {"x":322,"y":850,"w":73,"h":107}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/LegRightKneel.png": +"Models/Bunny/GloveLeftYoked.png": { - "frame": {"x":879,"y":1598,"w":310,"h":335}, + "frame": {"x":784,"y":1551,"w":204,"h":357}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":244,"y":760,"w":310,"h":335}, + "spriteSourceSize": {"x":744,"y":279,"w":204,"h":357}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/GloveLeftFront.png": +"Models/Bunny/HighLeotardKneel.png": { - "frame": {"x":1193,"y":1499,"w":245,"h":267}, + "frame": {"x":1432,"y":3,"w":268,"h":336}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":523,"y":464,"w":245,"h":267}, + "spriteSourceSize": {"x":446,"y":518,"w":268,"h":336}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/HighLeotard.png": +"Models/Bunny/LeotardKneel.png": { - "frame": {"x":3,"y":413,"w":266,"h":397}, + "frame": {"x":1432,"y":3,"w":268,"h":336}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":518,"w":266,"h":397}, + "spriteSourceSize": {"x":446,"y":518,"w":268,"h":336}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/HighLeotardClosed.png": +"Models/Catsuit/ArmLeftHogtie.png": { - "frame": {"x":3,"y":1215,"w":266,"h":395}, + "frame": {"x":1481,"y":1190,"w":119,"h":350}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":518,"w":266,"h":395}, + "spriteSourceSize": {"x":660,"y":411,"w":119,"h":350}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/LegSockRightHogtie.png": +"Models/Catsuit/ArmLeftUp.png": { - "frame": {"x":484,"y":789,"w":142,"h":14}, + "frame": {"x":3,"y":3,"w":207,"h":395}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":907,"w":142,"h":14}, + "spriteSourceSize": {"x":626,"y":167,"w":207,"h":395}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cape/CoatHogtieFree.png": +"Models/Catsuit/SleevelessTorsoUpper.png": { - "frame": {"x":1442,"y":1576,"w":177,"h":190}, + "frame": {"x":1432,"y":343,"w":268,"h":303}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":615,"y":418,"w":177,"h":190}, + "spriteSourceSize": {"x":445,"y":382,"w":268,"h":303}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cape/ShouldersHogtie.png": +"Models/CyberArms/GlowLongMittenLeftWristtie.png": { - "frame": {"x":1702,"y":148,"w":341,"h":259}, + "frame": {"x":1296,"y":1898,"w":71,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":396,"w":341,"h":259}, + "spriteSourceSize": {"x":716,"y":525,"w":71,"h":68}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ArmLeftUp.png": +"Models/CyberCuffs/ThighRightKneel.png": { - "frame": {"x":273,"y":413,"w":207,"h":395}, + "frame": {"x":269,"y":1975,"w":139,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":626,"y":167,"w":207,"h":395}, + "spriteSourceSize": {"x":375,"y":817,"w":139,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ArmLeftWristtie.png": +"Models/CyberCuffs/ThighRightKneelClosed.png": { - "frame": {"x":1582,"y":3,"w":116,"h":353}, + "frame": {"x":269,"y":1975,"w":139,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":663,"y":407,"w":116,"h":353}, + "spriteSourceSize": {"x":375,"y":817,"w":139,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Corsets/BuckleCorsetBuckles.png": +"Models/CyberMitts/LongMittenLeftFree.png": { - "frame": {"x":1915,"y":1033,"w":128,"h":118}, + "frame": {"x":1283,"y":1544,"w":205,"h":350}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":506,"y":664,"w":128,"h":118}, + "spriteSourceSize": {"x":702,"y":512,"w":205,"h":350}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/WristRightYoked.png": +"Models/CyberMitts/LongMittenLeftYoked.png": { - "frame": {"x":625,"y":1999,"w":64,"h":46}, + "frame": {"x":1843,"y":1053,"w":202,"h":331}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":310,"y":394,"w":64,"h":46}, + "spriteSourceSize": {"x":751,"y":312,"w":202,"h":331}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/AnkleLeftKneel.png": +"Models/CyberMitts/UpperGlowLongMittenLeftWristtie.png": { - "frame": {"x":1192,"y":741,"w":60,"h":67}, + "frame": {"x":1296,"y":1898,"w":71,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":705,"y":961,"w":60,"h":67}, + "spriteSourceSize": {"x":716,"y":525,"w":71,"h":68}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/WristRightYoked.png": +"Models/DivineBelt/BraMetal1.png": { - "frame": {"x":693,"y":1999,"w":64,"h":46}, + "frame": {"x":540,"y":1974,"w":277,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":310,"y":394,"w":64,"h":46}, + "spriteSourceSize": {"x":436,"y":569,"w":277,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberHeels/ShinyBalletLeftClosed.png": +"Models/DivineBelt/BraMetalRunic1.png": { - "frame": {"x":1466,"y":3,"w":112,"h":354}, + "frame": {"x":821,"y":1974,"w":277,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":585,"y":1331,"w":112,"h":354}, + "spriteSourceSize": {"x":436,"y":569,"w":277,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberHeels/ShinyBalletLeftSpread.png": +"Models/DivineCuffs/AnkleLeftLockBandClosed.png": { - "frame": {"x":1466,"y":3,"w":112,"h":354}, + "frame": {"x":1812,"y":754,"w":27,"h":36}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":668,"y":1344,"w":112,"h":354}, + "spriteSourceSize": {"x":661,"y":1458,"w":27,"h":36}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberHeels/ShinyBalletRightClosed.png": +"Models/DivineCuffs/CollarLockBand.png": { - "frame": {"x":1349,"y":3,"w":113,"h":354}, + "frame": {"x":591,"y":1127,"w":43,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":522,"y":1328,"w":113,"h":354}, + "spriteSourceSize": {"x":597,"y":405,"w":43,"h":23}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CapLongMittenLeftYoked.png": +"Models/DivineCuffs/ThighRightKneel.png": { - "frame": {"x":1022,"y":741,"w":86,"h":67}, + "frame": {"x":3,"y":1978,"w":156,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":868,"y":284,"w":86,"h":67}, + "spriteSourceSize": {"x":366,"y":834,"w":156,"h":67}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CuffLongMittenLeftYoked.png": +"Models/DivineCuffs/ThighRightKneelClosed.png": { - "frame": {"x":1256,"y":741,"w":60,"h":67}, + "frame": {"x":3,"y":1978,"w":156,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":871,"y":388,"w":60,"h":67}, + "spriteSourceSize": {"x":366,"y":834,"w":156,"h":67}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleLeftDecoCleanClosed.png": +"Models/Dress/Band.png": { - "frame": {"x":3,"y":2011,"w":68,"h":34}, + "frame": {"x":1102,"y":1974,"w":265,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":605,"y":1449,"w":68,"h":34}, + "spriteSourceSize": {"x":454,"y":749,"w":265,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleLeftDecoClosed.png": +"Models/Dress/BlouseArmLeftUp.png": { - "frame": {"x":75,"y":2011,"w":68,"h":34}, + "frame": {"x":1843,"y":711,"w":202,"h":338}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":605,"y":1449,"w":68,"h":34}, + "spriteSourceSize": {"x":637,"y":166,"w":202,"h":338}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighRightDecoCleanSpread.png": +"Models/Dress/BlouseCollarBoxtie.png": { - "frame": {"x":351,"y":2009,"w":94,"h":36}, + "frame": {"x":1573,"y":1126,"w":266,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":1052,"w":94,"h":36}, + "spriteSourceSize": {"x":479,"y":425,"w":266,"h":60}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighRightDecoSpread.png": +"Models/Dress/BlouseSkirtOverKneel.png": { - "frame": {"x":449,"y":2009,"w":94,"h":36}, + "frame": {"x":1704,"y":518,"w":341,"h":189}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":1052,"w":94,"h":36}, + "spriteSourceSize": {"x":451,"y":801,"w":341,"h":189}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristLeftLockBandKneel.png": +"Models/Dress/LaceChestDeco.png": { - "frame": {"x":1702,"y":3,"w":343,"h":141}, + "frame": {"x":163,"y":1978,"w":102,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":426,"y":849,"w":343,"h":141}, + "spriteSourceSize": {"x":522,"y":551,"w":102,"h":67}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseArmRightFree.png": +"Models/Dress/LaceCrotchPanelTrim.png": { - "frame": {"x":1637,"y":1779,"w":221,"h":266}, + "frame": {"x":1432,"y":650,"w":268,"h":167}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":329,"y":443,"w":221,"h":266}, + "spriteSourceSize": {"x":449,"y":754,"w":268,"h":167}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/LaceCorset.png": +"Models/Dress/MageCollarCrystal.png": { - "frame": {"x":1644,"y":1459,"w":267,"h":316}, + "frame": {"x":1249,"y":712,"w":27,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":455,"y":519,"w":267,"h":316}, + "spriteSourceSize": {"x":597,"y":421,"w":27,"h":23}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MageCorset.png": +"Models/Dress/MageSkirtCrotchStrap.png": { - "frame": {"x":3,"y":814,"w":255,"h":397}, + "frame": {"x":1044,"y":3,"w":384,"h":359}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":407,"w":255,"h":397}, + "spriteSourceSize": {"x":404,"y":747,"w":384,"h":359}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MageSkirtCrotchStrap.png": +"Models/Dress/SkirtSplitBelt.png": { - "frame": {"x":805,"y":1181,"w":384,"h":359}, + "frame": {"x":1291,"y":1126,"w":278,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":404,"y":747,"w":384,"h":359}, + "spriteSourceSize": {"x":451,"y":765,"w":278,"h":60}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/SkirtBandKneel.png": +"Models/Ears/Kitty.png": { - "frame": {"x":1031,"y":1544,"w":109,"h":50}, + "frame": {"x":1704,"y":1849,"w":264,"h":196}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":630,"y":742,"w":109,"h":50}, + "spriteSourceSize": {"x":483,"y":45,"w":264,"h":196}, "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKjus/BlushMedium.png": +"Models/Elf/BandLeftYoked.png": { - "frame": {"x":709,"y":756,"w":154,"h":52}, + "frame": {"x":1704,"y":711,"w":104,"h":106}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":530,"y":295,"w":154,"h":52}, - "sourceSize": {"w":744,"h":433} + "spriteSourceSize": {"x":729,"y":461,"w":104,"h":106}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/EyesHeart.png": +"Models/EyesDai2/BrowsSurprised.png": { - "frame": {"x":867,"y":756,"w":151,"h":52}, + "frame": {"x":298,"y":1162,"w":36,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":159,"w":151,"h":52}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":528,"y":241,"w":36,"h":26}, + "sourceSize": {"w":738,"h":409} +}, +"Models/Furniture/OneBarBackClosed.png": +{ + "frame": {"x":1492,"y":1544,"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":1492,"y":1544,"w":347,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":418,"y":1611,"w":347,"h":97}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/GagMetal/SciFiPanel.png": +"Models/Furniture/OneBarBackSpread.png": { - "frame": {"x":1112,"y":741,"w":76,"h":67}, + "frame": {"x":1492,"y":1544,"w":347,"h":97}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":97,"y":228,"w":76,"h":67}, + "spriteSourceSize": {"x":428,"y":1576,"w":347,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Furniture/OneBarBackSpreadHeels.png": +{ + "frame": {"x":1492,"y":1544,"w":347,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":428,"y":1611,"w":347,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagCloth/Cleave.png": +{ + "frame": {"x":1291,"y":888,"w":157,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":238,"w":157,"h":46}, "sourceSize": {"w":321,"h":332} }, -"Models/Hair/Bow.png": +"Models/Hair/Curly_Overstrap.png": { - "frame": {"x":1078,"y":812,"w":362,"h":357}, + "frame": {"x":388,"y":3,"w":239,"h":376}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":97,"w":362,"h":357}, + "spriteSourceSize": {"x":478,"y":143,"w":239,"h":376}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair2_Right.png": +"Models/Labcoat/ShouldersHogtie.png": { - "frame": {"x":1915,"y":904,"w":128,"h":125}, + "frame": {"x":1704,"y":3,"w":341,"h":259}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":86,"w":128,"h":125}, + "spriteSourceSize": {"x":454,"y":396,"w":341,"h":259}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/HairAura_LeftB.png": +"Models/LeatherCuffs/BandAnkleLeftClosed.png": { - "frame": {"x":989,"y":3,"w":189,"h":366}, + "frame": {"x":498,"y":1162,"w":67,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":533,"y":403,"w":189,"h":366}, + "spriteSourceSize": {"x":597,"y":1445,"w":67,"h":23}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Harness/HardwareUnderbust.png": +"Models/LeatherCuffs/BandAnkleLeftSpread.png": { - "frame": {"x":1144,"y":1544,"w":45,"h":46}, + "frame": {"x":569,"y":1162,"w":65,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":549,"y":619,"w":45,"h":46}, + "spriteSourceSize": {"x":686,"y":1436,"w":65,"h":23}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/BeltsChestWristtie.png": +"Models/LeatherCuffs/BowBellCollar.png": { - "frame": {"x":3,"y":3,"w":307,"h":406}, + "frame": {"x":374,"y":1162,"w":27,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":466,"y":387,"w":307,"h":406}, + "spriteSourceSize": {"x":595,"y":399,"w":27,"h":26}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/BinderTorsoLower.png": +"Models/LeatherCuffs/ElbowRightUp.png": { - "frame": {"x":1629,"y":411,"w":282,"h":317}, + "frame": {"x":412,"y":1975,"w":124,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":593,"w":282,"h":317}, + "spriteSourceSize": {"x":443,"y":252,"w":124,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Labcoat/CoatHogtieFree.png": +"Models/LeatherCuffs/HardwareAnkleRightClosed.png": { - "frame": {"x":1442,"y":1576,"w":177,"h":190}, + "frame": {"x":405,"y":1162,"w":43,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":615,"y":418,"w":177,"h":190}, + "spriteSourceSize": {"x":548,"y":1440,"w":43,"h":24}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandBelt.png": +"Models/LeatherCuffs/HardwareAnkleRightSpread.png": { - "frame": {"x":805,"y":1544,"w":222,"h":50}, + "frame": {"x":452,"y":1162,"w":42,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":471,"y":680,"w":222,"h":50}, + "spriteSourceSize": {"x":502,"y":1436,"w":42,"h":24}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/WristRightYoked.png": +"Models/LeatherPetsuit/LegsBeltsKneel.png": { - "frame": {"x":1629,"y":360,"w":69,"h":47}, + "frame": {"x":1598,"y":821,"w":241,"h":288}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":307,"y":394,"w":69,"h":47}, + "spriteSourceSize": {"x":309,"y":788,"w":241,"h":288}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherLeotard/LeotardCorset.png": +"Models/LeatherPetsuit/LegsBeltsKneelClosed.png": { - "frame": {"x":1016,"y":373,"w":274,"h":364}, + "frame": {"x":1598,"y":821,"w":241,"h":288}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":593,"w":274,"h":364}, + "spriteSourceSize": {"x":309,"y":788,"w":241,"h":288}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeOverKneel.png": +"Models/Maid/FootSockRightKneel.png": { - "frame": {"x":1320,"y":732,"w":321,"h":76}, + "frame": {"x":1972,"y":1765,"w":73,"h":105}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":866,"w":321,"h":76}, + "spriteSourceSize": {"x":321,"y":849,"w":73,"h":105}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/Apron.png": +"Models/Maid/ShoeRightClosed.png": { - "frame": {"x":177,"y":1614,"w":285,"h":391}, + "frame": {"x":1314,"y":938,"w":134,"h":134}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":438,"y":549,"w":285,"h":391}, + "spriteSourceSize": {"x":456,"y":1490,"w":134,"h":134}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ArmLeftFree.png": +"Models/Maid/SockRightKneel.png": { - "frame": {"x":703,"y":1598,"w":172,"h":386}, + "frame": {"x":1492,"y":1645,"w":204,"h":249}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":686,"y":416,"w":172,"h":386}, + "spriteSourceSize": {"x":313,"y":816,"w":204,"h":249}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ArmRightFree.png": +"Models/Maid/Stripe.png": { - "frame": {"x":1444,"y":812,"w":197,"h":282}, + "frame": {"x":638,"y":1127,"w":353,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":352,"y":424,"w":197,"h":282}, + "spriteSourceSize": {"x":422,"y":858,"w":353,"h":59}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ForeArmLeftFront.png": +"Models/MaidKnightLight/ArmLeftFree.png": { - "frame": {"x":1915,"y":484,"w":129,"h":172}, + "frame": {"x":240,"y":1585,"w":172,"h":386}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":626,"y":544,"w":129,"h":172}, + "spriteSourceSize": {"x":686,"y":416,"w":172,"h":386}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/CollarTag.png": +"Models/MaidKnightLight/GloveLeftYoked.png": { - "frame": {"x":147,"y":2011,"w":68,"h":34}, + "frame": {"x":1738,"y":1410,"w":101,"h":124}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":582,"y":392,"w":68,"h":34}, + "spriteSourceSize": {"x":849,"y":278,"w":101,"h":124}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/SockLeftClosed.png": +"Models/Ninja/KneeLeftSpread.png": { - "frame": {"x":488,"y":3,"w":161,"h":374}, + "frame": {"x":1843,"y":1654,"w":125,"h":172}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":534,"y":1261,"w":161,"h":374}, + "spriteSourceSize": {"x":645,"y":1152,"w":125,"h":172}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/SockLeftSpread.png": +"Models/Ninja/SockRightKneel.png": { - "frame": {"x":653,"y":3,"w":131,"h":374}, + "frame": {"x":1972,"y":1765,"w":73,"h":105}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":640,"y":1253,"w":131,"h":374}, + "spriteSourceSize": {"x":321,"y":849,"w":73,"h":105}, "sourceSize": {"w":1240,"h":1754} }, "Models/Ninja/SockRightSpread.png": { - "frame": {"x":935,"y":812,"w":139,"h":359}, + "frame": {"x":641,"y":1569,"w":139,"h":359}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":466,"y":1266,"w":139,"h":359}, "sourceSize": {"w":1240,"h":1754} }, +"Models/Ninja/ThighLeftSpread.png": +{ + "frame": {"x":1115,"y":1547,"w":164,"h":352}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":606,"y":973,"w":164,"h":352}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/OperaGloves/GloveLeftFront.png": +{ + "frame": {"x":1704,"y":266,"w":341,"h":248}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":430,"y":465,"w":341,"h":248}, + "sourceSize": {"w":1240,"h":1754} +}, "Models/OperaGloves/GloveLeftYoked.png": { - "frame": {"x":1294,"y":371,"w":208,"h":357}, + "frame": {"x":689,"y":1190,"w":208,"h":357}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":743,"y":278,"w":208,"h":357}, @@ -450,31 +498,39 @@ }, "Models/Petsuit/LegsHogtie.png": { - "frame": {"x":709,"y":381,"w":303,"h":371}, + "frame": {"x":554,"y":383,"w":303,"h":371}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":443,"y":837,"w":303,"h":371}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/ChestGoldTied.png": +"Models/Ribbon/RightThigh1KneelClosed.png": { - "frame": {"x":1862,"y":1779,"w":183,"h":256}, + "frame": {"x":773,"y":1932,"w":102,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":521,"y":405,"w":183,"h":256}, + "spriteSourceSize": {"x":335,"y":911,"w":102,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/PlateSpread.png": +"Models/Ribbon/TopHarness.png": { - "frame": {"x":1193,"y":1173,"w":245,"h":322}, + "frame": {"x":1121,"y":1190,"w":356,"h":350}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":595,"w":245,"h":322}, + "spriteSourceSize": {"x":433,"y":394,"w":356,"h":350}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ribbon/TopThigh3Closed.png": +{ + "frame": {"x":995,"y":1126,"w":292,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":918,"w":292,"h":60}, "sourceSize": {"w":1240,"h":1754} }, "Models/Robes/SleeveLeftYoked.png": { - "frame": {"x":484,"y":400,"w":221,"h":385}, + "frame": {"x":416,"y":1585,"w":221,"h":385}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":723,"y":380,"w":221,"h":385}, @@ -482,183 +538,239 @@ }, "Models/Robes/SleeveLeftYokedTight.png": { - "frame": {"x":484,"y":400,"w":221,"h":385}, + "frame": {"x":416,"y":1585,"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": +"Models/Robes/SleeveRightUp.png": { - "frame": {"x":219,"y":2009,"w":128,"h":36}, + "frame": {"x":1843,"y":1388,"w":202,"h":262}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":544,"y":1416,"w":128,"h":36}, + "spriteSourceSize": {"x":387,"y":159,"w":202,"h":262}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/LeftFrogtieKneelClosed.png": +"Models/Rope/Arm2Boxtie.png": { - "frame": {"x":1442,"y":1377,"w":198,"h":195}, + "frame": {"x":879,"y":1912,"w":308,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":555,"y":822,"w":198,"h":195}, + "spriteSourceSize": {"x":465,"y":484,"w":308,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/ForeArm1Wristtie.png": +{ + "frame": {"x":338,"y":1162,"w":32,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":688,"w":32,"h":26}, "sourceSize": {"w":1240,"h":1754} }, "Models/Rope/RightThigh2KneelClosedOver.png": { - "frame": {"x":1915,"y":1155,"w":128,"h":38}, + "frame": {"x":641,"y":1932,"w":128,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":365,"y":860,"w":128,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/ArmLeftCrossed.png": +"Models/Rope/Thigh2KneelClosedOver.png": { - "frame": {"x":1193,"y":1770,"w":218,"h":275}, + "frame": {"x":1604,"y":1410,"w":130,"h":130}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":552,"y":424,"w":218,"h":275}, + "spriteSourceSize": {"x":468,"y":871,"w":130,"h":130}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/ArmLeftUp.png": +"Models/Rubber/AnkleLeftClosed.png": { - "frame": {"x":314,"y":3,"w":170,"h":393}, + "frame": {"x":901,"y":1190,"w":113,"h":355}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":663,"y":167,"w":170,"h":393}, + "spriteSourceSize": {"x":579,"y":1145,"w":113,"h":355}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/ArmRightUp.png": +"Models/Rubber/AnkleRightClosed.png": { - "frame": {"x":1915,"y":1197,"w":127,"h":344}, + "frame": {"x":1018,"y":1190,"w":99,"h":353}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":162,"w":127,"h":344}, + "spriteSourceSize": {"x":502,"y":1146,"w":99,"h":353}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/FootLeftClosed.png": +{ + "frame": {"x":1291,"y":608,"w":137,"h":276}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":1342,"w":137,"h":276}, "sourceSize": {"w":1240,"h":1754} }, "Models/Rubber/TorsoLower.png": { - "frame": {"x":273,"y":1213,"w":291,"h":389}, + "frame": {"x":3,"y":799,"w":291,"h":389}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":446,"y":541,"w":291,"h":389}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/ArmLeftCrossed.png": +"Models/Sailor/HemRight.png": { - "frame": {"x":1415,"y":1770,"w":218,"h":275}, + "frame": {"x":1812,"y":711,"w":27,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":552,"y":424,"w":218,"h":275}, + "spriteSourceSize": {"x":448,"y":490,"w":27,"h":39}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/ArmLeftFront.png": +"Models/ShadowHands/LeftArm2Boxtie.png": { - "frame": {"x":1915,"y":1545,"w":95,"h":227}, + "frame": {"x":1972,"y":1978,"w":69,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":429,"y":432,"w":95,"h":227}, + "spriteSourceSize": {"x":671,"y":639,"w":69,"h":67}, "sourceSize": {"w":1240,"h":1754} }, "Models/Slime/ArmLeftUp.png": { - "frame": {"x":3,"y":1614,"w":170,"h":393}, + "frame": {"x":214,"y":3,"w":170,"h":393}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":663,"y":167,"w":170,"h":393}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/FootRightClosed.png": +"Models/Slime/TorsoLower.png": { - "frame": {"x":1444,"y":1098,"w":197,"h":275}, + "frame": {"x":3,"y":402,"w":291,"h":393}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":1342,"w":197,"h":275}, + "spriteSourceSize": {"x":446,"y":537,"w":291,"h":393}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SMoonlight/ReverseBinderStraps.png": +"Models/Slime/TorsoLowerKneel.png": { - "frame": {"x":1645,"y":943,"w":266,"h":186}, + "frame": {"x":816,"y":758,"w":338,"h":364}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":475,"y":452,"w":266,"h":186}, + "spriteSourceSize": {"x":416,"y":537,"w":338,"h":364}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimThighLeftClosed.png": +"Models/SteelChastity/Belt.png": { - "frame": {"x":879,"y":1937,"w":148,"h":47}, + "frame": {"x":1604,"y":1190,"w":235,"h":216}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":579,"y":998,"w":148,"h":47}, + "spriteSourceSize": {"x":469,"y":700,"w":235,"h":216}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ThighRightClosed.png": +"Models/SteelCuffs/RimThighRightClosed.png": { - "frame": {"x":1915,"y":411,"w":130,"h":69}, + "frame": {"x":1314,"y":1076,"w":120,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":973,"w":130,"h":69}, + "spriteSourceSize": {"x":462,"y":995,"w":120,"h":46}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/WristRightYoked.png": +"Models/Succubus/bac/SuccubusClawRightYoked.png": { - "frame": {"x":547,"y":1999,"w":74,"h":46}, + "frame": {"x":1191,"y":1903,"w":101,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":303,"y":391,"w":74,"h":46}, + "spriteSourceSize": {"x":298,"y":286,"w":101,"h":67}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/AnklesHogtie.png": +"Models/TallBallet/TallLegRightHogtie.png": { - "frame": {"x":473,"y":812,"w":233,"h":389}, + "frame": {"x":1452,"y":821,"w":142,"h":301}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":506,"y":955,"w":233,"h":389}, + "spriteSourceSize": {"x":448,"y":905,"w":142,"h":301}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TallBallet/TallLegRightKneelClosed.png": +{ + "frame": {"x":1249,"y":366,"w":179,"h":238}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":323,"y":821,"w":179,"h":238}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/ChestPetsuit.png": +"Models/TapeHeavy/AnklesHogtie.png": { - "frame": {"x":1645,"y":1133,"w":266,"h":159}, + "frame": {"x":3,"y":1192,"w":233,"h":389}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":469,"w":266,"h":159}, + "spriteSourceSize": {"x":506,"y":955,"w":233,"h":389}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/AnklesClosed.png": +"Models/TapeHeavy/AnklesKneelClosed.png": { - "frame": {"x":1915,"y":660,"w":129,"h":109}, + "frame": {"x":1371,"y":1898,"w":329,"h":147}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":539,"y":1376,"w":129,"h":109}, + "spriteSourceSize": {"x":436,"y":936,"w":329,"h":147}, "sourceSize": {"w":1240,"h":1754} }, "Models/TapeLight/AnklesHogtie.png": { - "frame": {"x":466,"y":1606,"w":233,"h":389}, + "frame": {"x":3,"y":1585,"w":233,"h":389}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":506,"y":955,"w":233,"h":389}, "sourceSize": {"w":1240,"h":1754} }, +"Models/TapeLight/TopWristtie.png": +{ + "frame": {"x":1249,"y":608,"w":38,"h":100}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":660,"w":38,"h":100}, + "sourceSize": {"w":1240,"h":1754} +}, "Models/TapeMed/AnklesHogtie.png": { - "frame": {"x":568,"y":1205,"w":233,"h":389}, + "frame": {"x":240,"y":1192,"w":233,"h":389}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":506,"y":955,"w":233,"h":389}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ChestPetsuit.png": +"Models/Witch/BlouseBust.png": { - "frame": {"x":1645,"y":1296,"w":266,"h":159}, + "frame": {"x":298,"y":783,"w":289,"h":375}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":469,"w":266,"h":159}, + "spriteSourceSize": {"x":438,"y":409,"w":289,"h":375}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseLeftFree.png": +{ + "frame": {"x":477,"y":1190,"w":208,"h":375}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":409,"w":208,"h":375}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseLeftWristtie.png": +{ + "frame": {"x":832,"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/BlouseLeftYoked.png": +{ + "frame": {"x":298,"y":400,"w":252,"h":379}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":405,"w":252,"h":379}, "sourceSize": {"w":1240,"h":1754} }, "Models/Witch/BlouseRightBoxtie.png": { - "frame": {"x":1182,"y":3,"w":163,"h":364}, + "frame": {"x":861,"y":373,"w":163,"h":364}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":431,"y":420,"w":163,"h":364}, @@ -666,7 +778,7 @@ }, "Models/Witch/BlouseRightFree.png": { - "frame": {"x":1182,"y":3,"w":163,"h":364}, + "frame": {"x":861,"y":373,"w":163,"h":364}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":431,"y":420,"w":163,"h":364}, @@ -674,7 +786,7 @@ }, "Models/Witch/BlouseRightWristtie.png": { - "frame": {"x":1182,"y":3,"w":163,"h":364}, + "frame": {"x":861,"y":373,"w":163,"h":364}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":431,"y":420,"w":163,"h":364}, @@ -682,7 +794,7 @@ }, "Models/Witch/BlouseRightYoked.png": { - "frame": {"x":788,"y":3,"w":197,"h":371}, + "frame": {"x":631,"y":3,"w":197,"h":371}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":397,"y":413,"w":197,"h":371}, @@ -690,18 +802,26 @@ }, "Models/WolfCatsuit/GloveLeftFree.png": { - "frame": {"x":710,"y":812,"w":221,"h":365}, + "frame": {"x":591,"y":758,"w":221,"h":365}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":697,"y":499,"w":221,"h":365}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegBandLeftSpread.png": +"Models/WolfCatsuit/GloveLeftYoked.png": +{ + "frame": {"x":1028,"y":373,"w":217,"h":362}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":734,"y":278,"w":217,"h":362}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/ShoeRightClosed.png": { - "frame": {"x":1044,"y":1937,"w":142,"h":108}, + "frame": {"x":1158,"y":938,"w":152,"h":184}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":605,"y":802,"w":142,"h":108}, + "spriteSourceSize": {"x":449,"y":1451,"w":152,"h":184}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -711,7 +831,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas29.webp b/TextureAtlas/atlas29.webp index 8ce444f34..e8b9cbe59 100644 Binary files a/TextureAtlas/atlas29.webp and b/TextureAtlas/atlas29.webp differ diff --git a/TextureAtlas/atlas3.json b/TextureAtlas/atlas3.json index d21f2dd90..7b16fa557 100644 --- a/TextureAtlas/atlas3.json +++ b/TextureAtlas/atlas3.json @@ -151,7 +151,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas30.json b/TextureAtlas/atlas30.json index 4dc2bc7f0..15201df65 100644 --- a/TextureAtlas/atlas30.json +++ b/TextureAtlas/atlas30.json @@ -1,144 +1,176 @@ {"frames": { -"Models/ArmorChain/SkirtHogtie.png": +"Models/ArmorPlate/BootLeftKneel.png": { - "frame": {"x":1079,"y":1416,"w":349,"h":274}, + "frame": {"x":3,"y":388,"w":387,"h":160}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":421,"y":739,"w":349,"h":274}, + "spriteSourceSize": {"x":506,"y":925,"w":387,"h":160}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/Breastplate.png": +"Models/ArmorPlate/BootLeftKneelClosed.png": { - "frame": {"x":1767,"y":1601,"w":278,"h":246}, + "frame": {"x":3,"y":552,"w":387,"h":153}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":420,"w":278,"h":246}, + "spriteSourceSize": {"x":506,"y":932,"w":387,"h":153}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ShoeLeftKneel.png": +"Models/ArmorPlate/GauntletLeftYoked.png": { - "frame": {"x":1853,"y":1496,"w":192,"h":101}, + "frame": {"x":274,"y":1383,"w":98,"h":193}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":705,"y":923,"w":192,"h":101}, + "spriteSourceSize": {"x":850,"y":280,"w":98,"h":193}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ShortsKneel.png": +"Models/ArmorPlate/PauldronsYoked.png": { - "frame": {"x":1164,"y":264,"w":375,"h":220}, + "frame": {"x":3,"y":3,"w":390,"h":151}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":400,"y":751,"w":375,"h":220}, + "spriteSourceSize": {"x":433,"y":398,"w":390,"h":151}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ShortsKneelClosed.png": +"Models/Belts/Feet2Kneel.png": { - "frame": {"x":1164,"y":264,"w":375,"h":220}, + "frame": {"x":1964,"y":300,"w":80,"h":140}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":400,"y":751,"w":375,"h":220}, + "spriteSourceSize": {"x":564,"y":939,"w":80,"h":140}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/LegRightKneelClosed.png": +"Models/Cape/ShouldersHogtieFree.png": { - "frame": {"x":974,"y":1710,"w":310,"h":335}, + "frame": {"x":759,"y":1020,"w":368,"h":182}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":244,"y":760,"w":310,"h":335}, + "spriteSourceSize": {"x":454,"y":396,"w":368,"h":182}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bra/InvertedRose.png": +"Models/Cape/ShouldersKneel.png": { - "frame": {"x":1497,"y":1694,"w":266,"h":111}, + "frame": {"x":759,"y":1020,"w":368,"h":182}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":514,"w":266,"h":111}, + "spriteSourceSize": {"x":454,"y":396,"w":368,"h":182}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/GloveRightBoxtie.png": +"Models/Cape/ShouldersSpread.png": { - "frame": {"x":717,"y":1491,"w":253,"h":199}, + "frame": {"x":759,"y":1020,"w":368,"h":182}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":464,"y":517,"w":253,"h":199}, + "spriteSourceSize": {"x":454,"y":396,"w":368,"h":182}, "sourceSize": {"w":1240,"h":1754} }, "Models/Cape/ShouldersUp.png": { - "frame": {"x":1152,"y":646,"w":368,"h":179}, + "frame": {"x":1541,"y":1144,"w":368,"h":179}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":454,"y":399,"w":368,"h":179}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ArmLeftHogtie.png": +"Models/Catsuit/ArmLeftFront.png": +{ + "frame": {"x":1358,"y":1746,"w":107,"h":299}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":662,"y":404,"w":107,"h":299}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/SleevelessTorsoUpperHogtie.png": +{ + "frame": {"x":3,"y":1746,"w":267,"h":299}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":395,"w":267,"h":299}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/China/DressSkirtKneel.png": +{ + "frame": {"x":3,"y":158,"w":389,"h":226}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":734,"w":389,"h":226}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/TrackingModule.png": +{ + "frame": {"x":1918,"y":924,"w":27,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":567,"y":402,"w":27,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/WristRightYoked.png": { - "frame": {"x":212,"y":1694,"w":119,"h":350}, + "frame": {"x":1884,"y":1999,"w":64,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":660,"y":411,"w":119,"h":350}, + "spriteSourceSize": {"x":310,"y":394,"w":64,"h":46}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ForeArmRightCrossed.png": +"Models/Cuffs/WristRightYoked.png": { - "frame": {"x":324,"y":1609,"w":267,"h":81}, + "frame": {"x":1952,"y":1999,"w":64,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":433,"y":603,"w":267,"h":81}, + "spriteSourceSize": {"x":310,"y":394,"w":64,"h":46}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BeltLock.png": +"Models/CyberArms/ForeLongMittenRightFront.png": { - "frame": {"x":1853,"y":1358,"w":192,"h":134}, + "frame": {"x":745,"y":1608,"w":161,"h":259}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":535,"y":705,"w":192,"h":134}, + "spriteSourceSize": {"x":424,"y":462,"w":161,"h":259}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraLock.png": +"Models/CyberArms/LongMittenLeftWristtie.png": { - "frame": {"x":595,"y":1609,"w":118,"h":70}, + "frame": {"x":910,"y":1843,"w":79,"h":202}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":556,"y":565,"w":118,"h":70}, + "spriteSourceSize": {"x":677,"y":550,"w":79,"h":202}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Corsets/HeavyCorsetKneel.png": +"Models/CyberMitts/ArmLongMittenLeftWristtie.png": { - "frame": {"x":447,"y":1694,"w":290,"h":349}, + "frame": {"x":910,"y":1843,"w":79,"h":202}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":508,"w":290,"h":349}, + "spriteSourceSize": {"x":677,"y":550,"w":79,"h":202}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenElbowLeftBoxtie.png": +"Models/CyberMitts/CapLongMittenRightCrossed.png": { - "frame": {"x":1455,"y":1221,"w":37,"h":62}, + "frame": {"x":1131,"y":1020,"w":34,"h":75}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":742,"y":570,"w":37,"h":62}, + "spriteSourceSize": {"x":747,"y":612,"w":34,"h":75}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberHeels/ShinyBalletRightSpread.png": +"Models/CyberMitts/ForeLongMittenRightFront.png": { - "frame": {"x":335,"y":1694,"w":108,"h":350}, + "frame": {"x":745,"y":1608,"w":161,"h":259}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":1348,"w":108,"h":350}, + "spriteSourceSize": {"x":424,"y":462,"w":161,"h":259}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/LongMittenLeftFree.png": +"Models/CyberMitts/LongMittenLeftWristtie.png": { - "frame": {"x":3,"y":1694,"w":205,"h":350}, + "frame": {"x":910,"y":1843,"w":79,"h":202}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":702,"y":512,"w":205,"h":350}, + "spriteSourceSize": {"x":677,"y":550,"w":79,"h":202}, "sourceSize": {"w":1240,"h":1754} }, "Models/CyberPetsuit/DisplayArms.png": { - "frame": {"x":391,"y":3,"w":383,"h":121}, + "frame": {"x":1177,"y":493,"w":383,"h":121}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":405,"y":465,"w":383,"h":121}, @@ -146,7 +178,7 @@ }, "Models/CyberPetsuit/LeftLegsKneel.png": { - "frame": {"x":1543,"y":278,"w":373,"h":287}, + "frame": {"x":1169,"y":771,"w":373,"h":287}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":368,"y":801,"w":373,"h":287}, @@ -154,407 +186,535 @@ }, "Models/CyberPetsuit/LeftLegsKneelClosed.png": { - "frame": {"x":3,"y":573,"w":368,"h":289}, + "frame": {"x":1546,"y":851,"w":368,"h":289}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":368,"y":801,"w":368,"h":289}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/LockBeltShackle.png": +"Models/DivineBelt/BraBase2.png": +{ + "frame": {"x":1469,"y":1746,"w":83,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":557,"y":440,"w":83,"h":73}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightDecoCleanClosed.png": +{ + "frame": {"x":1108,"y":1459,"w":57,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":532,"y":1444,"w":57,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightDecoClosed.png": +{ + "frame": {"x":1108,"y":1497,"w":57,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":532,"y":1444,"w":57,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleRightLockBandClosed.png": +{ + "frame": {"x":1918,"y":851,"w":27,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":514,"y":1454,"w":27,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoCleanFree.png": +{ + "frame": {"x":1964,"y":3,"w":81,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":699,"y":605,"w":81,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoCleanFront.png": +{ + "frame": {"x":855,"y":1871,"w":51,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":712,"y":612,"w":51,"h":38}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoFree.png": { - "frame": {"x":908,"y":1958,"w":62,"h":83}, + "frame": {"x":1964,"y":42,"w":81,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":539,"y":780,"w":62,"h":83}, + "spriteSourceSize": {"x":699,"y":605,"w":81,"h":35}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristLeftLockFree.png": +"Models/Dress/BlouseBustChesttied.png": { - "frame": {"x":1455,"y":1287,"w":37,"h":62}, + "frame": {"x":376,"y":1462,"w":274,"h":114}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":826,"y":724,"w":37,"h":62}, + "spriteSourceSize": {"x":444,"y":514,"w":274,"h":114}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/LaceChestCups.png": +"Models/Dress/CroppedBlouseTorso.png": { - "frame": {"x":1496,"y":1599,"w":267,"h":91}, + "frame": {"x":1566,"y":337,"w":383,"h":180}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":534,"w":267,"h":91}, + "spriteSourceSize": {"x":446,"y":559,"w":383,"h":180}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/BandLeftWristtie.png": +"Models/Dress/LaceCorset.png": { - "frame": {"x":639,"y":1518,"w":70,"h":87}, + "frame": {"x":3,"y":1383,"w":267,"h":316}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":700,"y":499,"w":70,"h":87}, + "spriteSourceSize": {"x":455,"y":519,"w":267,"h":316}, "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK4/EyesSurprised.png": +"Models/Elf/ShoeRightSpread.png": { - "frame": {"x":1436,"y":1353,"w":56,"h":49}, + "frame": {"x":993,"y":1843,"w":111,"h":175}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":522,"y":268,"w":56,"h":49}, + "spriteSourceSize": {"x":491,"y":1467,"w":111,"h":175}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai1/Brows2Angry.png": +{ + "frame": {"x":3,"y":1703,"w":59,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":241,"w":59,"h":39}, + "sourceSize": {"w":703,"h":355} +}, +"Models/EyesK4/EyesClosed.png": +{ + "frame": {"x":993,"y":2022,"w":53,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":526,"y":283,"w":53,"h":23}, "sourceSize": {"w":781,"h":560} }, -"Models/EyesK4/WhitesEyesNeutral.png": +"Models/EyesK4/WhitesEyesClosed.png": { - "frame": {"x":1436,"y":1406,"w":56,"h":49}, + "frame": {"x":993,"y":2022,"w":53,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":522,"y":268,"w":56,"h":49}, + "spriteSourceSize": {"x":526,"y":283,"w":53,"h":23}, "sourceSize": {"w":781,"h":560} }, -"Models/GagLatex/Harness.png": +"Models/FaceDask/WhitesEyesClosed.png": +{ + "frame": {"x":1050,"y":2022,"w":52,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":55,"y":189,"w":52,"h":23}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKjus/EyesDazed.png": +{ + "frame": {"x":66,"y":1703,"w":59,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":275,"w":59,"h":39}, + "sourceSize": {"w":725,"h":425} +}, +"Models/FaceKjus/WhitesEyesDazed.png": +{ + "frame": {"x":129,"y":1703,"w":59,"h":39}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":275,"w":59,"h":39}, + "sourceSize": {"w":725,"h":425} +}, +"Models/GagLeather/Ball.png": +{ + "frame": {"x":192,"y":1703,"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_TeethDeep.png": +{ + "frame": {"x":247,"y":1703,"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.png": { - "frame": {"x":1432,"y":1459,"w":60,"h":208}, + "frame": {"x":745,"y":1871,"w":51,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":101,"y":9,"w":60,"h":208}, + "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, "sourceSize": {"w":321,"h":332} }, -"Models/GagLatex/SideStrap.png": +"Models/GagMetal/Ball_TeethDeep.png": { - "frame": {"x":1455,"y":1037,"w":37,"h":180}, + "frame": {"x":800,"y":1871,"w":51,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":206,"y":46,"w":37,"h":180}, + "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, "sourceSize": {"w":321,"h":332} }, -"Models/Hair/Fuzzy_Overstrap.png": +"Models/Hair2/Hair3_FrontB.png": { - "frame": {"x":741,"y":1694,"w":229,"h":260}, + "frame": {"x":1575,"y":3,"w":385,"h":330}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":489,"y":136,"w":229,"h":260}, + "spriteSourceSize": {"x":421,"y":97,"w":385,"h":330}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair4_Front.png": +"Models/Heels/BalletLaceRightClosed.png": { - "frame": {"x":1497,"y":1809,"w":243,"h":236}, + "frame": {"x":1117,"y":1220,"w":48,"h":195}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":114,"w":243,"h":236}, + "spriteSourceSize": {"x":527,"y":1387,"w":48,"h":195}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Labcoat/ShouldersHogtieFree.png": +"Models/Kigu/Eyes2.png": { - "frame": {"x":1527,"y":569,"w":368,"h":182}, + "frame": {"x":1840,"y":1327,"w":74,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":396,"w":368,"h":182}, + "spriteSourceSize": {"x":611,"y":240,"w":74,"h":65}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Labcoat/ShouldersKneel.png": +"Models/Labcoat/ShouldersHogtieFree.png": { - "frame": {"x":375,"y":801,"w":366,"h":146}, + "frame": {"x":1169,"y":1062,"w":368,"h":182}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":407,"w":366,"h":146}, + "spriteSourceSize": {"x":454,"y":396,"w":368,"h":182}, "sourceSize": {"w":1240,"h":1754} }, "Models/LatexPetsuit/LeftLegsBeltsKneel.png": { - "frame": {"x":1546,"y":3,"w":377,"h":271}, + "frame": {"x":3,"y":709,"w":377,"h":271}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":366,"y":824,"w":377,"h":271}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Leash/LeashCrossed.png": +"Models/LeatherPetsuit/ArmsHardware.png": { - "frame": {"x":1927,"y":3,"w":118,"h":339}, + "frame": {"x":1169,"y":618,"w":374,"h":149}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":582,"y":436,"w":118,"h":339}, + "spriteSourceSize": {"x":418,"y":534,"w":374,"h":149}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/SkirtClosed.png": +"Models/Maid/Skirt.png": { - "frame": {"x":734,"y":1140,"w":356,"h":204}, + "frame": {"x":776,"y":812,"w":372,"h":204}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":415,"y":741,"w":356,"h":204}, + "spriteSourceSize": {"x":415,"y":741,"w":372,"h":204}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/SkirtOverKneel.png": +"Models/Maid/StripeKneelCrotchStrap.png": { - "frame": {"x":3,"y":1143,"w":358,"h":176}, + "frame": {"x":790,"y":3,"w":389,"h":98}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":801,"w":358,"h":176}, + "spriteSourceSize": {"x":393,"y":818,"w":389,"h":98}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/Stripe.png": +"Models/MaidKnightLight/BootLeftKneelClosed.png": { - "frame": {"x":1079,"y":1353,"w":353,"h":59}, + "frame": {"x":787,"y":322,"w":386,"h":193}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":422,"y":858,"w":353,"h":59}, + "spriteSourceSize": {"x":539,"y":891,"w":386,"h":193}, "sourceSize": {"w":1240,"h":1754} }, "Models/MaidKnightLight/DressSkirtHogtie.png": { - "frame": {"x":778,"y":3,"w":382,"h":326}, + "frame": {"x":1564,"y":521,"w":382,"h":326}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":436,"y":661,"w":382,"h":326}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LongMittenLeftYoked.png": +"Models/Mittens/BandLeftYoked.png": { - "frame": {"x":1288,"y":1694,"w":205,"h":349}, + "frame": {"x":1108,"y":1419,"w":57,"h":36}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":744,"y":287,"w":205,"h":349}, + "spriteSourceSize": {"x":875,"y":385,"w":57,"h":36}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/KneeLeftSpread.png": +"Models/Mittens/LatexRightYoked.png": { - "frame": {"x":1920,"y":544,"w":125,"h":172}, + "frame": {"x":1950,"y":825,"w":95,"h":232}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":645,"y":1152,"w":125,"h":172}, + "spriteSourceSize": {"x":298,"y":298,"w":95,"h":232}, "sourceSize": {"w":1240,"h":1754} }, -"Models/OperaGloves/GloveRightCrossed.png": +"Models/Mittens/LockRightFree.png": { - "frame": {"x":1744,"y":1851,"w":272,"h":194}, + "frame": {"x":1918,"y":890,"w":27,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":431,"y":491,"w":272,"h":194}, + "spriteSourceSize": {"x":371,"y":607,"w":27,"h":30}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/LacesKneel.png": +"Models/Mittens/LongMittenLeftYoked.png": { - "frame": {"x":3,"y":1609,"w":317,"h":81}, + "frame": {"x":1840,"y":1409,"w":205,"h":349}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":437,"y":773,"w":317,"h":81}, + "spriteSourceSize": {"x":744,"y":287,"w":205,"h":349}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Petsuit/LeftLegsBeltsKneel.png": +"Models/Ninja/Skirt.png": { - "frame": {"x":1546,"y":3,"w":377,"h":271}, + "frame": {"x":1469,"y":1835,"w":333,"h":210}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":366,"y":824,"w":377,"h":271}, + "spriteSourceSize": {"x":434,"y":738,"w":333,"h":210}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Petsuit/LeftLegsKneel.png": +"Models/Ninja/SockLeftKneel.png": { - "frame": {"x":3,"y":280,"w":378,"h":289}, + "frame": {"x":1177,"y":336,"w":385,"h":153}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":366,"y":816,"w":378,"h":289}, + "spriteSourceSize": {"x":510,"y":931,"w":385,"h":153}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Arm2Up.png": +"Models/Ninja/ThighLeftClosed.png": { - "frame": {"x":385,"y":402,"w":370,"h":104}, + "frame": {"x":590,"y":1580,"w":151,"h":330}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":240,"w":370,"h":104}, + "spriteSourceSize": {"x":574,"y":981,"w":151,"h":330}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ninja/TopBandRimChestUp.png": +{ + "frame": {"x":910,"y":1608,"w":194,"h":231}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":397,"w":194,"h":231}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/HarnessLowerStrap.png": +"Models/Ninja/TopChestUp.png": { - "frame": {"x":1496,"y":1275,"w":353,"h":320}, + "frame": {"x":1556,"y":1598,"w":280,"h":233}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":436,"y":606,"w":353,"h":320}, + "spriteSourceSize": {"x":442,"y":397,"w":280,"h":233}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/HarnessMid.png": +"Models/Petsuit/LeftLegsBeltsKneel.png": { - "frame": {"x":360,"y":1376,"w":353,"h":138}, + "frame": {"x":3,"y":709,"w":377,"h":271}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":436,"y":604,"w":353,"h":138}, + "spriteSourceSize": {"x":366,"y":824,"w":377,"h":271}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Thigh2Closed.png": +"Models/Petsuit/LeftLegsKneel.png": { - "frame": {"x":360,"y":1518,"w":275,"h":87}, + "frame": {"x":787,"y":519,"w":378,"h":289}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":457,"y":974,"w":275,"h":87}, + "spriteSourceSize": {"x":366,"y":816,"w":378,"h":289}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopArmsUp.png": +"Models/Ribbon/Arm1Up.png": { - "frame": {"x":758,"y":663,"w":366,"h":195}, + "frame": {"x":590,"y":1914,"w":316,"h":131}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":240,"w":366,"h":195}, + "spriteSourceSize": {"x":472,"y":316,"w":316,"h":131}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopHarnessMid.png": +"Models/Ribbon/Arm2Up.png": { - "frame": {"x":722,"y":1348,"w":353,"h":139}, + "frame": {"x":3,"y":984,"w":370,"h":104}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":436,"y":604,"w":353,"h":139}, + "spriteSourceSize": {"x":451,"y":240,"w":370,"h":104}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopHarnessMidFlattened.png": +"Models/Ribbon/Calf1Closed.png": { - "frame": {"x":3,"y":1323,"w":353,"h":169}, + "frame": {"x":1840,"y":1762,"w":205,"h":233}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":436,"y":573,"w":353,"h":169}, + "spriteSourceSize": {"x":542,"y":1225,"w":205,"h":233}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/ChestGoldBase.png": +"Models/Rope/Arm2Up.png": { - "frame": {"x":1857,"y":942,"w":188,"h":255}, + "frame": {"x":376,"y":1351,"w":365,"h":107}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":521,"y":405,"w":188,"h":255}, + "spriteSourceSize": {"x":451,"y":237,"w":365,"h":107}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/ShoeLeftKneel.png": +"Models/Rubber/ArmRightFront.png": { - "frame": {"x":741,"y":1958,"w":163,"h":87}, + "frame": {"x":1108,"y":1746,"w":121,"h":299}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":730,"y":932,"w":163,"h":87}, + "spriteSourceSize": {"x":648,"y":404,"w":121,"h":299}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/ShoeLeftKneelClosed.png": +"Models/Rubber/ArmRightUp.png": { - "frame": {"x":741,"y":1958,"w":163,"h":87}, + "frame": {"x":1918,"y":1061,"w":127,"h":344}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":730,"y":932,"w":163,"h":87}, + "spriteSourceSize": {"x":449,"y":162,"w":127,"h":344}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SkirtOverKneel.png": +"Models/Rubber/LegLeftKneel.png": { - "frame": {"x":734,"y":973,"w":357,"h":163}, + "frame": {"x":396,"y":255,"w":387,"h":331}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":801,"w":357,"h":163}, + "spriteSourceSize": {"x":388,"y":751,"w":387,"h":331}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Arm2Up.png": +"Models/Sailor/HemRightUp.png": { - "frame": {"x":745,"y":862,"w":365,"h":107}, + "frame": {"x":654,"y":1462,"w":87,"h":101}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":237,"w":365,"h":107}, + "spriteSourceSize": {"x":472,"y":323,"w":87,"h":101}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/FrogThigh3Kneel.png": +"Models/Sailor/HemRightYoked.png": { - "frame": {"x":372,"y":951,"w":358,"h":226}, + "frame": {"x":1131,"y":1099,"w":34,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":372,"y":842,"w":358,"h":226}, + "spriteSourceSize": {"x":435,"y":488,"w":34,"h":57}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Thigh3KneelClosed.png": +"Models/Sailor/ShirtChestTied.png": { - "frame": {"x":1857,"y":1201,"w":188,"h":153}, + "frame": {"x":302,"y":1703,"w":284,"h":326}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":499,"y":832,"w":188,"h":153}, + "spriteSourceSize": {"x":445,"y":303,"w":284,"h":326}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/SleeveLeftUp.png": +"Models/Skirts/StripedSkirtOverKneel.png": { - "frame": {"x":974,"y":1491,"w":101,"h":215}, + "frame": {"x":790,"y":105,"w":388,"h":213}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":669,"y":351,"w":101,"h":215}, + "spriteSourceSize": {"x":444,"y":771,"w":388,"h":213}, "sourceSize": {"w":1240,"h":1754} }, "Models/Slayer/Cape.png": { - "frame": {"x":385,"y":510,"w":369,"h":287}, + "frame": {"x":3,"y":1092,"w":369,"h":287}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":438,"y":410,"w":369,"h":287}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeBackYoked.png": +"Models/Slime/ArmRightFront.png": { - "frame": {"x":1152,"y":488,"w":371,"h":154}, + "frame": {"x":1233,"y":1746,"w":121,"h":299}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":423,"y":530,"w":371,"h":154}, + "spriteSourceSize": {"x":648,"y":404,"w":121,"h":299}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeStripe.png": +"Models/Slime/FaceEyes.png": { - "frame": {"x":3,"y":866,"w":365,"h":273}, + "frame": {"x":1168,"y":1598,"w":217,"h":144}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":422,"w":365,"h":273}, + "spriteSourceSize": {"x":505,"y":194,"w":217,"h":144}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeStripeTied.png": +"Models/Slime/HandRightYoked.png": { - "frame": {"x":3,"y":3,"w":384,"h":273}, + "frame": {"x":1953,"y":444,"w":92,"h":127}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":421,"y":422,"w":384,"h":273}, + "spriteSourceSize": {"x":299,"y":287,"w":92,"h":127}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/BottomKneelClosed.png": +"Models/Slime/LegLeftKneelClosed.png": { - "frame": {"x":365,"y":1181,"w":353,"h":191}, + "frame": {"x":1183,"y":3,"w":388,"h":329}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":395,"y":652,"w":353,"h":191}, + "spriteSourceSize": {"x":387,"y":751,"w":388,"h":329}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/PetsuitTopArms.png": +"Models/SteelCuffs/WristRightYoked.png": { - "frame": {"x":391,"y":128,"w":382,"h":270}, + "frame": {"x":1806,"y":1999,"w":74,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":398,"y":439,"w":382,"h":270}, + "spriteSourceSize": {"x":303,"y":391,"w":74,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/TopFullCrossed.png": +{ + "frame": {"x":1529,"y":1327,"w":307,"h":267}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":462,"y":384,"w":307,"h":267}, "sourceSize": {"w":1240,"h":1754} }, "Models/TapeLight/LegsKneelClosed.png": { - "frame": {"x":1497,"y":925,"w":356,"h":346}, + "frame": {"x":1169,"y":1248,"w":356,"h":346}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":328,"y":652,"w":356,"h":346}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/RightLegsKneelClosed.png": +"Models/TapeMed/LegsKneel.png": { - "frame": {"x":1095,"y":1037,"w":356,"h":312}, + "frame": {"x":384,"y":851,"w":371,"h":326}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":328,"y":652,"w":356,"h":312}, + "spriteSourceSize": {"x":408,"y":760,"w":371,"h":326}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/BottomKneelClosed.png": +"Models/TapeMed/TopFullCrossed.png": { - "frame": {"x":3,"y":1496,"w":353,"h":109}, + "frame": {"x":1529,"y":1327,"w":307,"h":267}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":395,"y":734,"w":353,"h":109}, + "spriteSourceSize": {"x":462,"y":384,"w":307,"h":267}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/LegsKneel.png": +"Models/Warrior/BandGloveLeftYoked.png": { - "frame": {"x":777,"y":333,"w":371,"h":326}, + "frame": {"x":1108,"y":1535,"w":57,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":408,"y":760,"w":371,"h":326}, + "spriteSourceSize": {"x":877,"y":389,"w":57,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ShoeLeftHogtie.png": +{ + "frame": {"x":1108,"y":1569,"w":56,"h":173}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":679,"y":964,"w":56,"h":173}, "sourceSize": {"w":1240,"h":1754} }, "Models/Warrior/ShoeLeftKneelClosed.png": { - "frame": {"x":1524,"y":755,"w":368,"h":166}, + "frame": {"x":376,"y":1181,"w":368,"h":166}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":535,"y":924,"w":368,"h":166}, @@ -562,7 +722,7 @@ }, "Models/Warrior/ShoeLeftKneelClosedRopesAnkle.png": { - "frame": {"x":1524,"y":755,"w":368,"h":166}, + "frame": {"x":376,"y":1181,"w":368,"h":166}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":535,"y":924,"w":368,"h":166}, @@ -570,7 +730,7 @@ }, "Models/Warrior/Skirt.png": { - "frame": {"x":1164,"y":3,"w":378,"h":257}, + "frame": {"x":394,"y":590,"w":378,"h":257}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":403,"y":686,"w":378,"h":257}, @@ -578,26 +738,90 @@ }, "Models/Witch/SkirtOverKneelCrotchStrap.png": { - "frame": {"x":1128,"y":829,"w":365,"h":204}, + "frame": {"x":748,"y":1206,"w":365,"h":204}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":477,"y":774,"w":365,"h":204}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/GloveRightUp.png": +"Models/Witch/SkirtRuffleOverKneelCrotchStrap.png": +{ + "frame": {"x":745,"y":1414,"w":359,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":786,"w":359,"h":190}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/CollarTag.png": +{ + "frame": {"x":1131,"y":1160,"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":1131,"y":1160,"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":274,"y":1580,"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":274,"y":1580,"w":312,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":439,"y":797,"w":312,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/BandGloveLeftYoked.png": +{ + "frame": {"x":1108,"y":1535,"w":57,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":877,"y":389,"w":57,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/GloveLeftWristtie.png": +{ + "frame": {"x":1950,"y":575,"w":95,"h":246}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":677,"y":506,"w":95,"h":246}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegPadsLeftKneel.png": +{ + "frame": {"x":397,"y":3,"w":389,"h":248}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":388,"y":827,"w":389,"h":248}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRimLeftClosed.png": { - "frame": {"x":1899,"y":720,"w":146,"h":218}, + "frame": {"x":1389,"y":1598,"w":163,"h":144}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":164,"w":146,"h":218}, + "spriteSourceSize": {"x":586,"y":792,"w":163,"h":144}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegPadsRightHogtie.png": +"Models/WolfCatsuit/TorsoUpperBeltStrap.png": { - "frame": {"x":1920,"y":346,"w":125,"h":194}, + "frame": {"x":1964,"y":81,"w":80,"h":215}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":942,"w":125,"h":194}, + "spriteSourceSize": {"x":550,"y":418,"w":80,"h":215}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -607,7 +831,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas30.webp b/TextureAtlas/atlas30.webp index f8c8b3c0d..f2ee9177e 100644 Binary files a/TextureAtlas/atlas30.webp and b/TextureAtlas/atlas30.webp differ diff --git a/TextureAtlas/atlas31.json b/TextureAtlas/atlas31.json index 0b67e3d40..eca33c0ad 100644 --- a/TextureAtlas/atlas31.json +++ b/TextureAtlas/atlas31.json @@ -1,667 +1,635 @@ {"frames": { -"Models/Belts/LeftArm2Wristtie.png": +"Models/ArmorChain/Skirt2KneelCrotchStrap.png": { - "frame": {"x":1388,"y":441,"w":57,"h":52}, + "frame": {"x":706,"y":518,"w":346,"h":169}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":682,"y":596,"w":57,"h":52}, + "spriteSourceSize": {"x":352,"y":796,"w":346,"h":169}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bra/Rose.png": +"Models/ArmorChain/SkirtHogtie.png": { - "frame": {"x":1175,"y":1250,"w":265,"h":111}, + "frame": {"x":1077,"y":290,"w":349,"h":274}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":514,"w":265,"h":111}, + "spriteSourceSize": {"x":421,"y":739,"w":349,"h":274}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/GloveRightYoked.png": +"Models/ArmorChain/SkirtHogtieCrotchStrap.png": { - "frame": {"x":401,"y":349,"w":171,"h":341}, + "frame": {"x":363,"y":211,"w":349,"h":274}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":300,"y":288,"w":171,"h":341}, + "spriteSourceSize": {"x":421,"y":739,"w":349,"h":274}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/HighLeotardKneel.png": +"Models/ArmorPlate/BreastplateHogtie.png": { - "frame": {"x":414,"y":694,"w":268,"h":336}, + "frame": {"x":1377,"y":1303,"w":267,"h":209}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":518,"w":268,"h":336}, + "spriteSourceSize": {"x":447,"y":466,"w":267,"h":209}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/LeotardKneel.png": +"Models/ArmorPlate/PauldronsHogtie.png": { - "frame": {"x":414,"y":694,"w":268,"h":336}, + "frame": {"x":1405,"y":772,"w":339,"h":167}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":518,"w":268,"h":336}, + "spriteSourceSize": {"x":456,"y":387,"w":339,"h":167}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/SockLeftHogtie.png": +"Models/Body/HandRightFront.png": { - "frame": {"x":353,"y":1756,"w":170,"h":289}, + "frame": {"x":1780,"y":650,"w":265,"h":335}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":569,"y":918,"w":170,"h":289}, + "spriteSourceSize": {"x":354,"y":244,"w":265,"h":335}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ArmRightUp.png": +"Models/Bubble/CuffsArms.png": { - "frame": {"x":215,"y":3,"w":145,"h":344}, + "frame": {"x":1430,"y":319,"w":348,"h":157}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":162,"w":145,"h":344}, + "spriteSourceSize": {"x":419,"y":1131,"w":348,"h":157}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/HandRightFront.png": +"Models/Catsuit/ArmLeftCrossed.png": { - "frame": {"x":576,"y":348,"w":234,"h":335}, + "frame": {"x":943,"y":1751,"w":107,"h":293}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":354,"y":244,"w":234,"h":335}, + "spriteSourceSize": {"x":662,"y":404,"w":107,"h":293}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/LongMittenLeftWristtie.png": +"Models/China/DressSkirtKneelCrotchStrap.png": { - "frame": {"x":1964,"y":888,"w":79,"h":202}, + "frame": {"x":343,"y":1322,"w":335,"h":148}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":677,"y":550,"w":79,"h":202}, + "spriteSourceSize": {"x":423,"y":734,"w":335,"h":148}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenAnkleLeftClosed.png": +"Models/CyberCuffs/DisplayThighRightKneel.png": { - "frame": {"x":1388,"y":375,"w":57,"h":62}, + "frame": {"x":1699,"y":1869,"w":31,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":606,"y":1433,"w":57,"h":62}, + "spriteSourceSize": {"x":381,"y":824,"w":31,"h":44}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/ArmLongMittenLeftWristtie.png": +"Models/CyberCuffs/ScreenElbowLeftFree.png": { - "frame": {"x":1964,"y":888,"w":79,"h":202}, + "frame": {"x":1695,"y":1382,"w":37,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":677,"y":550,"w":79,"h":202}, + "spriteSourceSize": {"x":752,"y":581,"w":37,"h":59}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/LongMittenLeftWristtie.png": +"Models/DivineBelt/BraMetal2.png": { - "frame": {"x":1964,"y":888,"w":79,"h":202}, + "frame": {"x":1695,"y":1318,"w":37,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":677,"y":550,"w":79,"h":202}, + "spriteSourceSize": {"x":556,"y":556,"w":37,"h":60}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/LongMittenLeftYoked.png": +"Models/DivineBelt/BraMetalRunic2.png": { - "frame": {"x":955,"y":1369,"w":202,"h":331}, + "frame": {"x":1695,"y":1318,"w":37,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":751,"y":312,"w":202,"h":331}, + "spriteSourceSize": {"x":556,"y":556,"w":37,"h":60}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/LongMittenRightYoked.png": +"Models/DivineCuffs/AnkleLeftLockClosed.png": { - "frame": {"x":999,"y":1034,"w":172,"h":327}, + "frame": {"x":294,"y":1933,"w":43,"h":76}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":292,"y":311,"w":172,"h":327}, + "spriteSourceSize": {"x":646,"y":1428,"w":43,"h":76}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleRightDecoClosed.png": +"Models/DivineCuffs/WristRightLockPlateCrossed.png": { - "frame": {"x":1388,"y":497,"w":57,"h":34}, + "frame": {"x":1736,"y":943,"w":40,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":532,"y":1444,"w":57,"h":34}, + "spriteSourceSize": {"x":656,"y":601,"w":40,"h":32}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseArmRightUp.png": +"Models/Dress/BlouseArmRightCrossed.png": { - "frame": {"x":3,"y":360,"w":177,"h":349}, + "frame": {"x":3,"y":553,"w":346,"h":213}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":156,"w":177,"h":349}, + "spriteSourceSize": {"x":428,"y":438,"w":346,"h":213}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/LaceCorsetStripes.png": +"Models/Dress/BlouseForeArmRightCrossed.png": { - "frame": {"x":1448,"y":862,"w":265,"h":228}, + "frame": {"x":3,"y":770,"w":346,"h":213}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":607,"w":265,"h":228}, + "spriteSourceSize": {"x":428,"y":473,"w":346,"h":213}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/SkirtOverKneelCrotchStrap.png": +"Models/Dress/BlouseNeckUp.png": { - "frame": {"x":1717,"y":3,"w":327,"h":320}, + "frame": {"x":3,"y":987,"w":337,"h":177}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":477,"y":773,"w":327,"h":320}, + "spriteSourceSize": {"x":450,"y":387,"w":337,"h":177}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/SkirtKneelCrotchStrap.png": +"Models/Dress/BowCorsetLongRuffle.png": { - "frame": {"x":1723,"y":1538,"w":322,"h":260}, + "frame": {"x":3,"y":1933,"w":287,"h":112}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":318,"y":749,"w":322,"h":260}, + "spriteSourceSize": {"x":444,"y":761,"w":287,"h":112}, "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesDai2/BrowsNeutral.png": +"Models/Elf/SkirtBack.png": { - "frame": {"x":1119,"y":1008,"w":41,"h":22}, + "frame": {"x":723,"y":198,"w":350,"h":316}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":530,"y":245,"w":41,"h":22}, - "sourceSize": {"w":744,"h":461} -}, -"Models/EyesK4/WhitesEyesSurprised.png": -{ - "frame": {"x":1388,"y":569,"w":56,"h":49}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":522,"y":268,"w":56,"h":49}, - "sourceSize": {"w":781,"h":560} -}, -"Models/FaceDask/Eyes2Closed.png": -{ - "frame": {"x":417,"y":1727,"w":65,"h":24}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":152,"y":182,"w":65,"h":24}, - "sourceSize": {"w":321,"h":332} -}, -"Models/FaceDask/WhitesEyes2Closed.png": -{ - "frame": {"x":417,"y":1727,"w":65,"h":24}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":152,"y":182,"w":65,"h":24}, - "sourceSize": {"w":321,"h":332} -}, -"Models/Hair/BackShortMessyUnderlight.png": -{ - "frame": {"x":655,"y":1373,"w":296,"h":334}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":480,"y":93,"w":296,"h":334}, + "spriteSourceSize": {"x":436,"y":781,"w":350,"h":316}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/Braid_Overstrap.png": +"Models/EyesK3/Eyes2Angry.png": { - "frame": {"x":1771,"y":1094,"w":274,"h":278}, + "frame": {"x":1225,"y":2001,"w":63,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":469,"y":104,"w":274,"h":278}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":617,"y":260,"w":63,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/Hair2/HairAura_RightB.png": +"Models/EyesK3/WhitesEyes2Angry.png": { - "frame": {"x":3,"y":1411,"w":221,"h":343}, + "frame": {"x":1292,"y":2001,"w":63,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":348,"y":398,"w":221,"h":343}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":617,"y":260,"w":63,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/Heels/BalletLeftHogtie.png": +"Models/EyesK4/Eyes2Angry.png": { - "frame": {"x":757,"y":1711,"w":87,"h":334}, + "frame": {"x":1359,"y":2001,"w":67,"h":42}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":702,"y":761,"w":87,"h":334}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":615,"y":266,"w":67,"h":42}, + "sourceSize": {"w":781,"h":560} }, -"Models/Heels/BalletLeftSpread.png": +"Models/Hair2/Hair3_FrontC.png": { - "frame": {"x":184,"y":356,"w":105,"h":346}, + "frame": {"x":1736,"y":1303,"w":309,"h":303}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":663,"y":1332,"w":105,"h":346}, + "spriteSourceSize": {"x":478,"y":114,"w":309,"h":303}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/BalletRightSpread.png": +"Models/Hair2/Hair3_FrontE.png": { - "frame": {"x":198,"y":706,"w":104,"h":342}, + "frame": {"x":1736,"y":1610,"w":309,"h":303}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":472,"y":1334,"w":104,"h":342}, + "spriteSourceSize": {"x":478,"y":114,"w":309,"h":303}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/FlatBalletLeftClosed.png": +"Models/Heels/BalletLaceLeftSpread.png": { - "frame": {"x":293,"y":351,"w":104,"h":342}, + "frame": {"x":1648,"y":1318,"w":43,"h":194}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":578,"y":1337,"w":104,"h":342}, + "spriteSourceSize": {"x":668,"y":1389,"w":43,"h":194}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/FlatBalletLeftHogtie.png": +"Models/Heels/BalletLeftKneel.png": { - "frame": {"x":757,"y":1711,"w":87,"h":334}, + "frame": {"x":1033,"y":1366,"w":278,"h":146}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":702,"y":761,"w":87,"h":334}, + "spriteSourceSize": {"x":652,"y":906,"w":278,"h":146}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/FlatBalletLeftSpread.png": +"Models/Heels/FlatBalletLeftKneel.png": { - "frame": {"x":472,"y":3,"w":105,"h":341}, + "frame": {"x":1033,"y":1366,"w":278,"h":146}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":664,"y":1335,"w":105,"h":341}, + "spriteSourceSize": {"x":652,"y":906,"w":278,"h":146}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/FlatBalletRightSpread.png": +"Models/Heels/LeatherLeftHogtie.png": { - "frame": {"x":364,"y":3,"w":104,"h":342}, + "frame": {"x":1315,"y":1366,"w":50,"h":145}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":472,"y":1334,"w":104,"h":342}, + "spriteSourceSize": {"x":730,"y":797,"w":50,"h":145}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/ShinyBalletLeftClosed.png": +"Models/Jacket/ChestBoleroBoxtie.png": { - "frame": {"x":275,"y":1052,"w":104,"h":342}, + "frame": {"x":1736,"y":989,"w":309,"h":310}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":578,"y":1337,"w":104,"h":342}, + "spriteSourceSize": {"x":463,"y":375,"w":309,"h":310}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/ShinyBalletLeftHogtie.png": +"Models/KittyLatex/KittyLatexEarLight.png": { - "frame": {"x":757,"y":1711,"w":87,"h":334}, + "frame": {"x":1225,"y":1751,"w":201,"h":121}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":702,"y":761,"w":87,"h":334}, + "spriteSourceSize": {"x":498,"y":64,"w":201,"h":121}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/ShinyBalletLeftSpread.png": +"Models/LatexPetsuit/LeftLegsBeltsKneelClosed.png": { - "frame": {"x":383,"y":1043,"w":105,"h":341}, + "frame": {"x":1397,"y":943,"w":335,"h":272}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":664,"y":1335,"w":105,"h":341}, + "spriteSourceSize": {"x":366,"y":824,"w":335,"h":272}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/ShinyBalletRightSpread.png": +"Models/LatexPetsuit/LegsBeltsHogtie.png": { - "frame": {"x":306,"y":697,"w":104,"h":342}, + "frame": {"x":1430,"y":1516,"w":302,"h":349}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":472,"y":1334,"w":104,"h":342}, + "spriteSourceSize": {"x":443,"y":858,"w":302,"h":349}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/ChestBoleroWristtie.png": +"Models/LeatherPetsuit/LeftLegsKneel.png": { - "frame": {"x":1450,"y":1365,"w":317,"h":169}, + "frame": {"x":356,"y":489,"w":346,"h":287}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":375,"w":317,"h":169}, + "spriteSourceSize": {"x":391,"y":810,"w":346,"h":287}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/ChestBoxtie.png": +"Models/LeatherPetsuit/LeftLegsKneelClosed.png": { - "frame": {"x":1717,"y":574,"w":326,"h":310}, + "frame": {"x":1430,"y":480,"w":346,"h":288}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":375,"w":326,"h":310}, + "spriteSourceSize": {"x":391,"y":810,"w":346,"h":288}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/CrotchlessBinderTorsoLower.png": +"Models/LeatherPetsuit/LegsKneel.png": { - "frame": {"x":686,"y":687,"w":282,"h":330}, + "frame": {"x":341,"y":1751,"w":240,"h":294}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":593,"w":282,"h":330}, + "spriteSourceSize": {"x":307,"y":785,"w":240,"h":294}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/TorsoLower.png": +"Models/LeatherPetsuit/LegsKneelClosed.png": { - "frame": {"x":814,"y":342,"w":282,"h":330}, + "frame": {"x":341,"y":1751,"w":240,"h":294}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":593,"w":282,"h":330}, + "spriteSourceSize": {"x":307,"y":785,"w":240,"h":294}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareElbowRightYoked.png": +"Models/Maid/Corset.png": { - "frame": {"x":1400,"y":885,"w":44,"h":81}, + "frame": {"x":1794,"y":3,"w":250,"h":159}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":402,"y":523,"w":44,"h":81}, + "spriteSourceSize": {"x":463,"y":612,"w":250,"h":159}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherLeotard/StrapsLowerClean.png": +"Models/Maid/SkirtClosed.png": { - "frame": {"x":527,"y":1727,"w":226,"h":318}, + "frame": {"x":363,"y":3,"w":356,"h":204}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":473,"y":639,"w":226,"h":318}, + "spriteSourceSize": {"x":415,"y":741,"w":356,"h":204}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LeftLegsKneel.png": +"Models/Maid/StripeClosed.png": { - "frame": {"x":3,"y":1758,"w":346,"h":287}, + "frame": {"x":1055,"y":833,"w":339,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":391,"y":810,"w":346,"h":287}, + "spriteSourceSize": {"x":422,"y":858,"w":339,"h":59}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Legbinder/LegbinderClosed.png": +"Models/MaidKnightLight/ApronKneelHogtie.png": { - "frame": {"x":974,"y":3,"w":154,"h":329}, + "frame": {"x":1056,"y":568,"w":345,"h":261}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":589,"y":909,"w":154,"h":329}, + "spriteSourceSize": {"x":378,"y":549,"w":345,"h":261}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Legbinder/LegLegbinderClosed.png": +"Models/MaidKnightLight/ArmLeftYoked.png": { - "frame": {"x":106,"y":3,"w":105,"h":349}, + "frame": {"x":1794,"y":166,"w":249,"h":253}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":588,"y":1198,"w":105,"h":349}, + "spriteSourceSize": {"x":680,"y":384,"w":249,"h":253}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeSockLeftHogtie.png": +"Models/MaidKnightLight/ArmRightFront.png": { - "frame": {"x":972,"y":1008,"w":143,"h":22}, + "frame": {"x":812,"y":1751,"w":127,"h":293}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":584,"y":978,"w":143,"h":22}, + "spriteSourceSize": {"x":422,"y":424,"w":127,"h":293}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/GloveRightFree.png": +"Models/Ninja/TopBandChestTied.png": { - "frame": {"x":1289,"y":885,"w":107,"h":119}, + "frame": {"x":1219,"y":1516,"w":207,"h":231}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":267,"y":537,"w":107,"h":119}, + "spriteSourceSize": {"x":492,"y":397,"w":207,"h":231}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ShoulderRightUp.png": +"Models/Petsuit/LeftLegsBeltsKneelClosed.png": { - "frame": {"x":1289,"y":666,"w":155,"h":215}, + "frame": {"x":1397,"y":943,"w":335,"h":272}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":441,"y":346,"w":155,"h":215}, + "spriteSourceSize": {"x":366,"y":824,"w":335,"h":272}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LongMittenRightYoked.png": +"Models/Petsuit/LegsBeltsHogtie.png": { - "frame": {"x":492,"y":1034,"w":173,"h":335}, + "frame": {"x":1430,"y":1516,"w":302,"h":349}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":298,"y":294,"w":173,"h":335}, + "spriteSourceSize": {"x":443,"y":858,"w":302,"h":349}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/ThighLeftClosed.png": +"Models/Petsuit/Petsuit.png": { - "frame": {"x":819,"y":3,"w":151,"h":330}, + "frame": {"x":1430,"y":1516,"w":302,"h":349}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":574,"y":981,"w":151,"h":330}, + "spriteSourceSize": {"x":443,"y":858,"w":302,"h":349}, "sourceSize": {"w":1240,"h":1754} }, -"Models/OperaGloves/GloveRightYoked.png": +"Models/Ribbon/HarnessMidFlattened.png": { - "frame": {"x":228,"y":1410,"w":185,"h":342}, + "frame": {"x":1080,"y":3,"w":353,"h":170}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":299,"y":287,"w":185,"h":342}, + "spriteSourceSize": {"x":436,"y":572,"w":353,"h":170}, "sourceSize": {"w":1240,"h":1754} }, -"Models/PantiesHigh/StripesClosed.png": +"Models/Ribbon/TopHarnessLower.png": { - "frame": {"x":1717,"y":888,"w":243,"h":202}, + "frame": {"x":3,"y":319,"w":349,"h":230}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":467,"y":717,"w":243,"h":202}, + "spriteSourceSize": {"x":440,"y":696,"w":349,"h":230}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Thigh3Closed.png": +"Models/Ribbon/TopHarnessMid.png": { - "frame": {"x":1420,"y":3,"w":293,"h":221}, + "frame": {"x":1437,"y":176,"w":353,"h":139}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":918,"w":293,"h":221}, + "spriteSourceSize": {"x":436,"y":604,"w":353,"h":139}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/BaseClosed.png": +"Models/Ribbon/TopHarnessMidFlattened.png": { - "frame": {"x":848,"y":1711,"w":290,"h":333}, + "frame": {"x":1437,"y":3,"w":353,"h":169}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":587,"w":290,"h":333}, + "spriteSourceSize": {"x":436,"y":573,"w":353,"h":169}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/BaseKneel.png": +"Models/RobeOfChastity/ChestPlate.png": { - "frame": {"x":1448,"y":1094,"w":319,"h":267}, + "frame": {"x":1782,"y":423,"w":263,"h":223}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":439,"y":587,"w":319,"h":267}, + "spriteSourceSize": {"x":447,"y":428,"w":263,"h":223}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/BaseSpread.png": +"Models/Robes/Skirt.png": { - "frame": {"x":1142,"y":1704,"w":290,"h":330}, + "frame": {"x":706,"y":691,"w":345,"h":252}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":587,"w":290,"h":330}, + "spriteSourceSize": {"x":431,"y":710,"w":345,"h":252}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/ChestBaseTied.png": +"Models/Robes/SkirtClosed.png": { - "frame": {"x":1448,"y":602,"w":265,"h":256}, + "frame": {"x":706,"y":691,"w":345,"h":252}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":404,"w":265,"h":256}, + "spriteSourceSize": {"x":431,"y":710,"w":345,"h":252}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/ChestPlate.png": +"Models/Robes/SkirtCrotchStrap.png": { - "frame": {"x":1450,"y":375,"w":263,"h":223}, + "frame": {"x":1055,"y":896,"w":338,"h":218}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":428,"w":263,"h":223}, + "spriteSourceSize": {"x":437,"y":713,"w":338,"h":218}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/Chest.png": +"Models/Rope/FrogThigh1Kneel.png": { - "frame": {"x":1450,"y":1538,"w":269,"h":153}, + "frame": {"x":1038,"y":1118,"w":335,"h":244}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":479,"w":269,"h":153}, + "spriteSourceSize": {"x":317,"y":842,"w":335,"h":244}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/RibbonBackHogtie.png": +"Models/Rope/FrogThigh3KneelClosed.png": { - "frame": {"x":1717,"y":327,"w":327,"h":243}, + "frame": {"x":353,"y":780,"w":340,"h":195}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":549,"y":623,"w":327,"h":243}, + "spriteSourceSize": {"x":399,"y":812,"w":340,"h":195}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveRightFree.png": +"Models/Rubber/AnkleLeftKneelClosed.png": { - "frame": {"x":115,"y":1063,"w":156,"h":343}, + "frame": {"x":1699,"y":1917,"w":334,"h":128}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":348,"y":491,"w":156,"h":343}, + "spriteSourceSize": {"x":410,"y":953,"w":334,"h":128}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveRightFreeTight.png": +"Models/Rubber/ChestCrossed.png": { - "frame": {"x":115,"y":1063,"w":156,"h":343}, + "frame": {"x":697,"y":947,"w":337,"h":339}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":348,"y":491,"w":156,"h":343}, + "spriteSourceSize": {"x":433,"y":360,"w":337,"h":339}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Arm1OverWristtie.png": +"Models/ShadowHands/Eyes.png": { - "frame": {"x":1388,"y":622,"w":56,"h":40}, + "frame": {"x":1225,"y":1876,"w":201,"h":121}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":686,"y":580,"w":56,"h":40}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":42,"y":133,"w":201,"h":121}, + "sourceSize": {"w":321,"h":332} }, -"Models/RopeOld/ArmsWristtie.png": +"Models/Skirts/MaidSkirtOverKneel.png": { - "frame": {"x":1420,"y":228,"w":293,"h":143}, + "frame": {"x":3,"y":1168,"w":336,"h":207}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":470,"y":495,"w":293,"h":143}, + "spriteSourceSize": {"x":471,"y":749,"w":336,"h":207}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/AnkleRightClosed.png": +"Models/Skirts/MaidSkirtOverKneelCrotchStrap.png": { - "frame": {"x":3,"y":3,"w":99,"h":353}, + "frame": {"x":3,"y":1168,"w":336,"h":207}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":502,"y":1146,"w":99,"h":353}, + "spriteSourceSize": {"x":471,"y":749,"w":336,"h":207}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/HandRightFront.png": +"Models/Slime/ChestCrossed.png": { - "frame": {"x":581,"y":3,"w":234,"h":335}, + "frame": {"x":353,"y":979,"w":337,"h":339}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":354,"y":244,"w":234,"h":335}, + "spriteSourceSize": {"x":433,"y":360,"w":337,"h":339}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/ShirtChest.png": +"Models/Slime/LegRightKneel.png": { - "frame": {"x":1161,"y":1365,"w":285,"h":326}, + "frame": {"x":585,"y":1751,"w":223,"h":294}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":303,"w":285,"h":326}, + "spriteSourceSize": {"x":315,"y":768,"w":223,"h":294}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/ShirtChestTied.png": +"Models/SmoothHeels/LegLeftHogtie.png": { - "frame": {"x":1100,"y":336,"w":284,"h":326}, + "frame": {"x":1054,"y":1751,"w":167,"h":291}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":303,"w":284,"h":326}, + "spriteSourceSize": {"x":576,"y":920,"w":167,"h":291}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/ShirtChestUp.png": +"Models/SteelChastity/BraSegu.png": { - "frame": {"x":1436,"y":1695,"w":277,"h":326}, + "frame": {"x":294,"y":2013,"w":33,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":303,"w":277,"h":326}, + "spriteSourceSize": {"x":555,"y":554,"w":33,"h":32}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/ShirtChestYoked.png": +"Models/SteelCuffs/ElbowRightYoked.png": { - "frame": {"x":1132,"y":3,"w":284,"h":326}, + "frame": {"x":1648,"y":1219,"w":84,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":303,"w":284,"h":326}, + "spriteSourceSize": {"x":395,"y":504,"w":84,"h":95}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/HandRightFront.png": +"Models/SteelCuffs/RimWristRightCrossed.png": { - "frame": {"x":417,"y":1388,"w":234,"h":335}, + "frame": {"x":1695,"y":1445,"w":37,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":354,"y":244,"w":234,"h":335}, + "spriteSourceSize": {"x":635,"y":597,"w":37,"h":58}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/FootSockRightKneel.png": +"Models/TallSmoothHeels/TallLegleftKneelClosed.png": { - "frame": {"x":1400,"y":970,"w":42,"h":34}, + "frame": {"x":3,"y":1379,"w":334,"h":273}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":309,"y":918,"w":42,"h":34}, + "spriteSourceSize": {"x":384,"y":815,"w":334,"h":273}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/PetsuitTopBody.png": +"Models/TapeHeavy/ArmLeftWristtie.png": { - "frame": {"x":972,"y":676,"w":313,"h":328}, + "frame": {"x":341,"y":1474,"w":334,"h":273}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":384,"w":313,"h":328}, + "spriteSourceSize": {"x":446,"y":487,"w":334,"h":273}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/TopFullWristtie.png": +"Models/TapeHeavy/ArmRightWristtie.png": { - "frame": {"x":669,"y":1034,"w":326,"h":331}, + "frame": {"x":3,"y":1656,"w":334,"h":273}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":384,"w":326,"h":331}, + "spriteSourceSize": {"x":446,"y":487,"w":334,"h":273}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/TopFullWristtie.png": +"Models/TapeHeavy/BottomKneelClosed.png": { - "frame": {"x":669,"y":1034,"w":326,"h":331}, + "frame": {"x":723,"y":3,"w":353,"h":191}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":384,"w":326,"h":331}, + "spriteSourceSize": {"x":395,"y":652,"w":353,"h":191}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/BandGloveLeftYoked.png": +"Models/TapeLight/RightLegsKneelClosed.png": { - "frame": {"x":1388,"y":535,"w":57,"h":30}, + "frame": {"x":3,"y":3,"w":356,"h":312}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":877,"y":389,"w":57,"h":30}, + "spriteSourceSize": {"x":328,"y":652,"w":356,"h":312}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/BustierChest.png": +"Models/TapeMed/BottomKneelClosed.png": { - "frame": {"x":1771,"y":1376,"w":274,"h":149}, + "frame": {"x":1080,"y":177,"w":353,"h":109}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":442,"y":482,"w":274,"h":149}, + "spriteSourceSize": {"x":395,"y":734,"w":353,"h":109}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/ShoeLeftHogtie.png": +"Models/Visors/DollmakerFullRim.png": { - "frame": {"x":3,"y":1063,"w":108,"h":344}, + "frame": {"x":1007,"y":1516,"w":208,"h":231}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":679,"y":793,"w":108,"h":344}, + "spriteSourceSize": {"x":497,"y":183,"w":208,"h":231}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/BandGloveLeftYoked.png": +"Models/Witch/ApprenticeHat.png": { - "frame": {"x":1388,"y":535,"w":57,"h":30}, + "frame": {"x":679,"y":1516,"w":324,"h":231}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":877,"y":389,"w":57,"h":30}, + "spriteSourceSize": {"x":497,"y":18,"w":324,"h":231}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/Chest2.png": +"Models/Wolf/PantiesKneel.png": { - "frame": {"x":1175,"y":1008,"w":269,"h":238}, + "frame": {"x":1430,"y":1869,"w":265,"h":176}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":390,"w":269,"h":238}, + "spriteSourceSize": {"x":457,"y":673,"w":265,"h":176}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/GloveRightYoked.png": +"Models/WolfCatsuit/ForeGloveRightCrossed.png": { - "frame": {"x":3,"y":713,"w":191,"h":346}, + "frame": {"x":1377,"y":1219,"w":267,"h":80}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":299,"y":286,"w":191,"h":346}, + "spriteSourceSize": {"x":433,"y":603,"w":267,"h":80}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/SkirtOverKneelCrotchStrap.png": +"Models/Yukata/SkirtOverKneel.png": { - "frame": {"x":1717,"y":1802,"w":323,"h":243}, + "frame": {"x":694,"y":1290,"w":335,"h":222}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":546,"y":762,"w":323,"h":243}, + "spriteSourceSize": {"x":489,"y":750,"w":335,"h":222}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -671,7 +639,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas31.webp b/TextureAtlas/atlas31.webp index 8f208092b..5ee8abddb 100644 Binary files a/TextureAtlas/atlas31.webp and b/TextureAtlas/atlas31.webp differ diff --git a/TextureAtlas/atlas32.json b/TextureAtlas/atlas32.json index 0d4d52dc8..19fc580bf 100644 --- a/TextureAtlas/atlas32.json +++ b/TextureAtlas/atlas32.json @@ -1,867 +1,755 @@ {"frames": { -"Models/ArmorChain/Skirt2KneelCrotchStrap.png": +"Models/Armbinder/CrossWristtie.png": { - "frame": {"x":1414,"y":3,"w":346,"h":169}, + "frame": {"x":1630,"y":1688,"w":245,"h":127}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":352,"y":796,"w":346,"h":169}, + "spriteSourceSize": {"x":470,"y":410,"w":245,"h":127}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorChain/SkirtHogtieCrotchStrap.png": +"Models/ArmorChain/Skirt2Hogtie.png": { - "frame": {"x":3,"y":3,"w":349,"h":274}, + "frame": {"x":1746,"y":3,"w":299,"h":273}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":421,"y":739,"w":349,"h":274}, + "spriteSourceSize": {"x":421,"y":740,"w":299,"h":273}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/PauldronsFree.png": +"Models/ArmorChain/Skirt2HogtieCrotchStrap.png": { - "frame": {"x":706,"y":506,"w":337,"h":164}, + "frame": {"x":1746,"y":280,"w":299,"h":273}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":383,"w":337,"h":164}, + "spriteSourceSize": {"x":421,"y":740,"w":299,"h":273}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ShortsSpread.png": +"Models/ArmorChain/SkirtBelt.png": { - "frame": {"x":1346,"y":1610,"w":324,"h":257}, + "frame": {"x":1439,"y":1343,"w":279,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":438,"y":750,"w":324,"h":257}, + "spriteSourceSize": {"x":454,"y":763,"w":279,"h":57}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bubble/CuffsArms.png": +"Models/Belts/RightLegs2Kneel.png": { - "frame": {"x":1062,"y":3,"w":348,"h":157}, + "frame": {"x":3,"y":706,"w":260,"h":344}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":419,"y":1131,"w":348,"h":157}, + "spriteSourceSize": {"x":260,"y":750,"w":260,"h":344}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/SleevelessTorsoUpper.png": +"Models/Belts/RightLegs2KneelClosed.png": { - "frame": {"x":551,"y":1647,"w":268,"h":303}, + "frame": {"x":3,"y":706,"w":260,"h":344}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":382,"w":268,"h":303}, + "spriteSourceSize": {"x":260,"y":750,"w":260,"h":344}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraCups.png": +"Models/Body/ArmLeftBoxtie.png": { - "frame": {"x":1723,"y":1532,"w":319,"h":233}, + "frame": {"x":1630,"y":1404,"w":109,"h":280}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":406,"w":319,"h":233}, + "spriteSourceSize": {"x":662,"y":404,"w":109,"h":280}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/CyberPantiesClosed.png": +"Models/Body/ArmRightUp.png": { - "frame": {"x":1658,"y":1871,"w":273,"h":173}, + "frame": {"x":198,"y":353,"w":145,"h":344}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":744,"w":273,"h":173}, + "spriteSourceSize": {"x":449,"y":162,"w":145,"h":344}, "sourceSize": {"w":1240,"h":1754} }, -"Models/China/DressSkirtCrotchStrap.png": +"Models/Body/HandRightYoked.png": { - "frame": {"x":341,"y":1017,"w":329,"h":190}, + "frame": {"x":970,"y":1373,"w":187,"h":325}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":438,"y":734,"w":329,"h":190}, + "spriteSourceSize": {"x":216,"y":91,"w":187,"h":325}, "sourceSize": {"w":1240,"h":1754} }, -"Models/China/DressSkirtKneelCrotchStrap.png": +"Models/Body/LegRightKneelClosed.png": { - "frame": {"x":3,"y":715,"w":335,"h":148}, + "frame": {"x":376,"y":696,"w":310,"h":335}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":423,"y":734,"w":335,"h":148}, + "spriteSourceSize": {"x":244,"y":760,"w":310,"h":335}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/SteelCollar.png": +"Models/Bunny/GloveRightYoked.png": { - "frame": {"x":256,"y":1610,"w":97,"h":33}, + "frame": {"x":271,"y":1400,"w":171,"h":341}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":577,"y":392,"w":97,"h":33}, + "spriteSourceSize": {"x":300,"y":288,"w":171,"h":341}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/SteelCollar.png": +"Models/Catsuit/ArmRightUp.png": { - "frame": {"x":256,"y":1610,"w":97,"h":33}, + "frame": {"x":221,"y":3,"w":145,"h":344}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":577,"y":392,"w":97,"h":33}, + "spriteSourceSize": {"x":449,"y":162,"w":145,"h":344}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayThighLeftSpread.png": +"Models/Catsuit/HandRightFront.png": { - "frame": {"x":1674,"y":1588,"w":45,"h":55}, + "frame": {"x":456,"y":346,"w":234,"h":335}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":686,"y":1004,"w":45,"h":55}, + "spriteSourceSize": {"x":354,"y":244,"w":234,"h":335}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberLink/ThighLinkSpreadHigh.png": +"Models/Chastity/BraProtoLiningRim.png": { - "frame": {"x":1674,"y":1724,"w":44,"h":41}, + "frame": {"x":1439,"y":1819,"w":270,"h":226}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":573,"y":1012,"w":44,"h":41}, + "spriteSourceSize": {"x":446,"y":413,"w":270,"h":226}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CapLongMittenLeftFree.png": +"Models/Chastity/BraProtoLiningZip.png": { - "frame": {"x":1983,"y":1769,"w":62,"h":72}, + "frame": {"x":1713,"y":1819,"w":270,"h":226}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":861,"y":798,"w":62,"h":72}, + "spriteSourceSize": {"x":446,"y":413,"w":270,"h":226}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/MittenLeftFree.png": +"Models/China/DressSkirtOverKneel.png": { - "frame": {"x":1254,"y":1943,"w":88,"h":84}, + "frame": {"x":1744,"y":1131,"w":301,"h":159}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":819,"y":778,"w":88,"h":84}, + "spriteSourceSize": {"x":476,"y":801,"w":301,"h":159}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/LockBraLines.png": +"Models/Corsets/CrossHeavyCorset.png": { - "frame": {"x":1254,"y":1608,"w":88,"h":210}, + "frame": {"x":1630,"y":1688,"w":245,"h":127}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":534,"y":432,"w":88,"h":210}, + "spriteSourceSize": {"x":470,"y":410,"w":245,"h":127}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftDecoBoxtie.png": +"Models/CrystalCuffs/AnkleLeftKneelClosed.png": { - "frame": {"x":737,"y":1609,"w":82,"h":30}, + "frame": {"x":1566,"y":680,"w":38,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":694,"y":596,"w":82,"h":30}, + "spriteSourceSize": {"x":717,"y":945,"w":38,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/SteelCollar.png": +"Models/CyberArms/GlowLongMittenLeftFree.png": { - "frame": {"x":256,"y":1610,"w":97,"h":33}, + "frame": {"x":1246,"y":663,"w":156,"h":320}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":577,"y":392,"w":97,"h":33}, + "spriteSourceSize": {"x":733,"y":485,"w":156,"h":320}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristLeftDecoCleanYoked.png": +"Models/CyberCuffs/DisplayThighRightKneelClosed.png": { - "frame": {"x":357,"y":1610,"w":61,"h":33}, + "frame": {"x":2014,"y":1556,"w":31,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":873,"y":403,"w":61,"h":33}, + "spriteSourceSize": {"x":381,"y":824,"w":31,"h":44}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristLeftDecoYoked.png": +"Models/CyberMitts/LongMittenRightYoked.png": { - "frame": {"x":422,"y":1610,"w":61,"h":33}, + "frame": {"x":781,"y":677,"w":172,"h":327}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":873,"y":403,"w":61,"h":33}, + "spriteSourceSize": {"x":292,"y":311,"w":172,"h":327}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseArmRightCrossed.png": +"Models/DivineCuffs/AnkleLeftDecoCleanSpread.png": { - "frame": {"x":3,"y":281,"w":346,"h":213}, + "frame": {"x":1334,"y":987,"w":68,"h":31}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":428,"y":438,"w":346,"h":213}, + "spriteSourceSize": {"x":683,"y":1439,"w":68,"h":31}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseForeArmRightCrossed.png": +"Models/DivineCuffs/AnkleRightLockClosed.png": { - "frame": {"x":3,"y":498,"w":346,"h":213}, + "frame": {"x":1987,"y":1967,"w":38,"h":77}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":428,"y":473,"w":346,"h":213}, + "spriteSourceSize": {"x":513,"y":1422,"w":38,"h":77}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseNeckUp.png": +"Models/DivineCuffs/ThighLeftLockBandClosed.png": { - "frame": {"x":1051,"y":427,"w":337,"h":177}, + "frame": {"x":1131,"y":1337,"w":66,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":387,"w":337,"h":177}, + "spriteSourceSize": {"x":625,"y":1083,"w":66,"h":32}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseSkirtOverKneel.png": +"Models/DivineCuffs/ThighRightDecoKneel.png": { - "frame": {"x":1405,"y":176,"w":341,"h":189}, + "frame": {"x":1609,"y":463,"w":133,"h":45}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":801,"w":341,"h":189}, + "spriteSourceSize": {"x":369,"y":854,"w":133,"h":45}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MageCorsetStripes.png": +"Models/DivineCuffs/ThighRightDecoKneelClosed.png": { - "frame": {"x":823,"y":1290,"w":191,"h":198}, + "frame": {"x":1609,"y":463,"w":133,"h":45}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":605,"w":191,"h":198}, + "spriteSourceSize": {"x":369,"y":854,"w":133,"h":45}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ears/FoxInner.png": +"Models/DivineCuffs/ThighRightLockBandClosed.png": { - "frame": {"x":823,"y":1566,"w":190,"h":85}, + "frame": {"x":1201,"y":1337,"w":66,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":501,"y":89,"w":190,"h":85}, + "spriteSourceSize": {"x":487,"y":1082,"w":66,"h":32}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/SkirtCrotchStrap.png": +"Models/Elf/Bra.png": { - "frame": {"x":601,"y":1290,"w":218,"h":315}, + "frame": {"x":1743,"y":1556,"w":267,"h":128}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":432,"y":781,"w":218,"h":315}, + "spriteSourceSize": {"x":445,"y":518,"w":267,"h":128}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/SkirtKneel.png": +"Models/Elf/CrystalShoeRightSpread.png": { - "frame": {"x":1018,"y":1342,"w":324,"h":262}, + "frame": {"x":1439,"y":1702,"w":31,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":316,"y":749,"w":324,"h":262}, + "spriteSourceSize": {"x":533,"y":1497,"w":31,"h":63}, "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesDai2/Brows2Annoyed.png": +"Models/EyesK3/Eyes2Closed.png": { - "frame": {"x":1674,"y":1689,"w":45,"h":31}, + "frame": {"x":1271,"y":1337,"w":52,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":601,"y":236,"w":45,"h":31}, - "sourceSize": {"w":717,"h":405} -}, -"Models/EyesK3/Eyes2Dazed.png": -{ - "frame": {"x":487,"y":1610,"w":56,"h":33}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":624,"y":271,"w":56,"h":33}, + "spriteSourceSize": {"x":624,"y":273,"w":52,"h":32}, "sourceSize": {"w":781,"h":560} }, -"Models/EyesK3/WhitesEyes2Dazed.png": +"Models/EyesK3/WhitesEyes2Closed.png": { - "frame": {"x":547,"y":1610,"w":56,"h":33}, + "frame": {"x":1271,"y":1337,"w":52,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":624,"y":271,"w":56,"h":33}, + "spriteSourceSize": {"x":624,"y":273,"w":52,"h":32}, "sourceSize": {"w":781,"h":560} }, -"Models/FaceDask/Eyes2Neutral.png": -{ - "frame": {"x":3,"y":1290,"w":70,"h":48}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":145,"y":160,"w":70,"h":48}, - "sourceSize": {"w":321,"h":332} -}, -"Models/FaceDask/WhitesEyes2Neutral.png": -{ - "frame": {"x":77,"y":1290,"w":70,"h":48}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":145,"y":160,"w":70,"h":48}, - "sourceSize": {"w":321,"h":332} -}, -"Models/FaceKjus/EyesAngry.png": -{ - "frame": {"x":607,"y":1609,"w":61,"h":34}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":523,"y":280,"w":61,"h":34}, - "sourceSize": {"w":725,"h":425} -}, -"Models/FaceKjus/WhitesEyesAngry.png": -{ - "frame": {"x":672,"y":1609,"w":61,"h":34}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":523,"y":280,"w":61,"h":34}, - "sourceSize": {"w":725,"h":425} -}, -"Models/Furniture/OneBarBackClosed.png": -{ - "frame": {"x":709,"y":153,"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": +"Models/FaceKjus/MouthNeutral.png": { - "frame": {"x":709,"y":153,"w":347,"h":97}, + "frame": {"x":1566,"y":647,"w":39,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":418,"y":1611,"w":347,"h":97}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":587,"y":322,"w":39,"h":29}, + "sourceSize": {"w":763,"h":461} }, -"Models/Furniture/OneBarBackSpread.png": +"Models/FaceKjus/MouthSurprised.png": { - "frame": {"x":709,"y":153,"w":347,"h":97}, + "frame": {"x":2014,"y":1604,"w":31,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":428,"y":1576,"w":347,"h":97}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":591,"y":322,"w":31,"h":44}, + "sourceSize": {"w":754,"h":450} }, -"Models/Furniture/OneBarBackSpreadHeels.png": +"Models/GagLeather/GhostBallStrap.png": { - "frame": {"x":709,"y":153,"w":347,"h":97}, + "frame": {"x":895,"y":1339,"w":149,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":428,"y":1611,"w":347,"h":97}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Heels/BalletLaceLeftClosed.png": -{ - "frame": {"x":1676,"y":1061,"w":43,"h":195}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":582,"y":1391,"w":43,"h":195}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Heels/BalletLaceLeftSpread.png": -{ - "frame": {"x":1676,"y":1260,"w":43,"h":194}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":668,"y":1389,"w":43,"h":194}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Labcoat/ShouldersHogtie.png": -{ - "frame": {"x":1060,"y":164,"w":341,"h":259}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":454,"y":396,"w":341,"h":259}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/LeatherLeotard/StrapsArms.png": -{ - "frame": {"x":1018,"y":1017,"w":326,"h":49}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":459,"y":477,"w":326,"h":49}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":67,"y":234,"w":149,"h":30}, + "sourceSize": {"w":321,"h":332} }, -"Models/LeatherPetsuit/LeftLegsKneelClosed.png": +"Models/Hair/BackShortCurly.png": { - "frame": {"x":356,"y":237,"w":346,"h":288}, + "frame": {"x":1743,"y":1294,"w":302,"h":258}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":391,"y":810,"w":346,"h":288}, + "spriteSourceSize": {"x":487,"y":114,"w":302,"h":258}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LegsBeltsHogtie.png": +"Models/Hair/BackShortMessyUnderlight.png": { - "frame": {"x":823,"y":1655,"w":292,"h":295}, + "frame": {"x":458,"y":1035,"w":296,"h":334}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":920,"w":292,"h":295}, + "spriteSourceSize": {"x":480,"y":93,"w":296,"h":334}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeCrotchStrap.png": +"Models/Hair2/Hair4_FrontB.png": { - "frame": {"x":1723,"y":1454,"w":320,"h":74}, + "frame": {"x":1609,"y":512,"w":132,"h":229}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":438,"y":832,"w":320,"h":74}, + "spriteSourceSize": {"x":493,"y":120,"w":132,"h":229}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ArmLeftBoxtie.png": +"Models/Hair2/HairAura.png": { - "frame": {"x":1119,"y":1655,"w":131,"h":262}, + "frame": {"x":3,"y":1748,"w":313,"h":297}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":675,"y":427,"w":131,"h":262}, + "spriteSourceSize": {"x":482,"y":109,"w":313,"h":297}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ArmLeftCrossed.png": +"Models/Hair2/HairAura_RightB.png": { - "frame": {"x":1119,"y":1655,"w":131,"h":262}, + "frame": {"x":3,"y":1054,"w":221,"h":343}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":675,"y":427,"w":131,"h":262}, + "spriteSourceSize": {"x":348,"y":398,"w":221,"h":343}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/GloveLeftFree.png": +"Models/Heels/BalletLeftHogtie.png": { - "frame": {"x":650,"y":1954,"w":107,"h":91}, + "frame": {"x":690,"y":685,"w":87,"h":334}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":813,"y":773,"w":107,"h":91}, + "spriteSourceSize": {"x":702,"y":761,"w":87,"h":334}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/ThighLeftKneel.png": +"Models/Heels/BalletLeftSpread.png": { - "frame": {"x":1723,"y":1182,"w":321,"h":172}, + "frame": {"x":112,"y":3,"w":105,"h":346}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":406,"y":818,"w":321,"h":172}, + "spriteSourceSize": {"x":663,"y":1332,"w":105,"h":346}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/ThighLeftKneelClosed.png": +"Models/Heels/FlatBalletLeftHogtie.png": { - "frame": {"x":1723,"y":746,"w":322,"h":192}, + "frame": {"x":690,"y":685,"w":87,"h":334}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":405,"y":818,"w":322,"h":192}, + "spriteSourceSize": {"x":702,"y":761,"w":87,"h":334}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/TopBandRim.png": +"Models/Heels/FlatBalletLeftSpread.png": { - "frame": {"x":1935,"y":1871,"w":110,"h":94}, + "frame": {"x":267,"y":701,"w":105,"h":341}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":492,"y":574,"w":110,"h":94}, + "spriteSourceSize": {"x":664,"y":1335,"w":105,"h":341}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/TopChestUp.png": +"Models/Heels/ShinyBalletLeftClosed.png": { - "frame": {"x":1764,"y":3,"w":280,"h":233}, + "frame": {"x":163,"y":1401,"w":104,"h":342}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":442,"y":397,"w":280,"h":233}, + "spriteSourceSize": {"x":578,"y":1337,"w":104,"h":342}, "sourceSize": {"w":1240,"h":1754} }, -"Models/OperaGloves/GloveLeftFront.png": +"Models/Heels/ShinyBalletLeftHogtie.png": { - "frame": {"x":706,"y":254,"w":341,"h":248}, + "frame": {"x":690,"y":685,"w":87,"h":334}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":430,"y":465,"w":341,"h":248}, + "spriteSourceSize": {"x":702,"y":761,"w":87,"h":334}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/StripesKneel.png": +"Models/Heels/ShinyBalletLeftSpread.png": { - "frame": {"x":1750,"y":240,"w":295,"h":99}, + "frame": {"x":347,"y":351,"w":105,"h":341}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":452,"y":755,"w":295,"h":99}, + "spriteSourceSize": {"x":664,"y":1335,"w":105,"h":341}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Arm1Boxtie.png": +"Models/Heels/ShinyBalletRightSpread.png": { - "frame": {"x":3,"y":1647,"w":315,"h":118}, + "frame": {"x":228,"y":1054,"w":104,"h":342}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":476,"y":515,"w":315,"h":118}, + "spriteSourceSize": {"x":472,"y":1334,"w":104,"h":342}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/HarnessLower.png": +"Models/Heels/TallLegLeftHogtie.png": { - "frame": {"x":709,"y":3,"w":349,"h":146}, + "frame": {"x":1161,"y":1373,"w":169,"h":309}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":696,"w":349,"h":146}, + "spriteSourceSize": {"x":575,"y":902,"w":169,"h":309}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Thigh1KneelClosed.png": +"Models/Jacket/BinderTorsoLower.png": { - "frame": {"x":1723,"y":1358,"w":321,"h":92}, + "frame": {"x":550,"y":1728,"w":282,"h":317}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":412,"y":924,"w":321,"h":92}, + "spriteSourceSize": {"x":449,"y":593,"w":282,"h":317}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopArmHarnessUnderbust.png": +"Models/Jacket/CrotchlessBinderTorsoLower.png": { - "frame": {"x":1017,"y":1608,"w":233,"h":43}, + "frame": {"x":751,"y":3,"w":282,"h":330}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":475,"y":583,"w":233,"h":43}, + "spriteSourceSize": {"x":449,"y":593,"w":282,"h":330}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopHarnessLower.png": +"Models/Jacket/LatexUpper.png": { - "frame": {"x":356,"y":3,"w":349,"h":230}, + "frame": {"x":320,"y":1745,"w":226,"h":300}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":696,"w":349,"h":230}, + "spriteSourceSize": {"x":479,"y":394,"w":226,"h":300}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/FrillKneel.png": +"Models/Jacket/StrapsTorsoLowerBoxtie.png": { - "frame": {"x":1674,"y":1769,"w":305,"h":98}, + "frame": {"x":1153,"y":1702,"w":282,"h":317}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":443,"y":755,"w":305,"h":98}, + "spriteSourceSize": {"x":449,"y":606,"w":282,"h":317}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/PauldronsTied.png": +"Models/Jacket/TorsoLower.png": { - "frame": {"x":1369,"y":974,"w":329,"h":83}, + "frame": {"x":684,"y":1373,"w":282,"h":330}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":421,"w":329,"h":83}, + "spriteSourceSize": {"x":449,"y":593,"w":282,"h":330}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/ShoeRightClosed.png": +"Models/Leash/LeashCrossed.png": { - "frame": {"x":519,"y":1954,"w":127,"h":91}, + "frame": {"x":336,"y":1046,"w":118,"h":339}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":1528,"w":127,"h":91}, + "spriteSourceSize": {"x":582,"y":436,"w":118,"h":339}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveRightBoxtie.png": +"Models/LeatherCuffs/BandElbowLeftBoxtie.png": { - "frame": {"x":403,"y":1769,"w":54,"h":276}, + "frame": {"x":1048,"y":1337,"w":79,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":491,"w":54,"h":276}, + "spriteSourceSize": {"x":693,"y":585,"w":79,"h":32}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveRightBoxtieRopesUpper.png": +"Models/LeatherLeotard/StrapsLower.png": { - "frame": {"x":461,"y":1769,"w":54,"h":276}, + "frame": {"x":1286,"y":3,"w":226,"h":318}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":491,"w":54,"h":276}, + "spriteSourceSize": {"x":473,"y":639,"w":226,"h":318}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveRightBoxtieTight.png": +"Models/LeatherLeotard/StrapsLowerClean.png": { - "frame": {"x":403,"y":1769,"w":54,"h":276}, + "frame": {"x":1379,"y":325,"w":226,"h":318}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":491,"w":54,"h":276}, + "spriteSourceSize": {"x":473,"y":639,"w":226,"h":318}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveRightWristtie.png": +"Models/LeatherLeotard/StrapsLowerClosed.png": { - "frame": {"x":285,"y":1769,"w":55,"h":276}, + "frame": {"x":1516,"y":3,"w":226,"h":318}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":491,"w":55,"h":276}, + "spriteSourceSize": {"x":473,"y":639,"w":226,"h":318}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveRightWristtieRopesUpper.png": +"Models/Legbinder/LegLegbinderClosed.png": { - "frame": {"x":344,"y":1769,"w":55,"h":276}, + "frame": {"x":3,"y":3,"w":105,"h":349}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":491,"w":55,"h":276}, + "spriteSourceSize": {"x":588,"y":1198,"w":105,"h":349}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveRightWristtieTight.png": +"Models/Mittens/LeatherRightFront.png": { - "frame": {"x":285,"y":1769,"w":55,"h":276}, + "frame": {"x":1879,"y":1688,"w":164,"h":127}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":491,"w":55,"h":276}, + "spriteSourceSize": {"x":475,"y":465,"w":164,"h":127}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/FrogThigh3KneelClosed.png": +"Models/Ninja/SockRightClosed.png": { - "frame": {"x":1405,"y":369,"w":340,"h":195}, + "frame": {"x":370,"y":3,"w":139,"h":339}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":399,"y":812,"w":340,"h":195}, + "spriteSourceSize": {"x":460,"y":1276,"w":139,"h":339}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/HarnessLowerKneel.png": +"Models/Ninja/ThighRightClosed.png": { - "frame": {"x":333,"y":1290,"w":264,"h":315}, + "frame": {"x":758,"y":1023,"w":133,"h":328}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":455,"y":526,"w":264,"h":315}, + "spriteSourceSize": {"x":461,"y":980,"w":133,"h":328}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/AnkleLeftKneelClosed.png": +"Models/Ninja/ThighRightSpread.png": { - "frame": {"x":1031,"y":885,"w":334,"h":128}, + "frame": {"x":895,"y":1008,"w":147,"h":327}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":410,"y":953,"w":334,"h":128}, + "spriteSourceSize": {"x":449,"y":979,"w":147,"h":327}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/ChestBoxtie.png": +"Models/Ribbon/TopThigh1KneelClosed.png": { - "frame": {"x":1018,"y":1070,"w":324,"h":268}, + "frame": {"x":1609,"y":325,"w":133,"h":134}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":360,"w":324,"h":268}, + "spriteSourceSize": {"x":412,"y":882,"w":133,"h":134}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/ChestWristtie.png": +"Models/Ribbon/TopThigh2KneelClosed.png": { - "frame": {"x":3,"y":867,"w":334,"h":268}, + "frame": {"x":1334,"y":1556,"w":136,"h":142}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":360,"w":334,"h":268}, + "spriteSourceSize": {"x":465,"y":874,"w":136,"h":142}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/FootLeftClosed.png": +"Models/RobeOfChastity/PlateClosed.png": { - "frame": {"x":3,"y":1769,"w":137,"h":276}, + "frame": {"x":1024,"y":337,"w":245,"h":322}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":534,"y":1342,"w":137,"h":276}, + "spriteSourceSize": {"x":451,"y":595,"w":245,"h":322}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/TorsoLowerKneel.png": +"Models/RobeOfChastity/PlateSpread.png": { - "frame": {"x":1749,"y":427,"w":296,"h":315}, + "frame": {"x":1037,"y":3,"w":245,"h":322}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":437,"y":541,"w":296,"h":315}, + "spriteSourceSize": {"x":451,"y":595,"w":245,"h":322}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/HemLeft.png": +"Models/Robes/SleeveRightFree.png": { - "frame": {"x":149,"y":1610,"w":103,"h":33}, + "frame": {"x":3,"y":1401,"w":156,"h":343}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":700,"y":537,"w":103,"h":33}, + "spriteSourceSize": {"x":348,"y":491,"w":156,"h":343}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/MaidSkirtOverKneel.png": +"Models/Robes/SleeveRightFreeTight.png": { - "frame": {"x":353,"y":529,"w":336,"h":207}, + "frame": {"x":3,"y":1401,"w":156,"h":343}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":471,"y":749,"w":336,"h":207}, + "spriteSourceSize": {"x":348,"y":491,"w":156,"h":343}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/MaidSkirtOverKneelCrotchStrap.png": +"Models/Rubber/HandRightFront.png": { - "frame": {"x":353,"y":529,"w":336,"h":207}, + "frame": {"x":513,"y":3,"w":234,"h":335}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":471,"y":749,"w":336,"h":207}, + "spriteSourceSize": {"x":354,"y":244,"w":234,"h":335}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeShoulderRightUp.png": +"Models/Sailor/ShirtChest.png": { - "frame": {"x":1674,"y":1458,"w":45,"h":126}, + "frame": {"x":957,"y":677,"w":285,"h":326}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":536,"y":291,"w":45,"h":126}, + "spriteSourceSize": {"x":445,"y":303,"w":285,"h":326}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/AnkleLeftKneelClosed.png": +"Models/Sailor/ShirtChestYoked.png": { - "frame": {"x":680,"y":951,"w":334,"h":128}, + "frame": {"x":1046,"y":1007,"w":284,"h":326}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":410,"y":953,"w":334,"h":128}, + "spriteSourceSize": {"x":445,"y":303,"w":284,"h":326}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/ChestBoxtie.png": +"Models/Sailor/SleeveLeftUp.png": { - "frame": {"x":1346,"y":1338,"w":324,"h":268}, + "frame": {"x":1334,"y":1022,"w":101,"h":215}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":360,"w":324,"h":268}, + "spriteSourceSize": {"x":669,"y":351,"w":101,"h":215}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/ChestWristtie.png": +"Models/ShadowHands/Legs2Kneel.png": { - "frame": {"x":1385,"y":702,"w":334,"h":268}, + "frame": {"x":1745,"y":557,"w":300,"h":145}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":360,"w":334,"h":268}, + "spriteSourceSize": {"x":409,"y":887,"w":300,"h":145}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/FootLeftClosed.png": +"Models/ShadowHands/Legs2KneelClosed.png": { - "frame": {"x":144,"y":1769,"w":137,"h":276}, + "frame": {"x":1745,"y":557,"w":300,"h":145}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":534,"y":1342,"w":137,"h":276}, + "spriteSourceSize": {"x":409,"y":887,"w":300,"h":145}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/HandLeftFree.png": +"Models/Skirts/ApronSkirtKneel.png": { - "frame": {"x":322,"y":1647,"w":112,"h":118}, + "frame": {"x":1439,"y":1022,"w":301,"h":178}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":806,"y":743,"w":112,"h":118}, + "spriteSourceSize": {"x":411,"y":735,"w":301,"h":178}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SMoonlight/PostureCollarRim.png": +"Models/Skirts/ApronSkirtKneelCrotchStrap.png": { - "frame": {"x":761,"y":1954,"w":84,"h":91}, + "frame": {"x":1439,"y":1022,"w":301,"h":178}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":587,"y":357,"w":84,"h":91}, + "spriteSourceSize": {"x":411,"y":735,"w":301,"h":178}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelChastity/BraRadial.png": +"Models/Slayer/CapeUp.png": { - "frame": {"x":1674,"y":1647,"w":45,"h":38}, + "frame": {"x":1744,"y":846,"w":301,"h":281}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":553,"y":552,"w":45,"h":38}, + "spriteSourceSize": {"x":466,"y":262,"w":301,"h":281}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ElbowLeftYoked.png": +"Models/Slime/ArmLeftWristtie.png": { - "frame": {"x":1935,"y":1969,"w":97,"h":76}, + "frame": {"x":1273,"y":329,"w":102,"h":320}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":742,"y":498,"w":97,"h":76}, + "spriteSourceSize": {"x":678,"y":424,"w":102,"h":320}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SuccubusHornLeft.png": +"Models/Slime/HandRightFront.png": { - "frame": {"x":438,"y":1647,"w":109,"h":118}, + "frame": {"x":446,"y":1389,"w":234,"h":335}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":639,"y":85,"w":109,"h":118}, + "spriteSourceSize": {"x":354,"y":244,"w":234,"h":335}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SuccubusHornRight.png": +"Models/SmoothHeels/LegRightKneel.png": { - "frame": {"x":1254,"y":1822,"w":88,"h":117}, + "frame": {"x":1474,"y":1556,"w":152,"h":254}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":481,"y":84,"w":88,"h":117}, + "spriteSourceSize": {"x":313,"y":830,"w":152,"h":254}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallBallet/TallLegLeftHogtie.png": +"Models/TapeHeavy/FeetKneel.png": { - "frame": {"x":151,"y":1290,"w":178,"h":316}, + "frame": {"x":1406,"y":647,"w":156,"h":94}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":577,"y":902,"w":178,"h":316}, + "spriteSourceSize": {"x":728,"y":903,"w":156,"h":94}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallBallet/TallLegRightHogtie.png": +"Models/TapeHeavy/PetsuitTopBody.png": { - "frame": {"x":3,"y":1342,"w":142,"h":301}, + "frame": {"x":836,"y":1707,"w":313,"h":328}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":905,"w":142,"h":301}, + "spriteSourceSize": {"x":446,"y":384,"w":313,"h":328}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/AnklesKneelClosed.png": +"Models/TapeHeavy/TopFullWristtie.png": { - "frame": {"x":3,"y":1139,"w":329,"h":147}, + "frame": {"x":694,"y":342,"w":326,"h":331}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":436,"y":936,"w":329,"h":147}, + "spriteSourceSize": {"x":456,"y":384,"w":326,"h":331}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/ArmLeftWristtie.png": +"Models/TapeMed/TopFullWristtie.png": { - "frame": {"x":1047,"y":608,"w":334,"h":273}, + "frame": {"x":694,"y":342,"w":326,"h":331}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":487,"w":334,"h":273}, + "spriteSourceSize": {"x":456,"y":384,"w":326,"h":331}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/ArmRightWristtie.png": +"Models/TapeMed/TopWristtie.png": { - "frame": {"x":693,"y":674,"w":334,"h":273}, + "frame": {"x":1406,"y":745,"w":334,"h":273}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":446,"y":487,"w":334,"h":273}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/BottomKneel.png": +"Models/Warrior/BandGloveRightFree.png": { - "frame": {"x":674,"y":1083,"w":324,"h":203}, + "frame": {"x":1439,"y":1769,"w":31,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":424,"y":652,"w":324,"h":203}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/TapeHeavy/TopFullBoxtie.png": -{ - "frame": {"x":1348,"y":1061,"w":324,"h":273}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":446,"y":384,"w":324,"h":273}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/TapeMed/TopFullBoxtie.png": -{ - "frame": {"x":1348,"y":1061,"w":324,"h":273}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":446,"y":384,"w":324,"h":273}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/TapeMed/TopStrapWristtie.png": -{ - "frame": {"x":336,"y":1211,"w":319,"h":75}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":461,"y":437,"w":319,"h":75}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/TapeMed/TopWristtie.png": -{ - "frame": {"x":342,"y":740,"w":334,"h":273}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":446,"y":487,"w":334,"h":273}, + "spriteSourceSize": {"x":359,"y":613,"w":31,"h":46}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/GloveLeftFree.png": +"Models/Warrior/FootShoeLeftHogtie.png": { - "frame": {"x":1119,"y":1921,"w":131,"h":123}, + "frame": {"x":1987,"y":1819,"w":56,"h":144}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":787,"y":741,"w":131,"h":123}, + "spriteSourceSize": {"x":731,"y":793,"w":56,"h":144}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/SkirtOverKneel.png": +"Models/Warrior/GloveRightYoked.png": { - "frame": {"x":1392,"y":568,"w":335,"h":130}, + "frame": {"x":1334,"y":1241,"w":101,"h":159}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":477,"y":801,"w":335,"h":130}, + "spriteSourceSize": {"x":299,"y":286,"w":101,"h":159}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtBeltKneel.png": +"Models/Wolf/HarnessBandLower.png": { - "frame": {"x":1750,"y":343,"w":295,"h":80}, + "frame": {"x":1439,"y":1204,"w":300,"h":135}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":735,"w":295,"h":80}, + "spriteSourceSize": {"x":445,"y":809,"w":300,"h":135}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/BeltMid.png": +"Models/Wolf/HarnessBandLowerClosed.png": { - "frame": {"x":849,"y":1954,"w":266,"h":76}, + "frame": {"x":1745,"y":706,"w":300,"h":136}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":685,"w":266,"h":76}, + "spriteSourceSize": {"x":445,"y":809,"w":300,"h":136}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/HarnessMid.png": +"Models/WolfCatsuit/BandGloveRightFree.png": { - "frame": {"x":1346,"y":1871,"w":308,"h":174}, + "frame": {"x":1439,"y":1769,"w":31,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":437,"y":685,"w":308,"h":174}, + "spriteSourceSize": {"x":359,"y":613,"w":31,"h":46}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/ForeGloveLeftCrossed.png": +"Models/WolfCatsuit/GloveRightYoked.png": { - "frame": {"x":823,"y":1492,"w":191,"h":70}, + "frame": {"x":3,"y":356,"w":191,"h":346}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":552,"y":629,"w":191,"h":70}, + "spriteSourceSize": {"x":299,"y":286,"w":191,"h":346}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/ShirtChestTied.png": +"Models/WolfCatsuit/TorsoLowerBandKneel.png": { - "frame": {"x":1723,"y":942,"w":321,"h":236}, + "frame": {"x":1334,"y":1404,"w":292,"h":148}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":393,"w":321,"h":236}, + "spriteSourceSize": {"x":447,"y":762,"w":292,"h":148}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -871,7 +759,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas32.webp b/TextureAtlas/atlas32.webp index 1f4da92ca..ebd03e330 100644 Binary files a/TextureAtlas/atlas32.webp and b/TextureAtlas/atlas32.webp differ diff --git a/TextureAtlas/atlas33.json b/TextureAtlas/atlas33.json index 86f890acf..c7535822e 100644 --- a/TextureAtlas/atlas33.json +++ b/TextureAtlas/atlas33.json @@ -1,984 +1,776 @@ {"frames": { -"Models/Bandit/PouchKneel.png": +"Models/ArmorPlate/GauntletLeftCrossed.png": { - "frame": {"x":1226,"y":1090,"w":95,"h":95}, + "frame": {"x":659,"y":1426,"w":116,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":359,"y":872,"w":95,"h":95}, + "spriteSourceSize": {"x":507,"y":631,"w":116,"h":59}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ShoeLeftClosed.png": +"Models/Bandit/ShortsSpread.png": { - "frame": {"x":1325,"y":213,"w":139,"h":200}, + "frame": {"x":336,"y":678,"w":324,"h":257}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":533,"y":1432,"w":139,"h":200}, + "spriteSourceSize": {"x":438,"y":750,"w":324,"h":257}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/LeftArm1Boxtie.png": +"Models/Belts/Feet1KneelClosed.png": { - "frame": {"x":1974,"y":1118,"w":71,"h":54}, + "frame": {"x":2009,"y":307,"w":36,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":702,"y":491,"w":71,"h":54}, + "spriteSourceSize": {"x":705,"y":954,"w":36,"h":46}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/Legs1KneelClosed.png": +"Models/Bunny/EarsFront.png": { - "frame": {"x":1325,"y":611,"w":175,"h":148}, + "frame": {"x":324,"y":1489,"w":297,"h":243}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":500,"y":839,"w":175,"h":148}, + "spriteSourceSize": {"x":366,"y":14,"w":297,"h":243}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/HandRightBoxtie.png": +"Models/Catsuit/TorsoLowerClosed.png": { - "frame": {"x":304,"y":1624,"w":138,"h":313}, + "frame": {"x":1620,"y":1225,"w":314,"h":253}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":579,"y":411,"w":138,"h":313}, + "spriteSourceSize": {"x":445,"y":670,"w":314,"h":253}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/HandRightYoked.png": +"Models/Catsuit/TorsoLowerLowRiseClosed.png": { - "frame": {"x":3,"y":3,"w":187,"h":325}, + "frame": {"x":1298,"y":1426,"w":314,"h":205}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":216,"y":91,"w":187,"h":325}, + "spriteSourceSize": {"x":445,"y":718,"w":314,"h":205}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/LegLeftHogtie.png": +"Models/Catsuit/TorsoLowerLowRiseSpread.png": { - "frame": {"x":1629,"y":1624,"w":163,"h":288}, + "frame": {"x":657,"y":1095,"w":318,"h":205}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":578,"y":919,"w":163,"h":288}, + "spriteSourceSize": {"x":444,"y":718,"w":318,"h":205}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bra/Bra.png": +"Models/Chastity/BraLining.png": { - "frame": {"x":447,"y":1927,"w":268,"h":117}, + "frame": {"x":1290,"y":1679,"w":289,"h":233}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":510,"w":268,"h":117}, + "spriteSourceSize": {"x":476,"y":406,"w":289,"h":233}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ArmLeftCrossed.png": +"Models/China/DressSkirtClosedCrotchStrap.png": { - "frame": {"x":1172,"y":3,"w":107,"h":293}, + "frame": {"x":3,"y":1541,"w":314,"h":190}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":662,"y":404,"w":107,"h":293}, + "spriteSourceSize": {"x":438,"y":734,"w":314,"h":190}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ArmLeftFront.png": +"Models/China/DressSkirtCrotchStrap.png": { - "frame": {"x":774,"y":622,"w":107,"h":299}, + "frame": {"x":3,"y":494,"w":329,"h":190}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":662,"y":404,"w":107,"h":299}, + "spriteSourceSize": {"x":438,"y":734,"w":329,"h":190}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/LegRightHogtie.png": +"Models/CyberCuffs/DisplayAnkleRightClosed.png": { - "frame": {"x":1319,"y":1250,"w":145,"h":289}, + "frame": {"x":2009,"y":579,"w":34,"h":50}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":918,"w":145,"h":289}, + "spriteSourceSize": {"x":537,"y":1433,"w":34,"h":50}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/LegRightKneelClosed.png": +"Models/CyberCuffs/DisplayElbowLeftYoked.png": { - "frame": {"x":636,"y":318,"w":232,"h":300}, + "frame": {"x":2009,"y":357,"w":36,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":322,"y":759,"w":232,"h":300}, + "spriteSourceSize": {"x":798,"y":492,"w":36,"h":46}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/SleevelessTorsoUpperHogtie.png": +"Models/CyberCuffs/ScreenCollar.png": { - "frame": {"x":523,"y":947,"w":267,"h":299}, + "frame": {"x":2009,"y":451,"w":36,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":395,"w":267,"h":299}, + "spriteSourceSize": {"x":599,"y":394,"w":36,"h":39}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/Belt.png": +"Models/CyberMitts/ForeMittenRightFront.png": { - "frame": {"x":1771,"y":1515,"w":268,"h":105}, + "frame": {"x":1955,"y":1184,"w":90,"h":98}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":705,"w":268,"h":105}, + "spriteSourceSize": {"x":495,"y":462,"w":90,"h":98}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraCyberDisplay.png": +"Models/CyberMitts/GlowLongMittenRightYoked.png": { - "frame": {"x":1278,"y":568,"w":43,"h":26}, + "frame": {"x":1979,"y":1101,"w":66,"h":79}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":554,"y":553,"w":43,"h":26}, + "spriteSourceSize": {"x":273,"y":376,"w":66,"h":79}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraProtoLiningMid.png": -{ - "frame": {"x":1700,"y":739,"w":270,"h":94}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":446,"y":572,"w":270,"h":94}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/AnkleLeftClosed.png": -{ - "frame": {"x":1974,"y":1176,"w":71,"h":49}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":591,"y":1430,"w":71,"h":49}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/Belt.png": -{ - "frame": {"x":1468,"y":272,"w":228,"h":75}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":472,"y":672,"w":228,"h":75}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/CollarHardware.png": -{ - "frame": {"x":1468,"y":496,"w":32,"h":47}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":590,"y":400,"w":32,"h":47}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Cuffs/Belt.png": -{ - "frame": {"x":1468,"y":351,"w":228,"h":75}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":472,"y":672,"w":228,"h":75}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Cuffs/CollarHardware.png": -{ - "frame": {"x":1468,"y":496,"w":32,"h":47}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":590,"y":400,"w":32,"h":47}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/DisplayLongMittenLeftFree.png": -{ - "frame": {"x":1702,"y":1241,"w":90,"h":254}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":762,"y":520,"w":90,"h":254}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/GlowLongMittenLeftWristtie.png": -{ - "frame": {"x":1974,"y":915,"w":71,"h":68}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":716,"y":525,"w":71,"h":68}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/ElbowRightUp.png": -{ - "frame": {"x":858,"y":1550,"w":114,"h":70}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":445,"y":250,"w":114,"h":70}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/LockElbowRightYoked.png": -{ - "frame": {"x":653,"y":1550,"w":32,"h":29}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":401,"y":509,"w":32,"h":29}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/LockThighLeftClosed.png": -{ - "frame": {"x":1468,"y":547,"w":32,"h":40}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":656,"y":1045,"w":32,"h":40}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/ThighRightKneel.png": -{ - "frame": {"x":715,"y":1550,"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":715,"y":1550,"w":139,"h":70}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":375,"y":817,"w":139,"h":70}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/GlowLongMittenLeftYoked.png": -{ - "frame": {"x":1650,"y":1542,"w":66,"h":78}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":903,"y":383,"w":66,"h":78}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/LongMittenRightFree.png": -{ - "frame": {"x":1507,"y":687,"w":189,"h":146}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":299,"y":557,"w":189,"h":146}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/UpperGlowLongMittenLeftWristtie.png": -{ - "frame": {"x":1974,"y":915,"w":71,"h":68}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":716,"y":525,"w":71,"h":68}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberPetsuit/DisplayLegsHogtie.png": -{ - "frame": {"x":78,"y":1307,"w":289,"h":313}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":446,"y":907,"w":289,"h":313}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberPetsuit/LegsHogtie.png": -{ - "frame": {"x":3,"y":1625,"w":297,"h":313}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":445,"y":907,"w":297,"h":313}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberPetsuit/LegsKneel.png": -{ - "frame": {"x":289,"y":966,"w":230,"h":311}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":308,"y":761,"w":230,"h":311}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberPetsuit/LegsKneelClosed.png": +"Models/DivineBelt/BraStraps.png": { - "frame": {"x":1468,"y":1250,"w":230,"h":288}, + "frame": {"x":1044,"y":1916,"w":188,"h":129}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":308,"y":784,"w":230,"h":288}, + "spriteSourceSize": {"x":501,"y":407,"w":188,"h":129}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BraMetal2.png": +"Models/DivineBelt/BraStrapsRunic.png": { - "frame": {"x":1283,"y":213,"w":37,"h":60}, + "frame": {"x":1236,"y":1916,"w":188,"h":129}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":556,"y":556,"w":37,"h":60}, + "spriteSourceSize": {"x":501,"y":407,"w":188,"h":129}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BraMetalRunic2.png": +"Models/DivineCuffs/WristLeftLockPlateFree.png": { - "frame": {"x":1283,"y":213,"w":37,"h":60}, + "frame": {"x":2009,"y":407,"w":36,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":556,"y":556,"w":37,"h":60}, + "spriteSourceSize": {"x":826,"y":743,"w":36,"h":40}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BraStraps.png": +"Models/Dress/BlouseNeckBoxtie.png": { - "frame": {"x":1700,"y":1916,"w":188,"h":129}, + "frame": {"x":979,"y":1115,"w":317,"h":123}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":501,"y":407,"w":188,"h":129}, + "spriteSourceSize": {"x":450,"y":431,"w":317,"h":123}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/LockBeltLines.png": +"Models/Dress/MageSkirtOverKneel.png": { - "frame": {"x":1974,"y":739,"w":71,"h":95}, + "frame": {"x":3,"y":275,"w":333,"h":215}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":537,"y":769,"w":71,"h":95}, + "spriteSourceSize": {"x":446,"y":801,"w":333,"h":215}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/BeltLockPlate.png": +"Models/Dress/ShoeLeftSpread.png": { - "frame": {"x":1974,"y":838,"w":71,"h":73}, + "frame": {"x":1934,"y":1602,"w":111,"h":130}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":534,"y":683,"w":71,"h":73}, + "spriteSourceSize": {"x":641,"y":1507,"w":111,"h":130}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowRightDecoFront.png": +"Models/Elf/SkirtKneel.png": { - "frame": {"x":628,"y":1583,"w":83,"h":37}, + "frame": {"x":674,"y":565,"w":324,"h":262}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":430,"y":622,"w":83,"h":37}, + "spriteSourceSize": {"x":316,"y":749,"w":324,"h":262}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowRightLockUp.png": +"Models/Elf/SkirtKneelCrotchStrap.png": { - "frame": {"x":1720,"y":1542,"w":41,"h":78}, + "frame": {"x":664,"y":831,"w":322,"h":260}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":527,"y":232,"w":41,"h":78}, + "spriteSourceSize": {"x":318,"y":749,"w":322,"h":260}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristRightLockCrossed.png": +"Models/FaceKjus/BlushLow.png": { - "frame": {"x":480,"y":1585,"w":56,"h":35}, + "frame": {"x":625,"y":1680,"w":154,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":641,"y":600,"w":56,"h":35}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":530,"y":295,"w":154,"h":52}, + "sourceSize": {"w":744,"h":433} }, -"Models/Dress/BlouseArmLeftWristtie.png": +"Models/FaceKoi/BlushExtreme.png": { - "frame": {"x":885,"y":609,"w":116,"h":294}, + "frame": {"x":324,"y":1426,"w":169,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":664,"y":441,"w":116,"h":294}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":49,"y":190,"w":169,"h":59}, + "sourceSize": {"w":321,"h":332} }, -"Models/Dress/BlouseArmLeftYoked.png": +"Models/FaceKoi/BlushMedium.png": { - "frame": {"x":794,"y":925,"w":257,"h":294}, + "frame": {"x":497,"y":1426,"w":158,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":710,"y":353,"w":257,"h":294}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":56,"y":187,"w":158,"h":59}, + "sourceSize": {"w":321,"h":332} }, -"Models/Dress/BlouseCollar.png": +"Models/GagCloth/Knot.png": { - "frame": {"x":976,"y":1548,"w":273,"h":72}, + "frame": {"x":1297,"y":1635,"w":177,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":481,"y":409,"w":273,"h":72}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":65,"y":231,"w":177,"h":40}, + "sourceSize": {"w":321,"h":332} }, -"Models/Dress/BlouseNeckBoxtie.png": +"Models/GagLatex/MuteLogo.png": { - "frame": {"x":1117,"y":1922,"w":317,"h":123}, + "frame": {"x":2009,"y":250,"w":36,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":431,"w":317,"h":123}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":111,"y":225,"w":36,"h":53}, + "sourceSize": {"w":321,"h":332} }, -"Models/Dress/BowCorsetLong.png": +"Models/Hair/BackShortMessy.png": { - "frame": {"x":998,"y":307,"w":276,"h":293}, + "frame": {"x":314,"y":1736,"w":293,"h":309}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":566,"w":276,"h":293}, + "spriteSourceSize": {"x":485,"y":93,"w":293,"h":309}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MonocleRight.png": +"Models/Heels/TallLegLeftKneel.png": { - "frame": {"x":1974,"y":987,"w":71,"h":66}, + "frame": {"x":679,"y":3,"w":333,"h":273}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":516,"y":269,"w":71,"h":66}, + "spriteSourceSize": {"x":384,"y":815,"w":333,"h":273}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ears/ElfLongFront.png": +"Models/Heels/TallLegLeftKneelClosed.png": { - "frame": {"x":1507,"y":1542,"w":139,"h":78}, + "frame": {"x":341,"y":135,"w":333,"h":273}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":677,"y":259,"w":139,"h":78}, + "spriteSourceSize": {"x":384,"y":815,"w":333,"h":273}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ears/WolfInner.png": +"Models/Jacket/ArmsCrossed.png": { - "frame": {"x":1468,"y":3,"w":228,"h":136}, + "frame": {"x":1300,"y":1210,"w":316,"h":212}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":499,"y":60,"w":228,"h":136}, + "spriteSourceSize": {"x":448,"y":512,"w":316,"h":212}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/CollarHardware.png": +"Models/Jacket/ChestBoleroWristtie.png": { - "frame": {"x":1468,"y":496,"w":32,"h":47}, + "frame": {"x":3,"y":1368,"w":317,"h":169}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":590,"y":400,"w":32,"h":47}, + "spriteSourceSize": {"x":462,"y":375,"w":317,"h":169}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/CrystalShoeLeftClosed.png": +"Models/Jacket/ChestBoxtie.png": { - "frame": {"x":1468,"y":430,"w":32,"h":62}, + "frame": {"x":1351,"y":244,"w":326,"h":310}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":579,"y":1497,"w":32,"h":62}, + "spriteSourceSize": {"x":446,"y":375,"w":326,"h":310}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/ShoeLeftClosed.png": +"Models/Jacket/CrotchBelts.png": { - "frame": {"x":1325,"y":417,"w":139,"h":190}, + "frame": {"x":1428,"y":1916,"w":138,"h":129}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":534,"y":1450,"w":139,"h":190}, + "spriteSourceSize": {"x":505,"y":794,"w":138,"h":129}, "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKjus/WhitesEyes2Neutral.png": -{ - "frame": {"x":1702,"y":1499,"w":65,"h":39}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":614,"y":265,"w":65,"h":39}, - "sourceSize": {"w":807,"h":551} -}, -"Models/GagCloth/OTN.png": -{ - "frame": {"x":1504,"y":582,"w":192,"h":101}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":63,"y":204,"w":192,"h":101}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagFrilly/Duster.png": -{ - "frame": {"x":3,"y":1942,"w":133,"h":103}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":5,"y":213,"w":133,"h":103}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagFrilly/FrillyHardware.png": -{ - "frame": {"x":1892,"y":1881,"w":131,"h":164}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":75,"y":102,"w":131,"h":164}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagLeather/PanelStrap.png": -{ - "frame": {"x":1283,"y":3,"w":181,"h":206}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":39,"y":71,"w":181,"h":206}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagTape/Stuffing.png": -{ - "frame": {"x":1201,"y":1194,"w":120,"h":52}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":103,"y":225,"w":120,"h":52}, - "sourceSize": {"w":321,"h":332} -}, -"Models/Hair/BackShortCurlyUnderlight.png": +"Models/KittyLatex/KittyLatexEarMuffLight1.png": { - "frame": {"x":446,"y":1624,"w":303,"h":299}, + "frame": {"x":782,"y":1916,"w":258,"h":129}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":488,"y":115,"w":303,"h":299}, + "spriteSourceSize": {"x":479,"y":222,"w":258,"h":129}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/Fuzzy.png": +"Models/LeatherCuffs/BellCollar.png": { - "frame": {"x":1796,"y":1229,"w":249,"h":282}, + "frame": {"x":2009,"y":668,"w":33,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":489,"y":114,"w":249,"h":282}, + "spriteSourceSize": {"x":589,"y":400,"w":33,"h":47}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/BalletLaceRightSpread.png": +"Models/LeatherLeotard/StrapsArms.png": { - "frame": {"x":1278,"y":300,"w":43,"h":194}, + "frame": {"x":674,"y":512,"w":326,"h":49}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":528,"y":1389,"w":43,"h":194}, + "spriteSourceSize": {"x":459,"y":477,"w":326,"h":49}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/BalletRightClosed.png": +"Models/Maid/StripeOverKneel.png": { - "frame": {"x":3,"y":332,"w":100,"h":325}, + "frame": {"x":990,"y":864,"w":321,"h":76}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":510,"y":1359,"w":100,"h":325}, + "spriteSourceSize": {"x":465,"y":866,"w":321,"h":76}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/ShinyBalletRightClosed.png": +"Models/MaidKnightLight/GloveLeftBoxtie.png": { - "frame": {"x":3,"y":1307,"w":71,"h":314}, + "frame": {"x":2009,"y":537,"w":36,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":525,"y":1365,"w":71,"h":314}, + "spriteSourceSize": {"x":681,"y":678,"w":36,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/ChestCrossed.png": +"Models/MaidKnightLight/GloveLeftFree.png": { - "frame": {"x":1700,"y":3,"w":324,"h":254}, + "frame": {"x":1934,"y":1736,"w":107,"h":91}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":375,"w":324,"h":254}, + "spriteSourceSize": {"x":813,"y":773,"w":107,"h":91}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/LatexUpper.png": +"Models/MaidKnightLight/GloveLeftFront.png": { - "frame": {"x":811,"y":3,"w":226,"h":300}, + "frame": {"x":2009,"y":537,"w":36,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":479,"y":394,"w":226,"h":300}, + "spriteSourceSize": {"x":681,"y":678,"w":36,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/StrapsTorsoLowerBoxtie.png": +"Models/MaidKnightLight/GuardRightUp.png": { - "frame": {"x":3,"y":986,"w":282,"h":317}, + "frame": {"x":3,"y":1736,"w":307,"h":309}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":606,"w":282,"h":317}, + "spriteSourceSize": {"x":531,"y":198,"w":307,"h":309}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/StrapsTorsoLowerWristtie.png": +"Models/MaidKnightLight/SockRightKneelClosed.png": { - "frame": {"x":3,"y":661,"w":282,"h":321}, + "frame": {"x":782,"y":1426,"w":193,"h":238}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":602,"w":282,"h":321}, + "spriteSourceSize": {"x":317,"y":820,"w":193,"h":238}, "sourceSize": {"w":1240,"h":1754} }, -"Models/KittyLatex/KittyLatexEarMuff.png": +"Models/Mittens/ForeLongMittenRightCrossed.png": { - "frame": {"x":1325,"y":999,"w":275,"h":247}, + "frame": {"x":979,"y":1489,"w":314,"h":186}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":476,"y":110,"w":275,"h":247}, + "spriteSourceSize": {"x":424,"y":543,"w":314,"h":186}, "sourceSize": {"w":1240,"h":1754} }, -"Models/KittyLatex/KittyLatexEarMuffLight1.png": +"Models/Ninja/SkirtCrotchStrap.png": { - "frame": {"x":1438,"y":1916,"w":258,"h":129}, + "frame": {"x":1016,"y":3,"w":333,"h":207}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":479,"y":222,"w":258,"h":129}, + "spriteSourceSize": {"x":434,"y":738,"w":333,"h":207}, "sourceSize": {"w":1240,"h":1754} }, -"Models/KittyLatex/KittyLatexTailLight.png": +"Models/Ninja/SkirtOverKneel.png": { - "frame": {"x":1974,"y":1057,"w":71,"h":57}, + "frame": {"x":678,"y":280,"w":331,"h":141}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":896,"y":1290,"w":71,"h":57}, + "spriteSourceSize": {"x":448,"y":801,"w":331,"h":141}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LatexPetsuit/LegsKneel.png": +"Models/Ninja/ThighLeftKneel.png": { - "frame": {"x":653,"y":1250,"w":296,"h":296}, + "frame": {"x":1654,"y":868,"w":321,"h":172}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":315,"y":769,"w":296,"h":296}, + "spriteSourceSize": {"x":406,"y":818,"w":321,"h":172}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LatexPetsuit/LegsKneelClosed.png": +"Models/Ninja/ThighLeftKneelClosed.png": { - "frame": {"x":753,"y":1624,"w":296,"h":296}, + "frame": {"x":1664,"y":672,"w":322,"h":192}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":315,"y":769,"w":296,"h":296}, + "spriteSourceSize": {"x":405,"y":818,"w":322,"h":192}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareThighLeftClosed.png": +"Models/Ninja/TopBandRimChestTied.png": { - "frame": {"x":371,"y":1585,"w":105,"h":35}, + "frame": {"x":1583,"y":1681,"w":207,"h":231}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":589,"y":1051,"w":105,"h":35}, + "spriteSourceSize": {"x":492,"y":397,"w":207,"h":231}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/ThighLeftKneel.png": +"Models/Panties/LacesKneel.png": { - "frame": {"x":719,"y":1927,"w":189,"h":117}, + "frame": {"x":1634,"y":1140,"w":317,"h":81}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":469,"y":847,"w":189,"h":117}, + "spriteSourceSize": {"x":437,"y":773,"w":317,"h":81}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/ThighLeftKneelClosed.png": +"Models/Ribbon/Arm1Boxtie.png": { - "frame": {"x":1507,"y":430,"w":189,"h":148}, + "frame": {"x":650,"y":1304,"w":315,"h":118}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":469,"y":847,"w":189,"h":148}, + "spriteSourceSize": {"x":476,"y":515,"w":315,"h":118}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherLeotard/StrapsLowerClosed.png": +"Models/Ribbon/Arm2Wristtie.png": { - "frame": {"x":300,"y":3,"w":226,"h":318}, + "frame": {"x":1007,"y":455,"w":326,"h":181}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":473,"y":639,"w":226,"h":318}, + "spriteSourceSize": {"x":465,"y":484,"w":326,"h":181}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LegsBeltsKneel.png": +"Models/Ribbon/CrotchStrap.png": { - "frame": {"x":1384,"y":1624,"w":241,"h":288}, + "frame": {"x":1710,"y":1916,"w":80,"h":116}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":309,"y":788,"w":241,"h":288}, + "spriteSourceSize": {"x":541,"y":800,"w":80,"h":116}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LegsBeltsKneelClosed.png": +"Models/Ribbon/RightThigh2KneelClosed.png": { - "frame": {"x":1384,"y":1624,"w":241,"h":288}, + "frame": {"x":1478,"y":1635,"w":118,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":309,"y":788,"w":241,"h":288}, + "spriteSourceSize": {"x":372,"y":859,"w":118,"h":40}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LegsKneel.png": +"Models/Ribbon/Thigh1KneelClosed.png": { - "frame": {"x":953,"y":1250,"w":240,"h":294}, + "frame": {"x":1654,"y":1044,"w":321,"h":92}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":307,"y":785,"w":240,"h":294}, + "spriteSourceSize": {"x":412,"y":924,"w":321,"h":92}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LegsKneelClosed.png": +"Models/Ribbon/Thigh2KneelClosed.png": { - "frame": {"x":953,"y":1250,"w":240,"h":294}, + "frame": {"x":1794,"y":1681,"w":136,"h":146}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":307,"y":785,"w":240,"h":294}, + "spriteSourceSize": {"x":465,"y":874,"w":136,"h":146}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Legbinder/LacesLegbinderClosed.png": +"Models/Ribbon/TopArmsWristtie.png": { - "frame": {"x":1280,"y":1624,"w":100,"h":289}, + "frame": {"x":979,"y":1679,"w":307,"h":233}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":522,"y":947,"w":100,"h":289}, + "spriteSourceSize": {"x":465,"y":484,"w":307,"h":233}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Legbinder/LegbinderHogtie.png": +"Models/RobeOfChastity/GoldBaseKneel.png": { - "frame": {"x":483,"y":640,"w":162,"h":303}, + "frame": {"x":329,"y":1175,"w":317,"h":247}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":580,"y":909,"w":162,"h":303}, + "spriteSourceSize": {"x":441,"y":606,"w":317,"h":247}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Legbinder/LegRightLegbinderClosed.png": +"Models/RobeOfChastity/PauldronsFree.png": { - "frame": {"x":400,"y":640,"w":79,"h":310}, + "frame": {"x":990,"y":944,"w":319,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":504,"y":1213,"w":79,"h":310}, + "spriteSourceSize": {"x":464,"y":407,"w":319,"h":88}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Legbinder/RightLacesLegbinderKneelClosed.png": +"Models/RobeOfChastity/PauldronsTied.png": { - "frame": {"x":1325,"y":763,"w":178,"h":232}, + "frame": {"x":674,"y":425,"w":329,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":347,"y":832,"w":178,"h":232}, + "spriteSourceSize": {"x":458,"y":421,"w":329,"h":83}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Legbinder/RightLegbinderClosed.png": +"Models/Robes/RibbonBackHogtie.png": { - "frame": {"x":213,"y":327,"w":138,"h":319}, + "frame": {"x":1688,"y":3,"w":327,"h":243}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":911,"w":138,"h":319}, + "spriteSourceSize": {"x":549,"y":623,"w":327,"h":243}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Legbinder/RightLegbinderHogtie.png": +"Models/Robes/SleeveRightWristtieRopesUpper.png": { - "frame": {"x":371,"y":1281,"w":153,"h":300}, + "frame": {"x":1990,"y":719,"w":55,"h":276}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":911,"w":153,"h":300}, + "spriteSourceSize": {"x":449,"y":491,"w":55,"h":276}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/CorsetStrapsBoxtie.png": +"Models/ShadowHands/Arms2.png": { - "frame": {"x":1468,"y":143,"w":228,"h":125}, + "frame": {"x":3,"y":1166,"w":322,"h":198}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":412,"w":228,"h":125}, + "spriteSourceSize": {"x":452,"y":556,"w":322,"h":198}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeSockLeftKneelClosed.png": +"Models/ShadowHands/Legs1Closed.png": { - "frame": {"x":1787,"y":1096,"w":183,"h":121}, + "frame": {"x":331,"y":939,"w":322,"h":232}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":492,"y":857,"w":183,"h":121}, + "spriteSourceSize": {"x":433,"y":834,"w":322,"h":232}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeSockRightHogtie.png": +"Models/Slime/AnkleLeftKneelClosed.png": { - "frame": {"x":523,"y":1250,"w":126,"h":26}, + "frame": {"x":341,"y":3,"w":334,"h":128}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":965,"w":126,"h":26}, + "spriteSourceSize": {"x":410,"y":953,"w":334,"h":128}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ArmLeftFront.png": +"Models/Slime/ChestWristtie.png": { - "frame": {"x":1197,"y":1250,"w":118,"h":290}, + "frame": {"x":3,"y":3,"w":334,"h":268}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":685,"y":426,"w":118,"h":290}, + "spriteSourceSize": {"x":446,"y":360,"w":334,"h":268}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ArmLeftYoked.png": +"Models/SteelChastity/BraPadlockPin.png": { - "frame": {"x":1796,"y":1624,"w":249,"h":253}, + "frame": {"x":2009,"y":633,"w":34,"h":31}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":680,"y":384,"w":249,"h":253}, + "spriteSourceSize": {"x":558,"y":556,"w":34,"h":31}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ArmRightFront.png": +"Models/TallBallet/TallLegLeftKneelClosed.png": { - "frame": {"x":1041,"y":3,"w":127,"h":293}, + "frame": {"x":340,"y":412,"w":330,"h":262}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":422,"y":424,"w":127,"h":293}, + "spriteSourceSize": {"x":382,"y":819,"w":330,"h":262}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LatexRightYoked.png": +"Models/TallBallet/TallLegRightKneel.png": { - "frame": {"x":1226,"y":854,"w":95,"h":232}, + "frame": {"x":783,"y":1668,"w":192,"h":244}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":298,"y":298,"w":95,"h":232}, + "spriteSourceSize": {"x":312,"y":819,"w":192,"h":244}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/ShoeLeftClosed.png": +"Models/TallSmoothHeels/TallLegLeftHogtie.png": { - "frame": {"x":1378,"y":1543,"w":125,"h":77}, + "frame": {"x":611,"y":1736,"w":167,"h":308}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":535,"y":1558,"w":125,"h":77}, + "spriteSourceSize": {"x":575,"y":901,"w":167,"h":308}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/LinesKneel.png": +"Models/TapeHeavy/ArmFullLeftBoxtie.png": { - "frame": {"x":140,"y":1942,"w":303,"h":102}, + "frame": {"x":1616,"y":1482,"w":314,"h":195}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":753,"w":303,"h":102}, + "spriteSourceSize": {"x":456,"y":415,"w":314,"h":195}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/Stripes.png": +"Models/TapeHeavy/ArmLeftBoxtie.png": { - "frame": {"x":1507,"y":837,"w":276,"h":158}, + "frame": {"x":3,"y":688,"w":324,"h":235}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":761,"w":276,"h":158}, + "spriteSourceSize": {"x":446,"y":475,"w":324,"h":235}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/ChestGoldBaseTied.png": +"Models/TapeHeavy/ArmRightBoxtie.png": { - "frame": {"x":1787,"y":837,"w":183,"h":255}, + "frame": {"x":3,"y":927,"w":324,"h":235}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":521,"y":405,"w":183,"h":255}, + "spriteSourceSize": {"x":446,"y":475,"w":324,"h":235}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/GoldClosed.png": +"Models/TapeHeavy/BottomKneel.png": { - "frame": {"x":355,"y":325,"w":277,"h":311}, + "frame": {"x":1681,"y":465,"w":324,"h":203}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":605,"w":277,"h":311}, + "spriteSourceSize": {"x":424,"y":652,"w":324,"h":203}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/GoldSpread.png": +"Models/TapeHeavy/Chest.png": { - "frame": {"x":530,"y":3,"w":277,"h":311}, + "frame": {"x":979,"y":1242,"w":315,"h":243}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":605,"w":277,"h":311}, + "spriteSourceSize": {"x":446,"y":384,"w":315,"h":243}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Calf2KneelClosed.png": +"Models/TapeHeavy/ChestBoxtie.png": { - "frame": {"x":1278,"y":498,"w":43,"h":66}, + "frame": {"x":979,"y":1242,"w":315,"h":243}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":610,"y":981,"w":43,"h":66}, + "spriteSourceSize": {"x":446,"y":384,"w":315,"h":243}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Calf2KneelClosedOver.png": +"Models/TapeHeavy/ChestCrossed.png": { - "frame": {"x":1278,"y":498,"w":43,"h":66}, + "frame": {"x":979,"y":1242,"w":315,"h":243}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":610,"y":981,"w":43,"h":66}, + "spriteSourceSize": {"x":446,"y":384,"w":315,"h":243}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/RightThigh3KneelClosed.png": +"Models/TapeHeavy/ChestWristtie.png": { - "frame": {"x":1057,"y":1194,"w":140,"h":52}, + "frame": {"x":979,"y":1242,"w":315,"h":243}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":399,"y":812,"w":140,"h":52}, + "spriteSourceSize": {"x":446,"y":384,"w":315,"h":243}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/ArmLeftWristtie.png": +"Models/TapeHeavy/HandLeftYoked.png": { - "frame": {"x":107,"y":332,"w":102,"h":320}, + "frame": {"x":1946,"y":1831,"w":99,"h":121}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":678,"y":424,"w":102,"h":320}, + "spriteSourceSize": {"x":853,"y":287,"w":99,"h":121}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/ArmRightFront.png": +"Models/TapeHeavy/TopCrossed.png": { - "frame": {"x":528,"y":1280,"w":121,"h":299}, + "frame": {"x":1002,"y":640,"w":323,"h":220}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":648,"y":404,"w":121,"h":299}, + "spriteSourceSize": {"x":446,"y":470,"w":323,"h":220}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/Eyes.png": +"Models/TapeLight/HandLeftYoked.png": { - "frame": {"x":912,"y":1924,"w":201,"h":121}, + "frame": {"x":1946,"y":1956,"w":99,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":42,"y":133,"w":201,"h":121}, - "sourceSize": {"w":321,"h":332} -}, -"Models/Slayer/CapeCollarInner.png": -{ - "frame": {"x":1796,"y":1881,"w":84,"h":31}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":585,"y":373,"w":84,"h":31}, + "spriteSourceSize": {"x":853,"y":298,"w":99,"h":85}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeShoulderRight.png": +"Models/TapeLight/HandRightBoxtie.png": { - "frame": {"x":1253,"y":1544,"w":121,"h":76}, + "frame": {"x":2009,"y":494,"w":36,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":460,"y":417,"w":121,"h":76}, + "spriteSourceSize": {"x":681,"y":679,"w":36,"h":39}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/ArmLeftWristtie.png": +"Models/TapeMed/ArmFullLeftBoxtie.png": { - "frame": {"x":194,"y":3,"w":102,"h":320}, + "frame": {"x":1616,"y":1482,"w":314,"h":195}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":678,"y":424,"w":102,"h":320}, + "spriteSourceSize": {"x":456,"y":415,"w":314,"h":195}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/ArmRightFront.png": +"Models/TapeMed/TopBoxtie.png": { - "frame": {"x":649,"y":622,"w":121,"h":299}, + "frame": {"x":1681,"y":250,"w":324,"h":211}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":648,"y":404,"w":121,"h":299}, + "spriteSourceSize": {"x":446,"y":475,"w":324,"h":211}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/LegRightKneel.png": +"Models/TapeMed/TopCrossed.png": { - "frame": {"x":1053,"y":1624,"w":223,"h":294}, + "frame": {"x":1002,"y":640,"w":323,"h":220}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":315,"y":768,"w":223,"h":294}, + "spriteSourceSize": {"x":446,"y":470,"w":323,"h":220}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/LegRightKneelClosed.png": +"Models/TapeMed/TopStrapWristtie.png": { - "frame": {"x":1005,"y":604,"w":217,"h":291}, + "frame": {"x":990,"y":1036,"w":319,"h":75}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":323,"y":768,"w":217,"h":291}, + "spriteSourceSize": {"x":461,"y":437,"w":319,"h":75}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SmoothHeels/LegLeftHogtie.png": +"Models/Warrior/ForeGloveLeftFront.png": { - "frame": {"x":1055,"y":899,"w":167,"h":291}, + "frame": {"x":1570,"y":1916,"w":136,"h":129}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":576,"y":920,"w":167,"h":291}, + "spriteSourceSize": {"x":548,"y":465,"w":136,"h":129}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/Collar.png": +"Models/Wolf/HarnessLowerClosed.png": { - "frame": {"x":540,"y":1583,"w":84,"h":37}, + "frame": {"x":1313,"y":1045,"w":317,"h":161}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":585,"y":395,"w":84,"h":37}, + "spriteSourceSize": {"x":437,"y":797,"w":317,"h":161}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SuccubusHornLight.png": +"Models/WolfCatsuit/ButtKneel.png": { - "frame": {"x":794,"y":1223,"w":259,"h":23}, + "frame": {"x":1794,"y":1831,"w":148,"h":214}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":484,"y":152,"w":259,"h":23}, + "spriteSourceSize": {"x":627,"y":750,"w":148,"h":214}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallBallet/TallLegRightKneelClosed.png": +"Models/WolfCatsuit/ShoeLeftClosed.png": { - "frame": {"x":1604,"y":999,"w":179,"h":238}, + "frame": {"x":625,"y":1489,"w":153,"h":187}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":323,"y":821,"w":179,"h":238}, + "spriteSourceSize": {"x":520,"y":1456,"w":153,"h":187}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/ArmLeftBoxtie.png": +"Models/WolfCatsuit/ShoeRightKneel.png": { - "frame": {"x":1700,"y":261,"w":324,"h":235}, + "frame": {"x":1979,"y":999,"w":66,"h":98}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":475,"w":324,"h":235}, + "spriteSourceSize": {"x":324,"y":853,"w":66,"h":98}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/ArmRightBoxtie.png": +"Models/Yukata/ShirtChest.png": { - "frame": {"x":1700,"y":500,"w":324,"h":235}, + "frame": {"x":1353,"y":3,"w":331,"h":237}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":475,"w":324,"h":235}, + "spriteSourceSize": {"x":440,"y":392,"w":331,"h":237}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/GloveLeftWristtie.png": +"Models/Yukata/ShirtChestTied.png": { - "frame": {"x":1226,"y":604,"w":95,"h":246}, + "frame": {"x":1329,"y":805,"w":321,"h":236}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":677,"y":506,"w":95,"h":246}, + "spriteSourceSize": {"x":440,"y":393,"w":321,"h":236}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/SleeveLeftBoxtie.png": +"Models/Yukata/ShirtChestYoked.png": { - "frame": {"x":872,"y":307,"w":122,"h":298}, + "frame": {"x":1016,"y":214,"w":331,"h":237}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":653,"y":433,"w":122,"h":298}, + "spriteSourceSize": {"x":440,"y":392,"w":331,"h":237}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/SleeveLeftFront.png": +"Models/Yukata/SkirtOverKneelCrotchStrap.png": { - "frame": {"x":872,"y":307,"w":122,"h":298}, + "frame": {"x":1337,"y":558,"w":323,"h":243}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":653,"y":433,"w":122,"h":298}, + "spriteSourceSize": {"x":546,"y":762,"w":323,"h":243}, "sourceSize": {"w":1240,"h":1754} }, "Models/Yukata/SleeveLeftWristtie.png": { - "frame": {"x":289,"y":650,"w":107,"h":312}, + "frame": {"x":1938,"y":1286,"w":107,"h":312}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":675,"y":443,"w":107,"h":312}, @@ -991,7 +783,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas33.webp b/TextureAtlas/atlas33.webp index ad5b2fa15..29c13dffe 100644 Binary files a/TextureAtlas/atlas33.webp and b/TextureAtlas/atlas33.webp differ diff --git a/TextureAtlas/atlas34.json b/TextureAtlas/atlas34.json index fdc7320b7..0a0006cda 100644 --- a/TextureAtlas/atlas34.json +++ b/TextureAtlas/atlas34.json @@ -1,987 +1,987 @@ {"frames": { -"Models/ArmorChain/Skirt2Hogtie.png": +"Models/ArmorChain/Skirt2.png": { - "frame": {"x":1243,"y":996,"w":299,"h":273}, + "frame": {"x":1587,"y":434,"w":228,"h":205}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":421,"y":740,"w":299,"h":273}, + "spriteSourceSize": {"x":475,"y":798,"w":228,"h":205}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorChain/Skirt2HogtieCrotchStrap.png": +"Models/Belts/Legs1Kneel.png": { - "frame": {"x":1622,"y":1023,"w":299,"h":273}, + "frame": {"x":284,"y":1915,"w":174,"h":128}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":421,"y":740,"w":299,"h":273}, + "spriteSourceSize": {"x":501,"y":839,"w":174,"h":128}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/KneeKneel.png": +"Models/Body/HandRightBoxtie.png": { - "frame": {"x":3,"y":1443,"w":126,"h":110}, + "frame": {"x":3,"y":1282,"w":138,"h":313}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":382,"y":977,"w":126,"h":110}, + "spriteSourceSize": {"x":579,"y":411,"w":138,"h":313}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ShortsClosed.png": +"Models/Body/LegLeftHogtie.png": { - "frame": {"x":1234,"y":1515,"w":298,"h":201}, + "frame": {"x":1102,"y":903,"w":163,"h":288}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":751,"w":298,"h":201}, + "spriteSourceSize": {"x":578,"y":919,"w":163,"h":288}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ShortsLeftKneel.png": +"Models/Body/LegRightHogtie.png": { - "frame": {"x":936,"y":978,"w":303,"h":219}, + "frame": {"x":1159,"y":610,"w":160,"h":288}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":472,"y":752,"w":303,"h":219}, + "spriteSourceSize": {"x":448,"y":918,"w":160,"h":288}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ShortsLeftKneelClosed.png": +"Models/Bra/BraUnder.png": { - "frame": {"x":625,"y":1114,"w":303,"h":219}, + "frame": {"x":1783,"y":1519,"w":220,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":472,"y":752,"w":303,"h":219}, + "spriteSourceSize": {"x":478,"y":570,"w":220,"h":68}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/Feet2Kneel.png": +"Models/Bra/InvertedRose.png": { - "frame": {"x":1537,"y":1316,"w":80,"h":140}, + "frame": {"x":1323,"y":787,"w":266,"h":111}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":564,"y":939,"w":80,"h":140}, + "spriteSourceSize": {"x":447,"y":514,"w":266,"h":111}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/FootLeftHogtie.png": +"Models/Bubble/Head.png": { - "frame": {"x":1925,"y":1248,"w":119,"h":144}, + "frame": {"x":3,"y":1599,"w":312,"h":312}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":663,"y":799,"w":119,"h":144}, + "spriteSourceSize": {"x":457,"y":85,"w":312,"h":312}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/SleevelessTop.png": +"Models/Bunny/SockLeftHogtie.png": { - "frame": {"x":307,"y":1431,"w":267,"h":122}, + "frame": {"x":928,"y":935,"w":170,"h":289}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":564,"w":267,"h":122}, + "spriteSourceSize": {"x":569,"y":918,"w":170,"h":289}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/TorsoLowerClosed.png": +"Models/Bunny/SockRightHogtie.png": { - "frame": {"x":1305,"y":303,"w":314,"h":253}, + "frame": {"x":1269,"y":902,"w":153,"h":288}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":670,"w":314,"h":253}, + "spriteSourceSize": {"x":448,"y":919,"w":153,"h":288}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/TorsoLowerLowRiseClosed.png": +"Models/Bunny/SockRightKneelClosed.png": { - "frame": {"x":1623,"y":554,"w":314,"h":205}, + "frame": {"x":1819,"y":3,"w":226,"h":252}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":718,"w":314,"h":205}, + "spriteSourceSize": {"x":323,"y":816,"w":226,"h":252}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/TorsoLowerLowRiseSpread.png": +"Models/Catsuit/LegLeftHogtie.png": { - "frame": {"x":986,"y":3,"w":318,"h":205}, + "frame": {"x":1248,"y":1228,"w":163,"h":288}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":718,"w":318,"h":205}, + "spriteSourceSize": {"x":578,"y":919,"w":163,"h":288}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/TorsoLowerSpread.png": +"Models/Catsuit/LegRightHogtie.png": { - "frame": {"x":3,"y":238,"w":318,"h":253}, + "frame": {"x":1010,"y":610,"w":145,"h":289}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":670,"w":318,"h":253}, + "spriteSourceSize": {"x":448,"y":918,"w":145,"h":289}, "sourceSize": {"w":1240,"h":1754} }, -"Models/China/DressSkirtClosed.png": +"Models/Catsuit/TorsoLowerPanties.png": { - "frame": {"x":318,"y":651,"w":309,"h":273}, + "frame": {"x":1783,"y":1323,"w":262,"h":192}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":734,"w":309,"h":273}, + "spriteSourceSize": {"x":457,"y":728,"w":262,"h":192}, "sourceSize": {"w":1240,"h":1754} }, -"Models/China/DressSkirtClosedCrotchStrap.png": +"Models/Catsuit/TorsoUpper.png": { - "frame": {"x":325,"y":310,"w":314,"h":190}, + "frame": {"x":600,"y":3,"w":304,"h":303}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":438,"y":734,"w":314,"h":190}, + "spriteSourceSize": {"x":445,"y":382,"w":304,"h":303}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Corsets/BuckleCorsetHardware.png": +"Models/Chastity/CyberPantiesLining.png": { - "frame": {"x":1941,"y":535,"w":104,"h":112}, + "frame": {"x":874,"y":1885,"w":263,"h":160}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":524,"y":667,"w":104,"h":112}, + "spriteSourceSize": {"x":457,"y":755,"w":263,"h":160}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/CuffLongMittenLeftFront.png": +"Models/Chastity/CyberPantiesLiningClosed.png": { - "frame": {"x":1546,"y":1195,"w":72,"h":58}, + "frame": {"x":1141,"y":1885,"w":263,"h":160}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":702,"y":510,"w":72,"h":58}, + "spriteSourceSize": {"x":457,"y":755,"w":263,"h":160}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/StrapsLongMittenLeftFree.png": +"Models/China/DressSkirtClosed.png": { - "frame": {"x":1832,"y":1840,"w":86,"h":139}, + "frame": {"x":1649,"y":783,"w":309,"h":273}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":701,"y":593,"w":86,"h":139}, + "spriteSourceSize": {"x":440,"y":734,"w":309,"h":273}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/AnkleLeftSpread.png": +"Models/Corsets/BuckleCorsetBuckles.png": { - "frame": {"x":1546,"y":1065,"w":72,"h":61}, + "frame": {"x":1819,"y":661,"w":128,"h":118}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":681,"y":1426,"w":72,"h":61}, + "spriteSourceSize": {"x":506,"y":664,"w":128,"h":118}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/AnkleRightSpread.png": +"Models/CrystalCuffs/AnkleLeftKneel.png": { - "frame": {"x":1546,"y":1130,"w":72,"h":61}, + "frame": {"x":1159,"y":1520,"w":60,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":492,"y":1428,"w":72,"h":61}, + "spriteSourceSize": {"x":705,"y":961,"w":60,"h":67}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberHeels/ShinyBalletLeftKneel.png": +"Models/CrystalCuffs/CollarHardware.png": { - "frame": {"x":3,"y":873,"w":309,"h":126}, + "frame": {"x":2011,"y":1733,"w":32,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":651,"y":927,"w":309,"h":126}, + "spriteSourceSize": {"x":590,"y":400,"w":32,"h":47}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/GlowLongMittenLeftFree.png": +"Models/Cuffs/AnkleLeftKneel.png": { - "frame": {"x":1536,"y":1671,"w":80,"h":80}, + "frame": {"x":1223,"y":1520,"w":60,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":809,"y":725,"w":80,"h":80}, + "spriteSourceSize": {"x":705,"y":961,"w":60,"h":67}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/StrapsLongMittenLeftFree.png": +"Models/Cuffs/CollarHardware.png": { - "frame": {"x":1832,"y":1840,"w":86,"h":139}, + "frame": {"x":2011,"y":1733,"w":32,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":701,"y":593,"w":86,"h":139}, + "spriteSourceSize": {"x":590,"y":400,"w":32,"h":47}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperCuffLongMittenLeftFront.png": +"Models/CyberArms/ForeLongMittenRightCrossed.png": { - "frame": {"x":1546,"y":1195,"w":72,"h":58}, + "frame": {"x":1408,"y":1881,"w":267,"h":164}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":702,"y":510,"w":72,"h":58}, + "spriteSourceSize": {"x":430,"y":521,"w":267,"h":164}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperGlowLongMittenLeftFree.png": +"Models/CyberArms/StrapsForeLongMittenRightCrossed.png": { - "frame": {"x":1536,"y":1580,"w":80,"h":87}, + "frame": {"x":1667,"y":1106,"w":85,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":733,"y":485,"w":80,"h":87}, + "spriteSourceSize": {"x":430,"y":600,"w":85,"h":83}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleRightLockPlateClosed.png": +"Models/CyberArms/StrapsLongMittenLeftBoxtie.png": { - "frame": {"x":1584,"y":560,"w":32,"h":34}, + "frame": {"x":1962,"y":947,"w":83,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":514,"y":1424,"w":32,"h":34}, + "spriteSourceSize": {"x":683,"y":586,"w":83,"h":95}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/CollarLock.png": +"Models/CyberArms/StrapsLongMittenRightCrossed.png": { - "frame": {"x":1573,"y":937,"w":44,"h":58}, + "frame": {"x":1819,"y":1785,"w":85,"h":91}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":597,"y":380,"w":44,"h":58}, + "spriteSourceSize": {"x":430,"y":592,"w":85,"h":91}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighLeftLockSpread.png": +"Models/CyberArms/StrapsLongMittenRightYoked.png": { - "frame": {"x":1536,"y":1755,"w":79,"h":99}, + "frame": {"x":3,"y":1915,"w":109,"h":130}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":653,"y":1023,"w":79,"h":99}, + "spriteSourceSize": {"x":342,"y":490,"w":109,"h":130}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseNeck.png": +"Models/CyberCuffs/AnkleLeftClosed.png": { - "frame": {"x":627,"y":961,"w":305,"h":149}, + "frame": {"x":1962,"y":1984,"w":75,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":412,"w":305,"h":149}, + "spriteSourceSize": {"x":590,"y":1431,"w":75,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseSkirtUnder.png": +"Models/CyberCuffs/DisplayElbowLeftUp.png": { - "frame": {"x":932,"y":1329,"w":298,"h":224}, + "frame": {"x":1742,"y":1458,"w":37,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":368,"y":719,"w":298,"h":224}, + "spriteSourceSize": {"x":712,"y":260,"w":37,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/LaceChest.png": +"Models/CyberMitts/CapLongMittenLeftYoked.png": { - "frame": {"x":309,"y":1720,"w":269,"h":116}, + "frame": {"x":1069,"y":1520,"w":86,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":512,"w":269,"h":116}, + "spriteSourceSize": {"x":868,"y":284,"w":86,"h":67}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MageBra.png": +"Models/CyberMitts/CuffLongMittenLeftFree.png": { - "frame": {"x":557,"y":1858,"w":271,"h":186}, + "frame": {"x":1414,"y":1520,"w":56,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":443,"w":271,"h":186}, + "spriteSourceSize": {"x":803,"y":738,"w":56,"h":67}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/ShoeRightClosed.png": +"Models/CyberMitts/CuffLongMittenLeftYoked.png": { - "frame": {"x":1925,"y":1396,"w":119,"h":69}, + "frame": {"x":1287,"y":1520,"w":60,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":455,"y":1547,"w":119,"h":69}, + "spriteSourceSize": {"x":871,"y":388,"w":60,"h":67}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/ShoeRightSpread.png": +"Models/CyberMitts/ForeLongMittenRightCrossed.png": { - "frame": {"x":1925,"y":1514,"w":118,"h":144}, + "frame": {"x":1408,"y":1881,"w":267,"h":164}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":490,"y":1498,"w":118,"h":144}, + "spriteSourceSize": {"x":430,"y":521,"w":267,"h":164}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ears/Fox.png": +"Models/CyberMitts/StrapsForeLongMittenRightCrossed.png": { - "frame": {"x":1235,"y":1273,"w":298,"h":238}, + "frame": {"x":1667,"y":1106,"w":85,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":3,"w":298,"h":238}, + "spriteSourceSize": {"x":430,"y":600,"w":85,"h":83}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/BandLeftYoked.png": +"Models/CyberMitts/StrapsLongMittenLeftBoxtie.png": { - "frame": {"x":1941,"y":651,"w":104,"h":106}, + "frame": {"x":1962,"y":947,"w":83,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":729,"y":461,"w":104,"h":106}, + "spriteSourceSize": {"x":683,"y":586,"w":83,"h":95}, "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesDai2/Brows2Angry.png": +"Models/CyberMitts/StrapsLongMittenRightCrossed.png": { - "frame": {"x":250,"y":1519,"w":53,"h":31}, + "frame": {"x":1819,"y":1785,"w":85,"h":91}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":588,"y":249,"w":53,"h":31}, - "sourceSize": {"w":703,"h":355} + "spriteSourceSize": {"x":430,"y":592,"w":85,"h":91}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceDask/WhitesEyesClosed.png": +"Models/CyberMitts/StrapsLongMittenRightYoked.png": { - "frame": {"x":1993,"y":2022,"w":52,"h":23}, + "frame": {"x":3,"y":1915,"w":109,"h":130}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":55,"y":189,"w":52,"h":23}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":342,"y":490,"w":109,"h":130}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/GagLeather/BallHarness.png": +"Models/CyberMitts/UpperCuffLongMittenLeftCrossed.png": { - "frame": {"x":3,"y":1557,"w":149,"h":279}, + "frame": {"x":1962,"y":1880,"w":83,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":68,"y":9,"w":149,"h":279}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":693,"y":510,"w":83,"h":58}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/GagMetal/BallHarness.png": +"Models/CyberMitts/UpperCuffLongMittenLeftFree.png": { - "frame": {"x":156,"y":1557,"w":149,"h":279}, + "frame": {"x":1962,"y":1591,"w":83,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":68,"y":9,"w":149,"h":279}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":699,"y":496,"w":83,"h":60}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/GagMetal/BallSideStrap.png": +"Models/CyberPetsuit/DisplayLegsHogtie.png": { - "frame": {"x":1574,"y":663,"w":44,"h":200}, + "frame": {"x":299,"y":320,"w":289,"h":313}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":199,"y":46,"w":44,"h":200}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":446,"y":907,"w":289,"h":313}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair2_FrontB.png": +"Models/CyberPetsuit/LegsHogtie.png": { - "frame": {"x":1073,"y":1557,"w":157,"h":201}, + "frame": {"x":299,"y":3,"w":297,"h":313}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":553,"y":132,"w":157,"h":201}, + "spriteSourceSize": {"x":445,"y":907,"w":297,"h":313}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Harness/HardwareMid.png": +"Models/CyberPetsuit/LegsKneel.png": { - "frame": {"x":1546,"y":999,"w":72,"h":62}, + "frame": {"x":271,"y":962,"w":230,"h":311}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":537,"y":648,"w":72,"h":62}, + "spriteSourceSize": {"x":308,"y":761,"w":230,"h":311}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/BalletSoleLeftSpread.png": +"Models/CyberPetsuit/LegsKneelClosed.png": { - "frame": {"x":162,"y":1840,"w":105,"h":205}, + "frame": {"x":1014,"y":1228,"w":230,"h":288}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":663,"y":1473,"w":105,"h":205}, + "spriteSourceSize": {"x":308,"y":784,"w":230,"h":288}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/BalletSoleRightSpread.png": +"Models/DivineCuffs/ThighLeftDecoCleanClosed.png": { - "frame": {"x":1941,"y":336,"w":104,"h":195}, + "frame": {"x":1313,"y":1194,"w":94,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":472,"y":1481,"w":104,"h":195}, + "spriteSourceSize": {"x":620,"y":1057,"w":94,"h":30}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/ArmsBoxtie.png": +"Models/DivineCuffs/ThighLeftDecoClosed.png": { - "frame": {"x":636,"y":648,"w":310,"h":172}, + "frame": {"x":1411,"y":1194,"w":94,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":513,"w":310,"h":172}, + "spriteSourceSize": {"x":620,"y":1057,"w":94,"h":30}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/BeltsArmsBoxtie.png": +"Models/DivineCuffs/WristRightFree.png": { - "frame": {"x":958,"y":459,"w":310,"h":200}, + "frame": {"x":1351,"y":1520,"w":59,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":518,"w":310,"h":200}, + "spriteSourceSize": {"x":349,"y":602,"w":59,"h":67}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/BeltsArmsCrossed.png": +"Models/Dress/MageCollar.png": { - "frame": {"x":321,"y":504,"w":311,"h":143}, + "frame": {"x":1649,"y":1060,"w":103,"h":42}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":581,"w":311,"h":143}, + "spriteSourceSize": {"x":571,"y":407,"w":103,"h":42}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/ChestBoleroCrossed.png": +"Models/Ears/WolfInner.png": { - "frame": {"x":3,"y":700,"w":309,"h":169}, + "frame": {"x":1587,"y":643,"w":228,"h":136}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":375,"w":309,"h":169}, + "spriteSourceSize": {"x":499,"y":60,"w":228,"h":136}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/StrapsArmsBoxtie.png": +"Models/Elf/CollarHardware.png": { - "frame": {"x":316,"y":928,"w":307,"h":58}, + "frame": {"x":2011,"y":1733,"w":32,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":575,"w":307,"h":58}, + "spriteSourceSize": {"x":590,"y":400,"w":32,"h":47}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandAnkleLeftClosed.png": +"Models/Elf/ShoeLeftClosed.png": { - "frame": {"x":1922,"y":2022,"w":67,"h":23}, + "frame": {"x":1819,"y":1591,"w":139,"h":190}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":597,"y":1445,"w":67,"h":23}, + "spriteSourceSize": {"x":534,"y":1450,"w":139,"h":190}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/WristRightFree.png": +"Models/Elf/Skirt.png": { - "frame": {"x":250,"y":1443,"w":53,"h":72}, + "frame": {"x":3,"y":643,"w":214,"h":316}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":355,"y":601,"w":53,"h":72}, + "spriteSourceSize": {"x":436,"y":781,"w":214,"h":316}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/Corset.png": +"Models/Elf/SkirtCrotchStrap.png": { - "frame": {"x":309,"y":1557,"w":250,"h":159}, + "frame": {"x":221,"y":643,"w":218,"h":315}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":612,"w":250,"h":159}, + "spriteSourceSize": {"x":432,"y":781,"w":218,"h":315}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/CorsetStrapsUp.png": +"Models/FaceKjus/MouthFrown.png": { - "frame": {"x":843,"y":1557,"w":226,"h":158}, + "frame": {"x":2011,"y":1655,"w":33,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":402,"w":226,"h":158}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":591,"y":322,"w":33,"h":35}, + "sourceSize": {"w":754,"h":461} }, -"Models/Maid/ShoeLeftSpread.png": +"Models/FaceKoi/BrowsSurprised.png": { - "frame": {"x":1922,"y":1662,"w":123,"h":192}, + "frame": {"x":806,"y":1229,"w":41,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":633,"y":1455,"w":123,"h":192}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":60,"y":144,"w":41,"h":23}, + "sourceSize": {"w":321,"h":332} }, -"Models/Maid/ShoeRightSpread.png": +"Models/FaceKoi/EyesClosed.png": { - "frame": {"x":1925,"y":1047,"w":120,"h":151}, + "frame": {"x":1014,"y":1520,"w":50,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":492,"y":1493,"w":120,"h":151}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "sourceSize": {"w":321,"h":332} }, -"Models/Maid/StripeClosedCrotchStrap.png": +"Models/FaceKoi/HumanEyesClosed.png": { - "frame": {"x":1629,"y":3,"w":317,"h":74}, + "frame": {"x":1014,"y":1520,"w":50,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":438,"y":832,"w":317,"h":74}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "sourceSize": {"w":321,"h":332} }, -"Models/MaidKnightLight/DressChestWristtie.png": +"Models/FaceKoi/WhitesEyesClosed.png": { - "frame": {"x":1622,"y":1300,"w":299,"h":259}, + "frame": {"x":1014,"y":1520,"w":50,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":443,"y":389,"w":299,"h":259}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "sourceSize": {"w":321,"h":332} }, -"Models/Mittens/LatexRightFront.png": +"Models/FaceKoiBlank/EyesClosed.png": { - "frame": {"x":3,"y":1840,"w":155,"h":205}, + "frame": {"x":1014,"y":1520,"w":50,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":431,"y":466,"w":155,"h":205}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "sourceSize": {"w":321,"h":332} }, -"Models/Mittens/LongMittenLeftCrossed.png": +"Models/FaceKoiBlank/WhitesEyesClosed.png": { - "frame": {"x":1932,"y":862,"w":113,"h":181}, + "frame": {"x":1014,"y":1520,"w":50,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":656,"y":518,"w":113,"h":181}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "sourceSize": {"w":321,"h":332} }, -"Models/Ninja/KneeLeftClosed.png": +"Models/GagLeather/Plug.png": { - "frame": {"x":1922,"y":1858,"w":123,"h":160}, + "frame": {"x":2011,"y":1694,"w":33,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":574,"y":1151,"w":123,"h":160}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":116,"y":239,"w":33,"h":35}, + "sourceSize": {"w":321,"h":332} }, -"Models/OperaGloves/GloveRightWristtie.png": +"Models/GagMetal/HarnessRim.png": { - "frame": {"x":1584,"y":598,"w":32,"h":30}, + "frame": {"x":718,"y":1557,"w":131,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":466,"y":500,"w":32,"h":30}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":75,"y":243,"w":131,"h":30}, + "sourceSize": {"w":321,"h":332} }, -"Models/Panties/BaseKneel.png": +"Models/Hair/BraidCustomBack.png": { - "frame": {"x":3,"y":1337,"w":300,"h":102}, + "frame": {"x":716,"y":628,"w":290,"h":303}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":754,"w":300,"h":102}, + "spriteSourceSize": {"x":495,"y":104,"w":290,"h":303}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/StripesClosed.png": +"Models/Handcuffs/Irish8AnkleLeftClosed.png": { - "frame": {"x":563,"y":1557,"w":276,"h":158}, + "frame": {"x":1222,"y":1195,"w":87,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":761,"w":276,"h":158}, + "spriteSourceSize": {"x":593,"y":1431,"w":87,"h":29}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Arm1Up.png": +"Models/Heels/FlatBalletRightClosed.png": { - "frame": {"x":1308,"y":168,"w":316,"h":131}, + "frame": {"x":224,"y":3,"w":71,"h":314}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":472,"y":316,"w":316,"h":131}, + "spriteSourceSize": {"x":525,"y":1365,"w":71,"h":314}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/CrotchStrap.png": +"Models/Heels/LeatherLegLeftHogtie.png": { - "frame": {"x":1537,"y":1460,"w":80,"h":116}, + "frame": {"x":1415,"y":1228,"w":168,"h":286}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":541,"y":800,"w":80,"h":116}, + "spriteSourceSize": {"x":575,"y":924,"w":168,"h":286}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopArmsBoxtie.png": +"Models/Heels/LeatherLegRightHogtie.png": { - "frame": {"x":316,"y":990,"w":305,"h":149}, + "frame": {"x":1494,"y":434,"w":86,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":484,"w":305,"h":149}, + "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopArmsWristtie.png": +"Models/Heels/LeatherRightHogtie.png": { - "frame": {"x":950,"y":741,"w":307,"h":233}, + "frame": {"x":1494,"y":434,"w":86,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":484,"w":307,"h":233}, + "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/GoldKneel.png": +"Models/Heels/ShinyBalletRightClosed.png": { - "frame": {"x":1629,"y":81,"w":316,"h":248}, + "frame": {"x":224,"y":321,"w":71,"h":314}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":441,"y":605,"w":316,"h":248}, + "spriteSourceSize": {"x":525,"y":1365,"w":71,"h":314}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/PauldronsFree.png": +"Models/Heels/TallLegRightHogtie.png": { - "frame": {"x":331,"y":218,"w":319,"h":88}, + "frame": {"x":592,"y":320,"w":145,"h":304}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":464,"y":407,"w":319,"h":88}, + "spriteSourceSize": {"x":445,"y":905,"w":145,"h":304}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SkirtClosedCrotchStrap.png": +"Models/Heels/TallRightHogtie.png": { - "frame": {"x":643,"y":426,"w":311,"h":218}, + "frame": {"x":1494,"y":434,"w":86,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":437,"y":713,"w":311,"h":218}, + "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveLeftBoxtieRopesUpper.png": +"Models/Heels/TallRightKneel.png": { - "frame": {"x":1073,"y":1762,"w":98,"h":283}, + "frame": {"x":1962,"y":838,"w":83,"h":105}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, + "spriteSourceSize": {"x":311,"y":834,"w":83,"h":105}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveLeftFront.png": +"Models/Hood/Hood.png": { - "frame": {"x":1175,"y":1762,"w":98,"h":283}, + "frame": {"x":1601,"y":1591,"w":214,"h":285}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":505,"y":120,"w":214,"h":285}, + "sourceSize": {"w":752,"h":420} }, -"Models/Rope/Arm1Boxtie.png": +"Models/LatexPetsuit/LegsKneel.png": { - "frame": {"x":3,"y":1003,"w":305,"h":61}, + "frame": {"x":898,"y":310,"w":296,"h":296}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":575,"w":305,"h":61}, + "spriteSourceSize": {"x":315,"y":769,"w":296,"h":296}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Arm1OverBoxtie.png": +"Models/LatexPetsuit/LegsKneelClosed.png": { - "frame": {"x":3,"y":1068,"w":305,"h":58}, + "frame": {"x":908,"y":3,"w":296,"h":296}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":575,"w":305,"h":58}, + "spriteSourceSize": {"x":315,"y":769,"w":296,"h":296}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Arm2Boxtie.png": +"Models/LeatherCuffs/BandThighRightKneel.png": { - "frame": {"x":1262,"y":663,"w":308,"h":58}, + "frame": {"x":853,"y":1557,"w":104,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":484,"w":308,"h":58}, + "spriteSourceSize": {"x":391,"y":846,"w":104,"h":30}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Arm2Wristtie.png": +"Models/LeatherCuffs/BandThighRightKneelClosed.png": { - "frame": {"x":3,"y":1130,"w":304,"h":63}, + "frame": {"x":961,"y":1557,"w":104,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":484,"w":304,"h":63}, + "spriteSourceSize": {"x":391,"y":846,"w":104,"h":30}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Calf1Closed.png": +"Models/LeatherCuffs/BandWristRightFree.png": { - "frame": {"x":1925,"y":1469,"w":119,"h":41}, + "frame": {"x":2007,"y":1519,"w":38,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":544,"y":1411,"w":119,"h":41}, + "spriteSourceSize": {"x":362,"y":603,"w":38,"h":68}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/ForeArm1Wristtie.png": +"Models/LeatherCuffs/BandWristRightYoked.png": { - "frame": {"x":1584,"y":632,"w":32,"h":26}, + "frame": {"x":1509,"y":1194,"w":65,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":681,"y":688,"w":32,"h":26}, + "spriteSourceSize": {"x":309,"y":402,"w":65,"h":30}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RopeOld/ArmsBoxtie.png": +"Models/LeatherCuffs/HardwareThighRightClosed.png": { - "frame": {"x":631,"y":824,"w":307,"h":133}, + "frame": {"x":1962,"y":1942,"w":83,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":502,"w":307,"h":133}, + "spriteSourceSize": {"x":487,"y":1047,"w":83,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/CollarYoked.png": +"Models/LeatherCuffs/HardwareThighRightKneelClosed.png": { - "frame": {"x":582,"y":1719,"w":272,"h":135}, + "frame": {"x":1102,"y":1195,"w":116,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":395,"w":272,"h":135}, + "spriteSourceSize": {"x":373,"y":850,"w":116,"h":29}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/LeftArm2Wristtie.png": +"Models/LeatherPetsuit/LegsBeltsHogtie.png": { - "frame": {"x":1573,"y":867,"w":44,"h":66}, + "frame": {"x":718,"y":1258,"w":292,"h":295}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":681,"y":639,"w":44,"h":66}, + "spriteSourceSize": {"x":450,"y":920,"w":292,"h":295}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/Legs2Closed.png": +"Models/LeatherPetsuit/LegsHogtie.png": { - "frame": {"x":1622,"y":763,"w":306,"h":256}, + "frame": {"x":505,"y":951,"w":297,"h":303}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":433,"y":908,"w":306,"h":256}, + "spriteSourceSize": {"x":446,"y":915,"w":297,"h":303}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/Legs2Kneel.png": +"Models/Legbinder/RightLegbinderHogtie.png": { - "frame": {"x":311,"y":1143,"w":300,"h":145}, + "frame": {"x":741,"y":310,"w":153,"h":300}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":409,"y":887,"w":300,"h":145}, + "spriteSourceSize": {"x":445,"y":911,"w":153,"h":300}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/Legs2KneelClosed.png": +"Models/Maid/Blouse.png": { - "frame": {"x":311,"y":1143,"w":300,"h":145}, + "frame": {"x":873,"y":1591,"w":274,"h":290}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":409,"y":887,"w":300,"h":145}, + "spriteSourceSize": {"x":442,"y":494,"w":274,"h":290}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/RightLegs1KneelClosed.png": +"Models/Maid/CorsetStrapsUp.png": { - "frame": {"x":1950,"y":3,"w":95,"h":148}, + "frame": {"x":1819,"y":499,"w":226,"h":158}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":405,"y":785,"w":95,"h":148}, + "spriteSourceSize": {"x":493,"y":402,"w":226,"h":158}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeStripeUp.png": +"Models/Maid/StripeOverKneelCrotchStrap.png": { - "frame": {"x":1621,"y":1563,"w":297,"h":273}, + "frame": {"x":1426,"y":1106,"w":237,"h":84}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":468,"y":268,"w":297,"h":273}, + "spriteSourceSize": {"x":545,"y":832,"w":237,"h":84}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SmoothHeels/LegRightHogtie.png": +"Models/MaidKnightLight/ArmLeftFront.png": { - "frame": {"x":1832,"y":1983,"w":86,"h":62}, + "frame": {"x":806,"y":935,"w":118,"h":290}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":62}, + "spriteSourceSize": {"x":685,"y":426,"w":118,"h":290}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SmoothHeels/RightHogtie.png": +"Models/MaidKnightLight/Dress.png": { - "frame": {"x":1832,"y":1983,"w":86,"h":62}, + "frame": {"x":1198,"y":303,"w":292,"h":192}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":62}, + "spriteSourceSize": {"x":452,"y":582,"w":292,"h":192}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimWristRightFront.png": +"Models/MaidKnightLight/DressChestFree.png": { - "frame": {"x":1546,"y":1257,"w":72,"h":55}, + "frame": {"x":1756,"y":1060,"w":289,"h":259}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":471,"y":540,"w":72,"h":55}, + "spriteSourceSize": {"x":443,"y":389,"w":289,"h":259}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SuccubusClawLeftFront.png": +"Models/MaidKnightLight/GuardLeftUp.png": { - "frame": {"x":1925,"y":1202,"w":120,"h":42}, + "frame": {"x":1151,"y":1591,"w":176,"h":288}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":531,"y":487,"w":120,"h":42}, + "spriteSourceSize": {"x":662,"y":219,"w":176,"h":288}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/StrappyLower.png": +"Models/MaidKnightLight/SockLeftHogtie.png": { - "frame": {"x":1277,"y":1720,"w":255,"h":223}, + "frame": {"x":1331,"y":1591,"w":266,"h":286}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":696,"w":255,"h":223}, + "spriteSourceSize": {"x":473,"y":929,"w":266,"h":286}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/ArmFullLeftBoxtie.png": +"Models/Panties/LinesClosed.png": { - "frame": {"x":654,"y":227,"w":314,"h":195}, + "frame": {"x":1679,"y":1880,"w":279,"h":165}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":415,"w":314,"h":195}, + "spriteSourceSize": {"x":452,"y":755,"w":279,"h":165}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/Chest.png": +"Models/Ribbon/TopCalf2KneelClosed.png": { - "frame": {"x":986,"y":212,"w":315,"h":243}, + "frame": {"x":1819,"y":259,"w":226,"h":236}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":384,"w":315,"h":243}, + "spriteSourceSize": {"x":427,"y":812,"w":226,"h":236}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/ChestBoxtie.png": +"Models/RobeOfChastity/GoldBaseSpread.png": { - "frame": {"x":986,"y":212,"w":315,"h":243}, + "frame": {"x":426,"y":1277,"w":288,"h":310}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":384,"w":315,"h":243}, + "spriteSourceSize": {"x":448,"y":606,"w":288,"h":310}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/ChestCrossed.png": +"Models/RobeOfChastity/GoldClosed.png": { - "frame": {"x":986,"y":212,"w":315,"h":243}, + "frame": {"x":145,"y":1282,"w":277,"h":311}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":384,"w":315,"h":243}, + "spriteSourceSize": {"x":459,"y":605,"w":277,"h":311}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/ChestWristtie.png": +"Models/RobeOfChastity/GoldSpread.png": { - "frame": {"x":986,"y":212,"w":315,"h":243}, + "frame": {"x":319,"y":1597,"w":277,"h":311}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":384,"w":315,"h":243}, + "spriteSourceSize": {"x":459,"y":605,"w":277,"h":311}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/HandLeftFree.png": +"Models/Robes/ShoeLeftSpread.png": { - "frame": {"x":1941,"y":761,"w":104,"h":97}, + "frame": {"x":170,"y":1915,"w":110,"h":129}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":812,"y":768,"w":104,"h":97}, + "spriteSourceSize": {"x":641,"y":1507,"w":110,"h":129}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/HandRightFree.png": +"Models/Rope/HarnessLowerKneel.png": { - "frame": {"x":133,"y":1443,"w":113,"h":110}, + "frame": {"x":3,"y":963,"w":264,"h":315}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":266,"y":546,"w":113,"h":110}, + "spriteSourceSize": {"x":455,"y":526,"w":264,"h":315}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/RightLegsKneel.png": +"Models/RopeOld/ArmsBoxtie.png": { - "frame": {"x":858,"y":1719,"w":211,"h":272}, + "frame": {"x":462,"y":1912,"w":307,"h":133}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":314,"y":798,"w":211,"h":272}, + "spriteSourceSize": {"x":463,"y":502,"w":307,"h":133}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/TopCrossed.png": +"Models/Rubber/FaceFull.png": { - "frame": {"x":659,"y":3,"w":323,"h":220}, + "frame": {"x":1426,"y":902,"w":219,"h":200}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":470,"w":323,"h":220}, + "spriteSourceSize": {"x":503,"y":194,"w":219,"h":200}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/TopFullCrossed.png": +"Models/Sailor/CollarStripe.png": { - "frame": {"x":1262,"y":725,"w":307,"h":267}, + "frame": {"x":1198,"y":499,"w":240,"h":107}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":384,"w":307,"h":267}, + "spriteSourceSize": {"x":510,"y":412,"w":240,"h":107}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/ArmLeftBoxtie.png": +"Models/Sailor/RibbonUp.png": { - "frame": {"x":3,"y":495,"w":314,"h":96}, + "frame": {"x":1587,"y":1194,"w":165,"h":260}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":584,"w":314,"h":96}, + "spriteSourceSize": {"x":525,"y":350,"w":165,"h":260}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/TopBoxtie.png": +"Models/Sailor/SleeveLeft.png": { - "frame": {"x":1272,"y":560,"w":308,"h":99}, + "frame": {"x":773,"y":1905,"w":97,"h":140}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":587,"w":308,"h":99}, + "spriteSourceSize": {"x":704,"y":410,"w":97,"h":140}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ArmFullLeftBoxtie.png": +"Models/Sailor/SleeveRightUp.png": { - "frame": {"x":654,"y":227,"w":314,"h":195}, + "frame": {"x":1962,"y":661,"w":83,"h":173}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":415,"w":314,"h":195}, + "spriteSourceSize": {"x":476,"y":303,"w":83,"h":173}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ArmLeftBoxtie.png": +"Models/ShadowHands/Legs2Closed.png": { - "frame": {"x":1623,"y":333,"w":314,"h":217}, + "frame": {"x":1509,"y":3,"w":306,"h":256}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":465,"w":314,"h":217}, + "spriteSourceSize": {"x":433,"y":908,"w":306,"h":256}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/BottomKneel.png": +"Models/Slayer/CapeShoulderRightUp.png": { - "frame": {"x":3,"y":595,"w":311,"h":101}, + "frame": {"x":1962,"y":1655,"w":45,"h":126}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":437,"y":734,"w":311,"h":101}, + "spriteSourceSize": {"x":536,"y":291,"w":45,"h":126}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ChestFull.png": +"Models/Slayer/CapeStripeUp.png": { - "frame": {"x":271,"y":1840,"w":282,"h":204}, + "frame": {"x":1208,"y":3,"w":297,"h":273}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":479,"y":384,"w":282,"h":204}, + "spriteSourceSize": {"x":468,"y":268,"w":297,"h":273}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/TopBoxtie.png": +"Models/SMoonlight/PostureCollarRim.png": { - "frame": {"x":331,"y":3,"w":324,"h":211}, + "frame": {"x":1908,"y":1785,"w":84,"h":91}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":475,"w":324,"h":211}, + "spriteSourceSize": {"x":587,"y":357,"w":84,"h":91}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/TopCrossed.png": +"Models/SteelChastity/BeltRadial.png": { - "frame": {"x":659,"y":3,"w":323,"h":220}, + "frame": {"x":116,"y":1915,"w":50,"h":130}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":470,"w":323,"h":220}, + "spriteSourceSize": {"x":546,"y":729,"w":50,"h":130}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/TopFullCrossed.png": +"Models/SteelCuffs/RimThighLeftSpread.png": { - "frame": {"x":1262,"y":725,"w":307,"h":267}, + "frame": {"x":1587,"y":1458,"w":151,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":384,"w":307,"h":267}, + "spriteSourceSize": {"x":614,"y":994,"w":151,"h":56}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/TopStrapBoxtie.png": +"Models/SteelCuffs/RimWristRightFree.png": { - "frame": {"x":950,"y":663,"w":308,"h":74}, + "frame": {"x":1996,"y":1785,"w":49,"h":73}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":438,"w":308,"h":74}, + "spriteSourceSize": {"x":346,"y":597,"w":49,"h":73}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/BraYoked.png": +"Models/SteelCuffs/ThighLeftClosed.png": { - "frame": {"x":611,"y":1337,"w":280,"h":216}, + "frame": {"x":1474,"y":1518,"w":171,"h":69}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":412,"w":280,"h":216}, + "spriteSourceSize": {"x":566,"y":977,"w":171,"h":69}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/ApprenticeHat.png": +"Models/SteelCuffs/ThighRightClosed.png": { - "frame": {"x":3,"y":3,"w":324,"h":231}, + "frame": {"x":1649,"y":1518,"w":130,"h":69}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":497,"y":18,"w":324,"h":231}, + "spriteSourceSize": {"x":453,"y":973,"w":130,"h":69}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtBelt.png": +"Models/TallSmoothHeels/TallRightHogtie.png": { - "frame": {"x":1536,"y":1858,"w":292,"h":85}, + "frame": {"x":1494,"y":434,"w":86,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":735,"w":292,"h":85}, + "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/BeltBandMid.png": +"Models/TapeHeavy/FeetHogtie.png": { - "frame": {"x":832,"y":1995,"w":237,"h":49}, + "frame": {"x":1593,"y":783,"w":52,"h":112}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":468,"y":695,"w":237,"h":49}, + "spriteSourceSize": {"x":730,"y":800,"w":52,"h":112}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/HarnessBandLower.png": +"Models/Witch/BlouseLiner.png": { - "frame": {"x":307,"y":1292,"w":300,"h":135}, + "frame": {"x":1323,"y":610,"w":260,"h":173}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":809,"w":300,"h":135}, + "spriteSourceSize": {"x":456,"y":611,"w":260,"h":173}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/HarnessBandLowerClosed.png": +"Models/Witch/ShoeLeftKneelClosed.png": { - "frame": {"x":3,"y":1197,"w":300,"h":136}, + "frame": {"x":1442,"y":499,"w":141,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":809,"w":300,"h":136}, + "spriteSourceSize": {"x":752,"y":930,"w":141,"h":95}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/HarnessBandLowerKneel.png": +"Models/Wolf/HarnessHardwareMid.png": { - "frame": {"x":1277,"y":1947,"w":276,"h":98}, + "frame": {"x":1509,"y":263,"w":306,"h":167}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":757,"w":276,"h":98}, + "spriteSourceSize": {"x":438,"y":688,"w":306,"h":167}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/HarnessLowerClosed.png": +"Models/WolfCatsuit/LegRightKneel.png": { - "frame": {"x":1308,"y":3,"w":317,"h":161}, + "frame": {"x":3,"y":3,"w":217,"h":316}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":437,"y":797,"w":317,"h":161}, + "spriteSourceSize": {"x":312,"y":746,"w":217,"h":316}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/HarnessMidKneel.png": +"Models/WolfCatsuit/LegRightKneelClosed.png": { - "frame": {"x":1557,"y":1947,"w":271,"h":80}, + "frame": {"x":3,"y":323,"w":217,"h":316}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":685,"w":271,"h":80}, + "spriteSourceSize": {"x":312,"y":746,"w":217,"h":316}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/GloveLeftBoxtie.png": +"Models/WolfCatsuit/TorsoUpper.png": { - "frame": {"x":1949,"y":155,"w":96,"h":177}, + "frame": {"x":600,"y":1591,"w":269,"h":310}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":676,"y":507,"w":96,"h":177}, + "spriteSourceSize": {"x":447,"y":390,"w":269,"h":310}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/TorsoLowerBand.png": +"Models/WolfCatsuit/TorsoUpper2.png": { - "frame": {"x":932,"y":1201,"w":299,"h":124}, + "frame": {"x":443,"y":637,"w":269,"h":310}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":802,"w":299,"h":124}, + "spriteSourceSize": {"x":447,"y":390,"w":269,"h":310}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -991,7 +991,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas34.webp b/TextureAtlas/atlas34.webp index fb7719ca5..afd280bc1 100644 Binary files a/TextureAtlas/atlas34.webp and b/TextureAtlas/atlas34.webp differ diff --git a/TextureAtlas/atlas35.json b/TextureAtlas/atlas35.json index f34097747..62e7e1cec 100644 --- a/TextureAtlas/atlas35.json +++ b/TextureAtlas/atlas35.json @@ -1,755 +1,827 @@ {"frames": { -"Models/ArmorChain/ShirtChestFree.png": +"Models/Armbinder/WolfHarness.png": { - "frame": {"x":1754,"y":1055,"w":282,"h":213}, + "frame": {"x":1799,"y":1525,"w":246,"h":146}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":412,"w":282,"h":213}, + "spriteSourceSize": {"x":477,"y":412,"w":246,"h":146}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorChain/ShirtChestHogtie.png": +"Models/ArmorChain/Skirt2Kneel.png": { - "frame": {"x":870,"y":1164,"w":278,"h":208}, + "frame": {"x":596,"y":1011,"w":292,"h":170}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":417,"w":278,"h":208}, + "spriteSourceSize": {"x":352,"y":796,"w":292,"h":170}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorChain/ShirtChestUp.png": +"Models/Bandit/ShortsClosed.png": { - "frame": {"x":3,"y":1266,"w":278,"h":225}, + "frame": {"x":1551,"y":522,"w":298,"h":201}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":400,"w":278,"h":225}, + "spriteSourceSize": {"x":446,"y":751,"w":298,"h":201}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorChain/Skirt2Kneel.png": +"Models/Bandit/ShortsLeftKneel.png": { - "frame": {"x":304,"y":258,"w":292,"h":170}, + "frame": {"x":633,"y":418,"w":303,"h":219}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":352,"y":796,"w":292,"h":170}, + "spriteSourceSize": {"x":472,"y":752,"w":303,"h":219}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorChain/SkirtBeltKneel.png": +"Models/Bandit/ShortsLeftKneelClosed.png": { - "frame": {"x":593,"y":773,"w":289,"h":68}, + "frame": {"x":318,"y":419,"w":303,"h":219}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":754,"w":289,"h":68}, + "spriteSourceSize": {"x":472,"y":752,"w":303,"h":219}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/EarsFront.png": +"Models/Blindfold/LeatherRim.png": { - "frame": {"x":605,"y":3,"w":297,"h":243}, + "frame": {"x":1844,"y":834,"w":201,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":366,"y":14,"w":297,"h":243}, + "spriteSourceSize": {"x":513,"y":254,"w":201,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/TorsoLower.png": +"Models/Body/Chest.png": { - "frame": {"x":299,"y":560,"w":290,"h":254}, + "frame": {"x":1683,"y":1933,"w":265,"h":112}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":670,"w":290,"h":254}, + "spriteSourceSize": {"x":447,"y":514,"w":265,"h":112}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/TorsoLowerHogtie.png": +"Models/Body/FootRightHogtie.png": { - "frame": {"x":891,"y":448,"w":290,"h":268}, + "frame": {"x":1897,"y":3,"w":148,"h":212}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":657,"w":290,"h":268}, + "spriteSourceSize": {"x":654,"y":801,"w":148,"h":212}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/TorsoLowerLowRise.png": +"Models/Bra/Straps.png": { - "frame": {"x":3,"y":641,"w":290,"h":206}, + "frame": {"x":939,"y":1930,"w":220,"h":108}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":718,"w":290,"h":206}, + "spriteSourceSize": {"x":484,"y":415,"w":220,"h":108}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraCyber.png": +"Models/Catsuit/ChestHogtie.png": +{ + "frame": {"x":560,"y":1930,"w":267,"h":115}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":513,"w":267,"h":115}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Catsuit/TorsoLowerHogtie.png": { - "frame": {"x":607,"y":1807,"w":271,"h":236}, + "frame": {"x":891,"y":1193,"w":290,"h":268}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":410,"w":271,"h":236}, + "spriteSourceSize": {"x":448,"y":657,"w":290,"h":268}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraLining.png": +"Models/Catsuit/TorsoLowerLowRise.png": { - "frame": {"x":889,"y":720,"w":289,"h":233}, + "frame": {"x":1224,"y":1169,"w":290,"h":206}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":476,"y":406,"w":289,"h":233}, + "spriteSourceSize": {"x":448,"y":718,"w":290,"h":206}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraProtoCups.png": +"Models/Catsuit/TorsoUpperCrop.png": { - "frame": {"x":567,"y":1389,"w":277,"h":99}, + "frame": {"x":942,"y":382,"w":303,"h":245}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":443,"y":543,"w":277,"h":99}, + "spriteSourceSize": {"x":446,"y":382,"w":303,"h":245}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/ProtoLining.png": +"Models/Chastity/BeltLock.png": { - "frame": {"x":3,"y":1495,"w":278,"h":89}, + "frame": {"x":1853,"y":696,"w":192,"h":134}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":452,"y":762,"w":278,"h":89}, + "spriteSourceSize": {"x":535,"y":705,"w":192,"h":134}, "sourceSize": {"w":1240,"h":1754} }, -"Models/China/Bra.png": +"Models/Chastity/BeltStrap.png": { - "frame": {"x":882,"y":1807,"w":269,"h":235}, + "frame": {"x":3,"y":1708,"w":170,"h":218}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":390,"w":269,"h":235}, + "spriteSourceSize": {"x":557,"y":705,"w":170,"h":218}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/ElbowRightYoked.png": +"Models/Chastity/BraCyberLining.png": { - "frame": {"x":1207,"y":1448,"w":55,"h":91}, + "frame": {"x":1412,"y":1933,"w":267,"h":112}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":398,"y":520,"w":55,"h":91}, + "spriteSourceSize": {"x":448,"y":515,"w":267,"h":112}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/ThighLeftSpread.png": +"Models/Chastity/CyberLining.png": { - "frame": {"x":1325,"y":1448,"w":141,"h":90}, + "frame": {"x":883,"y":1554,"w":262,"h":145}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":619,"y":1004,"w":141,"h":90}, + "spriteSourceSize": {"x":458,"y":758,"w":262,"h":145}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/ElbowRightYoked.png": +"Models/Collars/Quake.png": { - "frame": {"x":1266,"y":1448,"w":55,"h":91}, + "frame": {"x":1952,"y":2007,"w":90,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":398,"y":520,"w":55,"h":91}, + "spriteSourceSize": {"x":578,"y":394,"w":90,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/ThighLeftSpread.png": +"Models/CyberCuffs/DisplayThighLeftSpread.png": { - "frame": {"x":1470,"y":1448,"w":141,"h":90}, + "frame": {"x":1172,"y":1468,"w":45,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":619,"y":1004,"w":141,"h":90}, + "spriteSourceSize": {"x":686,"y":1004,"w":45,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/LongMittenRightUp.png": +"Models/CyberCuffs/LockThighLeftClosed.png": { - "frame": {"x":1595,"y":1805,"w":143,"h":235}, + "frame": {"x":1185,"y":1424,"w":32,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":164,"w":143,"h":235}, + "spriteSourceSize": {"x":656,"y":1045,"w":32,"h":40}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ElbowRightYoked.png": +"Models/CyberHeels/ShinyBalletLeftKneel.png": { - "frame": {"x":1133,"y":1448,"w":70,"h":91}, + "frame": {"x":953,"y":150,"w":309,"h":126}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":394,"y":505,"w":70,"h":91}, + "spriteSourceSize": {"x":651,"y":927,"w":309,"h":126}, "sourceSize": {"w":1240,"h":1754} }, "Models/CyberHeels/ShinyBalletLeftKneelClosed.png": { - "frame": {"x":906,"y":109,"w":293,"h":125}, + "frame": {"x":603,"y":882,"w":293,"h":125}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":667,"y":928,"w":293,"h":125}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/ArmLongMittenRightUp.png": +"Models/DivineBelt/BraLines.png": { - "frame": {"x":1595,"y":1805,"w":143,"h":235}, + "frame": {"x":1518,"y":1207,"w":285,"h":236}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":164,"w":143,"h":235}, + "spriteSourceSize": {"x":435,"y":406,"w":285,"h":236}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/LongMittenRightUp.png": +"Models/DivineCuffs/AnkleLeftDecoSpread.png": { - "frame": {"x":1595,"y":1805,"w":143,"h":235}, + "frame": {"x":1149,"y":1577,"w":68,"h":31}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":164,"w":143,"h":235}, + "spriteSourceSize": {"x":683,"y":1439,"w":68,"h":31}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberPetsuit/LegsBeltsHogtie.png": +"Models/DivineCuffs/AnkleRightDecoCleanSpread.png": { - "frame": {"x":1202,"y":244,"w":291,"h":255}, + "frame": {"x":1149,"y":1612,"w":68,"h":31}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":914,"w":291,"h":255}, + "spriteSourceSize": {"x":495,"y":1439,"w":68,"h":31}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberPetsuit/Petsuit.png": +"Models/DivineCuffs/AnkleRightDecoSpread.png": { - "frame": {"x":1202,"y":244,"w":291,"h":255}, + "frame": {"x":1149,"y":1647,"w":68,"h":31}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":914,"w":291,"h":255}, + "spriteSourceSize": {"x":495,"y":1439,"w":68,"h":31}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BraBase1.png": +"Models/DivineCuffs/AnkleRightLockPlateClosed.png": { - "frame": {"x":292,"y":1058,"w":280,"h":142}, + "frame": {"x":844,"y":1648,"w":32,"h":34}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":436,"y":498,"w":280,"h":142}, + "spriteSourceSize": {"x":514,"y":1424,"w":32,"h":34}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BraLines.png": +"Models/Dress/BlouseBust.png": { - "frame": {"x":297,"y":818,"w":285,"h":236}, + "frame": {"x":282,"y":1930,"w":274,"h":115}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":435,"y":406,"w":285,"h":236}, + "spriteSourceSize": {"x":444,"y":514,"w":274,"h":115}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BraMetalRunic1.png": +"Models/Dress/BlouseBustUp.png": { - "frame": {"x":567,"y":1492,"w":277,"h":71}, + "frame": {"x":3,"y":1930,"w":275,"h":115}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":436,"y":569,"w":277,"h":71}, + "spriteSourceSize": {"x":444,"y":514,"w":275,"h":115}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowRightYoked.png": +"Models/Dress/BlouseNeck.png": { - "frame": {"x":1615,"y":1448,"w":70,"h":90}, + "frame": {"x":1581,"y":241,"w":305,"h":149}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":393,"y":515,"w":70,"h":90}, + "spriteSourceSize": {"x":450,"y":412,"w":305,"h":149}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighLeftDecoCleanClosed.png": +"Models/Dress/BlouseSkirtUnder.png": { - "frame": {"x":1944,"y":1508,"w":94,"h":30}, + "frame": {"x":940,"y":631,"w":298,"h":224}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":620,"y":1057,"w":94,"h":30}, + "spriteSourceSize": {"x":368,"y":719,"w":298,"h":224}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighLinkSpread.png": +"Models/Dress/BowCorsetBustRuffle.png": { - "frame": {"x":1742,"y":1805,"w":80,"h":26}, + "frame": {"x":591,"y":1648,"w":249,"h":51}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":566,"y":1057,"w":80,"h":26}, + "spriteSourceSize": {"x":475,"y":485,"w":249,"h":51}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BowCorsetRuffle.png": +"Models/Dress/LaceCrotchPanelLace.png": { - "frame": {"x":3,"y":1173,"w":280,"h":89}, + "frame": {"x":1163,"y":1682,"w":261,"h":168}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":746,"w":280,"h":89}, + "spriteSourceSize": {"x":451,"y":756,"w":261,"h":168}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MageSkirtOverKneelCrotchStrap.png": +"Models/Ears/Fox.png": { - "frame": {"x":3,"y":1588,"w":263,"h":215}, + "frame": {"x":1249,"y":408,"w":298,"h":238}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":516,"y":801,"w":263,"h":215}, + "spriteSourceSize": {"x":450,"y":3,"w":298,"h":238}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/SkirtSplitBelt.png": +"Models/Elf/BandRightYoked.png": { - "frame": {"x":1443,"y":1242,"w":278,"h":60}, + "frame": {"x":1428,"y":1848,"w":78,"h":81}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":765,"w":278,"h":60}, + "spriteSourceSize": {"x":421,"y":466,"w":78,"h":81}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/BandRightUp.png": +"Models/Elf/CrystalShoeLeftClosed.png": { - "frame": {"x":1944,"y":1418,"w":101,"h":86}, + "frame": {"x":1185,"y":1358,"w":32,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":469,"y":349,"w":101,"h":86}, + "spriteSourceSize": {"x":579,"y":1497,"w":32,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/Panties.png": +"Models/GagFrilly/FrillyStraps.png": { - "frame": {"x":1791,"y":664,"w":254,"h":171}, + "frame": {"x":1892,"y":219,"w":153,"h":263}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":746,"w":254,"h":171}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":70,"y":18,"w":153,"h":263}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/PanelStrap.png": +{ + "frame": {"x":1863,"y":486,"w":181,"h":206}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":39,"y":71,"w":181,"h":206}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagTape/Face.png": +{ + "frame": {"x":1844,"y":909,"w":200,"h":146}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":44,"y":147,"w":200,"h":146}, + "sourceSize": {"w":321,"h":332} }, "Models/Hair/BraidCustom_Overstrap.png": { - "frame": {"x":304,"y":3,"w":297,"h":251}, + "frame": {"x":1543,"y":727,"w":297,"h":251}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":469,"y":135,"w":297,"h":251}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/BalletLeftKneel.png": +"Models/Handcuffs/HingedCuffsFront.png": { - "frame": {"x":570,"y":1239,"w":278,"h":146}, + "frame": {"x":1510,"y":1854,"w":238,"h":75}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":652,"y":906,"w":278,"h":146}, + "spriteSourceSize": {"x":466,"y":526,"w":238,"h":75}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/FlatBalletLeftKneel.png": +"Models/Harness/HardwareUnderbust.png": { - "frame": {"x":570,"y":1239,"w":278,"h":146}, + "frame": {"x":1172,"y":1527,"w":45,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":652,"y":906,"w":278,"h":146}, + "spriteSourceSize": {"x":549,"y":619,"w":45,"h":46}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/ShinyBalletLeftKneel.png": +"Models/Jacket/ArmsBoxtie.png": { - "frame": {"x":285,"y":1371,"w":278,"h":146}, + "frame": {"x":1583,"y":3,"w":310,"h":172}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":652,"y":906,"w":278,"h":146}, + "spriteSourceSize": {"x":463,"y":513,"w":310,"h":172}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/BeltsTorsoLowerCrossed.png": +"Models/Jacket/ArmsWristtie.png": { - "frame": {"x":1468,"y":1019,"w":282,"h":219}, + "frame": {"x":318,"y":179,"w":311,"h":236}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":665,"w":282,"h":219}, + "spriteSourceSize": {"x":458,"y":513,"w":311,"h":236}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/BeltsTorsoLowerWristtie.png": +"Models/Jacket/BeltsArmsCrossed.png": { - "frame": {"x":285,"y":1521,"w":276,"h":282}, + "frame": {"x":953,"y":3,"w":311,"h":143}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":602,"w":276,"h":282}, + "spriteSourceSize": {"x":448,"y":581,"w":311,"h":143}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/LatexLower.png": +"Models/Jacket/ChestBoleroCrossed.png": { - "frame": {"x":1354,"y":1542,"w":256,"h":259}, + "frame": {"x":1268,"y":108,"w":309,"h":169}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":656,"w":256,"h":259}, + "spriteSourceSize": {"x":461,"y":375,"w":309,"h":169}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/StrapsTorsoLowerCrossed.png": +"Models/Jacket/StrapsArmsBoxtie.png": { - "frame": {"x":1182,"y":766,"w":282,"h":258}, + "frame": {"x":1581,"y":179,"w":307,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":665,"w":282,"h":258}, + "spriteSourceSize": {"x":463,"y":575,"w":307,"h":58}, "sourceSize": {"w":1240,"h":1754} }, "Models/Jacket/TorsoLowerCrossed.png": { - "frame": {"x":1478,"y":747,"w":282,"h":268}, + "frame": {"x":1510,"y":1582,"w":282,"h":268}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":449,"y":655,"w":282,"h":268}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandThighRightKneelClosed.png": +"Models/LeatherLeotard/Laces.png": { - "frame": {"x":1934,"y":1272,"w":104,"h":30}, + "frame": {"x":894,"y":1930,"w":41,"h":115}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":391,"y":846,"w":104,"h":30}, + "spriteSourceSize": {"x":541,"y":649,"w":41,"h":115}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherLeotard/Leotard.png": +"Models/LeatherLeotard/LeotardChest.png": { - "frame": {"x":3,"y":1807,"w":261,"h":237}, + "frame": {"x":925,"y":859,"w":295,"h":241}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":457,"y":720,"w":261,"h":237}, + "spriteSourceSize": {"x":426,"y":387,"w":295,"h":241}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Legbinder/LacesLegbinderKneelClosed.png": +"Models/LeatherPetsuit/LegsLacesHogtie.png": { - "frame": {"x":1691,"y":1306,"w":249,"h":232}, + "frame": {"x":1188,"y":1104,"w":32,"h":132}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":347,"y":841,"w":249,"h":232}, + "spriteSourceSize": {"x":703,"y":957,"w":32,"h":132}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ApronChest.png": +"Models/MaidKnightLight/ApronChestCrossed.png": { - "frame": {"x":875,"y":957,"w":282,"h":203}, + "frame": {"x":299,"y":1229,"w":291,"h":207}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":481,"y":467,"w":282,"h":203}, + "spriteSourceSize": {"x":472,"y":403,"w":291,"h":207}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ArmRightYoked.png": +"Models/MaidKnightLight/ApronChestUp.png": { - "frame": {"x":1802,"y":3,"w":243,"h":241}, + "frame": {"x":1796,"y":1675,"w":249,"h":251}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":315,"y":390,"w":243,"h":241}, + "spriteSourceSize": {"x":474,"y":358,"w":249,"h":251}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/Dress.png": +"Models/MaidKnightLight/DressChestBoxtie.png": { - "frame": {"x":605,"y":250,"w":292,"h":192}, + "frame": {"x":297,"y":1440,"w":290,"h":259}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":452,"y":582,"w":292,"h":192}, + "spriteSourceSize": {"x":443,"y":389,"w":290,"h":259}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/DressChestBoxtie.png": +"Models/MaidKnightLight/DressChestWristtie.png": { - "frame": {"x":595,"y":510,"w":290,"h":259}, + "frame": {"x":3,"y":598,"w":299,"h":259}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":443,"y":389,"w":290,"h":259}, + "spriteSourceSize": {"x":443,"y":389,"w":299,"h":259}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/DressChestFree.png": +"Models/MaidKnightLight/DressKneel.png": { - "frame": {"x":1185,"y":503,"w":289,"h":259}, + "frame": {"x":3,"y":1237,"w":291,"h":192}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":443,"y":389,"w":289,"h":259}, + "spriteSourceSize": {"x":452,"y":582,"w":291,"h":192}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/DressChestUp.png": +"Models/Mittens/ZipperLeftFree.png": { - "frame": {"x":1074,"y":1543,"w":276,"h":259}, + "frame": {"x":831,"y":1930,"w":59,"h":115}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":443,"y":389,"w":276,"h":259}, + "spriteSourceSize": {"x":796,"y":669,"w":59,"h":115}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/DressKneel.png": +"Models/Ninja/TopShoulders.png": { - "frame": {"x":1497,"y":276,"w":291,"h":192}, + "frame": {"x":300,"y":891,"w":292,"h":206}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":452,"y":582,"w":291,"h":192}, + "spriteSourceSize": {"x":449,"y":406,"w":292,"h":206}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LongMittenRightFree.png": +"Models/OperaGloves/GloveLeftUp.png": { - "frame": {"x":1833,"y":1542,"w":212,"h":153}, + "frame": {"x":177,"y":1708,"w":170,"h":218}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":276,"y":551,"w":212,"h":153}, + "spriteSourceSize": {"x":663,"y":168,"w":170,"h":218}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/ThighRightKneel.png": +"Models/Panties/CherryKneel.png": { - "frame": {"x":1614,"y":1542,"w":215,"h":259}, + "frame": {"x":883,"y":1465,"w":285,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":308,"y":805,"w":215,"h":259}, + "spriteSourceSize": {"x":450,"y":768,"w":285,"h":85}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/ThighRightKneelClosed.png": +"Models/Panties/StripesKneel.png": { - "frame": {"x":1614,"y":1542,"w":215,"h":259}, + "frame": {"x":1224,"y":919,"w":295,"h":99}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":308,"y":805,"w":215,"h":259}, + "spriteSourceSize": {"x":452,"y":755,"w":295,"h":99}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/TopBandChest.png": +"Models/Ribbon/Harness.png": { - "frame": {"x":1155,"y":1806,"w":216,"h":235}, + "frame": {"x":625,"y":641,"w":296,"h":237}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":492,"y":394,"w":216,"h":235}, + "spriteSourceSize": {"x":433,"y":394,"w":296,"h":237}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/TopBandRimChest.png": +"Models/Ribbon/Thigh3Closed.png": { - "frame": {"x":1375,"y":1805,"w":216,"h":235}, + "frame": {"x":1523,"y":982,"w":293,"h":221}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":492,"y":394,"w":216,"h":235}, + "spriteSourceSize": {"x":446,"y":918,"w":293,"h":221}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/TopChest.png": +"Models/Ribbon/TopArmsBoxtie.png": { - "frame": {"x":565,"y":1567,"w":275,"h":236}, + "frame": {"x":633,"y":265,"w":305,"h":149}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":442,"y":394,"w":275,"h":236}, + "spriteSourceSize": {"x":465,"y":484,"w":305,"h":149}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/TopShoulders.png": +"Models/RobeOfChastity/FrillClosed.png": { - "frame": {"x":906,"y":238,"w":292,"h":206}, + "frame": {"x":1510,"y":1447,"w":285,"h":131}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":406,"w":292,"h":206}, + "spriteSourceSize": {"x":450,"y":755,"w":285,"h":131}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Nipples/VibePiercings.png": +"Models/RobeOfChastity/FrillKneel.png": { - "frame": {"x":1725,"y":1272,"w":205,"h":30}, + "frame": {"x":942,"y":280,"w":305,"h":98}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":569,"w":205,"h":30}, + "spriteSourceSize": {"x":443,"y":755,"w":305,"h":98}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/BaseClosed.png": +"Models/RobeOfChastity/FrillSpread.png": { - "frame": {"x":852,"y":1376,"w":277,"h":163}, + "frame": {"x":1510,"y":1447,"w":285,"h":131}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":756,"w":277,"h":163}, + "spriteSourceSize": {"x":450,"y":755,"w":285,"h":131}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/CherryKneel.png": +"Models/Robes/SkirtClosedCrotchStrap.png": { - "frame": {"x":586,"y":845,"w":285,"h":85}, + "frame": {"x":3,"y":376,"w":311,"h":218}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":768,"w":285,"h":85}, + "spriteSourceSize": {"x":437,"y":713,"w":311,"h":218}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/InvertedRoseKneel.png": +"Models/Robes/SkirtOverKneelCrotchStrap.png": { - "frame": {"x":906,"y":3,"w":297,"h":102}, + "frame": {"x":1807,"y":1319,"w":238,"h":105}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":754,"w":297,"h":102}, + "spriteSourceSize": {"x":538,"y":801,"w":238,"h":105}, "sourceSize": {"w":1240,"h":1754} }, -"Models/PantiesHigh/Base.png": +"Models/Rope/Arm1Boxtie.png": { - "frame": {"x":1802,"y":248,"w":243,"h":208}, + "frame": {"x":1251,"y":281,"w":305,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":467,"y":711,"w":243,"h":208}, + "spriteSourceSize": {"x":463,"y":575,"w":305,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Calf2KneelClosed.png": +"Models/Rope/Arm1OverBoxtie.png": { - "frame": {"x":287,"y":1204,"w":279,"h":163}, + "frame": {"x":1251,"y":346,"w":305,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":374,"y":885,"w":279,"h":163}, + "spriteSourceSize": {"x":463,"y":575,"w":305,"h":58}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Harness.png": +"Models/Rope/FrogThigh2Kneel.png": { - "frame": {"x":1207,"y":3,"w":296,"h":237}, + "frame": {"x":1163,"y":1854,"w":245,"h":190}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":433,"y":394,"w":296,"h":237}, + "spriteSourceSize": {"x":351,"y":892,"w":245,"h":190}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopCalf2KneelClosed.png": +"Models/Rope/FrogThigh2KneelClosed.png": { - "frame": {"x":844,"y":1567,"w":226,"h":236}, + "frame": {"x":591,"y":1458,"w":288,"h":186}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":427,"y":812,"w":226,"h":236}, + "spriteSourceSize": {"x":365,"y":861,"w":288,"h":186}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopRightThigh3KneelClosed.png": +"Models/RopeOld/ArmsWristtie.png": { - "frame": {"x":1833,"y":1699,"w":212,"h":134}, + "frame": {"x":1224,"y":1022,"w":293,"h":143}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":335,"y":812,"w":212,"h":134}, + "spriteSourceSize": {"x":470,"y":495,"w":293,"h":143}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopThigh3Closed.png": +"Models/Skirts/StripedSkirtUnderKneel.png": { - "frame": {"x":595,"y":446,"w":292,"h":60}, + "frame": {"x":1221,"y":1379,"w":285,"h":183}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":918,"w":292,"h":60}, + "spriteSourceSize": {"x":370,"y":788,"w":285,"h":183}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/ChestFabric.png": +"Models/SMoonlight/RpArmbinder Secure.png": { - "frame": {"x":268,"y":1807,"w":167,"h":237}, + "frame": {"x":3,"y":103,"w":311,"h":269}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":533,"y":413,"w":167,"h":237}, + "spriteSourceSize": {"x":84,"y":300,"w":311,"h":269}, + "sourceSize": {"w":450,"h":675} +}, +"Models/Spats/SpatsClosed.png": +{ + "frame": {"x":1242,"y":650,"w":297,"h":265}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":446,"y":738,"w":297,"h":265}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/ChestFabricTied.png": +"Models/SteelChastity/Bra.png": { - "frame": {"x":439,"y":1807,"w":164,"h":237}, + "frame": {"x":351,"y":1703,"w":278,"h":223}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":533,"y":413,"w":164,"h":237}, + "spriteSourceSize": {"x":440,"y":405,"w":278,"h":223}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/FrillClosed.png": +"Models/SteelCuffs/RimElbowLeftYoked.png": { - "frame": {"x":3,"y":1038,"w":285,"h":131}, + "frame": {"x":1952,"y":1930,"w":93,"h":73}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":755,"w":285,"h":131}, + "spriteSourceSize": {"x":744,"y":499,"w":93,"h":73}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/FrillSpread.png": +"Models/Succubus/bac/SuccubusClawRightFree.png": { - "frame": {"x":3,"y":1038,"w":285,"h":131}, + "frame": {"x":1185,"y":1240,"w":32,"h":114}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":755,"w":285,"h":131}, + "spriteSourceSize": {"x":289,"y":526,"w":32,"h":114}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/Shirt.png": +"Models/Swimsuit/StrappyLower.png": { - "frame": {"x":1742,"y":1837,"w":269,"h":208}, + "frame": {"x":904,"y":1703,"w":255,"h":223}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":526,"w":269,"h":208}, + "spriteSourceSize": {"x":459,"y":696,"w":255,"h":223}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/ShirtKneel.png": +"Models/TapeHeavy/PetsuitTopHands.png": { - "frame": {"x":1742,"y":1837,"w":269,"h":208}, + "frame": {"x":1807,"y":1428,"w":238,"h":93}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":526,"w":269,"h":208}, + "spriteSourceSize": {"x":477,"y":413,"w":238,"h":93}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/StripedSkirtUnderKneel.png": +"Models/TapeHeavy/TopWristtie.png": { - "frame": {"x":3,"y":851,"w":285,"h":183}, + "frame": {"x":633,"y":1703,"w":267,"h":223}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":370,"y":788,"w":285,"h":183}, + "spriteSourceSize": {"x":446,"y":487,"w":267,"h":223}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Spats/SpatsClosed.png": +"Models/TapeLight/ArmLeftBoxtie.png": { - "frame": {"x":3,"y":3,"w":297,"h":265}, + "frame": {"x":3,"y":3,"w":314,"h":96}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":738,"w":297,"h":265}, + "spriteSourceSize": {"x":456,"y":584,"w":314,"h":96}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelChastity/Bra.png": +"Models/TapeLight/ArmStrapLeftBoxtie.png": { - "frame": {"x":1161,"y":1028,"w":278,"h":223}, + "frame": {"x":321,"y":3,"w":313,"h":172}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":405,"w":278,"h":223}, + "spriteSourceSize": {"x":456,"y":438,"w":313,"h":172}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/ChestStrappyFree.png": +"Models/TapeLight/LegsKneel.png": { - "frame": {"x":1764,"y":839,"w":280,"h":212}, + "frame": {"x":638,"y":3,"w":311,"h":258}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":415,"w":280,"h":212}, + "spriteSourceSize": {"x":456,"y":808,"w":311,"h":258}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/ChestStrappyYoked.png": +"Models/TapeLight/PetsuitTopHands.png": { - "frame": {"x":586,"y":1023,"w":280,"h":212}, + "frame": {"x":1807,"y":1428,"w":238,"h":93}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":415,"w":280,"h":212}, + "spriteSourceSize": {"x":477,"y":413,"w":238,"h":93}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/VBikini.png": +"Models/TapeLight/TopCrossed.png": { - "frame": {"x":1792,"y":460,"w":253,"h":200}, + "frame": {"x":1221,"y":1566,"w":285,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":718,"w":253,"h":200}, + "spriteSourceSize": {"x":459,"y":605,"w":285,"h":85}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/HandRightFront.png": +"Models/TapeMed/ArmRightBoxtie.png": { - "frame": {"x":1944,"y":1306,"w":101,"h":108}, + "frame": {"x":1428,"y":1655,"w":78,"h":189}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":488,"y":462,"w":101,"h":108}, + "spriteSourceSize": {"x":446,"y":493,"w":78,"h":189}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/TopCrossed.png": +"Models/TapeMed/ArmStrapLeftBoxtie.png": { - "frame": {"x":586,"y":934,"w":285,"h":85}, + "frame": {"x":321,"y":3,"w":313,"h":172}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":605,"w":285,"h":85}, + "spriteSourceSize": {"x":456,"y":438,"w":313,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/BottomKneel.png": +{ + "frame": {"x":1268,"y":3,"w":311,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":734,"w":311,"h":101}, "sourceSize": {"w":1240,"h":1754} }, "Models/TapeMed/PetsuitTopBody.png": { - "frame": {"x":1497,"y":472,"w":290,"h":271}, + "frame": {"x":3,"y":1433,"w":290,"h":271}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":469,"y":441,"w":290,"h":271}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/Corset.png": +"Models/TapeMed/PetsuitTopHands.png": { - "frame": {"x":1433,"y":1306,"w":254,"h":138}, + "frame": {"x":1807,"y":1428,"w":238,"h":93}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":645,"w":254,"h":138}, + "spriteSourceSize": {"x":477,"y":413,"w":238,"h":93}, "sourceSize": {"w":1240,"h":1754} }, "Models/Witch/SkirtBeltClosed.png": { - "frame": {"x":3,"y":552,"w":292,"h":85}, + "frame": {"x":892,"y":1104,"w":292,"h":85}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":447,"y":735,"w":292,"h":85}, "sourceSize": {"w":1240,"h":1754} }, +"Models/Wolf/BandAnkleLeftKneel.png": +{ + "frame": {"x":1752,"y":1854,"w":40,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":716,"y":958,"w":40,"h":63}, + "sourceSize": {"w":1240,"h":1754} +}, "Models/Wolf/HarnessLowerKneel.png": { - "frame": {"x":3,"y":424,"w":292,"h":124}, + "frame": {"x":300,"y":1101,"w":292,"h":124}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":446,"y":743,"w":292,"h":124}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/TorsoLowerBandClosed.png": +"Models/Wolf/HarnessUpper.png": { - "frame": {"x":299,"y":432,"w":292,"h":124}, + "frame": {"x":1799,"y":1525,"w":246,"h":146}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":802,"w":292,"h":124}, + "spriteSourceSize": {"x":477,"y":412,"w":246,"h":146}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/TorsoLowerBandKneel.png": +"Models/Wolf/Panties.png": { - "frame": {"x":3,"y":272,"w":292,"h":148}, + "frame": {"x":306,"y":642,"w":293,"h":245}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":762,"w":292,"h":148}, + "spriteSourceSize": {"x":447,"y":673,"w":293,"h":245}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/ShirtChestUp.png": +"Models/Wolf/PantiesClosed.png": { - "frame": {"x":1507,"y":3,"w":291,"h":269}, + "frame": {"x":3,"y":861,"w":293,"h":244}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":361,"w":291,"h":269}, + "spriteSourceSize": {"x":447,"y":673,"w":293,"h":244}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/WaistPattern.png": +"Models/WolfCatsuit/GloveLeftFront.png": { - "frame": {"x":1152,"y":1255,"w":277,"h":189}, + "frame": {"x":1820,"y":1059,"w":225,"h":256}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":620,"w":277,"h":189}, + "spriteSourceSize": {"x":548,"y":465,"w":225,"h":256}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoLowerBand.png": +{ + "frame": {"x":1560,"y":394,"w":299,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":802,"w":299,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/TorsoLowerBandClosed.png": +{ + "frame": {"x":3,"y":1109,"w":292,"h":124}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":448,"y":802,"w":292,"h":124}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/ShirtChestUp.png": +{ + "frame": {"x":596,"y":1185,"w":291,"h":269}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":361,"w":291,"h":269}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -759,7 +831,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas35.webp b/TextureAtlas/atlas35.webp index a78bef78e..45e84807f 100644 Binary files a/TextureAtlas/atlas35.webp and b/TextureAtlas/atlas35.webp differ diff --git a/TextureAtlas/atlas36.json b/TextureAtlas/atlas36.json index 47521be1f..2eafc1fd6 100644 --- a/TextureAtlas/atlas36.json +++ b/TextureAtlas/atlas36.json @@ -1,1120 +1,864 @@ {"frames": { -"Models/Bandit/ShoeRightClosed.png": +"Models/ArmorChain/ShirtChest.png": { - "frame": {"x":1309,"y":442,"w":146,"h":189}, + "frame": {"x":1418,"y":499,"w":275,"h":207}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":1433,"w":146,"h":189}, + "spriteSourceSize": {"x":445,"y":418,"w":275,"h":207}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ShortsLeftClosed.png": +"Models/ArmorChain/ShirtChestFree.png": { - "frame": {"x":1888,"y":3,"w":157,"h":178}, + "frame": {"x":575,"y":3,"w":282,"h":213}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":587,"y":771,"w":157,"h":178}, + "spriteSourceSize": {"x":445,"y":412,"w":282,"h":213}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/WristRightYoked.png": +"Models/ArmorChain/ShirtChestHogtie.png": { - "frame": {"x":334,"y":2010,"w":52,"h":35}, + "frame": {"x":3,"y":265,"w":278,"h":208}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":315,"y":392,"w":52,"h":35}, + "spriteSourceSize": {"x":445,"y":417,"w":278,"h":208}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/ArmLeftBoxtie.png": +"Models/ArmorChain/ShirtChestUp.png": { - "frame": {"x":156,"y":1161,"w":109,"h":280}, + "frame": {"x":289,"y":226,"w":278,"h":225}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":662,"y":404,"w":109,"h":280}, + "spriteSourceSize": {"x":444,"y":400,"w":278,"h":225}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/Head.png": +"Models/ArmorPlate/BootLeftHogtie.png": { - "frame": {"x":535,"y":1723,"w":218,"h":274}, + "frame": {"x":1992,"y":638,"w":52,"h":166}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":505,"y":120,"w":218,"h":274}, + "spriteSourceSize": {"x":680,"y":972,"w":52,"h":166}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/HeadGag.png": +"Models/Bandit/Breastplate.png": { - "frame": {"x":313,"y":1729,"w":218,"h":277}, + "frame": {"x":575,"y":220,"w":278,"h":246}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":505,"y":120,"w":218,"h":277}, + "spriteSourceSize": {"x":440,"y":420,"w":278,"h":246}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/HeadNoEar.png": +"Models/Bandit/BreastplateHogtie.png": { - "frame": {"x":175,"y":582,"w":216,"h":274}, + "frame": {"x":838,"y":922,"w":272,"h":217}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":505,"y":120,"w":216,"h":274}, + "spriteSourceSize": {"x":445,"y":414,"w":272,"h":217}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/HeadNoEarGag.png": +"Models/Bandit/KneeKneel.png": { - "frame": {"x":346,"y":1442,"w":216,"h":277}, + "frame": {"x":1122,"y":1934,"w":126,"h":110}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":505,"y":120,"w":216,"h":277}, + "spriteSourceSize": {"x":382,"y":977,"w":126,"h":110}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/ForeGloveRightFront.png": +"Models/Bandit/PouchClosed.png": { - "frame": {"x":494,"y":1137,"w":169,"h":268}, + "frame": {"x":377,"y":1669,"w":171,"h":173}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":417,"y":461,"w":169,"h":268}, + "spriteSourceSize": {"x":413,"y":939,"w":171,"h":173}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/GloveLeftUp.png": +"Models/Belts/Legs1Closed.png": { - "frame": {"x":526,"y":860,"w":168,"h":267}, + "frame": {"x":1431,"y":421,"w":277,"h":74}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":664,"y":167,"w":168,"h":267}, + "spriteSourceSize": {"x":457,"y":964,"w":277,"h":74}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/GloveRightFront.png": +"Models/Belts/RightArm1Boxtie.png": { - "frame": {"x":501,"y":556,"w":162,"h":270}, + "frame": {"x":2005,"y":174,"w":40,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":424,"y":461,"w":162,"h":270}, + "spriteSourceSize": {"x":461,"y":486,"w":40,"h":43}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/GloveRightUp.png": +"Models/Belts/RightArm1Wristtie.png": { - "frame": {"x":667,"y":549,"w":144,"h":266}, + "frame": {"x":2005,"y":174,"w":40,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":162,"w":144,"h":266}, + "spriteSourceSize": {"x":461,"y":486,"w":40,"h":43}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/SockRightHogtie.png": +"Models/Blindfold/Basic.png": { - "frame": {"x":3,"y":295,"w":153,"h":288}, + "frame": {"x":1658,"y":1755,"w":194,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":919,"w":153,"h":288}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Catsuit/ArmLeftBoxtie.png": -{ - "frame": {"x":233,"y":1445,"w":109,"h":280}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":662,"y":404,"w":109,"h":280}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Catsuit/ArmLeftYoked.png": -{ - "frame": {"x":911,"y":1437,"w":273,"h":255}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":663,"y":381,"w":273,"h":255}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Catsuit/ArmRightFree.png": -{ - "frame": {"x":262,"y":289,"w":187,"h":274}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":337,"y":432,"w":187,"h":274}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Catsuit/Chest.png": -{ - "frame": {"x":1459,"y":839,"w":267,"h":114}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":446,"y":513,"w":267,"h":114}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Catsuit/FootLeftKneelClosed.png": -{ - "frame": {"x":1886,"y":1461,"w":159,"h":83}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":726,"y":903,"w":159,"h":83}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":47,"y":152,"w":194,"h":72}, + "sourceSize": {"w":321,"h":332} }, -"Models/Catsuit/LegLeftHogtie.png": +"Models/Bra/Cherry.png": { - "frame": {"x":3,"y":3,"w":163,"h":288}, + "frame": {"x":853,"y":1934,"w":265,"h":110}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":578,"y":919,"w":163,"h":288}, + "spriteSourceSize": {"x":447,"y":514,"w":265,"h":110}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraProtoDisplay.png": +"Models/Bra/Rose.png": { - "frame": {"x":1760,"y":1212,"w":123,"h":55}, + "frame": {"x":377,"y":1934,"w":265,"h":111}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":509,"y":562,"w":123,"h":55}, + "spriteSourceSize": {"x":448,"y":514,"w":265,"h":111}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Collars/FutureRim.png": +"Models/Catsuit/ShoulderRightUp.png": { - "frame": {"x":1998,"y":1887,"w":47,"h":33}, + "frame": {"x":1547,"y":1755,"w":107,"h":109}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":588,"y":397,"w":47,"h":33}, + "spriteSourceSize": {"x":475,"y":397,"w":107,"h":109}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Corsets/ChestHeavyCorset.png": +"Models/Chastity/BraCyber.png": { - "frame": {"x":1397,"y":319,"w":268,"h":119}, + "frame": {"x":1114,"y":1125,"w":271,"h":236}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":507,"w":268,"h":119}, + "spriteSourceSize": {"x":446,"y":410,"w":271,"h":236}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/ElbowLeftUp.png": +"Models/Chastity/BraProtoCups.png": { - "frame": {"x":1669,"y":749,"w":114,"h":72}, + "frame": {"x":567,"y":470,"w":277,"h":99}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":717,"y":249,"w":114,"h":72}, + "spriteSourceSize": {"x":443,"y":543,"w":277,"h":99}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/SteelCollarRunes.png": +"Models/Chastity/BraProtoLiningMid.png": { - "frame": {"x":3,"y":2017,"w":93,"h":26}, + "frame": {"x":1671,"y":1227,"w":270,"h":94}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":578,"y":396,"w":93,"h":26}, + "spriteSourceSize": {"x":446,"y":572,"w":270,"h":94}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/SteelCollarRunes.png": +"Models/Chastity/BraProtoLiningMidZip.png": { - "frame": {"x":3,"y":2017,"w":93,"h":26}, + "frame": {"x":1389,"y":1277,"w":270,"h":94}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":578,"y":396,"w":93,"h":26}, + "spriteSourceSize": {"x":446,"y":572,"w":270,"h":94}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/CuffLongMittenRightYoked.png": +"Models/Chastity/BraProtoLiningZipRim.png": { - "frame": {"x":1669,"y":1542,"w":172,"h":148}, + "frame": {"x":554,"y":1396,"w":270,"h":226}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":312,"y":393,"w":172,"h":148}, + "spriteSourceSize": {"x":446,"y":413,"w":270,"h":226}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/ForeLongMittenLeftFront.png": +"Models/Chastity/CyberPantiesClosed.png": { - "frame": {"x":1459,"y":1118,"w":185,"h":251}, + "frame": {"x":1685,"y":834,"w":273,"h":173}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":574,"y":470,"w":185,"h":251}, + "spriteSourceSize": {"x":453,"y":744,"w":273,"h":173}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/ForeLongMittenRightFront.png": +"Models/Chastity/ProtoLining.png": { - "frame": {"x":911,"y":541,"w":161,"h":259}, + "frame": {"x":3,"y":477,"w":278,"h":89}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":424,"y":462,"w":161,"h":259}, + "spriteSourceSize": {"x":452,"y":762,"w":278,"h":89}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/GlowLongMittenLeftBoxtie.png": +"Models/Corsets/StrapsHeavyCorset.png": { - "frame": {"x":1309,"y":264,"w":84,"h":83}, + "frame": {"x":1630,"y":1616,"w":222,"h":135}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":725,"y":493,"w":84,"h":83}, + "spriteSourceSize": {"x":498,"y":407,"w":222,"h":135}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/LongMittenLeftFree.png": +"Models/CyberArms/CuffLongMittenLeftUp.png": { - "frame": {"x":323,"y":3,"w":138,"h":274}, + "frame": {"x":1085,"y":1868,"w":110,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":702,"y":512,"w":138,"h":274}, + "spriteSourceSize": {"x":690,"y":360,"w":110,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/LongMittenLeftUp.png": +"Models/CyberArms/GlowLongMittenRightFree.png": { - "frame": {"x":1224,"y":3,"w":169,"h":257}, + "frame": {"x":1962,"y":960,"w":82,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":664,"y":165,"w":169,"h":257}, + "spriteSourceSize": {"x":314,"y":630,"w":82,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenElbowLeftFree.png": +"Models/CyberCuffs/DisplayBelt.png": { - "frame": {"x":1845,"y":1525,"w":37,"h":59}, + "frame": {"x":2003,"y":354,"w":42,"h":51}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":752,"y":581,"w":37,"h":59}, + "spriteSourceSize": {"x":548,"y":694,"w":42,"h":51}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenWristRightCrossed.png": +"Models/CyberCuffs/DisplayThighRightClosed.png": { - "frame": {"x":163,"y":2017,"w":54,"h":26}, + "frame": {"x":2005,"y":64,"w":40,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":648,"y":588,"w":54,"h":26}, + "spriteSourceSize": {"x":479,"y":1028,"w":40,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ThighLeftSpread.png": +"Models/CyberCuffs/ElbowLeftBoxtie.png": { - "frame": {"x":1888,"y":283,"w":156,"h":88}, + "frame": {"x":1309,"y":1868,"w":89,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":607,"y":977,"w":156,"h":88}, + "spriteSourceSize": {"x":686,"y":568,"w":89,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberHeels/GlowBalletLeftKneel.png": +"Models/CyberCuffs/ThighLeftKneelClosed.png": { - "frame": {"x":1239,"y":635,"w":216,"h":75}, + "frame": {"x":1407,"y":710,"w":274,"h":167}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":725,"y":932,"w":216,"h":75}, + "spriteSourceSize": {"x":375,"y":840,"w":274,"h":167}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/ArmLongMittenLeftFree.png": +"Models/CyberCuffs/ThighRightClosed.png": { - "frame": {"x":323,"y":3,"w":138,"h":274}, + "frame": {"x":246,"y":1868,"w":127,"h":87}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":702,"y":512,"w":138,"h":274}, + "spriteSourceSize": {"x":463,"y":1002,"w":127,"h":87}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/ArmLongMittenLeftUp.png": +"Models/CyberMitts/ForeMittenLeftFront.png": { - "frame": {"x":1224,"y":3,"w":169,"h":257}, + "frame": {"x":1945,"y":1240,"w":100,"h":99}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":664,"y":165,"w":169,"h":257}, + "spriteSourceSize": {"x":574,"y":470,"w":100,"h":99}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CapForeLongMittenLeftFront.png": +"Models/CyberMitts/GlowLongMittenRightFree.png": { - "frame": {"x":1309,"y":351,"w":84,"h":72}, + "frame": {"x":1962,"y":960,"w":82,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":570,"y":457,"w":84,"h":72}, + "spriteSourceSize": {"x":314,"y":630,"w":82,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/ForeLongMittenLeftFront.png": +"Models/CyberMitts/UpperCuffLongMittenLeftUp.png": { - "frame": {"x":1459,"y":1118,"w":185,"h":251}, + "frame": {"x":1085,"y":1868,"w":110,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":574,"y":470,"w":185,"h":251}, + "spriteSourceSize": {"x":690,"y":360,"w":110,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/ForeLongMittenRightFront.png": +"Models/CyberPetsuit/LeftLegsBeltsKneel.png": { - "frame": {"x":911,"y":541,"w":161,"h":259}, + "frame": {"x":1120,"y":900,"w":272,"h":221}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":424,"y":462,"w":161,"h":259}, + "spriteSourceSize": {"x":468,"y":853,"w":272,"h":221}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/LongMittenLeftUp.png": +"Models/DivineCuffs/CollarLockPlate.png": { - "frame": {"x":1224,"y":3,"w":169,"h":257}, + "frame": {"x":2003,"y":294,"w":42,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":664,"y":165,"w":169,"h":257}, + "spriteSourceSize": {"x":598,"y":380,"w":42,"h":56}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperGlowLongMittenLeftBoxtie.png": +"Models/DivineCuffs/ElbowRightFront.png": { - "frame": {"x":1309,"y":264,"w":84,"h":83}, + "frame": {"x":1958,"y":1035,"w":87,"h":73}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":725,"y":493,"w":84,"h":83}, + "spriteSourceSize": {"x":430,"y":586,"w":87,"h":73}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberPetsuit/DisplayLegsKneel.png": +"Models/DivineCuffs/ThighRightLockKneel.png": { - "frame": {"x":1887,"y":1215,"w":158,"h":138}, + "frame": {"x":1981,"y":1759,"w":64,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":371,"y":761,"w":158,"h":138}, + "spriteSourceSize": {"x":420,"y":826,"w":64,"h":66}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberPetsuit/DisplayLegsKneelClosed.png": +"Models/DivineGag/MuzzleHarness.png": { - "frame": {"x":1887,"y":1215,"w":158,"h":138}, + "frame": {"x":3,"y":1868,"w":144,"h":177}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":371,"y":761,"w":158,"h":138}, + "spriteSourceSize": {"x":523,"y":124,"w":144,"h":177}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/SteelCollarRunes.png": +"Models/Dress/BlouseBustBoxtieChesttied.png": { - "frame": {"x":3,"y":2017,"w":93,"h":26}, + "frame": {"x":842,"y":787,"w":274,"h":131}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":578,"y":396,"w":93,"h":26}, + "spriteSourceSize": {"x":444,"y":497,"w":274,"h":131}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighLeftLockKneel.png": +"Models/Dress/BlouseBustUpChesttied.png": { - "frame": {"x":1899,"y":1887,"w":95,"h":57}, + "frame": {"x":560,"y":869,"w":274,"h":114}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":480,"y":838,"w":95,"h":57}, + "spriteSourceSize": {"x":444,"y":514,"w":274,"h":114}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighLeftLockKneelClosed.png": +"Models/Dress/BlouseCollar.png": { - "frame": {"x":1899,"y":1887,"w":95,"h":57}, + "frame": {"x":1681,"y":1011,"w":273,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":480,"y":838,"w":95,"h":57}, + "spriteSourceSize": {"x":481,"y":409,"w":273,"h":72}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighRightSpread.png": +"Models/Dress/BlouseCollarUp.png": { - "frame": {"x":1473,"y":1373,"w":153,"h":60}, + "frame": {"x":1044,"y":1755,"w":206,"h":109}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":1029,"w":153,"h":60}, + "spriteSourceSize": {"x":521,"y":341,"w":206,"h":109}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineGag/MuzzleGold.png": +"Models/Dress/BowCorset.png": { - "frame": {"x":1669,"y":573,"w":114,"h":84}, + "frame": {"x":1396,"y":1018,"w":271,"h":255}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":572,"y":281,"w":114,"h":84}, + "spriteSourceSize": {"x":445,"y":567,"w":271,"h":255}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineGag/MuzzleGoldClean.png": +"Models/Dress/BowCorsetBust.png": { - "frame": {"x":1669,"y":661,"w":114,"h":84}, + "frame": {"x":832,"y":1363,"w":271,"h":146}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":572,"y":281,"w":114,"h":84}, + "spriteSourceSize": {"x":445,"y":500,"w":271,"h":146}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseArmLeftFront.png": +"Models/Dress/BowCorsetRuffle.png": { - "frame": {"x":1022,"y":266,"w":121,"h":259}, + "frame": {"x":861,"y":213,"w":280,"h":89}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":656,"y":440,"w":121,"h":259}, + "spriteSourceSize": {"x":447,"y":746,"w":280,"h":89}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseArmRightFront.png": +"Models/Dress/MageBra.png": { - "frame": {"x":3,"y":1733,"w":153,"h":280}, + "frame": {"x":279,"y":1277,"w":271,"h":186}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":409,"y":440,"w":153,"h":280}, + "spriteSourceSize": {"x":445,"y":443,"w":271,"h":186}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseArmRightYoked.png": +"Models/Dress/ShoeRightSpread.png": { - "frame": {"x":309,"y":860,"w":213,"h":273}, + "frame": {"x":1927,"y":1831,"w":118,"h":144}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":286,"y":356,"w":213,"h":273}, + "spriteSourceSize": {"x":490,"y":1498,"w":118,"h":144}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseCollarBoxtie.png": +"Models/Ears/ElfBack.png": { - "frame": {"x":1189,"y":791,"w":266,"h":60}, + "frame": {"x":1199,"y":1868,"w":106,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":479,"y":425,"w":266,"h":60}, + "spriteSourceSize": {"x":454,"y":274,"w":106,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BowCorset.png": +"Models/Ears/ElfFloppyFront.png": { - "frame": {"x":923,"y":1696,"w":271,"h":255}, + "frame": {"x":1502,"y":1934,"w":152,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":567,"w":271,"h":255}, + "spriteSourceSize": {"x":655,"y":266,"w":152,"h":72}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/LaceChestStripes.png": +"Models/Ears/ElfLongBack.png": { - "frame": {"x":1787,"y":609,"w":256,"h":63}, + "frame": {"x":1856,"y":1759,"w":121,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":513,"w":256,"h":63}, + "spriteSourceSize": {"x":439,"y":269,"w":121,"h":68}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/LaceCrotchPanelTrim.png": +"Models/Ears/Wolf.png": { - "frame": {"x":1397,"y":3,"w":268,"h":167}, + "frame": {"x":3,"y":1296,"w":271,"h":185}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":754,"w":268,"h":167}, + "spriteSourceSize": {"x":479,"y":27,"w":271,"h":185}, "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesDai1/Brows2Annoyed.png": +"Models/EyesDai2/Brows2Angry.png": { - "frame": {"x":390,"y":2010,"w":51,"h":35}, + "frame": {"x":1992,"y":603,"w":53,"h":31}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":603,"y":234,"w":51,"h":35}, - "sourceSize": {"w":717,"h":405} + "spriteSourceSize": {"x":588,"y":249,"w":53,"h":31}, + "sourceSize": {"w":703,"h":355} }, -"Models/EyesDai1/BrowsAnnoyed.png": +"Models/EyesK3/Eyes2Surprised.png": { - "frame": {"x":588,"y":1409,"w":46,"h":24}, + "frame": {"x":1663,"y":1325,"w":64,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":531,"y":247,"w":46,"h":24}, - "sourceSize": {"w":765,"h":427} -}, -"Models/EyesDai1/BrowsSad.png": -{ - "frame": {"x":494,"y":1409,"w":44,"h":26}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":530,"y":254,"w":44,"h":26}, - "sourceSize": {"w":806,"h":515} -}, -"Models/EyesDai2/Brows2Neutral.png": -{ - "frame": {"x":614,"y":830,"w":48,"h":24}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":604,"y":237,"w":48,"h":24}, - "sourceSize": {"w":725,"h":424} -}, -"Models/EyesDai2/BrowsAngry.png": -{ - "frame": {"x":501,"y":830,"w":46,"h":26}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":543,"y":254,"w":46,"h":26}, - "sourceSize": {"w":693,"h":407} -}, -"Models/EyesK3/EyesAngry.png": -{ - "frame": {"x":445,"y":2010,"w":51,"h":35}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":530,"y":278,"w":51,"h":35}, + "spriteSourceSize": {"x":616,"y":258,"w":64,"h":46}, "sourceSize": {"w":781,"h":560} }, -"Models/EyesK3/EyesDazed.png": +"Models/EyesK3/WhitesEyes2Surprised.png": { - "frame": {"x":772,"y":819,"w":47,"h":35}, + "frame": {"x":1731,"y":1325,"w":64,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":530,"y":278,"w":47,"h":35}, + "spriteSourceSize": {"x":616,"y":258,"w":64,"h":46}, "sourceSize": {"w":781,"h":560} }, -"Models/EyesK3/WhitesEyesAngry.png": +"Models/FaceDask/WhitesEyesAngry.png": { - "frame": {"x":500,"y":2010,"w":51,"h":35}, + "frame": {"x":1992,"y":462,"w":53,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":530,"y":278,"w":51,"h":35}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK3/WhitesEyesDazed.png": -{ - "frame": {"x":688,"y":1398,"w":47,"h":35}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":530,"y":278,"w":47,"h":35}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK4/Eyes2Closed.png": -{ - "frame": {"x":551,"y":830,"w":59,"h":24}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":620,"y":275,"w":59,"h":24}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK4/Eyes2Surprised.png": -{ - "frame": {"x":555,"y":2001,"w":70,"h":44}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":614,"y":264,"w":70,"h":44}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK4/WhitesEyes2Closed.png": -{ - "frame": {"x":551,"y":830,"w":59,"h":24}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":620,"y":275,"w":59,"h":24}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK4/WhitesEyes2Neutral.png": -{ - "frame": {"x":629,"y":2001,"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":703,"y":2001,"w":70,"h":44}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":614,"y":264,"w":70,"h":44}, - "sourceSize": {"w":781,"h":560} -}, -"Models/FaceKoi/BlushHigh.png": -{ - "frame": {"x":1305,"y":1375,"w":164,"h":58}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":49,"y":188,"w":164,"h":58}, - "sourceSize": {"w":321,"h":332} -}, -"Models/FaceKoi/BlushLow.png": -{ - "frame": {"x":1888,"y":461,"w":153,"h":57}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":56,"y":187,"w":153,"h":57}, + "spriteSourceSize": {"x":51,"y":173,"w":53,"h":43}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoi/Brows2Angry.png": +"Models/FaceKjus/EyesSurprised.png": { - "frame": {"x":638,"y":1409,"w":46,"h":24}, + "frame": {"x":1992,"y":509,"w":53,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":142,"y":124,"w":46,"h":24}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":527,"y":270,"w":53,"h":43}, + "sourceSize": {"w":791,"h":501} }, -"Models/Fiddle/FiddleLines.png": +"Models/FaceKjus/WhitesEyesSurprised.png": { - "frame": {"x":1669,"y":116,"w":215,"h":106}, + "frame": {"x":1992,"y":556,"w":53,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":476,"y":521,"w":215,"h":106}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":527,"y":270,"w":53,"h":43}, + "sourceSize": {"w":791,"h":501} }, -"Models/FutureHarness/StrapsMid.png": +"Models/FutureHarness/DisplayChest.png": { - "frame": {"x":1189,"y":855,"w":248,"h":98}, + "frame": {"x":2003,"y":409,"w":42,"h":49}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":665,"w":248,"h":98}, + "spriteSourceSize": {"x":559,"y":488,"w":42,"h":49}, "sourceSize": {"w":1240,"h":1754} }, -"Models/GagFrilly/FrillyHighlights.png": -{ - "frame": {"x":866,"y":275,"w":152,"h":262}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":71,"y":19,"w":152,"h":262}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagFrilly/FrillyStraps.png": +"Models/GagLeather/Whiskers.png": { - "frame": {"x":667,"y":1131,"w":153,"h":263}, + "frame": {"x":1502,"y":2010,"w":127,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":70,"y":18,"w":153,"h":263}, + "spriteSourceSize": {"x":76,"y":222,"w":127,"h":35}, "sourceSize": {"w":321,"h":332} }, -"Models/GagLatex/NeckCorset2.png": -{ - "frame": {"x":1046,"y":1955,"w":115,"h":90}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":562,"y":354,"w":115,"h":90}, - "sourceSize": {"w":784,"h":486} -}, -"Models/GagLatex/NeckCorsetRim2.png": +"Models/Hair/Braid_Overstrap.png": { - "frame": {"x":1669,"y":484,"w":114,"h":85}, + "frame": {"x":282,"y":856,"w":274,"h":278}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":562,"y":358,"w":114,"h":85}, - "sourceSize": {"w":763,"h":476} -}, -"Models/GagLeather/BallHarnessLarge.png": -{ - "frame": {"x":160,"y":1733,"w":149,"h":280}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":68,"y":9,"w":149,"h":280}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagLeather/LargeBallHarness.png": -{ - "frame": {"x":170,"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/BallHarnessLarge.png": -{ - "frame": {"x":3,"y":877,"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":156,"y":877,"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":3,"y":1163,"w":149,"h":282}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":68,"y":9,"w":149,"h":282}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagMetal/BallStrap.png": -{ - "frame": {"x":1632,"y":1072,"w":149,"h":42}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":68,"y":233,"w":149,"h":42}, - "sourceSize": {"w":321,"h":332} -}, -"Models/Hair/BraidCustom.png": -{ - "frame": {"x":465,"y":3,"w":273,"h":270}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":469,"y":117,"w":273,"h":270}, + "spriteSourceSize": {"x":469,"y":104,"w":274,"h":278}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/MaidHairband.png": +"Models/Hair/Fuzzy_Overstrap.png": { - "frame": {"x":1543,"y":1949,"w":221,"h":96}, + "frame": {"x":1816,"y":1343,"w":229,"h":260}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":500,"y":119,"w":221,"h":96}, + "spriteSourceSize": {"x":489,"y":136,"w":229,"h":260}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair6_Left.png": +"Models/Hair/Hairband.png": { - "frame": {"x":1648,"y":1118,"w":108,"h":250}, + "frame": {"x":3,"y":1675,"w":220,"h":189}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":699,"y":107,"w":108,"h":250}, + "spriteSourceSize": {"x":500,"y":124,"w":220,"h":189}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair6_Right.png": +"Models/Handcuffs/Irish8CuffsFront.png": { - "frame": {"x":1787,"y":1694,"w":108,"h":250}, + "frame": {"x":552,"y":1868,"w":238,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":435,"y":107,"w":108,"h":250}, + "spriteSourceSize": {"x":466,"y":526,"w":238,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/LeatherLegLeftHogtie.png": +"Models/Harness/BeltsOverbust.png": { - "frame": {"x":3,"y":587,"w":168,"h":286}, + "frame": {"x":744,"y":1934,"w":55,"h":111}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":575,"y":924,"w":168,"h":286}, + "spriteSourceSize": {"x":556,"y":505,"w":55,"h":111}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/LeatherLegRightKneel.png": +"Models/Harness/HardwareMid.png": { - "frame": {"x":1198,"y":1695,"w":152,"h":254}, + "frame": {"x":1580,"y":1868,"w":72,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":313,"y":830,"w":152,"h":254}, + "spriteSourceSize": {"x":537,"y":648,"w":72,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/TallLegRightKneel.png": +"Models/Harness/HardwareStrap.png": { - "frame": {"x":1013,"y":3,"w":207,"h":259}, + "frame": {"x":2005,"y":3,"w":40,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":313,"y":811,"w":207,"h":259}, + "spriteSourceSize": {"x":552,"y":693,"w":40,"h":57}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/TallLegRightKneelClosed.png": +"Models/Heels/ShinyBalletLeftKneel.png": { - "frame": {"x":1188,"y":1437,"w":206,"h":254}, + "frame": {"x":285,"y":455,"w":278,"h":146}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":314,"y":811,"w":206,"h":254}, + "spriteSourceSize": {"x":652,"y":906,"w":278,"h":146}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hood/Blindfold.png": -{ - "frame": {"x":1239,"y":714,"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": +"Models/Hood/WolfEars.png": { - "frame": {"x":1888,"y":375,"w":156,"h":82}, + "frame": {"x":3,"y":1485,"w":270,"h":186}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":533,"y":311,"w":156,"h":82}, + "spriteSourceSize": {"x":480,"y":32,"w":270,"h":186}, "sourceSize": {"w":752,"h":479} }, -"Models/Jacket/BeltsArmsWristtie.png": -{ - "frame": {"x":799,"y":1398,"w":55,"h":34}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":686,"y":597,"w":55,"h":34}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Kigu/Mask.png": -{ - "frame": {"x":269,"y":1161,"w":221,"h":277}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":503,"y":118,"w":221,"h":277}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/LeatherCuffs/AnkleLeftClosed.png": -{ - "frame": {"x":1787,"y":1271,"w":96,"h":54}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":579,"y":1427,"w":96,"h":54}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/LeatherCuffs/BandAnkleRightClosed.png": +"Models/Jacket/BeltsTorsoLowerCrossed.png": { - "frame": {"x":100,"y":2017,"w":59,"h":26}, + "frame": {"x":289,"y":3,"w":282,"h":219}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":538,"y":1438,"w":59,"h":26}, + "spriteSourceSize": {"x":449,"y":665,"w":282,"h":219}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandElbowLeftWristtie.png": +"Models/Jacket/StrapsTorsoLowerCrossed.png": { - "frame": {"x":666,"y":830,"w":47,"h":24}, + "frame": {"x":3,"y":3,"w":282,"h":258}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":687,"y":620,"w":47,"h":24}, + "spriteSourceSize": {"x":449,"y":665,"w":282,"h":258}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandThighLeftKneel.png": +"Models/KittyLatex/KittyLatexEar.png": { - "frame": {"x":1888,"y":1948,"w":148,"h":97}, + "frame": {"x":278,"y":1467,"w":270,"h":198}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":488,"y":860,"w":148,"h":97}, + "spriteSourceSize": {"x":482,"y":44,"w":270,"h":198}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherLeotard/StrapsLowerCleanClosed.png": +"Models/KittyLatex/KittyLatexEarMuff.png": { - "frame": {"x":3,"y":1449,"w":226,"h":280}, + "frame": {"x":284,"y":605,"w":275,"h":247}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":473,"y":639,"w":226,"h":280}, + "spriteSourceSize": {"x":476,"y":110,"w":275,"h":247}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ArmRightBoxtie.png": +"Models/Leash/LeashHogtie.png": { - "frame": {"x":698,"y":858,"w":109,"h":263}, + "frame": {"x":1107,"y":1365,"w":269,"h":247}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":424,"w":109,"h":263}, + "spriteSourceSize": {"x":343,"y":436,"w":269,"h":247}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/BandLeftFree.png": +"Models/LeatherCuffs/ThighLeftKneelClosed.png": { - "frame": {"x":717,"y":819,"w":51,"h":35}, + "frame": {"x":1856,"y":1607,"w":189,"h":148}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":804,"y":760,"w":51,"h":35}, + "spriteSourceSize": {"x":469,"y":847,"w":189,"h":148}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/BandRightYoked.png": +"Models/LeatherCuffs/ThighRightKneel.png": { - "frame": {"x":739,"y":1398,"w":56,"h":34}, + "frame": {"x":794,"y":1868,"w":142,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":313,"y":393,"w":56,"h":34}, + "spriteSourceSize": {"x":371,"y":831,"w":142,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LongMittenLeftUp.png": +"Models/LeatherCuffs/ThighRightKneelClosed.png": { - "frame": {"x":526,"y":860,"w":168,"h":267}, + "frame": {"x":940,"y":1868,"w":141,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":664,"y":167,"w":168,"h":267}, + "spriteSourceSize": {"x":371,"y":831,"w":141,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LongMittenRightUp.png": +"Models/LeatherLeotard/Leotard.png": { - "frame": {"x":667,"y":549,"w":144,"h":266}, + "frame": {"x":1380,"y":1375,"w":261,"h":237}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":162,"w":144,"h":266}, + "spriteSourceSize": {"x":457,"y":720,"w":261,"h":237}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/KneeLeftKneel.png": +"Models/LeatherPetsuit/LeftLegsHardwareKneel.png": { - "frame": {"x":1888,"y":817,"w":155,"h":136}, + "frame": {"x":246,"y":1959,"w":111,"h":86}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":384,"y":952,"w":155,"h":136}, + "spriteSourceSize": {"x":567,"y":970,"w":111,"h":86}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/KneeLeftKneelClosed.png": +"Models/LeatherPetsuit/LeftLegsHardwareKneelClosed.png": { - "frame": {"x":1888,"y":817,"w":155,"h":136}, + "frame": {"x":246,"y":1959,"w":111,"h":86}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":384,"y":952,"w":155,"h":136}, + "spriteSourceSize": {"x":567,"y":970,"w":111,"h":86}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/ShoeRightClosed.png": +"Models/LeatherPetsuit/LegsHardwareHogtie.png": { - "frame": {"x":1787,"y":1140,"w":97,"h":68}, + "frame": {"x":803,"y":1934,"w":46,"h":111}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":1561,"w":97,"h":68}, + "spriteSourceSize": {"x":692,"y":1010,"w":46,"h":111}, "sourceSize": {"w":1240,"h":1754} }, -"Models/OperaGloves/ForeGloveRightFront.png": +"Models/Maid/BlouseBust.png": { - "frame": {"x":1017,"y":858,"w":168,"h":256}, + "frame": {"x":1404,"y":881,"w":273,"h":133}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":423,"y":461,"w":168,"h":256}, + "spriteSourceSize": {"x":442,"y":494,"w":273,"h":133}, "sourceSize": {"w":1240,"h":1754} }, -"Models/OperaGloves/GloveRightFront.png": +"Models/MaidKnightLight/ApronChest.png": { - "frame": {"x":1015,"y":1124,"w":169,"h":256}, + "frame": {"x":1433,"y":3,"w":282,"h":198}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":423,"y":461,"w":169,"h":256}, + "spriteSourceSize": {"x":481,"y":403,"w":282,"h":198}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Pony/CollarTagHogtie.png": +"Models/MaidKnightLight/ApronChestBoxtie.png": { - "frame": {"x":542,"y":1409,"w":42,"h":26}, + "frame": {"x":861,"y":3,"w":282,"h":206}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":578,"y":406,"w":42,"h":26}, + "spriteSourceSize": {"x":481,"y":403,"w":282,"h":206}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Belt.png": +"Models/MaidKnightLight/ApronChestFront.png": { - "frame": {"x":1085,"y":1384,"w":216,"h":49}, + "frame": {"x":1719,"y":3,"w":282,"h":194}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":478,"y":658,"w":216,"h":49}, + "spriteSourceSize": {"x":481,"y":403,"w":282,"h":194}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Thigh3KneelClosed.png": +"Models/MaidKnightLight/ApronChestYoked.png": { - "frame": {"x":1458,"y":957,"w":170,"h":157}, + "frame": {"x":1712,"y":421,"w":276,"h":216}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":516,"y":826,"w":170,"h":157}, + "spriteSourceSize": {"x":483,"y":381,"w":276,"h":216}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/ToeClosed.png": +"Models/MaidKnightLight/DressDeco.png": { - "frame": {"x":221,"y":2017,"w":53,"h":26}, + "frame": {"x":1975,"y":808,"w":70,"h":148}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":519,"y":1571,"w":53,"h":26}, + "spriteSourceSize": {"x":715,"y":806,"w":70,"h":148}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopBelt.png": +"Models/MaidKnightLight/GloveRightYoked.png": { - "frame": {"x":858,"y":1384,"w":223,"h":49}, + "frame": {"x":1945,"y":1112,"w":100,"h":124}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":658,"w":223,"h":49}, + "spriteSourceSize": {"x":298,"y":286,"w":100,"h":124}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopCalf1Closed.png": +"Models/MaidKnightLight/GuardLeftWristtie.png": { - "frame": {"x":1459,"y":696,"w":206,"h":139}, + "frame": {"x":2005,"y":123,"w":40,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":542,"y":1318,"w":206,"h":139}, + "spriteSourceSize": {"x":685,"y":663,"w":40,"h":47}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopThigh2KneelClosed.png": +"Models/MaidKnightLight/GuardRightFree.png": { - "frame": {"x":1886,"y":1548,"w":136,"h":142}, + "frame": {"x":1254,"y":1755,"w":172,"h":109}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":874,"w":136,"h":142}, + "spriteSourceSize": {"x":332,"y":604,"w":172,"h":109}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopToeClosed.png": +"Models/Mittens/LeatherLeftFree.png": { - "frame": {"x":278,"y":2017,"w":52,"h":26}, + "frame": {"x":1430,"y":1755,"w":113,"h":109}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":520,"y":1571,"w":52,"h":26}, + "spriteSourceSize": {"x":800,"y":754,"w":113,"h":109}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/ChestGold.png": +"Models/Ninja/SkirtBandCrotchStrap.png": { - "frame": {"x":824,"y":1124,"w":187,"h":256}, + "frame": {"x":151,"y":1868,"w":91,"h":176}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":521,"y":405,"w":187,"h":256}, + "spriteSourceSize": {"x":453,"y":759,"w":91,"h":176}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/PlateKneel.png": +"Models/Ninja/TopChest.png": { - "frame": {"x":662,"y":1437,"w":245,"h":256}, + "frame": {"x":3,"y":763,"w":275,"h":236}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":595,"w":245,"h":256}, + "spriteSourceSize": {"x":442,"y":394,"w":275,"h":236}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveLeftFrontTight.png": +"Models/OperaGloves/ForeGloveRightCrossed.png": { - "frame": {"x":160,"y":295,"w":98,"h":283}, + "frame": {"x":3,"y":1209,"w":272,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":676,"y":495,"w":98,"h":283}, + "spriteSourceSize": {"x":431,"y":602,"w":272,"h":83}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SleeveRightUp.png": +"Models/OperaGloves/GloveRightBoxtie.png": { - "frame": {"x":811,"y":858,"w":202,"h":262}, + "frame": {"x":1658,"y":1831,"w":265,"h":214}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":387,"y":159,"w":202,"h":262}, + "spriteSourceSize": {"x":465,"y":500,"w":265,"h":214}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Crotchrope.png": +"Models/OperaGloves/GloveRightCrossed.png": { - "frame": {"x":1787,"y":522,"w":256,"h":83}, + "frame": {"x":560,"y":987,"w":272,"h":194}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":740,"w":256,"h":83}, + "spriteSourceSize": {"x":431,"y":491,"w":272,"h":194}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/RightThigh3KneelClosedOver.png": +"Models/Panties/BaseClosed.png": { - "frame": {"x":823,"y":816,"w":152,"h":38}, + "frame": {"x":857,"y":306,"w":277,"h":163}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":399,"y":812,"w":152,"h":38}, + "spriteSourceSize": {"x":453,"y":756,"w":277,"h":163}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Thigh1ClosedOver.png": +"Models/Panties/Cherry.png": { - "frame": {"x":979,"y":804,"w":206,"h":50}, + "frame": {"x":847,"y":635,"w":275,"h":148}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":492,"y":1092,"w":206,"h":50}, + "spriteSourceSize": {"x":454,"y":768,"w":275,"h":148}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Thigh1KneelClosed.png": +"Models/Panties/CherryClosed.png": { - "frame": {"x":1768,"y":1949,"w":116,"h":96}, + "frame": {"x":563,"y":718,"w":275,"h":147}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":402,"y":922,"w":116,"h":96}, + "spriteSourceSize": {"x":454,"y":768,"w":275,"h":147}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/ArmLeftBoxtie.png": +"Models/Panties/InvertedRoseClosed.png": { - "frame": {"x":566,"y":1439,"w":92,"h":265}, + "frame": {"x":1128,"y":589,"w":275,"h":154}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":678,"y":423,"w":92,"h":265}, + "spriteSourceSize": {"x":454,"y":761,"w":275,"h":154}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/ArmRightBoxtie.png": +"Models/Panties/Stripes.png": { - "frame": {"x":757,"y":1697,"w":79,"h":256}, + "frame": {"x":1138,"y":427,"w":276,"h":158}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":464,"y":429,"w":79,"h":256}, + "spriteSourceSize": {"x":453,"y":761,"w":276,"h":158}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/ArmRightCrossed.png": +"Models/Panties/StripesClosed.png": { - "frame": {"x":1188,"y":1118,"w":267,"h":253}, + "frame": {"x":848,"y":473,"w":276,"h":158}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":433,"y":430,"w":267,"h":253}, + "spriteSourceSize": {"x":453,"y":761,"w":276,"h":158}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/Chest.png": +"Models/Ribbon/Arm1Wristtie.png": { - "frame": {"x":595,"y":277,"w":267,"h":268}, + "frame": {"x":1671,"y":1087,"w":270,"h":136}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":360,"w":267,"h":268}, + "spriteSourceSize": {"x":474,"y":581,"w":270,"h":136}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/FaceMouth.png": +"Models/RobeOfChastity/ChestFabric.png": { - "frame": {"x":1366,"y":1953,"w":173,"h":92}, + "frame": {"x":1645,"y":1375,"w":167,"h":237}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":535,"y":302,"w":173,"h":92}, + "spriteSourceSize": {"x":533,"y":413,"w":167,"h":237}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/FootRightClosed.png": +"Models/Robes/SkirtKneel_LeftLegCrotchStrap.png": { - "frame": {"x":453,"y":281,"w":138,"h":271}, + "frame": {"x":377,"y":1846,"w":171,"h":84}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":1342,"w":138,"h":271}, + "spriteSourceSize": {"x":544,"y":810,"w":171,"h":84}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/CollarStripeTied.png": +"Models/Sailor/CollarTied.png": { - "frame": {"x":1165,"y":1955,"w":197,"h":89}, + "frame": {"x":1374,"y":1616,"w":252,"h":135}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":510,"y":430,"w":197,"h":89}, + "spriteSourceSize": {"x":479,"y":395,"w":252,"h":135}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/CollarStripeUp.png": +"Models/Sailor/CollarYoked.png": { - "frame": {"x":1730,"y":825,"w":154,"h":222}, + "frame": {"x":281,"y":1138,"w":272,"h":135}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":548,"y":303,"w":154,"h":222}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Sailor/HemRightUp.png": -{ - "frame": {"x":1669,"y":1437,"w":87,"h":101}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":472,"y":323,"w":87,"h":101}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Sailor/SleeveLeft.png": -{ - "frame": {"x":1787,"y":676,"w":97,"h":140}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":704,"y":410,"w":97,"h":140}, + "spriteSourceSize": {"x":493,"y":395,"w":272,"h":135}, "sourceSize": {"w":1240,"h":1754} }, "Models/ShadowHands/Legs1Kneel.png": { - "frame": {"x":1669,"y":3,"w":215,"h":109}, + "frame": {"x":825,"y":1755,"w":215,"h":109}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":565,"y":861,"w":215,"h":109}, @@ -1122,223 +866,167 @@ }, "Models/ShadowHands/Legs1KneelClosed.png": { - "frame": {"x":1669,"y":3,"w":215,"h":109}, + "frame": {"x":825,"y":1755,"w":215,"h":109}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":565,"y":861,"w":215,"h":109}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/StripedSkirtUnder.png": -{ - "frame": {"x":1510,"y":1694,"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":1510,"y":1694,"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":1510,"y":1694,"w":273,"h":251}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":469,"y":768,"w":273,"h":251}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Slime/ArmLeftBoxtie.png": -{ - "frame": {"x":815,"y":549,"w":92,"h":263}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":678,"y":423,"w":92,"h":263}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Slime/ArmRightBoxtie.png": -{ - "frame": {"x":840,"y":1697,"w":79,"h":256}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":464,"y":429,"w":79,"h":256}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Slime/ArmRightCrossed.png": -{ - "frame": {"x":1398,"y":1437,"w":267,"h":253}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":433,"y":430,"w":267,"h":253}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Slime/Chest.png": -{ - "frame": {"x":742,"y":3,"w":267,"h":268}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":446,"y":360,"w":267,"h":268}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/SMoonlight/ReverseBinderHardware.png": +"Models/SmoothHeels/LegRightHogtie.png": { - "frame": {"x":1189,"y":957,"w":265,"h":157}, + "frame": {"x":1402,"y":1868,"w":86,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":476,"y":398,"w":265,"h":157}, + "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SmoothHeels/LegRightKneel.png": +"Models/SmoothHeels/RightHogtie.png": { - "frame": {"x":1354,"y":1695,"w":152,"h":254}, + "frame": {"x":1402,"y":1868,"w":86,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":313,"y":830,"w":152,"h":254}, + "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimWristRightCrossed.png": +"Models/SteelCuffs/ElbowRightUp.png": { - "frame": {"x":1845,"y":1588,"w":37,"h":58}, + "frame": {"x":1927,"y":1979,"w":118,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":635,"y":597,"w":37,"h":58}, + "spriteSourceSize": {"x":446,"y":266,"w":118,"h":66}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ThighLeftKneel.png": +"Models/SteelCuffs/WristRightCrossed.png": { - "frame": {"x":1888,"y":676,"w":155,"h":137}, + "frame": {"x":2003,"y":221,"w":42,"h":69}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":513,"y":825,"w":155,"h":137}, + "spriteSourceSize": {"x":631,"y":596,"w":42,"h":69}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SockRightClosed.png": +"Models/Swimsuit/ChestStrappyBoxtie.png": { - "frame": {"x":1630,"y":1373,"w":113,"h":60}, + "frame": {"x":557,"y":1185,"w":271,"h":207}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":440,"y":1566,"w":113,"h":60}, + "spriteSourceSize": {"x":445,"y":420,"w":271,"h":207}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallSmoothHeels/TallLegRightKneel.png": +"Models/Swimsuit/ChestStrappyFree.png": { - "frame": {"x":1459,"y":442,"w":206,"h":250}, + "frame": {"x":1433,"y":205,"w":280,"h":212}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":313,"y":819,"w":206,"h":250}, + "spriteSourceSize": {"x":445,"y":415,"w":280,"h":212}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/ArmFullRightBoxtie.png": +"Models/Swimsuit/ChestStrappyUp.png": { - "frame": {"x":1787,"y":285,"w":97,"h":233}, + "frame": {"x":836,"y":1143,"w":271,"h":216}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":424,"w":97,"h":233}, + "spriteSourceSize": {"x":445,"y":411,"w":271,"h":216}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/FeetKneel.png": +"Models/Swimsuit/ChestStrappyWristtie.png": { - "frame": {"x":1888,"y":185,"w":156,"h":94}, + "frame": {"x":557,"y":1185,"w":271,"h":207}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":728,"y":903,"w":156,"h":94}, + "spriteSourceSize": {"x":445,"y":420,"w":271,"h":207}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/HandLeftYoked.png": +"Models/Swimsuit/ChestStrappyYoked.png": { - "frame": {"x":1785,"y":1051,"w":99,"h":85}, + "frame": {"x":1147,"y":211,"w":280,"h":212}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":853,"y":298,"w":99,"h":85}, + "spriteSourceSize": {"x":445,"y":415,"w":280,"h":212}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ArmFullRightBoxtie.png": +"Models/TapeHeavy/HandRightFree.png": { - "frame": {"x":1787,"y":285,"w":97,"h":233}, + "frame": {"x":1252,"y":1934,"w":113,"h":110}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":424,"w":97,"h":233}, + "spriteSourceSize": {"x":266,"y":546,"w":113,"h":110}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ArmLeftWristtie.png": +"Models/TapeLight/AnklesClosed.png": { - "frame": {"x":395,"y":567,"w":102,"h":273}, + "frame": {"x":1369,"y":1934,"w":129,"h":109}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":678,"y":487,"w":102,"h":273}, + "spriteSourceSize": {"x":539,"y":1376,"w":129,"h":109}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/Chest.png": +"Models/TapeLight/PetsuitTopBody.png": { - "frame": {"x":1397,"y":174,"w":268,"h":141}, + "frame": {"x":567,"y":573,"w":276,"h":141}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":486,"w":268,"h":141}, + "spriteSourceSize": {"x":475,"y":571,"w":276,"h":141}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/Belt.png": +"Models/TapeMed/ChestFull.png": { - "frame": {"x":1669,"y":226,"w":215,"h":55}, + "frame": {"x":1147,"y":3,"w":282,"h":204}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":477,"y":665,"w":215,"h":55}, + "spriteSourceSize": {"x":479,"y":384,"w":282,"h":204}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/SkirtOverKneelCrotchStrap.png": +"Models/Warrior/BraYoked.png": { - "frame": {"x":777,"y":1957,"w":265,"h":88}, + "frame": {"x":1719,"y":201,"w":280,"h":216}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":516,"y":801,"w":265,"h":88}, + "spriteSourceSize": {"x":445,"y":412,"w":280,"h":216}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/BlouseRightFront.png": +"Models/Warrior/Bustier.png": { - "frame": {"x":1760,"y":1329,"w":122,"h":192}, + "frame": {"x":3,"y":1003,"w":274,"h":202}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":431,"y":420,"w":122,"h":192}, + "spriteSourceSize": {"x":442,"y":482,"w":274,"h":202}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtRuffleKneel.png": +"Models/Warrior/BustierChest.png": { - "frame": {"x":1888,"y":957,"w":155,"h":125}, + "frame": {"x":1126,"y":747,"w":274,"h":149}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":587,"y":954,"w":155,"h":125}, + "spriteSourceSize": {"x":442,"y":482,"w":274,"h":149}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/SkirtRuffleOverKneel.png": +"Models/Wolf/AnkleLeftClosed.png": { - "frame": {"x":1888,"y":1086,"w":155,"h":125}, + "frame": {"x":1492,"y":1868,"w":84,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":587,"y":954,"w":155,"h":125}, + "spriteSourceSize": {"x":587,"y":1417,"w":84,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/ForeGloveRightFront.png": +"Models/WolfCatsuit/Chest.png": { - "frame": {"x":1076,"y":529,"w":159,"h":258}, + "frame": {"x":828,"y":1513,"w":269,"h":238}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":426,"y":460,"w":159,"h":258}, + "spriteSourceSize": {"x":447,"y":390,"w":269,"h":238}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/GloveRightFront.png": +"Models/WolfCatsuit/Chest2.png": { - "frame": {"x":1147,"y":266,"w":158,"h":258}, + "frame": {"x":552,"y":1626,"w":269,"h":238}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":426,"y":460,"w":158,"h":258}, + "spriteSourceSize": {"x":447,"y":390,"w":269,"h":238}, "sourceSize": {"w":1240,"h":1754} }, "Models/WolfCatsuit/LegPadsLeftHogtie.png": { - "frame": {"x":1899,"y":1694,"w":146,"h":189}, + "frame": {"x":227,"y":1675,"w":146,"h":189}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":580,"y":953,"w":146,"h":189}, @@ -1346,7 +1034,7 @@ }, "Models/WolfCatsuit/LegRimRightKneel.png": { - "frame": {"x":1632,"y":957,"w":94,"h":111}, + "frame": {"x":646,"y":1934,"w":94,"h":111}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":435,"y":746,"w":94,"h":111}, @@ -1354,34 +1042,34 @@ }, "Models/WolfCatsuit/LegRimRightKneelClosed.png": { - "frame": {"x":1632,"y":957,"w":94,"h":111}, + "frame": {"x":646,"y":1934,"w":94,"h":111}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":435,"y":746,"w":94,"h":111}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/ShoeLeftKneelClosed.png": +"Models/WolfCatsuit/TorsoUpperCups.png": { - "frame": {"x":1886,"y":1357,"w":159,"h":100}, + "frame": {"x":1101,"y":1616,"w":269,"h":135}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":742,"y":921,"w":159,"h":100}, + "spriteSourceSize": {"x":447,"y":494,"w":269,"h":135}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/ShoeRightKneel.png": +"Models/Yukata/Waist.png": { - "frame": {"x":1239,"y":528,"w":66,"h":98}, + "frame": {"x":1697,"y":641,"w":274,"h":189}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":324,"y":853,"w":66,"h":98}, + "spriteSourceSize": {"x":456,"y":620,"w":274,"h":189}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/ShoeRightSpread.png": +"Models/Yukata/WaistPattern.png": { - "frame": {"x":1669,"y":285,"w":114,"h":195}, + "frame": {"x":3,"y":570,"w":277,"h":189}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":495,"y":1456,"w":114,"h":195}, + "spriteSourceSize": {"x":453,"y":620,"w":277,"h":189}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -1391,7 +1079,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas36.webp b/TextureAtlas/atlas36.webp index dbef64a5f..df812b8db 100644 Binary files a/TextureAtlas/atlas36.webp and b/TextureAtlas/atlas36.webp differ diff --git a/TextureAtlas/atlas37.json b/TextureAtlas/atlas37.json index 5483d7730..79a5b4639 100644 --- a/TextureAtlas/atlas37.json +++ b/TextureAtlas/atlas37.json @@ -1,464 +1,624 @@ {"frames": { -"Models/Armbinder/CrossWristtie.png": +"Models/Bandit/Choker.png": { - "frame": {"x":1202,"y":1678,"w":245,"h":127}, + "frame": {"x":1029,"y":1071,"w":78,"h":36}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":470,"y":410,"w":245,"h":127}, + "spriteSourceSize": {"x":590,"y":390,"w":78,"h":36}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorChain/ShirtChest.png": +"Models/Bandit/ShoulderPadHogtie.png": { - "frame": {"x":283,"y":3,"w":275,"h":207}, + "frame": {"x":1933,"y":1150,"w":112,"h":132}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":418,"w":275,"h":207}, + "spriteSourceSize": {"x":685,"y":409,"w":112,"h":132}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/BreastplateHogtie.png": +"Models/Belts/Arms1.png": { - "frame": {"x":3,"y":954,"w":267,"h":209}, + "frame": {"x":1587,"y":1966,"w":222,"h":79}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":466,"w":267,"h":209}, + "spriteSourceSize": {"x":487,"y":455,"w":222,"h":79}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/BreastplateHogtie.png": +"Models/Blindfold/BasicRim.png": { - "frame": {"x":1118,"y":147,"w":272,"h":217}, + "frame": {"x":1813,"y":1966,"w":198,"h":79}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":414,"w":272,"h":217}, + "spriteSourceSize": {"x":45,"y":148,"w":198,"h":79}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Blindfold/Cloth.png": +{ + "frame": {"x":1228,"y":1631,"w":225,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":48,"y":152,"w":225,"h":79}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Body/Head.png": +{ + "frame": {"x":582,"y":3,"w":218,"h":274}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":505,"y":120,"w":218,"h":274}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/KneeClosed.png": +"Models/Body/HeadBigGag.png": { - "frame": {"x":1343,"y":1277,"w":104,"h":88}, + "frame": {"x":3,"y":1715,"w":218,"h":279}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":575,"y":1158,"w":104,"h":88}, + "spriteSourceSize": {"x":505,"y":120,"w":218,"h":279}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/Belt.png": +"Models/Body/HeadGag.png": { - "frame": {"x":1085,"y":874,"w":265,"h":62}, + "frame": {"x":156,"y":284,"w":218,"h":277}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":735,"w":265,"h":62}, + "spriteSourceSize": {"x":505,"y":120,"w":218,"h":277}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/LeftArm2Boxtie.png": +"Models/Body/HeadNoEar.png": { - "frame": {"x":1949,"y":406,"w":95,"h":74}, + "frame": {"x":309,"y":1126,"w":216,"h":274}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":675,"y":576,"w":95,"h":74}, + "spriteSourceSize": {"x":505,"y":120,"w":216,"h":274}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/Legs1Kneel.png": +"Models/Body/HeadNoEarBigGag.png": { - "frame": {"x":696,"y":1678,"w":174,"h":128}, + "frame": {"x":116,"y":1431,"w":216,"h":279}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":501,"y":839,"w":174,"h":128}, + "spriteSourceSize": {"x":505,"y":120,"w":216,"h":279}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/Chest.png": +"Models/Body/HeadNoEarGag.png": { - "frame": {"x":274,"y":972,"w":265,"h":112}, + "frame": {"x":156,"y":565,"w":216,"h":277}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":514,"w":265,"h":112}, + "spriteSourceSize": {"x":505,"y":120,"w":216,"h":277}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bra/BraRim.png": +{ + "frame": {"x":1345,"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/Bra/Stripes.png": { - "frame": {"x":274,"y":1088,"w":265,"h":93}, + "frame": {"x":1611,"y":1617,"w":265,"h":93}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":447,"y":524,"w":265,"h":93}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/GloveRightCrossed.png": +"Models/Bunny/ForeGloveRightFront.png": { - "frame": {"x":819,"y":628,"w":267,"h":169}, + "frame": {"x":529,"y":1122,"w":169,"h":268}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":433,"y":515,"w":267,"h":169}, + "spriteSourceSize": {"x":417,"y":461,"w":169,"h":268}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/LeotardChest.png": +"Models/Bunny/GloveLeftFront.png": { - "frame": {"x":814,"y":1019,"w":264,"h":108}, + "frame": {"x":607,"y":841,"w":245,"h":267}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":518,"w":264,"h":108}, + "spriteSourceSize": {"x":523,"y":464,"w":245,"h":267}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ButtKneel.png": +"Models/Bunny/GloveLeftUp.png": { - "frame": {"x":1898,"y":891,"w":147,"h":214}, + "frame": {"x":740,"y":556,"w":168,"h":267}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":627,"y":750,"w":147,"h":214}, + "spriteSourceSize": {"x":664,"y":167,"w":168,"h":267}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ShoulderRightUp.png": +"Models/Bunny/GloveRightFront.png": { - "frame": {"x":1938,"y":778,"w":107,"h":109}, + "frame": {"x":336,"y":1404,"w":162,"h":270}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":475,"y":397,"w":107,"h":109}, + "spriteSourceSize": {"x":424,"y":461,"w":162,"h":270}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/SleevelessTopV.png": +"Models/Bunny/GloveRightUp.png": { - "frame": {"x":1361,"y":688,"w":267,"h":116}, + "frame": {"x":804,"y":3,"w":144,"h":266}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":570,"w":267,"h":116}, + "spriteSourceSize": {"x":449,"y":162,"w":144,"h":266}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/SleevelessTopVChest.png": +"Models/Catsuit/ArmLeftBoxtie.png": { - "frame": {"x":548,"y":526,"w":267,"h":245}, + "frame": {"x":3,"y":1431,"w":109,"h":280}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":382,"w":267,"h":245}, + "spriteSourceSize": {"x":662,"y":404,"w":109,"h":280}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/TorsoLowerPanties.png": +"Models/Catsuit/ArmRightFree.png": { - "frame": {"x":1622,"y":1076,"w":262,"h":192}, + "frame": {"x":416,"y":844,"w":187,"h":274}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":457,"y":728,"w":262,"h":192}, + "spriteSourceSize": {"x":337,"y":432,"w":187,"h":274}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BeltLining.png": +"Models/Catsuit/ButtHogtie.png": { - "frame": {"x":549,"y":416,"w":268,"h":106}, + "frame": {"x":1693,"y":1111,"w":151,"h":158}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":705,"w":268,"h":106}, + "spriteSourceSize": {"x":625,"y":749,"w":151,"h":158}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BeltStrapLining.png": +"Models/Catsuit/FootLeftKneel.png": { - "frame": {"x":1451,"y":1277,"w":164,"h":186}, + "frame": {"x":1446,"y":260,"w":173,"h":89}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":557,"y":737,"w":164,"h":186}, + "spriteSourceSize": {"x":722,"y":932,"w":173,"h":89}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraProtoLiningMidZip.png": +"Models/Collars/Choker.png": { - "frame": {"x":282,"y":214,"w":270,"h":94}, + "frame": {"x":1029,"y":1071,"w":78,"h":36}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":572,"w":270,"h":94}, + "spriteSourceSize": {"x":590,"y":390,"w":78,"h":36}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraProtoLiningZip.png": +"Models/Collars/QuakeHogtie.png": { - "frame": {"x":837,"y":398,"w":270,"h":226}, + "frame": {"x":1242,"y":1045,"w":80,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":413,"w":270,"h":226}, + "spriteSourceSize": {"x":588,"y":394,"w":80,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/BraProtoLiningZipRim.png": +"Models/CrystalCuffs/AnkleLinkSpread.png": { - "frame": {"x":1669,"y":411,"w":270,"h":226}, + "frame": {"x":433,"y":1986,"w":151,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":413,"w":270,"h":226}, + "spriteSourceSize": {"x":546,"y":1438,"w":151,"h":59}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/CyberLining.png": +"Models/CrystalCuffs/ThighRightClosed.png": { - "frame": {"x":1619,"y":1272,"w":262,"h":145}, + "frame": {"x":743,"y":1986,"w":109,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":758,"w":262,"h":145}, + "spriteSourceSize": {"x":470,"y":1032,"w":109,"h":59}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/CyberPanties.png": +"Models/Cuffs/AnkleLinkSpread.png": { - "frame": {"x":1674,"y":3,"w":273,"h":179}, + "frame": {"x":588,"y":1986,"w":151,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":744,"w":273,"h":179}, + "spriteSourceSize": {"x":546,"y":1438,"w":151,"h":59}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/CyberPantiesLining.png": +"Models/Cuffs/ThighRightClosed.png": { - "frame": {"x":543,"y":1123,"w":263,"h":160}, + "frame": {"x":856,"y":1986,"w":109,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":457,"y":755,"w":263,"h":160}, + "spriteSourceSize": {"x":470,"y":1032,"w":109,"h":59}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/CyberPantiesLiningClosed.png": +"Models/CyberArms/CuffForeLongMittenRightFront.png": { - "frame": {"x":272,"y":1185,"w":263,"h":160}, + "frame": {"x":1326,"y":1045,"w":75,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":457,"y":755,"w":263,"h":160}, + "spriteSourceSize": {"x":469,"y":524,"w":75,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/China/Highlights.png": +"Models/CyberArms/ForeLongMittenLeftFront.png": { - "frame": {"x":1938,"y":642,"w":107,"h":132}, + "frame": {"x":1303,"y":1111,"w":185,"h":251}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":560,"y":394,"w":107,"h":132}, + "spriteSourceSize": {"x":574,"y":470,"w":185,"h":251}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Corsets/CrossHeavyCorset.png": +"Models/CyberArms/GlowForeLongMittenLeftFront.png": { - "frame": {"x":1202,"y":1678,"w":245,"h":127}, + "frame": {"x":1933,"y":353,"w":112,"h":145}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":470,"y":410,"w":245,"h":127}, + "spriteSourceSize": {"x":624,"y":515,"w":112,"h":145}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/ForeLongMittenRightCrossed.png": +"Models/CyberArms/GlowLongMittenRightFront.png": { - "frame": {"x":545,"y":775,"w":267,"h":164}, + "frame": {"x":1712,"y":687,"w":67,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":430,"y":521,"w":267,"h":164}, + "spriteSourceSize": {"x":413,"y":496,"w":67,"h":83}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/StrapsLongMittenRightUp.png": +"Models/CyberArms/LockLongMittenLeftFree.png": { - "frame": {"x":1951,"y":101,"w":94,"h":87}, + "frame": {"x":1560,"y":1364,"w":86,"h":249}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":182,"w":94,"h":87}, + "spriteSourceSize": {"x":765,"y":523,"w":86,"h":249}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ThighLeftKneelClosed.png": +"Models/CyberArms/LongMittenLeftFree.png": { - "frame": {"x":840,"y":3,"w":274,"h":167}, + "frame": {"x":598,"y":563,"w":138,"h":274}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":375,"y":840,"w":274,"h":167}, + "spriteSourceSize": {"x":702,"y":512,"w":138,"h":274}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/ForeLongMittenRightCrossed.png": +"Models/CyberArms/LongMittenLeftUp.png": { - "frame": {"x":545,"y":775,"w":267,"h":164}, + "frame": {"x":856,"y":827,"w":169,"h":257}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":430,"y":521,"w":267,"h":164}, + "spriteSourceSize": {"x":664,"y":165,"w":169,"h":257}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/StrapsLongMittenRightUp.png": +"Models/CyberArms/LongMittenRightFront.png": { - "frame": {"x":1951,"y":101,"w":94,"h":87}, + "frame": {"x":1933,"y":1801,"w":108,"h":161}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":182,"w":94,"h":87}, + "spriteSourceSize": {"x":421,"y":560,"w":108,"h":161}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberPetsuit/LeftLegsBeltsKneel.png": +"Models/CyberCuffs/AnkleLeftSpread.png": { - "frame": {"x":1673,"y":186,"w":272,"h":221}, + "frame": {"x":1772,"y":1045,"w":72,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":468,"y":853,"w":272,"h":221}, + "spriteSourceSize": {"x":681,"y":1426,"w":72,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BeltBase.png": +"Models/CyberCuffs/ScreenElbowLeftFront.png": { - "frame": {"x":262,"y":1576,"w":253,"h":194}, + "frame": {"x":1650,"y":1364,"w":38,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":722,"w":253,"h":194}, + "spriteSourceSize": {"x":743,"y":595,"w":38,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BeltBaseNoLock.png": +"Models/CyberCuffs/ScreenThighLeftClosed.png": { - "frame": {"x":3,"y":1615,"w":253,"h":194}, + "frame": {"x":915,"y":1641,"w":59,"h":69}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":722,"w":253,"h":194}, + "spriteSourceSize": {"x":641,"y":1032,"w":59,"h":69}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BeltLines.png": +"Models/CyberCuffs/ScreenThighRightKneel.png": { - "frame": {"x":1085,"y":940,"w":264,"h":201}, + "frame": {"x":1180,"y":1976,"w":52,"h":69}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":722,"w":264,"h":201}, + "spriteSourceSize": {"x":375,"y":814,"w":52,"h":69}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BeltMetal1.png": +"Models/CyberCuffs/ScreenThighRightKneelClosed.png": { - "frame": {"x":1077,"y":1145,"w":262,"h":113}, + "frame": {"x":1180,"y":1976,"w":52,"h":69}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":455,"y":738,"w":262,"h":113}, + "spriteSourceSize": {"x":375,"y":814,"w":52,"h":69}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BeltMetalRunic1.png": +"Models/CyberCuffs/ThighLeftKneel.png": { - "frame": {"x":1077,"y":1262,"w":262,"h":113}, + "frame": {"x":1880,"y":3,"w":165,"h":121}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":455,"y":738,"w":262,"h":113}, + "spriteSourceSize": {"x":484,"y":840,"w":165,"h":121}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/BeltDecoClean.png": +"Models/CyberCuffs/WristLeftFront.png": { - "frame": {"x":373,"y":1774,"w":221,"h":32}, + "frame": {"x":1484,"y":1045,"w":70,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":473,"y":699,"w":221,"h":32}, + "spriteSourceSize": {"x":620,"y":538,"w":70,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighRightDecoCleanClosed.png": +"Models/CyberHeels/GlowBalletLeftHogtie.png": { - "frame": {"x":598,"y":1774,"w":94,"h":31}, + "frame": {"x":1395,"y":521,"w":47,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":473,"y":1055,"w":94,"h":31}, + "spriteSourceSize": {"x":730,"y":798,"w":47,"h":65}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineGag/MuzzleHarness.png": +"Models/CyberMitts/ArmLongMittenLeftFree.png": { - "frame": {"x":1661,"y":1678,"w":144,"h":177}, + "frame": {"x":598,"y":563,"w":138,"h":274}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":523,"y":124,"w":144,"h":177}, + "spriteSourceSize": {"x":702,"y":512,"w":138,"h":274}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/Band.png": +"Models/CyberMitts/ArmLongMittenLeftUp.png": { - "frame": {"x":3,"y":1167,"w":265,"h":71}, + "frame": {"x":856,"y":827,"w":169,"h":257}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":749,"w":265,"h":71}, + "spriteSourceSize": {"x":664,"y":165,"w":169,"h":257}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BandCrotchStrap.png": +"Models/CyberMitts/ArmLongMittenRightFront.png": { - "frame": {"x":1361,"y":808,"w":265,"h":71}, + "frame": {"x":1933,"y":1801,"w":108,"h":161}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":749,"w":265,"h":71}, + "spriteSourceSize": {"x":421,"y":560,"w":108,"h":161}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseBustBoxtie.png": +"Models/CyberMitts/CuffForeLongMittenRightFront.png": { - "frame": {"x":1118,"y":3,"w":274,"h":140}, + "frame": {"x":1326,"y":1045,"w":75,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":489,"w":274,"h":140}, + "spriteSourceSize": {"x":469,"y":524,"w":75,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseBustBoxtieChesttied.png": +"Models/CyberMitts/ForeLongMittenLeftFront.png": { - "frame": {"x":1396,"y":3,"w":274,"h":131}, + "frame": {"x":1303,"y":1111,"w":185,"h":251}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":497,"w":274,"h":131}, + "spriteSourceSize": {"x":574,"y":470,"w":185,"h":251}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BowCorsetBust.png": +"Models/CyberMitts/GlowForeLongMittenLeftFront.png": { - "frame": {"x":1115,"y":368,"w":271,"h":146}, + "frame": {"x":1933,"y":353,"w":112,"h":145}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":500,"w":271,"h":146}, + "spriteSourceSize": {"x":624,"y":515,"w":112,"h":145}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/ShoeLeftClosed.png": +"Models/CyberMitts/LongMittenLeftUp.png": { - "frame": {"x":1063,"y":1379,"w":146,"h":101}, + "frame": {"x":856,"y":827,"w":169,"h":257}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":522,"y":1526,"w":146,"h":101}, + "spriteSourceSize": {"x":664,"y":165,"w":169,"h":257}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/SkirtSplitOverKneel.png": +"Models/CyberMitts/LongMittenRightFront.png": { - "frame": {"x":1354,"y":883,"w":264,"h":206}, + "frame": {"x":1933,"y":1801,"w":108,"h":161}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":519,"y":799,"w":264,"h":206}, + "spriteSourceSize": {"x":421,"y":560,"w":108,"h":161}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/Bra.png": +"Models/CyberMitts/UpperGlowLongMittenRightFront.png": { - "frame": {"x":1090,"y":658,"w":267,"h":128}, + "frame": {"x":1712,"y":687,"w":67,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":518,"w":267,"h":128}, + "spriteSourceSize": {"x":413,"y":496,"w":67,"h":83}, "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/EyesClosed.png": +"Models/DivineCuffs/AnkleLinkSpread.png": { - "frame": {"x":319,"y":1774,"w":50,"h":33}, + "frame": {"x":588,"y":1986,"w":151,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "spriteSourceSize": {"x":546,"y":1438,"w":151,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/BeltLock.png": +{ + "frame": {"x":1712,"y":598,"w":67,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":693,"w":67,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightDecoCleanUp.png": +{ + "frame": {"x":1933,"y":502,"w":107,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":260,"w":107,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightLockBandSpread.png": +{ + "frame": {"x":336,"y":1678,"w":65,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":472,"y":1082,"w":65,"h":32}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftFront.png": +{ + "frame": {"x":1631,"y":1045,"w":67,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":621,"y":537,"w":67,"h":62}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmLeftCrossed.png": +{ + "frame": {"x":1238,"y":1371,"w":206,"h":255}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":569,"y":441,"w":206,"h":255}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmLeftFront.png": +{ + "frame": {"x":877,"y":1714,"w":121,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":656,"y":440,"w":121,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BlouseArmRightFree.png": +{ + "frame": {"x":742,"y":281,"w":221,"h":266}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":329,"y":443,"w":221,"h":266}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/BowCorsetBow.png": +{ + "frame": {"x":1732,"y":1714,"w":197,"h":248}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":466,"y":533,"w":197,"h":248}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MonocleLeft.png": +{ + "frame": {"x":1933,"y":1408,"w":75,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":605,"y":264,"w":75,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MonocleLensLeft.png": +{ + "frame": {"x":1491,"y":788,"w":63,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":609,"y":268,"w":63,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/ShoeRightClosed.png": +{ + "frame": {"x":792,"y":1641,"w":119,"h":69}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":455,"y":1547,"w":119,"h":69}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/FaceDask/Eyes2Neutral.png": +{ + "frame": {"x":359,"y":1997,"w":70,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":160,"w":70,"h":48}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKjus/EyesAngry.png": +{ + "frame": {"x":543,"y":1676,"w":61,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":523,"y":280,"w":61,"h":34}, + "sourceSize": {"w":725,"h":425} +}, +"Models/FaceKjus/WhitesEyesAngry.png": +{ + "frame": {"x":608,"y":1676,"w":61,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":523,"y":280,"w":61,"h":34}, + "sourceSize": {"w":725,"h":425} +}, +"Models/FaceKoi/Eyes2Closed.png": +{ + "frame": {"x":405,"y":1678,"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":474,"y":1678,"w":65,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":159,"w":65,"h":32}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoi/HumanEyesClosed.png": +"Models/GagLeather/BallHarness.png": { - "frame": {"x":319,"y":1774,"w":50,"h":33}, + "frame": {"x":225,"y":1714,"w":149,"h":279}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "spriteSourceSize": {"x":68,"y":9,"w":149,"h":279}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoi/WhitesEyesClosed.png": +"Models/GagLeather/BallHarnessLarge.png": { - "frame": {"x":319,"y":1774,"w":50,"h":33}, + "frame": {"x":3,"y":1147,"w":149,"h":280}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "spriteSourceSize": {"x":68,"y":9,"w":149,"h":280}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/EyesClosed.png": +"Models/GagLeather/LargeBallHarness.png": { - "frame": {"x":319,"y":1774,"w":50,"h":33}, + "frame": {"x":3,"y":3,"w":149,"h":282}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "spriteSourceSize": {"x":68,"y":9,"w":149,"h":282}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/WhitesEyesClosed.png": +"Models/GagMetal/BallHarness.png": { - "frame": {"x":319,"y":1774,"w":50,"h":33}, + "frame": {"x":156,"y":1145,"w":149,"h":279}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":50,"h":33}, + "spriteSourceSize": {"x":68,"y":9,"w":149,"h":279}, "sourceSize": {"w":321,"h":332} }, -"Models/GagLatex/OTN.png": +"Models/GagMetal/BallHarnessLarge.png": { - "frame": {"x":1885,"y":1392,"w":160,"h":88}, + "frame": {"x":3,"y":289,"w":149,"h":282}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, + "spriteSourceSize": {"x":68,"y":9,"w":149,"h":282}, "sourceSize": {"w":321,"h":332} }, -"Models/GagMetal/BigBallStrap.png": +"Models/GagMetal/BallHarnessSegmented.png": { - "frame": {"x":1619,"y":1421,"w":149,"h":42}, + "frame": {"x":122,"y":861,"w":149,"h":280}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":68,"y":233,"w":149,"h":42}, + "spriteSourceSize": {"x":68,"y":9,"w":149,"h":280}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/BallHarnessSegmentedLarge.png": +{ + "frame": {"x":3,"y":575,"w":149,"h":282}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":68,"y":9,"w":149,"h":282}, "sourceSize": {"w":321,"h":332} }, "Models/Gasmask/Mask.png": { - "frame": {"x":1885,"y":1295,"w":160,"h":93}, + "frame": {"x":1880,"y":1617,"w":160,"h":93}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":64,"y":210,"w":160,"h":93}, @@ -466,530 +626,698 @@ }, "Models/Hair/Ponytail2.png": { - "frame": {"x":1064,"y":1810,"w":197,"h":232}, + "frame": {"x":1848,"y":914,"w":197,"h":232}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":607,"y":83,"w":197,"h":232}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/BalletLeftKneelClosed.png": +"Models/Hair2/Hair6_Right.png": { - "frame": {"x":3,"y":1242,"w":263,"h":146}, + "frame": {"x":1448,"y":1366,"w":108,"h":250}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":667,"y":906,"w":263,"h":146}, + "spriteSourceSize": {"x":435,"y":107,"w":108,"h":250}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/BalletSoleRightKneel.png": +"Models/Handcuffs/LegironsLeftClosed.png": { - "frame": {"x":1949,"y":192,"w":95,"h":117}, + "frame": {"x":1693,"y":565,"w":87,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":309,"y":839,"w":95,"h":117}, + "spriteSourceSize": {"x":593,"y":1431,"w":87,"h":29}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/FlatBalletLeftKneelClosed.png": +"Models/Handcuffs/LegironsLeftSpread.png": { - "frame": {"x":3,"y":1242,"w":263,"h":146}, + "frame": {"x":1693,"y":565,"w":87,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":667,"y":906,"w":263,"h":146}, + "spriteSourceSize": {"x":680,"y":1431,"w":87,"h":29}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/ShinyBalletLeftKneelClosed.png": +"Models/Handcuffs/WolfCuffsFront.png": { - "frame": {"x":810,"y":1131,"w":263,"h":146}, + "frame": {"x":969,"y":1977,"w":207,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":667,"y":906,"w":263,"h":146}, + "spriteSourceSize": {"x":477,"y":526,"w":207,"h":68}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hood/WolfEars.png": +"Models/Heels/BalletLaceRightSpread.png": { - "frame": {"x":1664,"y":641,"w":270,"h":186}, + "frame": {"x":1395,"y":590,"w":43,"h":194}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":480,"y":32,"w":270,"h":186}, + "spriteSourceSize": {"x":528,"y":1389,"w":43,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/BalletSoleLeftKneelClosed.png": +{ + "frame": {"x":1880,"y":251,"w":165,"h":98}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":765,"y":906,"w":165,"h":98}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallLegRightKneel.png": +{ + "frame": {"x":837,"y":1112,"w":207,"h":259}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":313,"y":811,"w":207,"h":259}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Heels/TallLegRightKneelClosed.png": +{ + "frame": {"x":1236,"y":263,"w":206,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":314,"y":811,"w":206,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hood/Blindfold.png": +{ + "frame": {"x":1036,"y":1637,"w":188,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":521,"y":248,"w":188,"h":73}, "sourceSize": {"w":752,"h":479} }, -"Models/Jacket/LatexChest.png": +"Models/Jacket/BeltsArmsWristtie.png": +{ + "frame": {"x":733,"y":1676,"w":55,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":686,"y":597,"w":55,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Jacket/Crotch.png": +{ + "frame": {"x":1701,"y":914,"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":1650,"y":1478,"w":204,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":555,"y":586,"w":204,"h":135}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Kigu/Mask.png": +{ + "frame": {"x":156,"y":3,"w":221,"h":277}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":503,"y":118,"w":221,"h":277}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LatexPetsuit/LegsBeltsKneel.png": +{ + "frame": {"x":1181,"y":530,"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":1181,"y":530,"w":210,"h":254}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":305,"y":812,"w":210,"h":254}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/WristLeftFree.png": +{ + "frame": {"x":1491,"y":851,"w":63,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":797,"y":748,"w":63,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherLeotard/LeotardClosed.png": +{ + "frame": {"x":1784,"y":565,"w":261,"h":238}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":457,"y":719,"w":261,"h":238}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmLeftBoxtie.png": +{ + "frame": {"x":702,"y":1112,"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":702,"y":1112,"w":131,"h":262}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":675,"y":427,"w":131,"h":262}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmRightBoxtie.png": +{ + "frame": {"x":952,"y":3,"w":109,"h":263}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":424,"w":109,"h":263}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmRightYoked.png": +{ + "frame": {"x":1446,"y":353,"w":243,"h":241}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":315,"y":390,"w":243,"h":241}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/BandRightYoked.png": +{ + "frame": {"x":673,"y":1676,"w":56,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":313,"y":393,"w":56,"h":34}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LongMittenLeftUp.png": { - "frame": {"x":3,"y":483,"w":267,"h":246}, + "frame": {"x":740,"y":556,"w":168,"h":267}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":382,"w":267,"h":246}, + "spriteSourceSize": {"x":664,"y":167,"w":168,"h":267}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/StrapsArmsWristtie.png": +"Models/Mittens/LongMittenRightUp.png": { - "frame": {"x":260,"y":1774,"w":55,"h":33}, + "frame": {"x":804,"y":3,"w":144,"h":266}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":686,"y":597,"w":55,"h":33}, + "spriteSourceSize": {"x":449,"y":162,"w":144,"h":266}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/StrapsTorsoLowerExtra.png": +"Models/Ninja/BeltLines.png": { - "frame": {"x":1353,"y":1093,"w":262,"h":180}, + "frame": {"x":1880,"y":128,"w":165,"h":119}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":610,"w":262,"h":180}, + "spriteSourceSize": {"x":482,"y":649,"w":165,"h":119}, "sourceSize": {"w":1240,"h":1754} }, -"Models/KittyLatex/KittyLatexEar.png": +"Models/Ninja/KneeRightKneel.png": { - "frame": {"x":1390,"y":486,"w":270,"h":198}, + "frame": {"x":1002,"y":1714,"w":160,"h":258}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":482,"y":44,"w":270,"h":198}, + "spriteSourceSize": {"x":308,"y":806,"w":160,"h":258}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherLeotard/StrapsChest.png": +"Models/Ninja/KneeRightKneelClosed.png": { - "frame": {"x":252,"y":1813,"w":240,"h":232}, + "frame": {"x":1002,"y":1714,"w":160,"h":258}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":466,"y":410,"w":240,"h":232}, + "spriteSourceSize": {"x":308,"y":806,"w":160,"h":258}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/BlouseBust.png": +"Models/Ninja/ShoeRightSpread.png": { - "frame": {"x":1396,"y":138,"w":273,"h":133}, + "frame": {"x":1933,"y":1714,"w":112,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":442,"y":494,"w":273,"h":133}, + "spriteSourceSize": {"x":493,"y":1563,"w":112,"h":83}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ForeArmRightCrossed.png": +"Models/Ninja/ThighRightKneel.png": { - "frame": {"x":810,"y":1281,"w":262,"h":81}, + "frame": {"x":773,"y":1378,"w":215,"h":259}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":432,"y":603,"w":262,"h":81}, + "spriteSourceSize": {"x":308,"y":805,"w":215,"h":259}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/Headband.png": +"Models/Ninja/ThighRightKneelClosed.png": { - "frame": {"x":3,"y":1813,"w":245,"h":232}, + "frame": {"x":773,"y":1378,"w":215,"h":259}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":510,"y":102,"w":245,"h":232}, + "spriteSourceSize": {"x":308,"y":805,"w":215,"h":259}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LatexLeftYoked.png": +"Models/OperaGloves/ForeGloveLeftFront.png": { - "frame": {"x":705,"y":1810,"w":111,"h":233}, + "frame": {"x":1520,"y":1714,"w":208,"h":248}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":843,"y":285,"w":111,"h":233}, + "spriteSourceSize": {"x":548,"y":465,"w":208,"h":248}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LongMittenRightBoxtie.png": +"Models/OperaGloves/ForeGloveRightFront.png": { - "frame": {"x":804,"y":1366,"w":255,"h":200}, + "frame": {"x":1048,"y":1111,"w":168,"h":256}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":464,"y":517,"w":255,"h":200}, + "spriteSourceSize": {"x":423,"y":461,"w":168,"h":256}, "sourceSize": {"w":1240,"h":1754} }, -"Models/OperaGloves/GloveRightBoxtie.png": +"Models/OperaGloves/GloveRightWristtie.png": { - "frame": {"x":816,"y":801,"w":265,"h":214}, + "frame": {"x":2012,"y":1408,"w":32,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":500,"w":265,"h":214}, + "spriteSourceSize": {"x":466,"y":500,"w":32,"h":30}, "sourceSize": {"w":1240,"h":1754} }, -"Models/OperaGloves/GloveRightFree.png": +"Models/Petsuit/LegsBeltsKneel.png": { - "frame": {"x":1574,"y":1467,"w":231,"h":207}, + "frame": {"x":1181,"y":530,"w":210,"h":254}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":267,"y":498,"w":231,"h":207}, + "spriteSourceSize": {"x":305,"y":812,"w":210,"h":254}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/InvertedRoseClosed.png": +"Models/Petsuit/LegsBeltsKneelClosed.png": { - "frame": {"x":3,"y":148,"w":275,"h":154}, + "frame": {"x":1181,"y":530,"w":210,"h":254}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":761,"w":275,"h":154}, + "spriteSourceSize": {"x":305,"y":812,"w":210,"h":254}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Arm1Wristtie.png": +"Models/Petsuit/LegsKneel.png": { - "frame": {"x":1111,"y":518,"w":270,"h":136}, + "frame": {"x":649,"y":1714,"w":224,"h":268}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":474,"y":581,"w":270,"h":136}, + "spriteSourceSize": {"x":303,"y":800,"w":224,"h":268}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Calf1Closed.png": +"Models/Petsuit/LegsKneelClosed.png": { - "frame": {"x":496,"y":1810,"w":205,"h":233}, + "frame": {"x":649,"y":1714,"w":224,"h":268}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":542,"y":1225,"w":205,"h":233}, + "spriteSourceSize": {"x":303,"y":800,"w":224,"h":268}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Calf2Closed.png": +"Models/Pony/CollarTag.png": { - "frame": {"x":820,"y":1810,"w":240,"h":232}, + "frame": {"x":1702,"y":1045,"w":66,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":507,"y":1225,"w":240,"h":232}, + "spriteSourceSize": {"x":600,"y":394,"w":66,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Calf3Closed.png": +"Models/Ribbon/Crotch.png": { - "frame": {"x":1330,"y":1467,"w":240,"h":207}, + "frame": {"x":1784,"y":807,"w":261,"h":103}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":507,"y":1225,"w":240,"h":207}, + "spriteSourceSize": {"x":456,"y":737,"w":261,"h":103}, "sourceSize": {"w":1240,"h":1754} }, "Models/Ribbon/Thigh1Closed.png": { - "frame": {"x":1451,"y":1678,"w":206,"h":127}, + "frame": {"x":1491,"y":914,"w":206,"h":127}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":488,"y":1012,"w":206,"h":127}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopBowWristtie.png": +"Models/Ribbon/TopCalf3KneelClosed.png": { - "frame": {"x":874,"y":1678,"w":132,"h":128}, + "frame": {"x":978,"y":1641,"w":54,"h":69}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":515,"y":540,"w":132,"h":128}, + "spriteSourceSize": {"x":521,"y":998,"w":54,"h":69}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopCrotch.png": +"Models/RobeOfChastity/ChestBase.png": { - "frame": {"x":539,"y":1287,"w":261,"h":183}, + "frame": {"x":912,"y":551,"w":265,"h":256}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":737,"w":261,"h":183}, + "spriteSourceSize": {"x":446,"y":404,"w":265,"h":256}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/Bra.png": +"Models/RobeOfChastity/ChestBaseTied.png": { - "frame": {"x":3,"y":306,"w":269,"h":173}, + "frame": {"x":967,"y":270,"w":265,"h":256}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":479,"w":269,"h":173}, + "spriteSourceSize": {"x":446,"y":404,"w":265,"h":256}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/FrogThigh2Kneel.png": +"Models/RobeOfChastity/ChestGold.png": { - "frame": {"x":1063,"y":1484,"w":245,"h":190}, + "frame": {"x":1029,"y":811,"w":187,"h":256}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":351,"y":892,"w":245,"h":190}, + "spriteSourceSize": {"x":521,"y":405,"w":187,"h":256}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/HarnessLower.png": +"Models/RobeOfChastity/ChestGoldBase.png": { - "frame": {"x":1630,"y":831,"w":264,"h":241}, + "frame": {"x":1328,"y":1714,"w":188,"h":255}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":455,"y":600,"w":264,"h":241}, + "spriteSourceSize": {"x":521,"y":405,"w":188,"h":255}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/RightThigh1KneelClosedOver.png": +"Models/RobeOfChastity/PlateKneel.png": { - "frame": {"x":1772,"y":1421,"w":107,"h":42}, + "frame": {"x":1065,"y":3,"w":245,"h":256}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":332,"y":908,"w":107,"h":42}, + "spriteSourceSize": {"x":451,"y":595,"w":245,"h":256}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/HandLeftYoked.png": +"Models/Robes/SleeveRightFront.png": { - "frame": {"x":1010,"y":1678,"w":92,"h":128}, + "frame": {"x":3,"y":861,"w":115,"h":282}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":857,"y":278,"w":92,"h":128}, + "spriteSourceSize": {"x":420,"y":488,"w":115,"h":282}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeShoulderLeft.png": +"Models/Robes/SleeveRightFrontTight.png": { - "frame": {"x":1213,"y":1379,"w":113,"h":101}, + "frame": {"x":3,"y":861,"w":115,"h":282}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":664,"y":411,"w":113,"h":101}, + "spriteSourceSize": {"x":420,"y":488,"w":115,"h":282}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/FaceEyes.png": +"Models/Robes/ZombieHatBand.png": { - "frame": {"x":1809,"y":1901,"w":217,"h":144}, + "frame": {"x":1623,"y":207,"w":253,"h":126}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":505,"y":194,"w":217,"h":144}, + "spriteSourceSize": {"x":506,"y":53,"w":253,"h":126}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/FaceMouth.png": +"Models/Rope/Calf3Closed.png": { - "frame": {"x":519,"y":1678,"w":173,"h":92}, + "frame": {"x":3,"y":1998,"w":200,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":535,"y":302,"w":173,"h":92}, + "spriteSourceSize": {"x":513,"y":1235,"w":200,"h":47}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/HandLeftYoked.png": +"Models/Rubber/ArmLeftCrossed.png": { - "frame": {"x":1106,"y":1678,"w":92,"h":128}, + "frame": {"x":376,"y":565,"w":218,"h":275}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":857,"y":278,"w":92,"h":128}, + "spriteSourceSize": {"x":552,"y":424,"w":218,"h":275}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/Belt.png": +"Models/Rubber/ArmRightBoxtie.png": { - "frame": {"x":1809,"y":1696,"w":236,"h":201}, + "frame": {"x":1155,"y":1371,"w":79,"h":256}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":670,"w":236,"h":201}, + "spriteSourceSize": {"x":464,"y":429,"w":79,"h":256}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ThighLeftKneelClosed.png": +"Models/Rubber/ArmRightCrossed.png": { - "frame": {"x":1888,"y":1109,"w":154,"h":182}, + "frame": {"x":1314,"y":3,"w":267,"h":253}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":514,"y":825,"w":154,"h":182}, + "spriteSourceSize": {"x":433,"y":430,"w":267,"h":253}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SockRightSpread.png": +"Models/Rubber/Chest.png": { - "frame": {"x":1343,"y":1369,"w":104,"h":72}, + "frame": {"x":378,"y":1714,"w":267,"h":268}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":503,"y":1571,"w":104,"h":72}, + "spriteSourceSize": {"x":446,"y":360,"w":267,"h":268}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/ChestStrappyBoxtie.png": +"Models/Rubber/FootRightClosed.png": { - "frame": {"x":1394,"y":275,"w":271,"h":207}, + "frame": {"x":600,"y":281,"w":138,"h":271}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":420,"w":271,"h":207}, + "spriteSourceSize": {"x":462,"y":1342,"w":138,"h":271}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/ChestStrappyUp.png": +"Models/Rubber/HandRightBoxtie.png": { - "frame": {"x":562,"y":196,"w":271,"h":216}, + "frame": {"x":1650,"y":1430,"w":38,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":411,"w":271,"h":216}, + "spriteSourceSize": {"x":678,"y":671,"w":38,"h":44}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/ChestStrappyWristtie.png": +"Models/Slime/ArmLeftCrossed.png": { - "frame": {"x":1394,"y":275,"w":271,"h":207}, + "frame": {"x":378,"y":284,"w":218,"h":275}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":420,"w":271,"h":207}, + "spriteSourceSize": {"x":552,"y":424,"w":218,"h":275}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/StrappyLowerClosed.png": +"Models/Slime/ArmRightBoxtie.png": { - "frame": {"x":270,"y":1349,"w":255,"h":223}, + "frame": {"x":1220,"y":1111,"w":79,"h":256}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":696,"w":255,"h":223}, + "spriteSourceSize": {"x":464,"y":429,"w":79,"h":256}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/SwimsuitChestBoxtie.png": +"Models/Slime/ArmRightCrossed.png": { - "frame": {"x":274,"y":755,"w":267,"h":213}, + "frame": {"x":1220,"y":788,"w":267,"h":253}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":415,"w":267,"h":213}, + "spriteSourceSize": {"x":433,"y":430,"w":267,"h":253}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/SwimsuitChestFree.png": +"Models/Slime/Chest.png": { - "frame": {"x":3,"y":733,"w":267,"h":217}, + "frame": {"x":502,"y":1404,"w":267,"h":268}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":411,"w":267,"h":217}, + "spriteSourceSize": {"x":446,"y":360,"w":267,"h":268}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/SwimsuitChestFront.png": +"Models/Slime/FootLeftClosed.png": { - "frame": {"x":274,"y":755,"w":267,"h":213}, + "frame": {"x":275,"y":846,"w":137,"h":276}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":415,"w":267,"h":213}, + "spriteSourceSize": {"x":534,"y":1342,"w":137,"h":276}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/SwimsuitChestUp.png": +"Models/Slime/FootRightClosed.png": { - "frame": {"x":274,"y":755,"w":267,"h":213}, + "frame": {"x":381,"y":3,"w":197,"h":275}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":415,"w":267,"h":213}, + "spriteSourceSize": {"x":462,"y":1342,"w":197,"h":275}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/SwimsuitChestWristtie.png": +"Models/Slime/HandLeftFree.png": { - "frame": {"x":274,"y":755,"w":267,"h":213}, + "frame": {"x":1933,"y":1286,"w":112,"h":118}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":415,"w":267,"h":213}, + "spriteSourceSize": {"x":806,"y":743,"w":112,"h":118}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/SwimsuitChestYoked.png": +"Models/SMoonlight/ReverseBinderStraps.png": { - "frame": {"x":3,"y":733,"w":267,"h":217}, + "frame": {"x":1442,"y":598,"w":266,"h":186}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":411,"w":267,"h":217}, + "spriteSourceSize": {"x":475,"y":452,"w":266,"h":186}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/VBikiniClosed.png": +"Models/SteelCuffs/Belt.png": { - "frame": {"x":529,"y":1474,"w":253,"h":200}, + "frame": {"x":1693,"y":1273,"w":236,"h":201}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":718,"w":253,"h":200}, + "spriteSourceSize": {"x":462,"y":670,"w":236,"h":201}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimThighLeftClosed.png": +{ + "frame": {"x":207,"y":1998,"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":1457,"y":1620,"w":150,"h":90}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":367,"y":812,"w":150,"h":90}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/PetsuitTopTapedHands.png": +"Models/SteelCuffs/RimThighRightKneelClosed.png": { - "frame": {"x":786,"y":1570,"w":244,"h":104}, + "frame": {"x":1457,"y":1620,"w":150,"h":90}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":474,"y":408,"w":244,"h":104}, + "spriteSourceSize": {"x":367,"y":812,"w":150,"h":90}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/TopWristtie.png": +"Models/Succubus/SockLeftKneel.png": { - "frame": {"x":274,"y":528,"w":267,"h":223}, + "frame": {"x":1405,"y":1045,"w":75,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":487,"w":267,"h":223}, + "spriteSourceSize": {"x":831,"y":959,"w":75,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/PetsuitTopBody.png": +"Models/Succubus/SuccubusClawRightFree.png": { - "frame": {"x":3,"y":3,"w":276,"h":141}, + "frame": {"x":1848,"y":1150,"w":46,"h":119}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":475,"y":571,"w":276,"h":141}, + "spriteSourceSize": {"x":286,"y":523,"w":46,"h":119}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/AnklesClosed.png": +"Models/Swimsuit/VBikini.png": { - "frame": {"x":1265,"y":1809,"w":172,"h":232}, + "frame": {"x":1623,"y":3,"w":253,"h":200}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":522,"y":1276,"w":172,"h":232}, + "spriteSourceSize": {"x":461,"y":718,"w":253,"h":200}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/HandRightFront.png": +"Models/TapeLight/ArmStrapLeftWristtie.png": { - "frame": {"x":1949,"y":313,"w":95,"h":89}, + "frame": {"x":1236,"y":1976,"w":105,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":494,"y":462,"w":95,"h":89}, + "spriteSourceSize": {"x":676,"y":438,"w":105,"h":68}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Visors/DollmakerFullRim.png": +"Models/TapeMed/ArmRightWristtie.png": { - "frame": {"x":1441,"y":1809,"w":208,"h":231}, + "frame": {"x":1191,"y":1071,"w":47,"h":36}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":497,"y":183,"w":208,"h":231}, + "spriteSourceSize": {"x":464,"y":493,"w":47,"h":36}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/Bra.png": +"Models/TapeMed/ArmStrapLeftWristtie.png": { - "frame": {"x":840,"y":174,"w":271,"h":220}, + "frame": {"x":1236,"y":1976,"w":105,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":408,"w":271,"h":220}, + "spriteSourceSize": {"x":676,"y":438,"w":105,"h":68}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/GloveLeftYoked.png": +"Models/Warrior/GloveRightFree.png": { - "frame": {"x":1943,"y":484,"w":102,"h":154}, + "frame": {"x":1858,"y":1478,"w":136,"h":135}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":849,"y":278,"w":102,"h":154}, + "spriteSourceSize": {"x":267,"y":537,"w":136,"h":135}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/Necklace.png": +"Models/Warrior/RimForeGloveRightFront.png": { - "frame": {"x":1951,"y":3,"w":94,"h":94}, + "frame": {"x":1558,"y":1045,"w":69,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":571,"y":406,"w":94,"h":94}, + "spriteSourceSize": {"x":479,"y":528,"w":69,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/HarnessHardwareMidKneel.png": +"Models/Witch/ApprenticeHatPuff.png": { - "frame": {"x":276,"y":451,"w":268,"h":73}, + "frame": {"x":1998,"y":1545,"w":47,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":455,"y":689,"w":268,"h":73}, + "spriteSourceSize": {"x":774,"y":36,"w":47,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/PantiesKneel.png": +"Models/Witch/ShoeLeftClosed.png": { - "frame": {"x":545,"y":943,"w":265,"h":176}, + "frame": {"x":1558,"y":788,"w":222,"h":122}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":457,"y":673,"w":265,"h":176}, + "spriteSourceSize": {"x":451,"y":1507,"w":222,"h":122}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/ForeGloveRightCrossed.png": +"Models/WolfCatsuit/ForeGloveLeftFront.png": { - "frame": {"x":1090,"y":790,"w":267,"h":80}, + "frame": {"x":1492,"y":1111,"w":197,"h":249}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":433,"y":603,"w":267,"h":80}, + "spriteSourceSize": {"x":548,"y":465,"w":197,"h":249}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/GloveRightBoxtie.png": +"Models/WolfCatsuit/ForeGloveRightFront.png": { - "frame": {"x":3,"y":1392,"w":255,"h":219}, + "frame": {"x":992,"y":1375,"w":159,"h":258}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":497,"w":255,"h":219}, + "spriteSourceSize": {"x":426,"y":460,"w":159,"h":258}, "sourceSize": {"w":1240,"h":1754} }, "Models/WolfCatsuit/GloveRightFree.png": { - "frame": {"x":1809,"y":1484,"w":236,"h":208}, + "frame": {"x":1693,"y":353,"w":236,"h":208}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":267,"y":496,"w":236,"h":208}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/ShoeRightClosed.png": +"Models/WolfCatsuit/GloveRightFront.png": +{ + "frame": {"x":1166,"y":1714,"w":158,"h":258}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":426,"y":460,"w":158,"h":258}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegBandLeftKneel.png": +{ + "frame": {"x":1111,"y":1071,"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":1653,"y":1859,"w":152,"h":184}, + "frame": {"x":1111,"y":1071,"w":76,"h":36}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":1451,"w":152,"h":184}, + "spriteSourceSize": {"x":663,"y":762,"w":76,"h":36}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/TorsoUpperCups.png": +"Models/WolfCatsuit/RimForeGloveRightFront.png": { - "frame": {"x":276,"y":312,"w":269,"h":135}, + "frame": {"x":1558,"y":1045,"w":69,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":494,"w":269,"h":135}, + "spriteSourceSize": {"x":479,"y":528,"w":69,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Yukata/Waist.png": +"Models/WolfCatsuit/TorsoUpperBeltBuckle.png": { - "frame": {"x":562,"y":3,"w":274,"h":189}, + "frame": {"x":1998,"y":1478,"w":47,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":620,"w":274,"h":189}, + "spriteSourceSize": {"x":534,"y":628,"w":47,"h":63}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -999,7 +1327,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas37.webp b/TextureAtlas/atlas37.webp index c4672c827..16eba092e 100644 Binary files a/TextureAtlas/atlas37.webp and b/TextureAtlas/atlas37.webp differ diff --git a/TextureAtlas/atlas38.json b/TextureAtlas/atlas38.json index 983d3674d..b8f22ae63 100644 --- a/TextureAtlas/atlas38.json +++ b/TextureAtlas/atlas38.json @@ -1,1259 +1,963 @@ {"frames": { -"Models/Armbinder/BinderLeftBoxtie.png": -{ - "frame": {"x":658,"y":1867,"w":92,"h":167}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":678,"y":526,"w":92,"h":167}, - "sourceSize": {"w":1240,"h":1754} -}, "Models/Armbinder/CrossBoxtie.png": { - "frame": {"x":1539,"y":3,"w":243,"h":126}, + "frame": {"x":1024,"y":1677,"w":243,"h":126}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":471,"y":410,"w":243,"h":126}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Armbinder/GwenBoxtie.png": -{ - "frame": {"x":480,"y":1008,"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":480,"y":1008,"w":223,"h":113}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":489,"y":421,"w":223,"h":113}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Armbinder/SecureBoxtie.png": +"Models/ArmorPlate/Breastplate.png": { - "frame": {"x":1282,"y":353,"w":242,"h":126}, + "frame": {"x":547,"y":426,"w":266,"h":207}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":469,"y":410,"w":242,"h":126}, + "spriteSourceSize": {"x":447,"y":467,"w":266,"h":207}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Armbinder/SecureWristtie.png": +"Models/Bandit/ShoeLeftSpread.png": { - "frame": {"x":1282,"y":353,"w":242,"h":126}, + "frame": {"x":1913,"y":3,"w":132,"h":206}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":469,"y":410,"w":242,"h":126}, + "spriteSourceSize": {"x":636,"y":1440,"w":132,"h":206}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorChain/SkirtBeltDeco.png": +"Models/Bandit/ShoulderPad.png": { - "frame": {"x":406,"y":1870,"w":153,"h":168}, + "frame": {"x":892,"y":1678,"w":128,"h":127}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":543,"y":772,"w":153,"h":168}, + "spriteSourceSize": {"x":686,"y":390,"w":128,"h":127}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/GauntletRightFront.png": +"Models/Blindfold/Tape.png": { - "frame": {"x":1207,"y":1420,"w":167,"h":179}, + "frame": {"x":1843,"y":1501,"w":200,"h":81}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":461,"w":167,"h":179}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Bandit/PouchClosed.png": -{ - "frame": {"x":3,"y":1870,"w":171,"h":173}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":413,"y":939,"w":171,"h":173}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Bandit/ShortsLeftSpread.png": -{ - "frame": {"x":1377,"y":1848,"w":167,"h":196}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":595,"y":750,"w":167,"h":196}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Belts/Arms1.png": -{ - "frame": {"x":1473,"y":783,"w":222,"h":79}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":487,"y":455,"w":222,"h":79}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Body/FootLeftHogtie.png": -{ - "frame": {"x":1244,"y":571,"w":235,"h":145}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":621,"y":799,"w":235,"h":145}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":44,"y":147,"w":200,"h":81}, + "sourceSize": {"w":321,"h":332} }, -"Models/Body/Nipples.png": +"Models/Bra/Bra.png": { - "frame": {"x":724,"y":894,"w":224,"h":151}, + "frame": {"x":1095,"y":160,"w":268,"h":117}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":556,"w":224,"h":151}, + "spriteSourceSize": {"x":446,"y":510,"w":268,"h":117}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bra/Straps.png": +"Models/Bra/InnerLines.png": { - "frame": {"x":229,"y":1126,"w":220,"h":108}, + "frame": {"x":1346,"y":860,"w":260,"h":94}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":484,"y":415,"w":220,"h":108}, + "spriteSourceSize": {"x":453,"y":541,"w":260,"h":94}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/Ears.png": +"Models/Bubble/Collar.png": { - "frame": {"x":245,"y":860,"w":231,"h":151}, + "frame": {"x":1472,"y":1319,"w":111,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":457,"y":15,"w":231,"h":151}, + "spriteSourceSize": {"x":569,"y":382,"w":111,"h":40}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/FootSockLeftHogtie.png": +"Models/Bunny/GloveRightBoxtie.png": { - "frame": {"x":1940,"y":1463,"w":53,"h":120}, + "frame": {"x":528,"y":1239,"w":253,"h":199}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":728,"y":792,"w":53,"h":120}, + "spriteSourceSize": {"x":464,"y":517,"w":253,"h":199}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/GloveLeftBoxtie.png": +"Models/Bunny/GloveRightCrossed.png": { - "frame": {"x":1378,"y":1420,"w":90,"h":164}, + "frame": {"x":1365,"y":482,"w":267,"h":169}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":679,"y":519,"w":90,"h":164}, + "spriteSourceSize": {"x":433,"y":515,"w":267,"h":169}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/GloveLeftCrossed.png": +"Models/Bunny/LeotardChest.png": { - "frame": {"x":1177,"y":1071,"w":217,"h":181}, + "frame": {"x":1086,"y":708,"w":264,"h":108}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":552,"y":518,"w":217,"h":181}, + "spriteSourceSize": {"x":447,"y":518,"w":264,"h":108}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/GloveLeftWristtie.png": +"Models/Catsuit/Chest.png": { - "frame": {"x":1151,"y":1853,"w":74,"h":192}, + "frame": {"x":547,"y":308,"w":267,"h":114}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":679,"y":549,"w":74,"h":192}, + "spriteSourceSize": {"x":446,"y":513,"w":267,"h":114}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bunny/SockRightKneel.png": +"Models/Catsuit/ForeArmRightCrossed.png": { - "frame": {"x":1473,"y":866,"w":221,"h":246}, + "frame": {"x":818,"y":410,"w":267,"h":81}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":315,"y":816,"w":221,"h":246}, + "spriteSourceSize": {"x":433,"y":603,"w":267,"h":81}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ArmRightYoked.png": +"Models/Catsuit/SleevelessTop.png": { - "frame": {"x":1323,"y":1603,"w":213,"h":241}, + "frame": {"x":1636,"y":618,"w":267,"h":122}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":311,"y":389,"w":213,"h":241}, + "spriteSourceSize": {"x":445,"y":564,"w":267,"h":122}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/ButtHogtie.png": +"Models/Catsuit/SleevelessTopChest.png": { - "frame": {"x":1643,"y":1256,"w":151,"h":158}, + "frame": {"x":3,"y":242,"w":267,"h":245}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":625,"y":749,"w":151,"h":158}, + "spriteSourceSize": {"x":446,"y":382,"w":267,"h":245}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/FootLeftSpread.png": +"Models/Catsuit/SleevelessTopV.png": { - "frame": {"x":1507,"y":1256,"w":132,"h":160}, + "frame": {"x":821,"y":290,"w":267,"h":116}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":620,"y":1467,"w":132,"h":160}, + "spriteSourceSize": {"x":445,"y":570,"w":267,"h":116}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Catsuit/FootRightClosed.png": +"Models/Catsuit/SleevelessTopVChest.png": { - "frame": {"x":1229,"y":1853,"w":144,"h":166}, + "frame": {"x":1640,"y":148,"w":267,"h":245}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":1448,"w":144,"h":166}, + "spriteSourceSize": {"x":446,"y":382,"w":267,"h":245}, "sourceSize": {"w":1240,"h":1754} }, "Models/Catsuit/TorsoLowerLeotard.png": { - "frame": {"x":760,"y":495,"w":240,"h":245}, + "frame": {"x":1599,"y":1394,"w":240,"h":245}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":464,"y":670,"w":240,"h":245}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Collars/NeckCorset.png": -{ - "frame": {"x":1193,"y":1303,"w":134,"h":113}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":560,"y":357,"w":134,"h":113}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Corsets/StrapsHeavyCorset.png": +"Models/Chastity/Belt.png": { - "frame": {"x":3,"y":1088,"w":222,"h":135}, + "frame": {"x":549,"y":199,"w":268,"h":105}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":498,"y":407,"w":222,"h":135}, + "spriteSourceSize": {"x":459,"y":705,"w":268,"h":105}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/AnkleLeftClosed.png": +"Models/Chastity/BeltLining.png": { - "frame": {"x":1398,"y":1071,"w":71,"h":49}, + "frame": {"x":822,"y":180,"w":268,"h":106}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":591,"y":1430,"w":71,"h":49}, + "spriteSourceSize": {"x":459,"y":705,"w":268,"h":106}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/CuffLongMittenRightFree.png": +"Models/Chastity/BraChain.png": { - "frame": {"x":1997,"y":1463,"w":48,"h":60}, + "frame": {"x":1080,"y":937,"w":259,"h":238}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":341,"y":602,"w":48,"h":60}, + "spriteSourceSize": {"x":506,"y":401,"w":259,"h":238}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/GlowLongMittenLeftFront.png": +"Models/China/Bra.png": { - "frame": {"x":1962,"y":1587,"w":83,"h":108}, + "frame": {"x":3,"y":3,"w":269,"h":235}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":724,"y":500,"w":83,"h":108}, + "spriteSourceSize": {"x":446,"y":390,"w":269,"h":235}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/LockLongMittenLeftFree.png": -{ - "frame": {"x":412,"y":1615,"w":86,"h":249}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":765,"y":523,"w":86,"h":249}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/LongMittenLeftCrossed.png": +"Models/Collars/NeckCorset.png": { - "frame": {"x":1210,"y":896,"w":221,"h":171}, + "frame": {"x":1911,"y":213,"w":134,"h":113}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":550,"y":543,"w":221,"h":171}, + "spriteSourceSize": {"x":560,"y":357,"w":134,"h":113}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/LongMittenLeftYoked.png": +"Models/Corsets/ChestHeavyCorset.png": { - "frame": {"x":1548,"y":1822,"w":172,"h":223}, + "frame": {"x":1368,"y":123,"w":268,"h":119}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":751,"y":420,"w":172,"h":223}, + "spriteSourceSize": {"x":444,"y":507,"w":268,"h":119}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/StrapsLongMittenLeftBoxtie.png": +"Models/CyberArms/GlowLongMittenLeftYoked.png": { - "frame": {"x":1962,"y":1808,"w":83,"h":95}, + "frame": {"x":1836,"y":1767,"w":207,"h":153}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":683,"y":586,"w":83,"h":95}, + "spriteSourceSize": {"x":762,"y":383,"w":207,"h":153}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/Belt.png": +"Models/CyberCuffs/WristRightFree.png": { - "frame": {"x":3,"y":1012,"w":231,"h":72}, + "frame": {"x":1527,"y":1573,"w":60,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":472,"y":674,"w":231,"h":72}, + "spriteSourceSize": {"x":347,"y":602,"w":60,"h":66}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/ArmLongMittenLeftCrossed.png": +"Models/CyberHeels/GlowBalletLeftKneelClosed.png": { - "frame": {"x":1210,"y":896,"w":221,"h":171}, + "frame": {"x":1836,"y":1643,"w":209,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":550,"y":543,"w":221,"h":171}, + "spriteSourceSize": {"x":732,"y":942,"w":209,"h":65}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/ArmLongMittenLeftYoked.png": +"Models/CyberMitts/LongMittenRightFree.png": { - "frame": {"x":1548,"y":1822,"w":172,"h":223}, + "frame": {"x":1855,"y":1351,"w":189,"h":146}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":751,"y":420,"w":172,"h":223}, + "spriteSourceSize": {"x":299,"y":557,"w":189,"h":146}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CuffLongMittenRightFree.png": +"Models/DivineBelt/BeltBase.png": { - "frame": {"x":1997,"y":1463,"w":48,"h":60}, + "frame": {"x":261,"y":1395,"w":253,"h":194}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":341,"y":602,"w":48,"h":60}, + "spriteSourceSize": {"x":459,"y":722,"w":253,"h":194}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/LongMittenLeftCrossed.png": +"Models/DivineBelt/BeltBaseNoLock.png": { - "frame": {"x":1210,"y":896,"w":221,"h":171}, + "frame": {"x":3,"y":1558,"w":253,"h":194}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":550,"y":543,"w":221,"h":171}, + "spriteSourceSize": {"x":459,"y":722,"w":253,"h":194}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/MittenRightFree.png": +"Models/DivineBelt/BeltLines.png": { - "frame": {"x":1977,"y":678,"w":68,"h":95}, + "frame": {"x":1354,"y":655,"w":264,"h":201}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":299,"y":557,"w":68,"h":95}, + "spriteSourceSize": {"x":454,"y":722,"w":264,"h":201}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/StrapsLongMittenLeftBoxtie.png": +"Models/DivineBelt/BeltMetal1.png": { - "frame": {"x":1962,"y":1808,"w":83,"h":95}, + "frame": {"x":3,"y":1062,"w":262,"h":113}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":683,"y":586,"w":83,"h":95}, + "spriteSourceSize": {"x":455,"y":738,"w":262,"h":113}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperGlowLongMittenLeftFront.png": +"Models/DivineBelt/BeltMetalRunic1.png": { - "frame": {"x":1962,"y":1587,"w":83,"h":108}, + "frame": {"x":1080,"y":820,"w":262,"h":113}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":724,"y":500,"w":83,"h":108}, + "spriteSourceSize": {"x":455,"y":738,"w":262,"h":113}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/BraStrapsRunic.png": +"Models/DivineGag/Muzzle.png": { - "frame": {"x":1748,"y":1418,"w":188,"h":129}, + "frame": {"x":1909,"y":563,"w":136,"h":92}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":501,"y":407,"w":188,"h":129}, + "spriteSourceSize": {"x":540,"y":302,"w":136,"h":92}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/Belt.png": +"Models/Dress/BandCrotchStrap.png": { - "frame": {"x":1699,"y":842,"w":222,"h":65}, + "frame": {"x":273,"y":763,"w":265,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":473,"y":669,"w":222,"h":65}, + "spriteSourceSize": {"x":454,"y":749,"w":265,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighRightLockBandClosed.png": +"Models/Dress/BlouseForeArmLeftFront.png": { - "frame": {"x":1748,"y":1551,"w":66,"h":32}, + "frame": {"x":1858,"y":1019,"w":187,"h":239}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":487,"y":1082,"w":66,"h":32}, + "spriteSourceSize": {"x":590,"y":480,"w":187,"h":239}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighRightLockBandSpread.png": +"Models/Dress/BlouseShoulderRightUp.png": { - "frame": {"x":1818,"y":1551,"w":65,"h":32}, + "frame": {"x":1695,"y":1643,"w":137,"h":160}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":472,"y":1082,"w":65,"h":32}, + "spriteSourceSize": {"x":456,"y":345,"w":137,"h":160}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineGag/Gold.png": +"Models/Dress/LaceChest.png": { - "frame": {"x":689,"y":1176,"w":217,"h":164}, + "frame": {"x":1368,"y":3,"w":269,"h":116}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":504,"y":207,"w":217,"h":164}, + "spriteSourceSize": {"x":445,"y":512,"w":269,"h":116}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineGag/GoldClean.png": +"Models/Dress/LaceCorsetStripes.png": { - "frame": {"x":447,"y":1252,"w":217,"h":164}, + "frame": {"x":817,"y":495,"w":265,"h":228}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":504,"y":207,"w":217,"h":164}, + "spriteSourceSize": {"x":456,"y":607,"w":265,"h":228}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseForeArmLeftCrossed.png": +"Models/Dress/MageSkirtOverKneelCrotchStrap.png": { - "frame": {"x":1240,"y":720,"w":229,"h":172}, + "frame": {"x":813,"y":727,"w":263,"h":215}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":534,"y":535,"w":229,"h":172}, + "spriteSourceSize": {"x":516,"y":801,"w":263,"h":215}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BlouseShoulderRightUp.png": +"Models/Dress/ShoeLeftKneelClosed.png": { - "frame": {"x":1366,"y":1256,"w":137,"h":160}, + "frame": {"x":1909,"y":447,"w":136,"h":112}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":345,"w":137,"h":160}, + "spriteSourceSize": {"x":763,"y":909,"w":136,"h":112}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/BowCorsetBow.png": +"Models/Dress/SkirtSplitOverKneel.png": { - "frame": {"x":714,"y":1613,"w":197,"h":248}, + "frame": {"x":1086,"y":498,"w":264,"h":206}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":466,"y":533,"w":197,"h":248}, + "spriteSourceSize": {"x":519,"y":799,"w":264,"h":206}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MageBraStripes.png": +"Models/Ears/FoxInner.png": { - "frame": {"x":3,"y":1431,"w":217,"h":182}, + "frame": {"x":1855,"y":1262,"w":190,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":478,"y":443,"w":217,"h":182}, + "spriteSourceSize": {"x":501,"y":89,"w":190,"h":85}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ears/ElfFloppyFront.png": +"Models/Elf/Chest.png": { - "frame": {"x":668,"y":1344,"w":152,"h":72}, + "frame": {"x":1367,"y":246,"w":267,"h":232}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":655,"y":266,"w":152,"h":72}, + "spriteSourceSize": {"x":445,"y":396,"w":267,"h":232}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/ShoeLeftSpread.png": +"Models/Elf/Panties.png": { - "frame": {"x":778,"y":1420,"w":108,"h":189}, + "frame": {"x":3,"y":1383,"w":254,"h":171}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":642,"y":1452,"w":108,"h":189}, + "spriteSourceSize": {"x":461,"y":746,"w":254,"h":171}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/ShoeRightClosed.png": +"Models/Fiddle/BackFiddleBody.png": { - "frame": {"x":509,"y":1420,"w":135,"h":190}, + "frame": {"x":1704,"y":1936,"w":113,"h":108}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":1439,"w":135,"h":190}, + "spriteSourceSize": {"x":574,"y":364,"w":113,"h":108}, "sourceSize": {"w":1240,"h":1754} }, -"Models/FutureHarness/StrapsChest.png": +"Models/GagFrilly/FrillyPanel.png": { - "frame": {"x":744,"y":744,"w":232,"h":146}, + "frame": {"x":1447,"y":1473,"w":76,"h":166}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":483,"y":404,"w":232,"h":146}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":96,"y":106,"w":76,"h":166}, + "sourceSize": {"w":321,"h":332} }, "Models/GagLatex/NeckCorset.png": { - "frame": {"x":1193,"y":1303,"w":134,"h":113}, + "frame": {"x":1911,"y":213,"w":134,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":560,"y":357,"w":134,"h":113}, "sourceSize": {"w":1240,"h":1754} }, -"Models/GagLeather/MuzzleSideStrap.png": +"Models/Gasmask/Valves.png": { - "frame": {"x":961,"y":1854,"w":50,"h":181}, + "frame": {"x":3,"y":1756,"w":124,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":191,"y":46,"w":50,"h":181}, + "spriteSourceSize": {"x":77,"y":236,"w":124,"h":53}, "sourceSize": {"w":321,"h":332} }, -"Models/Hair/BraidBack.png": +"Models/Hair2/Hair2_FrontB.png": { - "frame": {"x":1943,"y":777,"w":102,"h":126}, + "frame": {"x":1888,"y":814,"w":157,"h":201}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":278,"w":102,"h":126}, + "spriteSourceSize": {"x":553,"y":132,"w":157,"h":201}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair/MaidFrill.png": +"Models/Hair2/Hair2_Right.png": { - "frame": {"x":952,"y":935,"w":221,"h":93}, + "frame": {"x":1704,"y":1807,"w":128,"h":125}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":500,"y":97,"w":221,"h":93}, + "spriteSourceSize": {"x":459,"y":86,"w":128,"h":125}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair5_Front.png": +"Models/Hair2/Hair4_Front.png": { - "frame": {"x":1029,"y":142,"w":249,"h":216}, + "frame": {"x":1237,"y":1807,"w":243,"h":236}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":489,"y":116,"w":249,"h":216}, + "spriteSourceSize": {"x":493,"y":114,"w":243,"h":236}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair5_FrontB.png": +"Models/Hair2/Hair5_Front.png": { - "frame": {"x":489,"y":788,"w":231,"h":216}, + "frame": {"x":260,"y":1593,"w":249,"h":216}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":489,"y":116,"w":231,"h":216}, + "spriteSourceSize": {"x":489,"y":116,"w":249,"h":216}, "sourceSize": {"w":1240,"h":1754} }, "Models/Hair2/Hair6_Front.png": { - "frame": {"x":517,"y":3,"w":252,"h":215}, + "frame": {"x":1343,"y":1100,"w":252,"h":215}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":485,"y":112,"w":252,"h":215}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/HairAura_Front.png": -{ - "frame": {"x":754,"y":1865,"w":203,"h":180}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":489,"y":111,"w":203,"h":180}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Handcuffs/Irish8CuffsFront.png": -{ - "frame": {"x":3,"y":856,"w":238,"h":62}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":466,"y":526,"w":238,"h":62}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Harness/BeltsTopBoxtie.png": -{ - "frame": {"x":707,"y":1049,"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":707,"y":1049,"w":220,"h":123}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":487,"y":409,"w":220,"h":123}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Harness/BeltsTopUp.png": -{ - "frame": {"x":1282,"y":202,"w":242,"h":147}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":483,"y":409,"w":242,"h":147}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Harness/BeltsTopWristtie.png": +"Models/Heels/ShinyBalletLeftKneelClosed.png": { - "frame": {"x":465,"y":1125,"w":220,"h":123}, + "frame": {"x":271,"y":838,"w":263,"h":146}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":487,"y":409,"w":220,"h":123}, + "spriteSourceSize": {"x":667,"y":906,"w":263,"h":146}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Harness/BeltsTopYoked.png": +"Models/Jacket/LatexChest.png": { - "frame": {"x":3,"y":584,"w":244,"h":133}, + "frame": {"x":276,"y":215,"w":267,"h":246}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":475,"y":409,"w":244,"h":133}, + "spriteSourceSize": {"x":446,"y":382,"w":267,"h":246}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Harness/BeltsUnderbust.png": +"Models/Jacket/StrapsTorsoLowerExtra.png": { - "frame": {"x":1997,"y":1527,"w":48,"h":56}, + "frame": {"x":271,"y":988,"w":262,"h":180}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":548,"y":611,"w":48,"h":56}, + "spriteSourceSize": {"x":462,"y":610,"w":262,"h":180}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/BalletSoleLeftClosed.png": -{ - "frame": {"x":1940,"y":1170,"w":105,"h":215}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":578,"y":1465,"w":105,"h":215}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Heels/TallRightKneel.png": -{ - "frame": {"x":1962,"y":1699,"w":83,"h":105}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":311,"y":834,"w":83,"h":105}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Hood/KittyEars.png": -{ - "frame": {"x":511,"y":409,"w":245,"h":171}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":487,"y":51,"w":245,"h":171}, - "sourceSize": {"w":752,"h":479} -}, "Models/Jacket/StrapsUnderbust.png": { - "frame": {"x":1786,"y":3,"w":243,"h":106}, + "frame": {"x":1041,"y":1363,"w":243,"h":106}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":481,"y":605,"w":243,"h":106}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/Belt.png": +"Models/KittyLatex/KittyLatexEarMuffLight2.png": { - "frame": {"x":1483,"y":704,"w":230,"h":75}, + "frame": {"x":809,"y":946,"w":259,"h":178}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":469,"y":671,"w":230,"h":75}, + "spriteSourceSize": {"x":476,"y":222,"w":259,"h":178}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/Collar.png": +"Models/LeatherCuffs/HardwareBelt.png": { - "frame": {"x":1940,"y":1389,"w":105,"h":70}, + "frame": {"x":1309,"y":1319,"w":159,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":574,"y":364,"w":105,"h":70}, + "spriteSourceSize": {"x":492,"y":692,"w":159,"h":40}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareThighRightSpread.png": +"Models/LeatherLeotard/StrapsChest.png": { - "frame": {"x":1848,"y":1116,"w":89,"h":38}, + "frame": {"x":3,"y":1813,"w":240,"h":232}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":481,"y":1037,"w":89,"h":38}, + "spriteSourceSize": {"x":466,"y":410,"w":240,"h":232}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/CorsetStraps.png": +"Models/Legbinder/LacesLegbinderKneelClosed.png": { - "frame": {"x":3,"y":721,"w":239,"h":131}, + "frame": {"x":518,"y":1442,"w":249,"h":232}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":406,"w":239,"h":131}, + "spriteSourceSize": {"x":347,"y":841,"w":249,"h":232}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/SockRightKneel.png": +"Models/Legbinder/RightLacesLegbinderKneelClosed.png": { - "frame": {"x":3,"y":1617,"w":204,"h":249}, + "frame": {"x":491,"y":1813,"w":178,"h":232}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":313,"y":816,"w":204,"h":249}, + "spriteSourceSize": {"x":347,"y":832,"w":178,"h":232}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/SockRightKneelClosed.png": +"Models/Maid/CorsetStraps.png": { - "frame": {"x":1123,"y":1605,"w":196,"h":244}, + "frame": {"x":513,"y":1678,"w":239,"h":131}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":321,"y":816,"w":196,"h":244}, + "spriteSourceSize": {"x":493,"y":406,"w":239,"h":131}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeOverKneelCrotchStrap.png": +"Models/Maid/StripeSockLeftKneelClosed.png": { - "frame": {"x":1263,"y":483,"w":237,"h":84}, + "frame": {"x":1836,"y":1924,"w":183,"h":121}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":545,"y":832,"w":237,"h":84}, + "spriteSourceSize": {"x":492,"y":857,"w":183,"h":121}, "sourceSize": {"w":1240,"h":1754} }, "Models/MaidKnightLight/Bouquet.png": { - "frame": {"x":1798,"y":1256,"w":138,"h":151}, + "frame": {"x":1907,"y":659,"w":138,"h":151}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":586,"y":642,"w":138,"h":151}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ForeArmRightFront.png": -{ - "frame": {"x":648,"y":1420,"w":126,"h":189}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":422,"y":530,"w":126,"h":189}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/MaidKnightLight/GuardLeftFree.png": -{ - "frame": {"x":890,"y":1420,"w":147,"h":182}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":725,"y":632,"w":147,"h":182}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Mittens/LatexLeftFree.png": +"Models/MaidKnightLight/ForeArmRightCrossed.png": { - "frame": {"x":224,"y":1441,"w":162,"h":172}, + "frame": {"x":1622,"y":744,"w":262,"h":81}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":749,"y":682,"w":162,"h":172}, + "spriteSourceSize": {"x":432,"y":603,"w":262,"h":81}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LongMittenLeftBoxtie.png": +"Models/Mittens/LongMittenRightBoxtie.png": { - "frame": {"x":1378,"y":1420,"w":90,"h":164}, + "frame": {"x":3,"y":1179,"w":255,"h":200}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":679,"y":519,"w":90,"h":164}, + "spriteSourceSize": {"x":464,"y":517,"w":255,"h":200}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LongMittenLeftWristtie.png": +"Models/Mittens/LongMittenRightFront.png": { - "frame": {"x":1151,"y":1853,"w":74,"h":192}, + "frame": {"x":1528,"y":1363,"w":67,"h":206}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":679,"y":549,"w":74,"h":192}, + "spriteSourceSize": {"x":424,"y":509,"w":67,"h":206}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LongMittenRightCrossed.png": +"Models/Ninja/TopBandChest.png": { - "frame": {"x":265,"y":1870,"w":137,"h":169}, + "frame": {"x":849,"y":1810,"w":216,"h":235}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":433,"y":515,"w":137,"h":169}, + "spriteSourceSize": {"x":492,"y":394,"w":216,"h":235}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/Belt.png": +"Models/Ninja/TopBandRimChest.png": { - "frame": {"x":773,"y":144,"w":249,"h":133}, + "frame": {"x":1484,"y":1807,"w":216,"h":235}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":640,"w":249,"h":133}, + "spriteSourceSize": {"x":492,"y":394,"w":216,"h":235}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/SkirtBandCrotchStrap.png": +"Models/Nipples/Weights.png": { - "frame": {"x":563,"y":1867,"w":91,"h":176}, + "frame": {"x":1836,"y":1712,"w":209,"h":51}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":453,"y":759,"w":91,"h":176}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Ninja/Top.png": -{ - "frame": {"x":980,"y":836,"w":226,"h":95}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":474,"y":573,"w":226,"h":95}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Ninja/TopBandChestTied.png": -{ - "frame": {"x":1540,"y":1587,"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":1751,"y":1587,"w":207,"h":231}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":492,"y":397,"w":207,"h":231}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Ninja/TopShouldersTied.png": -{ - "frame": {"x":1004,"y":638,"w":232,"h":194}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":496,"y":422,"w":232,"h":194}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/OperaGloves/ForeGloveLeftFront.png": -{ - "frame": {"x":502,"y":1615,"w":208,"h":248}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":548,"y":465,"w":208,"h":248}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/PantiesHigh/BaseClosed.png": -{ - "frame": {"x":1539,"y":133,"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":3,"y":369,"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":768,"y":281,"w":245,"h":210}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":466,"y":709,"w":245,"h":210}, + "spriteSourceSize": {"x":461,"y":567,"w":209,"h":51}, "sourceSize": {"w":1240,"h":1754} }, "Models/PantiesHigh/Stripes.png": { - "frame": {"x":500,"y":584,"w":240,"h":200}, + "frame": {"x":996,"y":1473,"w":240,"h":200}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":468,"y":719,"w":240,"h":200}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/ArmHarness.png": -{ - "frame": {"x":1724,"y":1822,"w":213,"h":220}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":495,"y":409,"w":213,"h":220}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Ribbon/BowCrotch.png": -{ - "frame": {"x":1923,"y":977,"w":122,"h":135}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":521,"y":791,"w":122,"h":135}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Ribbon/TopCalf2Closed.png": -{ - "frame": {"x":931,"y":1129,"w":217,"h":170}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":531,"y":1231,"w":217,"h":170}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Ribbon/TopThigh2Closed.png": -{ - "frame": {"x":259,"y":329,"w":248,"h":124}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":468,"y":1012,"w":248,"h":124}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Ribbon/TopThigh3KneelClosed.png": +"Models/Ribbon/Calf2Closed.png": { - "frame": {"x":1786,"y":113,"w":242,"h":241}, + "frame": {"x":247,"y":1813,"w":240,"h":232}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":443,"y":826,"w":242,"h":241}, + "spriteSourceSize": {"x":507,"y":1225,"w":240,"h":232}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/ChestFrill.png": +"Models/Ribbon/TopBowWristtie.png": { - "frame": {"x":952,"y":1032,"w":221,"h":93}, + "frame": {"x":756,"y":1678,"w":132,"h":128}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":482,"y":446,"w":221,"h":93}, + "spriteSourceSize": {"x":515,"y":540,"w":132,"h":128}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/FabricClosed.png": +"Models/Ribbon/TopCrotch.png": { - "frame": {"x":1285,"y":3,"w":250,"h":195}, + "frame": {"x":1622,"y":829,"w":261,"h":183}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":657,"w":250,"h":195}, + "spriteSourceSize": {"x":456,"y":737,"w":261,"h":183}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RobeOfChastity/FabricSpread.png": +"Models/RobeOfChastity/ChestFabricTied.png": { - "frame": {"x":1285,"y":3,"w":250,"h":195}, + "frame": {"x":1069,"y":1807,"w":164,"h":237}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":462,"y":657,"w":250,"h":195}, + "spriteSourceSize": {"x":533,"y":413,"w":164,"h":237}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/RibbonBelt.png": +"Models/Robes/Bra.png": { - "frame": {"x":1743,"y":578,"w":230,"h":134}, + "frame": {"x":822,"y":3,"w":269,"h":173}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":470,"y":623,"w":230,"h":134}, + "spriteSourceSize": {"x":446,"y":479,"w":269,"h":173}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/ShoeLeftClosed.png": +"Models/Robes/Chest.png": { - "frame": {"x":984,"y":1303,"w":205,"h":113}, + "frame": {"x":1095,"y":3,"w":269,"h":153}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":466,"y":1517,"w":205,"h":113}, + "spriteSourceSize": {"x":446,"y":479,"w":269,"h":153}, "sourceSize": {"w":1240,"h":1754} }, "Models/Robes/ZombieHat.png": { - "frame": {"x":3,"y":3,"w":253,"h":178}, + "frame": {"x":1601,"y":1016,"w":253,"h":178}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":506,"y":1,"w":253,"h":178}, "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/Robes/ZombieTalisman.png": -{ - "frame": {"x":1472,"y":1420,"w":91,"h":163}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":554,"y":91,"w":91,"h":163}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Robes/ZombieTalismanBent.png": -{ - "frame": {"x":390,"y":1441,"w":115,"h":170}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":606,"y":139,"w":115,"h":170}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Rope/ArmHarness.png": -{ - "frame": {"x":1504,"y":489,"w":235,"h":211}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":478,"y":411,"w":235,"h":211}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Rope/ArmHarnessUnder.png": -{ - "frame": {"x":1504,"y":489,"w":235,"h":211}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":478,"y":411,"w":235,"h":211}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Rope/Calf2Closed.png": -{ - "frame": {"x":1152,"y":1256,"w":210,"h":43}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":470,"y":1327,"w":210,"h":43}, - "sourceSize": {"w":1240,"h":1754} -}, "Models/Rope/FrogThigh1KneelClosed.png": { - "frame": {"x":252,"y":457,"w":244,"h":160}, + "frame": {"x":1447,"y":1643,"w":244,"h":160}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":332,"y":908,"w":244,"h":160}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/HarnessLowerStrap.png": +"Models/Rope/HarnessLower.png": { - "frame": {"x":1977,"y":578,"w":68,"h":96}, + "frame": {"x":3,"y":817,"w":264,"h":241}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":540,"y":825,"w":68,"h":96}, + "spriteSourceSize": {"x":455,"y":600,"w":264,"h":241}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Thigh3KneelClosedOver.png": +"Models/Rope/LeftFrogtieKneel.png": { - "frame": {"x":1567,"y":1420,"w":177,"h":162}, + "frame": {"x":1240,"y":1473,"w":203,"h":200}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":510,"y":823,"w":177,"h":162}, + "spriteSourceSize": {"x":555,"y":822,"w":203,"h":200}, "sourceSize": {"w":1240,"h":1754} }, -"Models/RopeOld/ShoulderStraps.png": +"Models/Rope/Thigh2KneelClosed.png": { - "frame": {"x":238,"y":1015,"w":223,"h":107}, + "frame": {"x":1271,"y":1677,"w":148,"h":126}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":486,"y":409,"w":223,"h":107}, + "spriteSourceSize": {"x":450,"y":875,"w":148,"h":126}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/FaceFull.png": +"Models/Sailor/CollarStripeYoked.png": { - "frame": {"x":3,"y":1227,"w":219,"h":200}, + "frame": {"x":1288,"y":1363,"w":236,"h":106}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":503,"y":194,"w":219,"h":200}, + "spriteSourceSize": {"x":510,"y":413,"w":236,"h":106}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/CollarStripe.png": +"Models/Sailor/Ribbon.png": { - "frame": {"x":251,"y":621,"w":240,"h":107}, + "frame": {"x":1599,"y":1198,"w":252,"h":192}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":510,"y":412,"w":240,"h":107}, + "spriteSourceSize": {"x":491,"y":418,"w":252,"h":192}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/CollarStripeYoked.png": +"Models/Sailor/RibbonTied.png": { - "frame": {"x":1004,"y":528,"w":236,"h":106}, + "frame": {"x":1053,"y":1179,"w":252,"h":180}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":510,"y":413,"w":236,"h":106}, + "spriteSourceSize": {"x":479,"y":430,"w":252,"h":180}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/CollarTied.png": +"Models/Sailor/RibbonYoked.png": { - "frame": {"x":1029,"y":3,"w":252,"h":135}, + "frame": {"x":1599,"y":1198,"w":252,"h":192}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":479,"y":395,"w":252,"h":135}, + "spriteSourceSize": {"x":491,"y":418,"w":252,"h":192}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/Ribbon.png": +"Models/Sailor/Shirt.png": { - "frame": {"x":260,"y":133,"w":252,"h":192}, + "frame": {"x":276,"y":3,"w":269,"h":208}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":491,"y":418,"w":252,"h":192}, + "spriteSourceSize": {"x":445,"y":526,"w":269,"h":208}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/RibbonTied.png": +"Models/Sailor/ShirtKneel.png": { - "frame": {"x":3,"y":185,"w":252,"h":180}, + "frame": {"x":276,"y":3,"w":269,"h":208}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":479,"y":430,"w":252,"h":180}, + "spriteSourceSize": {"x":445,"y":526,"w":269,"h":208}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/RibbonYoked.png": +"Models/Skirts/ApronSkirt.png": { - "frame": {"x":260,"y":133,"w":252,"h":192}, + "frame": {"x":274,"y":465,"w":266,"h":202}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":491,"y":418,"w":252,"h":192}, + "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/SleeveRightTied.png": +"Models/Skirts/ApronSkirtClosed.png": { - "frame": {"x":1941,"y":1907,"w":64,"h":138}, + "frame": {"x":274,"y":465,"w":266,"h":202}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":430,"y":440,"w":64,"h":138}, + "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/SleeveRightUp.png": +"Models/Skirts/ApronSkirtClosedCrotchStrap.png": { - "frame": {"x":178,"y":1870,"w":83,"h":173}, + "frame": {"x":274,"y":465,"w":266,"h":202}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":476,"y":303,"w":83,"h":173}, + "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/Feet1KneelClosed.png": +"Models/Skirts/ApronSkirtCrotchStrap.png": { - "frame": {"x":516,"y":222,"w":248,"h":183}, + "frame": {"x":274,"y":465,"w":266,"h":202}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":516,"y":894,"w":248,"h":183}, + "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/FaceFull.png": +"Models/Skirts/ApronSkirtHogtie.png": { - "frame": {"x":226,"y":1238,"w":217,"h":199}, + "frame": {"x":274,"y":465,"w":266,"h":202}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":505,"y":194,"w":217,"h":199}, + "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelChastity/Belt.png": +"Models/Skirts/ApronSkirtHogtieCrotchStrap.png": { - "frame": {"x":1774,"y":358,"w":235,"h":216}, + "frame": {"x":274,"y":465,"w":266,"h":202}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":469,"y":700,"w":235,"h":216}, + "spriteSourceSize": {"x":452,"y":735,"w":266,"h":202}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ElbowRightUp.png": +"Models/Slayer/CapeCollar.png": { - "frame": {"x":1925,"y":907,"w":118,"h":66}, + "frame": {"x":131,"y":1756,"w":97,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":446,"y":266,"w":118,"h":66}, + "spriteSourceSize": {"x":576,"y":384,"w":97,"h":53}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimBelt.png": +"Models/Slayer/CapeCollarRim.png": { - "frame": {"x":1698,"y":911,"w":221,"h":201}, + "frame": {"x":1843,"y":1586,"w":97,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":472,"y":670,"w":221,"h":201}, + "spriteSourceSize": {"x":576,"y":384,"w":97,"h":53}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimThighLeftKneelClosed.png": +"Models/Slime/HandRightFree.png": { - "frame": {"x":1015,"y":1854,"w":132,"h":180}, + "frame": {"x":1911,"y":330,"w":134,"h":113}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":517,"y":826,"w":132,"h":180}, + "spriteSourceSize": {"x":268,"y":544,"w":134,"h":113}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SuccubusClawLeftFree.png": +"Models/SMoonlight/ReverseBinderHardware.png": { - "frame": {"x":910,"y":1303,"w":70,"h":37}, + "frame": {"x":544,"y":637,"w":265,"h":157}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":838,"y":832,"w":70,"h":37}, + "spriteSourceSize": {"x":476,"y":398,"w":265,"h":157}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Swimsuit/Strappy.png": +"Models/SteelCuffs/RimBelt.png": { - "frame": {"x":246,"y":732,"w":239,"h":124}, + "frame": {"x":771,"y":1473,"w":221,"h":201}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":469,"y":614,"w":239,"h":124}, + "spriteSourceSize": {"x":472,"y":670,"w":221,"h":201}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallSmoothHeels/TallLeftHogtie.png": +"Models/SteelCuffs/RimElbowLeftFront.png": { - "frame": {"x":1398,"y":1124,"w":54,"h":127}, + "frame": {"x":1944,"y":1586,"w":90,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":730,"y":792,"w":54,"h":127}, + "spriteSourceSize": {"x":681,"y":591,"w":90,"h":53}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallSmoothHeels/TallLegRightKneelClosed.png": +"Models/Swimsuit/StrappyLowerClosed.png": { - "frame": {"x":915,"y":1606,"w":204,"h":244}, + "frame": {"x":537,"y":1012,"w":255,"h":223}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":315,"y":818,"w":204,"h":244}, + "spriteSourceSize": {"x":459,"y":696,"w":255,"h":223}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/FeetClosed.png": +"Models/Swimsuit/SwimsuitChestBoxtie.png": { - "frame": {"x":1473,"y":1116,"w":209,"h":136}, + "frame": {"x":1094,"y":281,"w":267,"h":213}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":460,"y":1483,"w":209,"h":136}, + "spriteSourceSize": {"x":446,"y":415,"w":267,"h":213}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/AnklesKneelClosed.png": +"Models/Swimsuit/SwimsuitChestFree.png": { - "frame": {"x":3,"y":922,"w":231,"h":86}, + "frame": {"x":1638,"y":397,"w":267,"h":217}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":534,"y":980,"w":231,"h":86}, + "spriteSourceSize": {"x":446,"y":411,"w":267,"h":217}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/HandRightFront.png": +"Models/Swimsuit/SwimsuitChestFront.png": { - "frame": {"x":1848,"y":1158,"w":88,"h":84}, + "frame": {"x":1094,"y":281,"w":267,"h":213}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":494,"y":467,"w":88,"h":84}, + "spriteSourceSize": {"x":446,"y":415,"w":267,"h":213}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/PetsuitTopTapedHands.png": +"Models/Swimsuit/SwimsuitChestUp.png": { - "frame": {"x":1017,"y":450,"w":242,"h":74}, + "frame": {"x":1094,"y":281,"w":267,"h":213}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":475,"y":418,"w":242,"h":74}, + "spriteSourceSize": {"x":446,"y":415,"w":267,"h":213}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/AnklesKneelClosed.png": +"Models/Swimsuit/SwimsuitChestWristtie.png": { - "frame": {"x":773,"y":3,"w":252,"h":137}, + "frame": {"x":1094,"y":281,"w":267,"h":213}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":513,"y":936,"w":252,"h":137}, + "spriteSourceSize": {"x":446,"y":415,"w":267,"h":213}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/PetsuitTopTapedHands.png": +"Models/Swimsuit/SwimsuitChestYoked.png": { - "frame": {"x":1017,"y":362,"w":242,"h":84}, + "frame": {"x":1638,"y":397,"w":267,"h":217}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":475,"y":408,"w":242,"h":84}, + "spriteSourceSize": {"x":446,"y":411,"w":267,"h":217}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/BandForeGloveLeftFront.png": +"Models/Swimsuit/VBikiniClosed.png": { - "frame": {"x":1887,"y":1551,"w":49,"h":30}, + "frame": {"x":796,"y":1128,"w":253,"h":200}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":628,"y":554,"w":49,"h":30}, + "spriteSourceSize": {"x":461,"y":718,"w":253,"h":200}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/ShoeLeftClosed.png": +"Models/TapeHeavy/ChestPetsuit.png": { - "frame": {"x":1717,"y":716,"w":222,"h":122}, + "frame": {"x":3,"y":491,"w":266,"h":159}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":451,"y":1507,"w":222,"h":122}, + "spriteSourceSize": {"x":446,"y":469,"w":266,"h":159}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/Collar.png": +"Models/TapeHeavy/TopBoxtie.png": { - "frame": {"x":824,"y":1344,"w":126,"h":72}, + "frame": {"x":542,"y":798,"w":263,"h":210}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":565,"y":366,"w":126,"h":72}, + "spriteSourceSize": {"x":446,"y":500,"w":263,"h":210}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/HarnessBandUpper.png": +"Models/TapeMed/AnklesClosed.png": { - "frame": {"x":1528,"y":345,"w":242,"h":140}, + "frame": {"x":673,"y":1813,"w":172,"h":232}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":479,"y":414,"w":242,"h":140}, + "spriteSourceSize": {"x":522,"y":1276,"w":172,"h":232}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/BandForeGloveLeftFront.png": +"Models/TapeMed/AnklesKneelClosed.png": { - "frame": {"x":1887,"y":1551,"w":49,"h":30}, + "frame": {"x":785,"y":1332,"w":252,"h":137}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":628,"y":554,"w":49,"h":30}, + "spriteSourceSize": {"x":513,"y":936,"w":252,"h":137}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/ForeGloveLeftFront.png": +"Models/TapeMed/Chest.png": { - "frame": {"x":211,"y":1617,"w":197,"h":249}, + "frame": {"x":1641,"y":3,"w":268,"h":141}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":548,"y":465,"w":197,"h":249}, + "spriteSourceSize": {"x":446,"y":486,"w":268,"h":141}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegPadsRightKneel.png": +"Models/TapeMed/ChestPetsuit.png": { - "frame": {"x":1041,"y":1420,"w":162,"h":181}, + "frame": {"x":3,"y":654,"w":266,"h":159}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":332,"y":813,"w":162,"h":181}, + "spriteSourceSize": {"x":446,"y":469,"w":266,"h":159}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegPadsRightKneelClosed.png": +"Models/Warrior/SkirtOverKneelCrotchStrap.png": { - "frame": {"x":1041,"y":1420,"w":162,"h":181}, + "frame": {"x":273,"y":671,"w":265,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":332,"y":813,"w":162,"h":181}, + "spriteSourceSize": {"x":516,"y":801,"w":265,"h":88}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegRimLeftKneel.png": +"Models/Witch/Corset.png": { - "frame": {"x":1941,"y":1116,"w":104,"h":50}, + "frame": {"x":1343,"y":958,"w":254,"h":138}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":645,"y":755,"w":104,"h":50}, + "spriteSourceSize": {"x":463,"y":645,"w":254,"h":138}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegRimLeftKneelClosed.png": +"Models/WolfCatsuit/GloveRightBoxtie.png": { - "frame": {"x":1941,"y":1116,"w":104,"h":50}, + "frame": {"x":269,"y":1172,"w":255,"h":219}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":645,"y":755,"w":104,"h":50}, + "spriteSourceSize": {"x":462,"y":497,"w":255,"h":219}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegRimRightSpread.png": +"Models/WolfCatsuit/GloveRightCrossed.png": { - "frame": {"x":1686,"y":1116,"w":158,"h":136}, + "frame": {"x":549,"y":3,"w":269,"h":192}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":444,"y":803,"w":158,"h":136}, + "spriteSourceSize": {"x":432,"y":491,"w":269,"h":192}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -1263,7 +967,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas38.webp b/TextureAtlas/atlas38.webp index b07f1fc3f..98bc323d8 100644 Binary files a/TextureAtlas/atlas38.webp and b/TextureAtlas/atlas38.webp differ diff --git a/TextureAtlas/atlas39.json b/TextureAtlas/atlas39.json index 7d7fb147e..46343e9f0 100644 --- a/TextureAtlas/atlas39.json +++ b/TextureAtlas/atlas39.json @@ -1,3088 +1,1616 @@ {"frames": { -"Models/Armbinder/BinderLeftWristtie.png": +"Models/Armbinder/SecureBoxtie.png": { - "frame": {"x":177,"y":220,"w":86,"h":213}, + "frame": {"x":1262,"y":111,"w":242,"h":126}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":677,"y":531,"w":86,"h":213}, + "spriteSourceSize": {"x":469,"y":410,"w":242,"h":126}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/BootRightKneel.png": +"Models/Armbinder/SecureWristtie.png": { - "frame": {"x":1552,"y":331,"w":73,"h":100}, + "frame": {"x":1262,"y":111,"w":242,"h":126}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":321,"y":853,"w":73,"h":100}, + "spriteSourceSize": {"x":469,"y":410,"w":242,"h":126}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/GauntletLeftYoked.png": +"Models/ArmorChain/Skirt2CrotchStrap.png": { - "frame": {"x":314,"y":1738,"w":98,"h":193}, + "frame": {"x":728,"y":478,"w":228,"h":187}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":850,"y":280,"w":98,"h":193}, + "spriteSourceSize": {"x":475,"y":804,"w":228,"h":187}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/GauntletRightCrossed.png": +"Models/ArmorPlate/GauntletLeftFree.png": { - "frame": {"x":1949,"y":834,"w":95,"h":55}, + "frame": {"x":1466,"y":1761,"w":153,"h":165}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":609,"y":601,"w":95,"h":55}, + "spriteSourceSize": {"x":764,"y":698,"w":153,"h":165}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/GauntletRightFree.png": +"Models/ArmorPlate/GauntletLeftFront.png": { - "frame": {"x":627,"y":1738,"w":178,"h":153}, + "frame": {"x":1156,"y":1761,"w":158,"h":167}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":269,"y":537,"w":178,"h":153}, + "spriteSourceSize": {"x":550,"y":464,"w":158,"h":167}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/Choker.png": +"Models/Bandit/ShoeLeftKneel.png": { - "frame": {"x":1516,"y":1974,"w":78,"h":36}, + "frame": {"x":1853,"y":1433,"w":192,"h":101}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":590,"y":390,"w":78,"h":36}, + "spriteSourceSize": {"x":705,"y":923,"w":192,"h":101}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ShoeLeftKneelClosed.png": +"Models/Bandit/ShortsLeftClosed.png": { - "frame": {"x":1512,"y":767,"w":168,"h":95}, + "frame": {"x":1888,"y":1251,"w":157,"h":178}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":729,"y":929,"w":168,"h":95}, + "spriteSourceSize": {"x":587,"y":771,"w":157,"h":178}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/ShoeLeftSpread.png": +"Models/Bandit/ShortsLeftSpread.png": { - "frame": {"x":3,"y":1534,"w":132,"h":206}, + "frame": {"x":152,"y":1506,"w":167,"h":196}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":636,"y":1440,"w":132,"h":206}, + "spriteSourceSize": {"x":595,"y":750,"w":167,"h":196}, "sourceSize": {"w":1240,"h":1754} }, "Models/Belts/Feet1Closed.png": { - "frame": {"x":634,"y":1685,"w":141,"h":49}, + "frame": {"x":1227,"y":1708,"w":141,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":533,"y":1359,"w":141,"h":49}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/Feet1Kneel.png": +"Models/Body/FootLeftHogtie.png": { - "frame": {"x":1848,"y":1970,"w":59,"h":75}, + "frame": {"x":1001,"y":330,"w":235,"h":145}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":707,"y":949,"w":59,"h":75}, + "spriteSourceSize": {"x":621,"y":799,"w":235,"h":145}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/Legs2Closed.png": +"Models/Body/Nipples.png": { - "frame": {"x":545,"y":1475,"w":190,"h":55}, + "frame": {"x":1493,"y":434,"w":224,"h":151}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":491,"y":1150,"w":190,"h":55}, + "spriteSourceSize": {"x":458,"y":556,"w":224,"h":151}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Blindfold/BasicRim.png": -{ - "frame": {"x":330,"y":137,"w":198,"h":79}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":45,"y":148,"w":198,"h":79}, - "sourceSize": {"w":321,"h":332} -}, -"Models/Blindfold/LeatherRim.png": -{ - "frame": {"x":439,"y":1028,"w":201,"h":71}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":513,"y":254,"w":201,"h":71}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Body/ArmRightWristtie.png": -{ - "frame": {"x":3,"y":1744,"w":134,"h":204}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":465,"y":430,"w":134,"h":204}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Body/ButtKneel.png": -{ - "frame": {"x":177,"y":3,"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":1629,"y":347,"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":1107,"w":148,"h":212}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":654,"y":801,"w":148,"h":212}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Body/FootRightKneel.png": -{ - "frame": {"x":1435,"y":775,"w":73,"h":107}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":322,"y":850,"w":73,"h":107}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Body/HandLeftFree.png": -{ - "frame": {"x":877,"y":1014,"w":139,"h":85}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":806,"y":779,"w":139,"h":85}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Body/ShoulderRightUp.png": -{ - "frame": {"x":1438,"y":437,"w":106,"h":105}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":476,"y":401,"w":106,"h":105}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Bunny/FootSockRightKneel.png": -{ - "frame": {"x":1472,"y":331,"w":76,"h":100}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":324,"y":851,"w":76,"h":100}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Catsuit/FootLeftClosed.png": -{ - "frame": {"x":399,"y":1103,"w":138,"h":149}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":533,"y":1472,"w":138,"h":149}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Catsuit/FootLeftKneel.png": -{ - "frame": {"x":1246,"y":127,"w":173,"h":89}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":722,"y":932,"w":173,"h":89}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Catsuit/FootRightSpread.png": -{ - "frame": {"x":491,"y":665,"w":109,"h":143}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":496,"y":1482,"w":109,"h":143}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Catsuit/HandLeftFree.png": -{ - "frame": {"x":1129,"y":131,"w":113,"h":85}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":805,"y":778,"w":113,"h":85}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Chastity/BeltStrap.png": -{ - "frame": {"x":3,"y":3,"w":170,"h":218}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":557,"y":705,"w":170,"h":218}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Collars/Choker.png": -{ - "frame": {"x":1516,"y":1974,"w":78,"h":36}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":590,"y":390,"w":78,"h":36}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Collars/NeckCorsetRim.png": -{ - "frame": {"x":196,"y":1488,"w":131,"h":42}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":561,"y":424,"w":131,"h":42}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/AnkleLinkSpread.png": -{ - "frame": {"x":1882,"y":1189,"w":151,"h":59}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":546,"y":1438,"w":151,"h":59}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/ElbowLeftFree.png": -{ - "frame": {"x":1430,"y":1529,"w":82,"h":57}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":700,"y":582,"w":82,"h":57}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/ElbowLeftWristtie.png": -{ - "frame": {"x":1675,"y":1745,"w":65,"h":56}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":671,"y":599,"w":65,"h":56}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/ThighLeftClosed.png": -{ - "frame": {"x":1150,"y":1673,"w":143,"h":61}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":575,"y":1031,"w":143,"h":61}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/ThighLeftKneel.png": -{ - "frame": {"x":1502,"y":3,"w":185,"h":114}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":470,"y":848,"w":185,"h":114}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/ThighLeftKneelClosed.png": -{ - "frame": {"x":564,"y":1534,"w":184,"h":147}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":470,"y":848,"w":184,"h":147}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CrystalCuffs/ThighRightKneel.png": -{ - "frame": {"x":1297,"y":1673,"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":1297,"y":1673,"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":1757,"y":955,"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":929,"y":1681,"w":65,"h":53}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":623,"y":543,"w":65,"h":53}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Cuffs/AnkleLinkSpread.png": -{ - "frame": {"x":1726,"y":1226,"w":151,"h":59}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":546,"y":1438,"w":151,"h":59}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Cuffs/ElbowLeftUp.png": -{ - "frame": {"x":1839,"y":435,"w":114,"h":72}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":717,"y":249,"w":114,"h":72}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Cuffs/ElbowLeftWristtie.png": -{ - "frame": {"x":1744,"y":1745,"w":65,"h":56}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":671,"y":599,"w":65,"h":56}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Cuffs/ThighLeftClosed.png": -{ - "frame": {"x":1726,"y":1449,"w":143,"h":61}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":575,"y":1031,"w":143,"h":61}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Cuffs/ThighLeftKneel.png": -{ - "frame": {"x":1070,"y":1103,"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":303,"y":665,"w":184,"h":147}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":470,"y":848,"w":184,"h":147}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Cuffs/ThighRightKneel.png": -{ - "frame": {"x":1444,"y":1673,"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":1444,"y":1673,"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":1911,"y":1970,"w":134,"h":71}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":456,"y":1020,"w":134,"h":71}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Cuffs/WristRightFront.png": -{ - "frame": {"x":1604,"y":1745,"w":67,"h":56}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":473,"y":541,"w":67,"h":56}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/ForeLongMittenLeftCrossed.png": -{ - "frame": {"x":3,"y":1952,"w":206,"h":93}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":553,"y":621,"w":206,"h":93}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/GlowForeLongMittenLeftFront.png": -{ - "frame": {"x":541,"y":1103,"w":112,"h":145}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":624,"y":515,"w":112,"h":145}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/GlowLongMittenLeftYoked.png": -{ - "frame": {"x":416,"y":1738,"w":207,"h":153}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":762,"y":383,"w":207,"h":153}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/GlowLongMittenRightFront.png": -{ - "frame": {"x":1013,"y":350,"w":67,"h":83}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":413,"y":496,"w":67,"h":83}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/LongMittenRightFront.png": -{ - "frame": {"x":346,"y":1323,"w":108,"h":161}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":421,"y":560,"w":108,"h":161}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/LongMittenRightYoked.png": -{ - "frame": {"x":3,"y":447,"w":145,"h":218}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":319,"y":420,"w":145,"h":218}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/StrapsForeLongMittenLeftCrossed.png": -{ - "frame": {"x":1723,"y":1580,"w":140,"h":74}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":622,"y":638,"w":140,"h":74}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/StrapsLongMittenLeftCrossed.png": -{ - "frame": {"x":885,"y":220,"w":140,"h":126}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":622,"y":586,"w":140,"h":126}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/StrapsLongMittenLeftUp.png": -{ - "frame": {"x":532,"y":137,"w":94,"h":79}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":739,"y":176,"w":94,"h":79}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberArms/StrapsLongMittenRightYoked.png": -{ - "frame": {"x":445,"y":3,"w":109,"h":130}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":342,"y":490,"w":109,"h":130}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/DisplayElbowLeftUp.png": -{ - "frame": {"x":1607,"y":1596,"w":37,"h":55}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":712,"y":260,"w":37,"h":55}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/DisplayThighRightSpread.png": -{ - "frame": {"x":1792,"y":596,"w":43,"h":55}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":476,"y":1006,"w":43,"h":55}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/ScreenAnkleLeftKneelClosed.png": -{ - "frame": {"x":486,"y":1895,"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":1500,"y":1596,"w":50,"h":73}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":511,"y":243,"w":50,"h":73}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/ThighLeftKneel.png": -{ - "frame": {"x":1029,"y":220,"w":165,"h":121}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":484,"y":840,"w":165,"h":121}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/ThighRightSpread.png": -{ - "frame": {"x":800,"y":134,"w":150,"h":82}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":446,"y":981,"w":150,"h":82}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/WristRightCrossed.png": -{ - "frame": {"x":1878,"y":1745,"w":55,"h":56}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":651,"y":593,"w":55,"h":56}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberCuffs/WristRightFree.png": -{ - "frame": {"x":1058,"y":1463,"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":1719,"y":692,"w":69,"h":63}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":474,"y":535,"w":69,"h":63}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberHeels/GlowBalletLeftClosed.png": -{ - "frame": {"x":267,"y":220,"w":41,"h":213}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":642,"y":1418,"w":41,"h":213}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberHeels/GlowBalletLeftKneelClosed.png": -{ - "frame": {"x":1719,"y":1030,"w":209,"h":65}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":732,"y":942,"w":209,"h":65}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberHeels/GlowBalletLeftSpread.png": -{ - "frame": {"x":267,"y":220,"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":3,"y":890,"w":41,"h":213}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":580,"y":1415,"w":41,"h":213}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberHeels/ShinyBalletRightKneel.png": -{ - "frame": {"x":1466,"y":659,"w":76,"h":104}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":321,"y":852,"w":76,"h":104}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberLink/GlowThighLinkSpread.png": -{ - "frame": {"x":1880,"y":1312,"w":150,"h":45}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":527,"y":1026,"w":150,"h":45}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/ArmLongMittenRightFront.png": -{ - "frame": {"x":346,"y":1323,"w":108,"h":161}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":421,"y":560,"w":108,"h":161}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/ArmLongMittenRightYoked.png": -{ - "frame": {"x":3,"y":447,"w":145,"h":218}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":319,"y":420,"w":145,"h":218}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/CapLongMittenRightYoked.png": -{ - "frame": {"x":1957,"y":487,"w":86,"h":65}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":291,"y":284,"w":86,"h":65}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/ForeLongMittenLeftCrossed.png": -{ - "frame": {"x":3,"y":1952,"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":1174,"y":562,"w":100,"h":99}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":574,"y":470,"w":100,"h":99}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/ForeMittenRightFront.png": -{ - "frame": {"x":1448,"y":999,"w":90,"h":98}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":495,"y":462,"w":90,"h":98}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/GlowForeLongMittenLeftFront.png": -{ - "frame": {"x":541,"y":1103,"w":112,"h":145}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":624,"y":515,"w":112,"h":145}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/GlowLongMittenRightYoked.png": -{ - "frame": {"x":1430,"y":1590,"w":66,"h":79}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":273,"y":376,"w":66,"h":79}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/LongMittenRightFront.png": -{ - "frame": {"x":346,"y":1323,"w":108,"h":161}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":421,"y":560,"w":108,"h":161}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/StrapsForeLongMittenLeftCrossed.png": -{ - "frame": {"x":1723,"y":1580,"w":140,"h":74}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":622,"y":638,"w":140,"h":74}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/StrapsLongMittenLeftCrossed.png": -{ - "frame": {"x":885,"y":220,"w":140,"h":126}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":622,"y":586,"w":140,"h":126}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/StrapsLongMittenLeftUp.png": -{ - "frame": {"x":532,"y":137,"w":94,"h":79}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":739,"y":176,"w":94,"h":79}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/StrapsLongMittenRightYoked.png": -{ - "frame": {"x":445,"y":3,"w":109,"h":130}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":342,"y":490,"w":109,"h":130}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/CyberMitts/UpperGlowLongMittenRightFront.png": -{ - "frame": {"x":1013,"y":350,"w":67,"h":83}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":413,"y":496,"w":67,"h":83}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineBelt/BeltMetal2.png": -{ - "frame": {"x":1818,"y":1874,"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":1871,"y":1874,"w":49,"h":92}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":556,"y":829,"w":49,"h":92}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineBelt/LockBraPlate.png": -{ - "frame": {"x":220,"y":665,"w":79,"h":208}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":536,"y":434,"w":79,"h":208}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/AnkleLeftDecoCleanSpread.png": -{ - "frame": {"x":1513,"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/AnkleLeftDecoSpread.png": -{ - "frame": {"x":1629,"y":312,"w":68,"h":31}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":683,"y":1439,"w":68,"h":31}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/AnkleLinkSpread.png": -{ - "frame": {"x":1726,"y":1226,"w":151,"h":59}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":546,"y":1438,"w":151,"h":59}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/AnkleRightClosed.png": -{ - "frame": {"x":992,"y":1463,"w":62,"h":66}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":530,"y":1415,"w":62,"h":66}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/AnkleRightDecoCleanSpread.png": -{ - "frame": {"x":1701,"y":312,"w":68,"h":31}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":495,"y":1439,"w":68,"h":31}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/AnkleRightDecoSpread.png": -{ - "frame": {"x":1773,"y":312,"w":68,"h":31}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":495,"y":1439,"w":68,"h":31}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/AnkleRightSpread.png": -{ - "frame": {"x":779,"y":1681,"w":74,"h":53}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":494,"y":1417,"w":74,"h":53}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/Collar.png": -{ - "frame": {"x":1631,"y":1805,"w":93,"h":65}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":582,"y":362,"w":93,"h":65}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/CollarLockBand.png": -{ - "frame": {"x":1839,"y":628,"w":43,"h":23}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":597,"y":405,"w":43,"h":23}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ElbowLeftDecoCleanFront.png": -{ - "frame": {"x":1798,"y":157,"w":51,"h":38}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":712,"y":612,"w":51,"h":38}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ElbowLeftFree.png": -{ - "frame": {"x":1957,"y":424,"w":87,"h":59}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":694,"y":582,"w":87,"h":59}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ElbowLeftUp.png": -{ - "frame": {"x":761,"y":1023,"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":1728,"y":1805,"w":90,"h":65}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":648,"y":596,"w":90,"h":65}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ElbowRightDecoCleanUp.png": -{ - "frame": {"x":1615,"y":1200,"w":107,"h":59}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":449,"y":260,"w":107,"h":59}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ElbowRightDecoUp.png": -{ - "frame": {"x":1615,"y":1263,"w":107,"h":59}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":449,"y":260,"w":107,"h":59}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ElbowRightFront.png": -{ - "frame": {"x":1957,"y":347,"w":87,"h":73}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":430,"y":586,"w":87,"h":73}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ElbowRightUp.png": -{ - "frame": {"x":644,"y":1023,"w":113,"h":76}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":448,"y":260,"w":113,"h":76}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighLeftClosed.png": -{ - "frame": {"x":998,"y":1673,"w":148,"h":61}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":567,"y":1027,"w":148,"h":61}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighLeftDecoCleanKneel.png": -{ - "frame": {"x":740,"y":665,"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":740,"y":665,"w":164,"h":123}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":482,"y":864,"w":164,"h":123}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighLeftDecoKneel.png": -{ - "frame": {"x":908,"y":665,"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":908,"y":665,"w":164,"h":123}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":482,"y":864,"w":164,"h":123}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighLeftDecoSpread.png": -{ - "frame": {"x":1954,"y":785,"w":91,"h":45}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":675,"y":1034,"w":91,"h":45}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighLeftKneel.png": -{ - "frame": {"x":596,"y":877,"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":596,"y":877,"w":174,"h":142}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":482,"y":848,"w":174,"h":142}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighLeftLockBandKneel.png": -{ - "frame": {"x":1798,"y":199,"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":1798,"y":199,"w":51,"h":31}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":503,"y":855,"w":51,"h":31}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighLeftLockBandSpread.png": -{ - "frame": {"x":416,"y":1895,"w":66,"h":37}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":663,"y":1072,"w":66,"h":37}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighLeftLockPlateClosed.png": -{ - "frame": {"x":1516,"y":1529,"w":65,"h":63}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":623,"y":1034,"w":65,"h":63}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighLeftSpread.png": -{ - "frame": {"x":1792,"y":810,"w":153,"h":74}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":613,"y":1011,"w":153,"h":74}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighRightDecoCleanKneel.png": -{ - "frame": {"x":1585,"y":1504,"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":1585,"y":1504,"w":135,"h":45}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":369,"y":854,"w":135,"h":45}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighRightDecoClosed.png": -{ - "frame": {"x":1415,"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/ThighRightLockClosed.png": -{ - "frame": {"x":1566,"y":544,"w":70,"h":95}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":486,"y":1033,"w":70,"h":95}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighRightLockPlateKneel.png": -{ - "frame": {"x":1813,"y":1745,"w":61,"h":56}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":422,"y":826,"w":61,"h":56}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/ThighRightLockSpread.png": -{ - "frame": {"x":1249,"y":1221,"w":73,"h":97}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":470,"y":1031,"w":73,"h":97}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/WristLeftDecoCleanFree.png": -{ - "frame": {"x":1585,"y":2014,"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":1719,"y":825,"w":69,"h":58}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":792,"y":748,"w":69,"h":58}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/WristRightFree.png": -{ - "frame": {"x":561,"y":1252,"w":59,"h":67}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":349,"y":602,"w":59,"h":67}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/DivineCuffs/WristRightFront.png": -{ - "frame": {"x":222,"y":877,"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":809,"y":1738,"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":1114,"y":904,"w":136,"h":92}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":540,"y":302,"w":136,"h":92}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Dress/BlouseCollarUp.png": -{ - "frame": {"x":213,"y":1936,"w":206,"h":109}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":521,"y":341,"w":206,"h":109}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Dress/Glasses.png": -{ - "frame": {"x":921,"y":1247,"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":1792,"y":888,"w":153,"h":63}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":519,"y":268,"w":153,"h":63}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Dress/MageCollar.png": -{ - "frame": {"x":331,"y":1488,"w":103,"h":42}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":571,"y":407,"w":103,"h":42}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Dress/MageCollarTie.png": -{ - "frame": {"x":1581,"y":121,"w":213,"h":95}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":496,"y":415,"w":213,"h":95}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Dress/ShoeLeftKneel.png": -{ - "frame": {"x":1114,"y":788,"w":170,"h":112}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":729,"y":909,"w":170,"h":112}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Dress/ShoeLeftKneelClosed.png": -{ - "frame": {"x":1259,"y":1103,"w":136,"h":112}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":763,"y":909,"w":136,"h":112}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Dress/ShoeLeftSpread.png": -{ - "frame": {"x":330,"y":3,"w":111,"h":130}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":641,"y":1507,"w":111,"h":130}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Ears/ElfFront.png": -{ - "frame": {"x":1528,"y":1805,"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":1202,"y":1000,"w":73,"h":99}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":701,"y":487,"w":73,"h":99}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Elf/BandRightFront.png": -{ - "frame": {"x":1598,"y":1970,"w":44,"h":40}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":459,"y":494,"w":44,"h":40}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Elf/BandRightYoked.png": -{ - "frame": {"x":1032,"y":792,"w":78,"h":81}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":421,"y":466,"w":78,"h":81}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Elf/ShoeLeftHogtie.png": -{ - "frame": {"x":870,"y":1322,"w":50,"h":138}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":729,"y":794,"w":50,"h":138}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Elf/ShoeLeftKneel.png": -{ - "frame": {"x":1853,"y":3,"w":184,"h":104}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":719,"y":920,"w":184,"h":104}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Elf/SkirtBand.png": -{ - "frame": {"x":1937,"y":1745,"w":108,"h":50}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":639,"y":781,"w":108,"h":50}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/EyesK2/Eyes2Surprised.png": -{ - "frame": {"x":346,"y":1692,"w":69,"h":42}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":614,"y":262,"w":69,"h":42}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK2/EyesClosed.png": -{ - "frame": {"x":551,"y":1895,"w":61,"h":37}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":518,"y":269,"w":61,"h":37}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK2/WhitesEyes2Surprised.png": -{ - "frame": {"x":419,"y":1692,"w":69,"h":42}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":614,"y":262,"w":69,"h":42}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK2/WhitesEyesClosed.png": -{ - "frame": {"x":551,"y":1895,"w":61,"h":37}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":518,"y":269,"w":61,"h":37}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK3/Eyes2Surprised.png": -{ - "frame": {"x":1689,"y":946,"w":64,"h":46}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":616,"y":258,"w":64,"h":46}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK4/Eyes2Angry.png": -{ - "frame": {"x":492,"y":1692,"w":67,"h":42}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":615,"y":266,"w":67,"h":42}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK4/EyesClosed.png": -{ - "frame": {"x":1640,"y":632,"w":53,"h":23}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":526,"y":283,"w":53,"h":23}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK4/WhitesEyes2Angry.png": -{ - "frame": {"x":563,"y":1692,"w":67,"h":42}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":615,"y":266,"w":67,"h":42}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK4/WhitesEyesClosed.png": -{ - "frame": {"x":1640,"y":632,"w":53,"h":23}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":526,"y":283,"w":53,"h":23}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesKertasu/EyesWhitesAngry.png": -{ - "frame": {"x":1629,"y":347,"w":160,"h":84}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/EyesKertasu/EyesWhitesBase.png": -{ - "frame": {"x":1793,"y":347,"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":1629,"y":347,"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":1629,"y":347,"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":1629,"y":347,"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":1629,"y":347,"w":160,"h":84}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/FaceDask/EyesDazed.png": -{ - "frame": {"x":1898,"y":1142,"w":147,"h":43}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":54,"y":173,"w":147,"h":43}, - "sourceSize": {"w":321,"h":332} -}, -"Models/FaceKjus/BlushExtreme.png": -{ - "frame": {"x":1726,"y":1099,"w":168,"h":63}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":529,"y":288,"w":168,"h":63}, - "sourceSize": {"w":858,"h":486} -}, -"Models/FaceKjus/BlushHigh.png": -{ - "frame": {"x":549,"y":812,"w":162,"h":61}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":529,"y":289,"w":162,"h":61}, - "sourceSize": {"w":858,"h":486} -}, -"Models/FaceKjus/EyesNeutral.png": -{ - "frame": {"x":1670,"y":1386,"w":52,"h":45}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":528,"y":269,"w":52,"h":45}, - "sourceSize": {"w":745,"h":461} -}, -"Models/FaceKjus/MouthSmile.png": -{ - "frame": {"x":2001,"y":1696,"w":44,"h":30}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":584,"y":322,"w":44,"h":30}, - "sourceSize": {"w":700,"h":436} -}, -"Models/FaceKoi/BlushExtreme.png": -{ - "frame": {"x":1853,"y":284,"w":169,"h":59}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":49,"y":190,"w":169,"h":59}, - "sourceSize": {"w":321,"h":332} -}, -"Models/FaceKoi/BlushMedium.png": -{ - "frame": {"x":1792,"y":747,"w":158,"h":59}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":56,"y":187,"w":158,"h":59}, - "sourceSize": {"w":321,"h":332} -}, -"Models/FaceKoi/BrowsSurprised.png": -{ - "frame": {"x":1886,"y":628,"w":41,"h":23}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":60,"y":144,"w":41,"h":23}, - "sourceSize": {"w":321,"h":332} -}, -"Models/FaceKoi/Eyes2Heart.png": -{ - "frame": {"x":1865,"y":1696,"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":1933,"y":1696,"w":64,"h":45}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, - "sourceSize": {"w":321,"h":332} -}, -"Models/FaceKoi/HumanEyes2Heart.png": -{ - "frame": {"x":1865,"y":1696,"w":64,"h":45}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, - "sourceSize": {"w":321,"h":332} -}, -"Models/FaceKoiBlank/Eyes2Heart.png": -{ - "frame": {"x":1865,"y":1696,"w":64,"h":45}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, - "sourceSize": {"w":321,"h":332} -}, -"Models/Fiddle/BackFiddleBody.png": -{ - "frame": {"x":1321,"y":437,"w":113,"h":108}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":574,"y":364,"w":113,"h":108}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/GagLatex/NeckCorsetGag2.png": -{ - "frame": {"x":1259,"y":1439,"w":147,"h":89}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":537,"y":306,"w":147,"h":89}, - "sourceSize": {"w":784,"h":486} -}, -"Models/GagLatex/NeckCorsetRim.png": +"Models/Body/ShoulderRightUp.png": { - "frame": {"x":196,"y":1488,"w":131,"h":42}, + "frame": {"x":1623,"y":1761,"w":106,"h":105}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":561,"y":424,"w":131,"h":42}, + "spriteSourceSize": {"x":476,"y":401,"w":106,"h":105}, "sourceSize": {"w":1240,"h":1754} }, -"Models/GagLatex/OTNFlat.png": -{ - "frame": {"x":1263,"y":345,"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":1410,"y":1437,"w":160,"h":88}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagLeather/GhostBallStrap.png": -{ - "frame": {"x":1880,"y":1361,"w":149,"h":30}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":67,"y":234,"w":149,"h":30}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagLeather/Muzzle.png": -{ - "frame": {"x":1726,"y":1289,"w":150,"h":87}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":65,"y":207,"w":150,"h":87}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagLeather/MuzzleStrap.png": -{ - "frame": {"x":1802,"y":1705,"w":48,"h":36}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":179,"y":214,"w":48,"h":36}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagLeather/Panel.png": -{ - "frame": {"x":3,"y":1323,"w":137,"h":207}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":39,"y":74,"w":137,"h":207}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagMetal/Ball_TeethDeep.png": -{ - "frame": {"x":1798,"y":114,"w":51,"h":39}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":107,"y":235,"w":51,"h":39}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagMetal/BigBallStrapSegmented.png": -{ - "frame": {"x":1262,"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/GagMetal/HarnessMaskDisplay.png": -{ - "frame": {"x":828,"y":1470,"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":1629,"y":220,"w":160,"h":88}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagMetal/SciFiMuzzle.png": -{ - "frame": {"x":1629,"y":220,"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":1792,"y":655,"w":160,"h":88}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagTape/Full.png": -{ - "frame": {"x":1084,"y":345,"w":175,"h":88}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":54,"y":205,"w":175,"h":88}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagTape/Wrap.png": -{ - "frame": {"x":1853,"y":215,"w":172,"h":65}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":54,"y":214,"w":172,"h":65}, - "sourceSize": {"w":321,"h":332} -}, -"Models/Gasmask/Nose.png": -{ - "frame": {"x":1792,"y":533,"w":43,"h":59}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":106,"y":206,"w":43,"h":59}, - "sourceSize": {"w":321,"h":332} -}, -"Models/Gasmask/Plugs.png": -{ - "frame": {"x":1722,"y":1658,"w":139,"h":43}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":71,"y":240,"w":139,"h":43}, - "sourceSize": {"w":321,"h":332} -}, -"Models/Hair/Ahoge.png": +"Models/Bra/StrapsUp.png": { - "frame": {"x":155,"y":1268,"w":115,"h":51}, + "frame": {"x":1628,"y":1524,"w":193,"h":112}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":478,"y":99,"w":115,"h":51}, + "spriteSourceSize": {"x":485,"y":412,"w":193,"h":112}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/HairAura_Right.png": +"Models/Bunny/Ears.png": { - "frame": {"x":312,"y":220,"w":125,"h":134}, + "frame": {"x":244,"y":454,"w":231,"h":151}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":482,"y":270,"w":125,"h":134}, + "spriteSourceSize": {"x":457,"y":15,"w":231,"h":151}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Harness/BeltsOverbust.png": +"Models/Bunny/EarsInner.png": { - "frame": {"x":1537,"y":1320,"w":55,"h":111}, + "frame": {"x":1448,"y":1114,"w":216,"h":119}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":556,"y":505,"w":55,"h":111}, + "spriteSourceSize": {"x":461,"y":41,"w":216,"h":119}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/BalletLaceRightClosed.png": +"Models/Bunny/GloveLeftCrossed.png": { - "frame": {"x":144,"y":1323,"w":48,"h":195}, + "frame": {"x":1672,"y":806,"w":217,"h":181}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":527,"y":1387,"w":48,"h":195}, + "spriteSourceSize": {"x":552,"y":518,"w":217,"h":181}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/BalletRightKneel.png": +"Models/Bunny/GloveRightFree.png": { - "frame": {"x":1076,"y":665,"w":103,"h":119}, + "frame": {"x":1453,"y":589,"w":220,"h":167}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":309,"y":839,"w":103,"h":119}, + "spriteSourceSize": {"x":268,"y":537,"w":220,"h":167}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/BalletSoleLeftKneel.png": +"Models/Bunny/SockRightKneel.png": { - "frame": {"x":982,"y":563,"w":188,"h":98}, + "frame": {"x":960,"y":601,"w":221,"h":246}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":742,"y":906,"w":188,"h":98}, + "spriteSourceSize": {"x":315,"y":816,"w":221,"h":246}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/BalletSoleLeftKneelClosed.png": +"Models/Catsuit/ArmRightCrossed.png": { - "frame": {"x":1279,"y":1000,"w":165,"h":98}, + "frame": {"x":1949,"y":526,"w":96,"h":228}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":765,"y":906,"w":165,"h":98}, + "spriteSourceSize": {"x":428,"y":432,"w":96,"h":228}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/FlatBalletRightKneel.png": +"Models/Catsuit/ArmRightFront.png": { - "frame": {"x":1076,"y":665,"w":103,"h":119}, + "frame": {"x":251,"y":1706,"w":96,"h":228}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":309,"y":839,"w":103,"h":119}, + "spriteSourceSize": {"x":428,"y":432,"w":96,"h":228}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/LeatherLeftHogtie.png": +"Models/Catsuit/ButtKneel.png": { - "frame": {"x":649,"y":1322,"w":50,"h":145}, + "frame": {"x":1898,"y":758,"w":147,"h":214}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":730,"y":797,"w":50,"h":145}, + "spriteSourceSize": {"x":627,"y":750,"w":147,"h":214}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/LeatherLegRightHogtie.png": +"Models/Catsuit/FootRightClosed.png": { - "frame": {"x":1957,"y":556,"w":86,"h":61}, + "frame": {"x":1318,"y":1761,"w":144,"h":166}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":61}, + "spriteSourceSize": {"x":458,"y":1448,"w":144,"h":166}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/LeatherRightHogtie.png": +"Models/Catsuit/ForeArmRightFront.png": { - "frame": {"x":1957,"y":556,"w":86,"h":61}, + "frame": {"x":1099,"y":1055,"w":124,"h":186}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":61}, + "spriteSourceSize": {"x":417,"y":543,"w":124,"h":186}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/ShinyBalletRightKneel.png": +"Models/Chastity/BraProtoLiningMidZipRim.png": { - "frame": {"x":1076,"y":665,"w":103,"h":119}, + "frame": {"x":3,"y":703,"w":230,"h":50}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":309,"y":839,"w":103,"h":119}, + "spriteSourceSize": {"x":466,"y":616,"w":230,"h":50}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/TallLeftHogtie.png": +"Models/China/Dress.png": { - "frame": {"x":402,"y":877,"w":50,"h":147}, + "frame": {"x":1012,"y":3,"w":246,"h":134}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":730,"y":797,"w":50,"h":147}, + "spriteSourceSize": {"x":465,"y":603,"w":246,"h":134}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/TallRightHogtie.png": +"Models/Corsets/BuckleCorsetHardware.png": { - "frame": {"x":1957,"y":556,"w":86,"h":61}, + "frame": {"x":1223,"y":1932,"w":104,"h":112}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":61}, + "spriteSourceSize": {"x":524,"y":667,"w":104,"h":112}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/Crotch.png": +"Models/CrystalCuffs/Belt.png": { - "frame": {"x":606,"y":437,"w":143,"h":127}, + "frame": {"x":237,"y":747,"w":228,"h":75}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":505,"y":796,"w":143,"h":127}, + "spriteSourceSize": {"x":472,"y":672,"w":228,"h":75}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/CrotchBelts.png": +"Models/CrystalCuffs/Collar.png": { - "frame": {"x":495,"y":220,"w":138,"h":129}, + "frame": {"x":623,"y":1380,"w":89,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":505,"y":794,"w":138,"h":129}, + "spriteSourceSize": {"x":583,"y":374,"w":89,"h":56}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/StrapsArmsCrossed.png": +"Models/CrystalCuffs/ThighLeftKneel.png": { - "frame": {"x":973,"y":1534,"w":204,"h":135}, + "frame": {"x":1331,"y":1931,"w":185,"h":114}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":555,"y":586,"w":204,"h":135}, + "spriteSourceSize": {"x":470,"y":848,"w":185,"h":114}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Jacket/StrapsChestExtra.png": +"Models/CrystalCuffs/ThighLeftSpread.png": { - "frame": {"x":1236,"y":3,"w":217,"h":120}, + "frame": {"x":213,"y":1412,"w":141,"h":90}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":401,"w":217,"h":120}, + "spriteSourceSize": {"x":619,"y":1004,"w":141,"h":90}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Kigu/Eyes.png": +"Models/CrystalCuffs/WristRightCrossed.png": { - "frame": {"x":1774,"y":1970,"w":70,"h":75}, + "frame": {"x":2003,"y":264,"w":42,"h":42}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":525,"y":249,"w":70,"h":75}, + "spriteSourceSize": {"x":650,"y":602,"w":42,"h":42}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Kigu/Eyes2.png": +"Models/Cuffs/AnkleLeftKneelClosed.png": { - "frame": {"x":1901,"y":1805,"w":74,"h":65}, + "frame": {"x":2005,"y":36,"w":38,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":611,"y":240,"w":74,"h":65}, + "spriteSourceSize": {"x":717,"y":945,"w":38,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Kigu/EyesWhites.png": +"Models/Cuffs/Belt.png": { - "frame": {"x":1629,"y":347,"w":160,"h":84}, + "frame": {"x":3,"y":757,"w":228,"h":75}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, + "spriteSourceSize": {"x":472,"y":672,"w":228,"h":75}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandAnkleLeftSpread.png": +"Models/CyberArms/CuffLongMittenLeftYoked.png": { - "frame": {"x":1193,"y":2016,"w":65,"h":23}, + "frame": {"x":1429,"y":1470,"w":195,"h":159}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":686,"y":1436,"w":65,"h":23}, + "spriteSourceSize": {"x":736,"y":388,"w":195,"h":159}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandElbowRightUp.png": +"Models/CyberArms/CuffLongMittenRightFree.png": { - "frame": {"x":438,"y":1488,"w":103,"h":42}, + "frame": {"x":1576,"y":1633,"w":48,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":266,"w":103,"h":42}, + "spriteSourceSize": {"x":341,"y":602,"w":48,"h":60}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandThighRightClosed.png": +"Models/CyberArms/ForeLongMittenLeftCrossed.png": { - "frame": {"x":1932,"y":1097,"w":113,"h":41}, + "frame": {"x":889,"y":1025,"w":206,"h":93}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":474,"y":1043,"w":113,"h":41}, + "spriteSourceSize": {"x":553,"y":621,"w":206,"h":93}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/ElbowLeftFree.png": +"Models/CyberArms/GlowLongMittenLeftBoxtie.png": { - "frame": {"x":1956,"y":670,"w":85,"h":57}, + "frame": {"x":1020,"y":1706,"w":84,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":699,"y":582,"w":85,"h":57}, + "spriteSourceSize": {"x":725,"y":493,"w":84,"h":83}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/ElbowLeftUp.png": +"Models/CyberArms/GlowLongMittenRightYoked.png": { - "frame": {"x":1649,"y":1970,"w":121,"h":75}, + "frame": {"x":3,"y":933,"w":220,"h":180}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":712,"y":251,"w":121,"h":75}, + "spriteSourceSize": {"x":273,"y":376,"w":220,"h":180}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/ElbowLeftWristtie.png": +"Models/CyberArms/LongMittenLeftCrossed.png": { - "frame": {"x":1793,"y":234,"w":56,"h":48}, + "frame": {"x":469,"y":787,"w":221,"h":171}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":680,"y":610,"w":56,"h":48}, + "spriteSourceSize": {"x":550,"y":543,"w":221,"h":171}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareAnkleRightClosed.png": +"Models/CyberArms/LongMittenLeftYoked.png": { - "frame": {"x":1100,"y":2016,"w":43,"h":24}, + "frame": {"x":358,"y":1412,"w":172,"h":223}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":548,"y":1440,"w":43,"h":24}, + "spriteSourceSize": {"x":751,"y":420,"w":172,"h":223}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareAnkleRightSpread.png": +"Models/CyberArms/LongMittenRightUp.png": { - "frame": {"x":1147,"y":2016,"w":42,"h":24}, + "frame": {"x":3,"y":1706,"w":143,"h":235}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":502,"y":1436,"w":42,"h":24}, + "spriteSourceSize": {"x":450,"y":164,"w":143,"h":235}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareWristLeftFree.png": +"Models/CyberArms/LongMittenRightYoked.png": { - "frame": {"x":671,"y":1895,"w":46,"h":37}, + "frame": {"x":3,"y":1484,"w":145,"h":218}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":806,"y":757,"w":46,"h":37}, + "spriteSourceSize": {"x":319,"y":420,"w":145,"h":218}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareWristLeftFront.png": +"Models/CyberArms/StrapsForeLongMittenLeftCrossed.png": { - "frame": {"x":616,"y":1895,"w":51,"h":37}, + "frame": {"x":944,"y":1503,"w":140,"h":74}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":631,"y":552,"w":51,"h":37}, + "spriteSourceSize": {"x":622,"y":638,"w":140,"h":74}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/ThighLeftClosed.png": +"Models/CyberCuffs/Belt.png": { - "frame": {"x":715,"y":802,"w":147,"h":71}, + "frame": {"x":3,"y":548,"w":231,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":572,"y":1029,"w":147,"h":71}, + "spriteSourceSize": {"x":472,"y":674,"w":231,"h":72}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/ThighLeftSpread.png": +"Models/CyberCuffs/ElbowLeftYoked.png": { - "frame": {"x":1873,"y":1454,"w":142,"h":86}, + "frame": {"x":1955,"y":310,"w":90,"h":82}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":618,"y":1004,"w":142,"h":86}, + "spriteSourceSize": {"x":744,"y":494,"w":90,"h":82}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/ThighRightKneel.png": +"Models/CyberCuffs/ScreenElbowLeftYoked.png": { - "frame": {"x":1724,"y":1514,"w":142,"h":62}, + "frame": {"x":323,"y":1640,"w":46,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":371,"y":831,"w":142,"h":62}, + "spriteSourceSize": {"x":791,"y":486,"w":46,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/ThighRightKneelClosed.png": +"Models/CyberCuffs/ScreenWristLeftFront.png": { - "frame": {"x":1870,"y":1544,"w":141,"h":62}, + "frame": {"x":960,"y":478,"w":37,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":371,"y":831,"w":141,"h":62}, + "spriteSourceSize": {"x":659,"y":532,"w":37,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/WristRightFront.png": +"Models/CyberMitts/ArmLongMittenLeftCrossed.png": { - "frame": {"x":1719,"y":887,"w":69,"h":55}, + "frame": {"x":469,"y":787,"w":221,"h":171}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":469,"y":541,"w":69,"h":55}, + "spriteSourceSize": {"x":550,"y":543,"w":221,"h":171}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherLeotard/Laces.png": +"Models/CyberMitts/ArmLongMittenLeftYoked.png": { - "frame": {"x":1457,"y":3,"w":41,"h":115}, + "frame": {"x":358,"y":1412,"w":172,"h":223}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":541,"y":649,"w":41,"h":115}, + "spriteSourceSize": {"x":751,"y":420,"w":172,"h":223}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LeftLegsHardwareKneel.png": +"Models/CyberMitts/ArmLongMittenRightUp.png": { - "frame": {"x":1607,"y":1655,"w":111,"h":86}, + "frame": {"x":3,"y":1706,"w":143,"h":235}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":567,"y":970,"w":111,"h":86}, + "spriteSourceSize": {"x":450,"y":164,"w":143,"h":235}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LeftLegsHardwareKneelClosed.png": +"Models/CyberMitts/ArmLongMittenRightYoked.png": { - "frame": {"x":1607,"y":1655,"w":111,"h":86}, + "frame": {"x":3,"y":1484,"w":145,"h":218}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":567,"y":970,"w":111,"h":86}, + "spriteSourceSize": {"x":319,"y":420,"w":145,"h":218}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LeftLegsLacesKneel.png": +"Models/CyberMitts/CuffLongMittenRightFree.png": { - "frame": {"x":1020,"y":1000,"w":178,"h":99}, + "frame": {"x":1576,"y":1633,"w":48,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":536,"y":945,"w":178,"h":99}, + "spriteSourceSize": {"x":341,"y":602,"w":48,"h":60}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherPetsuit/LeftLegsLacesKneelClosed.png": +"Models/CyberMitts/ForeLongMittenLeftCrossed.png": { - "frame": {"x":1020,"y":1000,"w":178,"h":99}, + "frame": {"x":889,"y":1025,"w":206,"h":93}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":536,"y":945,"w":178,"h":99}, + "spriteSourceSize": {"x":553,"y":621,"w":206,"h":93}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/Bow.png": +"Models/CyberMitts/LongMittenLeftCrossed.png": { - "frame": {"x":1122,"y":1461,"w":133,"h":69}, + "frame": {"x":469,"y":787,"w":221,"h":171}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":547,"y":393,"w":133,"h":69}, + "spriteSourceSize": {"x":550,"y":543,"w":221,"h":171}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/FootSockRightKneel.png": +"Models/CyberMitts/LongMittenRightUp.png": { - "frame": {"x":1548,"y":435,"w":73,"h":105}, + "frame": {"x":3,"y":1706,"w":143,"h":235}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":321,"y":849,"w":73,"h":105}, + "spriteSourceSize": {"x":450,"y":164,"w":143,"h":235}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/ShoeLeftClosed.png": +"Models/CyberMitts/StrapsForeLongMittenLeftCrossed.png": { - "frame": {"x":924,"y":1322,"w":141,"h":137}, + "frame": {"x":944,"y":1503,"w":140,"h":74}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":529,"y":1493,"w":141,"h":137}, + "spriteSourceSize": {"x":622,"y":638,"w":140,"h":74}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/ShoeLeftKneel.png": +"Models/CyberMitts/UpperGlowLongMittenLeftBoxtie.png": { - "frame": {"x":1009,"y":437,"w":179,"h":121}, + "frame": {"x":1020,"y":1706,"w":84,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":722,"y":923,"w":179,"h":121}, + "spriteSourceSize": {"x":725,"y":493,"w":84,"h":83}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/ShoeLeftKneelClosed.png": +"Models/DivineBelt/LockBraLines.png": { - "frame": {"x":1198,"y":220,"w":147,"h":121}, + "frame": {"x":1733,"y":1697,"w":88,"h":210}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":754,"y":923,"w":147,"h":121}, + "spriteSourceSize": {"x":534,"y":432,"w":88,"h":210}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/ShoeRightClosed.png": +"Models/DivineCuffs/AnkleLeftKneel.png": { - "frame": {"x":1311,"y":1738,"w":134,"h":134}, + "frame": {"x":2005,"y":95,"w":38,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":456,"y":1490,"w":134,"h":134}, + "spriteSourceSize": {"x":717,"y":945,"w":38,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/StripeSockLeftKneel.png": +"Models/DivineCuffs/AnkleLeftKneelClosed.png": { - "frame": {"x":1183,"y":665,"w":184,"h":108}, + "frame": {"x":2005,"y":95,"w":38,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":492,"y":857,"w":184,"h":108}, + "spriteSourceSize": {"x":717,"y":945,"w":38,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/ForeArmLeftCrossed.png": +"Models/DivineCuffs/AnkleLeftLockPlateKneel.png": { - "frame": {"x":1514,"y":1101,"w":208,"h":95}, + "frame": {"x":1185,"y":703,"w":38,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":549,"y":617,"w":208,"h":95}, + "spriteSourceSize": {"x":720,"y":951,"w":38,"h":43}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/GuardRightFree.png": +"Models/DivineCuffs/AnkleLeftSpread.png": { - "frame": {"x":423,"y":1936,"w":172,"h":109}, + "frame": {"x":1628,"y":1640,"w":74,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":332,"y":604,"w":172,"h":109}, + "spriteSourceSize": {"x":678,"y":1417,"w":74,"h":53}, "sourceSize": {"w":1240,"h":1754} }, -"Models/MaidKnightLight/PauldronStrapFree.png": +"Models/DivineCuffs/AnkleRightSpread.png": { - "frame": {"x":1516,"y":1876,"w":54,"h":94}, + "frame": {"x":1706,"y":1640,"w":74,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":697,"y":463,"w":54,"h":94}, + "spriteSourceSize": {"x":494,"y":1417,"w":74,"h":53}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/BandLeftFront.png": +"Models/DivineCuffs/Belt.png": { - "frame": {"x":1585,"y":1553,"w":60,"h":39}, + "frame": {"x":1001,"y":532,"w":222,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":623,"y":547,"w":60,"h":39}, + "spriteSourceSize": {"x":473,"y":669,"w":222,"h":65}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LatexRightCrossed.png": +"Models/DivineCuffs/ElbowLeftUp.png": { - "frame": {"x":312,"y":358,"w":140,"h":75}, + "frame": {"x":1933,"y":1810,"w":112,"h":76}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":563,"y":593,"w":140,"h":75}, + "spriteSourceSize": {"x":716,"y":244,"w":112,"h":76}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LatexRightFree.png": +"Models/DivineCuffs/ElbowLeftWristtie.png": { - "frame": {"x":721,"y":1895,"w":210,"h":149}, + "frame": {"x":1955,"y":396,"w":90,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":276,"y":552,"w":210,"h":149}, + "spriteSourceSize": {"x":648,"y":596,"w":90,"h":65}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LeatherLeftFree.png": +"Models/DivineCuffs/ElbowRightDecoUp.png": { - "frame": {"x":599,"y":1936,"w":113,"h":109}, + "frame": {"x":423,"y":1639,"w":107,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":800,"y":754,"w":113,"h":109}, + "spriteSourceSize": {"x":449,"y":260,"w":107,"h":59}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LeatherLeftFront.png": +"Models/DivineCuffs/ThighLeftSpread.png": { - "frame": {"x":866,"y":3,"w":212,"h":125}, + "frame": {"x":787,"y":1503,"w":153,"h":74}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":475,"y":469,"w":212,"h":125}, + "spriteSourceSize": {"x":613,"y":1011,"w":153,"h":74}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LeatherLeftYoked.png": +"Models/DivineCuffs/ThighRightLockSpread.png": { - "frame": {"x":657,"y":1103,"w":90,"h":142}, + "frame": {"x":1150,"y":954,"w":73,"h":97}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":859,"y":287,"w":90,"h":142}, + "spriteSourceSize": {"x":470,"y":1031,"w":73,"h":97}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LeatherRightCrossed.png": +"Models/DivineCuffs/ThighRightSpread.png": { - "frame": {"x":1670,"y":435,"w":91,"h":94}, + "frame": {"x":1576,"y":1697,"w":153,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":647,"y":603,"w":91,"h":94}, + "spriteSourceSize": {"x":449,"y":1029,"w":153,"h":60}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LeatherRightFree.png": +"Models/DivineGag/Gold.png": { - "frame": {"x":1192,"y":437,"w":125,"h":117}, + "frame": {"x":1227,"y":875,"w":217,"h":164}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":276,"y":551,"w":125,"h":117}, + "spriteSourceSize": {"x":504,"y":207,"w":217,"h":164}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LeatherRightFront.png": +"Models/DivineGag/GoldClean.png": { - "frame": {"x":698,"y":3,"w":164,"h":127}, + "frame": {"x":1448,"y":946,"w":217,"h":164}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":475,"y":465,"w":164,"h":127}, + "spriteSourceSize": {"x":504,"y":207,"w":217,"h":164}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/LeatherRightYoked.png": +"Models/DivineGag/Metallic.png": { - "frame": {"x":751,"y":1103,"w":90,"h":141}, + "frame": {"x":889,"y":1122,"w":205,"h":143}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":298,"y":294,"w":90,"h":141}, + "spriteSourceSize": {"x":507,"y":215,"w":205,"h":143}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/PawLeftFront.png": +"Models/Dress/BlouseForeArmLeftCrossed.png": { - "frame": {"x":519,"y":574,"w":160,"h":87}, + "frame": {"x":1493,"y":258,"w":229,"h":172}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":483,"y":500,"w":160,"h":87}, + "spriteSourceSize": {"x":534,"y":535,"w":229,"h":172}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/PawRightFront.png": +"Models/Dress/MageBraStripes.png": { - "frame": {"x":1691,"y":3,"w":158,"h":107}, + "frame": {"x":1451,"y":760,"w":217,"h":182}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":520,"y":487,"w":158,"h":107}, + "spriteSourceSize": {"x":478,"y":443,"w":217,"h":182}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/BeltLines.png": +"Models/Dress/MageCorsetStripes.png": { - "frame": {"x":945,"y":877,"w":165,"h":119}, + "frame": {"x":1227,"y":1506,"w":191,"h":198}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":482,"y":649,"w":165,"h":119}, + "spriteSourceSize": {"x":493,"y":605,"w":191,"h":198}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/Collar.png": +"Models/Dress/ShoeLeftKneel.png": { - "frame": {"x":1932,"y":1030,"w":113,"h":63}, + "frame": {"x":821,"y":1933,"w":170,"h":112}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":571,"y":371,"w":113,"h":63}, + "spriteSourceSize": {"x":729,"y":909,"w":170,"h":112}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/ShoeLeftKneel.png": +"Models/Ears/KittyInner.png": { - "frame": {"x":1278,"y":558,"w":138,"h":102}, + "frame": {"x":1825,"y":1627,"w":193,"h":75}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":764,"y":920,"w":138,"h":102}, + "spriteSourceSize": {"x":505,"y":89,"w":193,"h":75}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/ShoeLeftKneelClosed.png": +"Models/Elf/BandLeftBoxtie.png": { - "frame": {"x":1278,"y":558,"w":138,"h":102}, + "frame": {"x":1150,"y":851,"w":73,"h":99}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":764,"y":920,"w":138,"h":102}, + "spriteSourceSize": {"x":701,"y":487,"w":73,"h":99}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/ShoeLeftSpread.png": +"Models/Elf/BandRightFree.png": { - "frame": {"x":304,"y":584,"w":108,"h":77}, + "frame": {"x":1185,"y":750,"w":38,"h":41}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":643,"y":1563,"w":108,"h":77}, + "spriteSourceSize": {"x":465,"y":493,"w":38,"h":41}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/ShoeRightSpread.png": +"Models/Elf/BandRightWristtie.png": { - "frame": {"x":897,"y":350,"w":112,"h":83}, + "frame": {"x":1185,"y":795,"w":38,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":493,"y":1563,"w":112,"h":83}, + "spriteSourceSize": {"x":465,"y":495,"w":38,"h":39}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/SkirtBandKneelCrotchStrap.png": +"Models/Elf/Circlet.png": { - "frame": {"x":434,"y":437,"w":168,"h":133}, + "frame": {"x":1721,"y":517,"w":224,"h":82}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":367,"y":759,"w":168,"h":133}, + "spriteSourceSize": {"x":501,"y":161,"w":224,"h":82}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/SkirtBandOverKneel.png": +"Models/EyesK2/EyesNeutral.png": { - "frame": {"x":908,"y":1464,"w":80,"h":66}, + "frame": {"x":716,"y":1392,"w":62,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":848,"w":80,"h":66}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":517,"y":269,"w":62,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/Ninja/SockRightKneel.png": +"Models/EyesK2/WhitesEyesNeutral.png": { - "frame": {"x":1548,"y":435,"w":73,"h":105}, + "frame": {"x":782,"y":1392,"w":62,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":321,"y":849,"w":73,"h":105}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":517,"y":269,"w":62,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/OperaGloves/GloveLeftUp.png": +"Models/EyesK3/EyesNeutral.png": { - "frame": {"x":3,"y":225,"w":170,"h":218}, + "frame": {"x":1898,"y":668,"w":47,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":663,"y":168,"w":170,"h":218}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":530,"y":269,"w":47,"h":44}, + "sourceSize": {"w":781,"h":560} }, -"Models/Pony/CollarTag.png": +"Models/FaceKjus/MouthDistracted.png": { - "frame": {"x":1979,"y":1799,"w":66,"h":62}, + "frame": {"x":1372,"y":1708,"w":44,"h":49}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":600,"y":394,"w":66,"h":62}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":585,"y":322,"w":44,"h":49}, + "sourceSize": {"w":745,"h":474} }, -"Models/Ribbon/Bow.png": +"Models/FaceKoi/EyesHeart.png": { - "frame": {"x":155,"y":1103,"w":146,"h":161}, + "frame": {"x":1893,"y":976,"w":151,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":504,"y":479,"w":146,"h":161}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":58,"y":159,"w":151,"h":52}, + "sourceSize": {"w":321,"h":332} }, -"Models/Ribbon/BowFront.png": +"Models/Fiddle/FiddleBody.png": { - "frame": {"x":1181,"y":1534,"w":132,"h":135}, + "frame": {"x":453,"y":962,"w":215,"h":103}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":515,"y":540,"w":132,"h":135}, + "spriteSourceSize": {"x":476,"y":523,"w":215,"h":103}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/FeetClosed.png": +"Models/Fiddle/FiddleLines.png": { - "frame": {"x":1726,"y":1380,"w":148,"h":65}, + "frame": {"x":694,"y":871,"w":215,"h":106}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":513,"y":1513,"w":148,"h":65}, + "spriteSourceSize": {"x":476,"y":521,"w":215,"h":106}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/Thigh2KneelClosed.png": +"Models/FutureHarness/StrapsMid.png": { - "frame": {"x":456,"y":877,"w":136,"h":146}, + "frame": {"x":508,"y":3,"w":248,"h":98}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":874,"w":136,"h":146}, + "spriteSourceSize": {"x":465,"y":665,"w":248,"h":98}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopArmHarness.png": +"Models/GagCloth/OTM.png": { - "frame": {"x":3,"y":669,"w":213,"h":217}, + "frame": {"x":659,"y":1202,"w":205,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":495,"y":409,"w":213,"h":217}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":54,"y":209,"w":205,"h":85}, + "sourceSize": {"w":321,"h":332} }, -"Models/Ribbon/TopBowBoxtie.png": +"Models/GagCloth/OTN.png": { - "frame": {"x":196,"y":1323,"w":146,"h":161}, + "frame": {"x":186,"y":1943,"w":192,"h":101}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":504,"y":479,"w":146,"h":161}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":63,"y":204,"w":192,"h":101}, + "sourceSize": {"w":321,"h":332} }, -"Models/Ribbon/TopBowCrotch.png": +"Models/GagLatex/OTN.png": { - "frame": {"x":1100,"y":1877,"w":122,"h":135}, + "frame": {"x":623,"y":1440,"w":160,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":521,"y":791,"w":122,"h":135}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, + "sourceSize": {"w":321,"h":332} }, -"Models/Ribbon/TopFeetClosed.png": +"Models/GagLeather/BallSideStrap.png": { - "frame": {"x":1574,"y":1435,"w":148,"h":65}, + "frame": {"x":220,"y":1181,"w":206,"h":227}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":513,"y":1513,"w":148,"h":65}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":56,"y":31,"w":206,"h":227}, + "sourceSize": {"w":321,"h":332} }, -"Models/Ribbon/TopRightThigh2KneelClosed.png": +"Models/GagLeather/PanelSideStrap.png": { - "frame": {"x":1596,"y":1326,"w":126,"h":56}, + "frame": {"x":220,"y":1181,"w":206,"h":227}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":364,"y":859,"w":126,"h":56}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":56,"y":31,"w":206,"h":227}, + "sourceSize": {"w":321,"h":332} }, -"Models/Ribbon/TopThigh1KneelClosed.png": +"Models/GagMetal/HarnessMask.png": { - "frame": {"x":1379,"y":1876,"w":133,"h":134}, + "frame": {"x":1623,"y":1966,"w":96,"h":79}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":412,"y":882,"w":133,"h":134}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":89,"y":208,"w":96,"h":79}, + "sourceSize": {"w":321,"h":332} }, -"Models/Robes/ShoeRightKneel.png": +"Models/Hair/Ahoge.png": { - "frame": {"x":1765,"y":435,"w":70,"h":94}, + "frame": {"x":1108,"y":1706,"w":115,"h":51}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":323,"y":856,"w":70,"h":94}, + "spriteSourceSize": {"x":478,"y":99,"w":115,"h":51}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/ShoeRightSpread.png": +"Models/Hair/MaidFrill.png": { - "frame": {"x":774,"y":877,"w":113,"h":133}, + "frame": {"x":3,"y":836,"w":221,"h":93}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":497,"y":1508,"w":113,"h":133}, + "spriteSourceSize": {"x":500,"y":97,"w":221,"h":93}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SkirtKneel_LeftLegCrotchStrap.png": +"Models/Hair/MaidHairband.png": { - "frame": {"x":954,"y":132,"w":171,"h":84}, + "frame": {"x":235,"y":826,"w":221,"h":96}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":544,"y":810,"w":171,"h":84}, + "spriteSourceSize": {"x":500,"y":119,"w":221,"h":96}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/AnklesClosed.png": +"Models/Hair2/HairAura_Front.png": { - "frame": {"x":1878,"y":1395,"w":148,"h":55}, + "frame": {"x":1436,"y":1286,"w":203,"h":180}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":514,"y":1519,"w":148,"h":55}, + "spriteSourceSize": {"x":489,"y":111,"w":203,"h":180}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/AnklesClosedOver.png": +"Models/Hair2/HairAura_Right.png": { - "frame": {"x":303,"y":816,"w":148,"h":57}, + "frame": {"x":1098,"y":1443,"w":125,"h":134}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":514,"y":1517,"w":148,"h":57}, + "spriteSourceSize": {"x":482,"y":270,"w":125,"h":134}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/ArmStrapHarnessCrossed.png": +"Models/Harness/BeltsTopBoxtie.png": { - "frame": {"x":1625,"y":435,"w":41,"h":95}, + "frame": {"x":1227,"y":621,"w":220,"h":123}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":559,"y":572,"w":41,"h":95}, + "spriteSourceSize": {"x":487,"y":409,"w":220,"h":123}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/LeftFrogtieKneel.png": +"Models/Harness/BeltsTopFree.png": { - "frame": {"x":139,"y":1534,"w":203,"h":200}, + "frame": {"x":1227,"y":621,"w":220,"h":123}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":555,"y":822,"w":203,"h":200}, + "spriteSourceSize": {"x":487,"y":409,"w":220,"h":123}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/RightFrogtieKneel.png": +"Models/Harness/BeltsTopWristtie.png": { - "frame": {"x":1839,"y":511,"w":114,"h":62}, + "frame": {"x":1227,"y":748,"w":220,"h":123}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":398,"y":816,"w":114,"h":62}, + "spriteSourceSize": {"x":487,"y":409,"w":220,"h":123}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/RightFrogtieKneelClosed.png": +"Models/Harness/BeltsTopYoked.png": { - "frame": {"x":1839,"y":511,"w":114,"h":62}, + "frame": {"x":3,"y":268,"w":244,"h":133}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":398,"y":816,"w":114,"h":62}, + "spriteSourceSize": {"x":475,"y":409,"w":244,"h":133}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/RightThigh1KneelClosed.png": +"Models/Hood/KittyEars.png": { - "frame": {"x":274,"y":1268,"w":107,"h":51}, + "frame": {"x":255,"y":190,"w":245,"h":171}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":332,"y":908,"w":107,"h":51}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":487,"y":51,"w":245,"h":171}, + "sourceSize": {"w":752,"h":479} }, -"Models/Rope/Thigh1KneelClosedOver.png": +"Models/Jacket/StrapsChestExtra.png": { - "frame": {"x":773,"y":565,"w":103,"h":96}, + "frame": {"x":1669,"y":991,"w":217,"h":120}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":415,"y":922,"w":103,"h":96}, + "spriteSourceSize": {"x":493,"y":401,"w":217,"h":120}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rope/Thigh2KneelClosed.png": +"Models/Kigu/Mouth.png": { - "frame": {"x":733,"y":220,"w":148,"h":126}, + "frame": {"x":960,"y":537,"w":37,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":450,"y":875,"w":148,"h":126}, + "spriteSourceSize": {"x":585,"y":322,"w":37,"h":43}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/ArmRightWristtie.png": +"Models/LeatherCuffs/BandBelt.png": { - "frame": {"x":1089,"y":1221,"w":76,"h":97}, + "frame": {"x":1227,"y":567,"w":222,"h":50}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":429,"w":76,"h":97}, + "spriteSourceSize": {"x":471,"y":680,"w":222,"h":50}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/FaceEyes.png": +"Models/LeatherCuffs/BandThighLeftKneel.png": { - "frame": {"x":752,"y":1534,"w":217,"h":143}, + "frame": {"x":716,"y":1291,"w":148,"h":97}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":505,"y":194,"w":217,"h":143}, + "spriteSourceSize": {"x":488,"y":860,"w":148,"h":97}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/FootLeftHogtie.png": +"Models/LeatherCuffs/Belt.png": { - "frame": {"x":1365,"y":1321,"w":54,"h":112}, + "frame": {"x":3,"y":624,"w":230,"h":75}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":727,"y":802,"w":54,"h":112}, + "spriteSourceSize": {"x":469,"y":671,"w":230,"h":75}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/FootLeftKneelClosed.png": +"Models/LeatherCuffs/ElbowRightYoked.png": { - "frame": {"x":1423,"y":127,"w":154,"h":89}, + "frame": {"x":1825,"y":1706,"w":56,"h":92}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":729,"y":902,"w":154,"h":89}, + "spriteSourceSize": {"x":398,"y":520,"w":56,"h":92}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/HandRightFree.png": +"Models/LeatherCuffs/HardwareCollar.png": { - "frame": {"x":1317,"y":1532,"w":109,"h":113}, + "frame": {"x":1898,"y":603,"w":47,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":268,"y":544,"w":109,"h":113}, + "spriteSourceSize": {"x":575,"y":384,"w":47,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/SleeveRightYoked.png": +"Models/LeatherCuffs/HardwareThighRightSpread.png": { - "frame": {"x":1764,"y":1874,"w":50,"h":92}, + "frame": {"x":868,"y":1350,"w":89,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":449,"y":434,"w":50,"h":92}, + "spriteSourceSize": {"x":481,"y":1037,"w":89,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/Mouth.png": -{ - "frame": {"x":1640,"y":534,"w":148,"h":94}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":72,"y":190,"w":148,"h":94}, - "sourceSize": {"w":321,"h":332} -}, -"Models/ShadowHands/RightLegs1Kneel.png": +"Models/LeatherCuffs/ThighLeftKneel.png": { - "frame": {"x":508,"y":1323,"w":137,"h":148}, + "frame": {"x":430,"y":1291,"w":189,"h":117}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":363,"y":785,"w":137,"h":148}, + "spriteSourceSize": {"x":469,"y":847,"w":189,"h":117}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/RightLegs2Kneel.png": +"Models/Maid/CorsetStrapsBoxtie.png": { - "frame": {"x":845,"y":1103,"w":109,"h":140}, + "frame": {"x":472,"y":658,"w":228,"h":125}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":370,"y":814,"w":109,"h":140}, + "spriteSourceSize": {"x":493,"y":412,"w":228,"h":125}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/RightLegs2KneelClosed.png": +"Models/Maid/ShoeLeftKneel.png": { - "frame": {"x":845,"y":1103,"w":109,"h":140}, + "frame": {"x":778,"y":1581,"w":179,"h":121}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":370,"y":814,"w":109,"h":140}, + "spriteSourceSize": {"x":722,"y":923,"w":179,"h":121}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/ApronSkirtOverKneel.png": +"Models/Maid/ShoeLeftKneelClosed.png": { - "frame": {"x":346,"y":1534,"w":214,"h":154}, + "frame": {"x":961,"y":1581,"w":147,"h":121}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":498,"y":752,"w":214,"h":154}, + "spriteSourceSize": {"x":754,"y":923,"w":147,"h":121}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/ApronSkirtOverKneelCrotchStrap.png": +"Models/Maid/ShoeRightKneel.png": { - "frame": {"x":346,"y":1534,"w":214,"h":154}, + "frame": {"x":534,"y":1412,"w":85,"h":116}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":498,"y":752,"w":214,"h":154}, + "spriteSourceSize": {"x":315,"y":845,"w":85,"h":116}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeShoulderLeftTied.png": +"Models/Maid/StripeSockLeftKneel.png": { - "frame": {"x":1349,"y":220,"w":111,"h":116}, + "frame": {"x":382,"y":1937,"w":184,"h":108}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":664,"y":413,"w":111,"h":116}, + "spriteSourceSize": {"x":492,"y":857,"w":184,"h":108}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeShoulderLeftYoked.png": +"Models/MaidKnightLight/GuardRightCrossed.png": { - "frame": {"x":1867,"y":1610,"w":139,"h":82}, + "frame": {"x":1668,"y":1115,"w":216,"h":104}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":666,"y":406,"w":139,"h":82}, + "spriteSourceSize": {"x":480,"y":593,"w":216,"h":104}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeShoulderRightTied.png": +"Models/MaidKnightLight/GuardRightFront.png": { - "frame": {"x":1924,"y":1874,"w":121,"h":71}, + "frame": {"x":534,"y":1532,"w":121,"h":170}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":460,"y":417,"w":121,"h":71}, + "spriteSourceSize": {"x":412,"y":530,"w":121,"h":170}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/ArmRightWristtie.png": +"Models/MaidKnightLight/Headband.png": { - "frame": {"x":1169,"y":1221,"w":76,"h":97}, + "frame": {"x":1726,"y":293,"w":225,"h":220}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":465,"y":429,"w":76,"h":97}, + "spriteSourceSize": {"x":510,"y":114,"w":225,"h":220}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/FootLeftHogtie.png": +"Models/MaidKnightLight/PauldronLeftUp.png": { - "frame": {"x":1423,"y":1321,"w":54,"h":112}, + "frame": {"x":995,"y":1350,"w":99,"h":118}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":727,"y":802,"w":54,"h":112}, + "spriteSourceSize": {"x":705,"y":452,"w":99,"h":118}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/FootLeftKneelClosed.png": +"Models/MaidKnightLight/ShoulderRightUp.png": { - "frame": {"x":741,"y":350,"w":152,"h":83}, + "frame": {"x":1890,"y":1032,"w":155,"h":215}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":730,"y":902,"w":152,"h":83}, + "spriteSourceSize": {"x":441,"y":346,"w":155,"h":215}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/HandRightFree.png": +"Models/Mittens/LatexRightFree.png": { - "frame": {"x":1227,"y":1322,"w":134,"h":113}, + "frame": {"x":445,"y":1138,"w":210,"h":149}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":268,"y":544,"w":134,"h":113}, + "spriteSourceSize": {"x":276,"y":552,"w":210,"h":149}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slime/HandRightYoked.png": +"Models/Ninja/Belt.png": { - "frame": {"x":637,"y":220,"w":92,"h":127}, + "frame": {"x":3,"y":3,"w":249,"h":133}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":299,"y":287,"w":92,"h":127}, + "spriteSourceSize": {"x":462,"y":640,"w":249,"h":133}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SMoonlight/PostureCollar.png": +"Models/OperaGloves/GloveRightFree.png": { - "frame": {"x":683,"y":568,"w":86,"h":93}, + "frame": {"x":493,"y":447,"w":231,"h":207}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":586,"y":356,"w":86,"h":93}, + "spriteSourceSize": {"x":267,"y":498,"w":231,"h":207}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SMoonlight/ReverseBinderLeft.png": +"Models/OperaGloves/GloveRightUp.png": { - "frame": {"x":305,"y":1103,"w":90,"h":151}, + "frame": {"x":717,"y":1706,"w":141,"h":223}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":689,"y":470,"w":90,"h":151}, + "spriteSourceSize": {"x":451,"y":163,"w":141,"h":223}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SMoonlight/ReverseBinderRight.png": +"Models/PantiesHigh/Base.png": { - "frame": {"x":304,"y":437,"w":126,"h":143}, + "frame": {"x":1758,"y":3,"w":243,"h":208}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":468,"y":376,"w":126,"h":143}, + "spriteSourceSize": {"x":467,"y":711,"w":243,"h":208}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelChastity/BeltPadlock.png": +"Models/PantiesHigh/Lines.png": { - "frame": {"x":458,"y":1323,"w":46,"h":149}, + "frame": {"x":760,"y":52,"w":245,"h":211}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":547,"y":734,"w":46,"h":149}, + "spriteSourceSize": {"x":466,"y":709,"w":245,"h":211}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelChastity/BeltRadial.png": +"Models/PantiesHigh/LinesClosed.png": { - "frame": {"x":441,"y":220,"w":50,"h":130}, + "frame": {"x":508,"y":105,"w":245,"h":210}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":546,"y":729,"w":50,"h":130}, + "spriteSourceSize": {"x":466,"y":709,"w":245,"h":210}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelChastity/BraPadlock.png": +"Models/PantiesHigh/StripesClosed.png": { - "frame": {"x":1895,"y":955,"w":46,"h":71}, + "frame": {"x":1510,"y":52,"w":243,"h":202}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":552,"y":556,"w":46,"h":71}, + "spriteSourceSize": {"x":467,"y":717,"w":243,"h":202}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/AnkleLeftSpread.png": +"Models/Ribbon/ArmHarness.png": { - "frame": {"x":455,"y":816,"w":90,"h":57}, + "frame": {"x":3,"y":1117,"w":213,"h":220}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":668,"y":1429,"w":90,"h":57}, + "spriteSourceSize": {"x":495,"y":409,"w":213,"h":220}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/AnkleRightSpread.png": +"Models/Ribbon/ArmHarnessUnderbust.png": { - "frame": {"x":1697,"y":632,"w":91,"h":56}, + "frame": {"x":1510,"y":3,"w":244,"h":45}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":488,"y":1431,"w":91,"h":56}, + "spriteSourceSize": {"x":464,"y":581,"w":244,"h":45}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ElbowLeftFront.png": +"Models/Ribbon/Belt.png": { - "frame": {"x":1956,"y":731,"w":85,"h":50}, + "frame": {"x":1668,"y":1223,"w":216,"h":49}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":688,"y":595,"w":85,"h":50}, + "spriteSourceSize": {"x":478,"y":658,"w":216,"h":49}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ElbowRightFront.png": +"Models/Ribbon/BowFront.png": { - "frame": {"x":1615,"y":866,"w":100,"h":58}, + "frame": {"x":1020,"y":1793,"w":132,"h":135}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":423,"y":603,"w":100,"h":58}, + "spriteSourceSize": {"x":515,"y":540,"w":132,"h":135}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimElbowLeftFree.png": +"Models/Ribbon/Calf1KneelClosed.png": { - "frame": {"x":1949,"y":893,"w":95,"h":49}, + "frame": {"x":2005,"y":210,"w":38,"h":50}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":691,"y":592,"w":95,"h":49}, + "spriteSourceSize": {"x":703,"y":954,"w":38,"h":50}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimElbowLeftUp.png": +"Models/Ribbon/Calf3Closed.png": { - "frame": {"x":627,"y":353,"w":110,"h":80}, + "frame": {"x":757,"y":267,"w":240,"h":207}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":712,"y":283,"w":110,"h":80}, + "spriteSourceSize": {"x":507,"y":1225,"w":240,"h":207}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimElbowRightBoxtie.png": +"Models/Ribbon/TopArmHarness.png": { - "frame": {"x":1957,"y":621,"w":86,"h":45}, + "frame": {"x":672,"y":981,"w":213,"h":217}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":460,"y":591,"w":86,"h":45}, + "spriteSourceSize": {"x":495,"y":409,"w":213,"h":217}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimElbowRightFront.png": +"Models/Ribbon/TopBelt.png": { - "frame": {"x":222,"y":1034,"w":213,"h":65}, + "frame": {"x":1001,"y":479,"w":223,"h":49}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":424,"y":595,"w":213,"h":65}, + "spriteSourceSize": {"x":461,"y":658,"w":223,"h":49}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimThighLeftKneel.png": +"Models/Ribbon/TopCalf1Closed.png": { - "frame": {"x":604,"y":665,"w":132,"h":133}, + "frame": {"x":3,"y":1341,"w":206,"h":139}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":517,"y":826,"w":132,"h":133}, + "spriteSourceSize": {"x":542,"y":1318,"w":206,"h":139}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimThighLeftSpread.png": +"Models/Ribbon/TopCalf1KneelClosed.png": { - "frame": {"x":1881,"y":1252,"w":151,"h":56}, + "frame": {"x":1185,"y":601,"w":38,"h":50}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":614,"y":994,"w":151,"h":56}, + "spriteSourceSize": {"x":703,"y":954,"w":38,"h":50}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimThighRightSpread.png": +"Models/Ribbon/TopCalf2Closed.png": { - "frame": {"x":1726,"y":1166,"w":152,"h":56}, + "frame": {"x":929,"y":851,"w":217,"h":170}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":441,"y":995,"w":152,"h":56}, + "spriteSourceSize": {"x":531,"y":1231,"w":217,"h":170}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimWristLeftYoked.png": +"Models/Ribbon/TopCalf3Closed.png": { - "frame": {"x":1596,"y":1386,"w":70,"h":45}, + "frame": {"x":1009,"y":141,"w":241,"h":185}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":866,"y":390,"w":70,"h":45}, + "spriteSourceSize": {"x":507,"y":1231,"w":241,"h":185}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimWristRightFree.png": +"Models/Ribbon/TopThigh1Closed.png": { - "frame": {"x":1554,"y":1596,"w":49,"h":73}, + "frame": {"x":1436,"y":1237,"w":205,"h":45}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":346,"y":597,"w":49,"h":73}, + "spriteSourceSize": {"x":488,"y":1094,"w":205,"h":45}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ThighLeftClosed.png": +"Models/Ribbon/TopThigh2Closed.png": { - "frame": {"x":746,"y":1249,"w":171,"h":69}, + "frame": {"x":3,"y":140,"w":248,"h":124}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":566,"y":977,"w":171,"h":69}, + "spriteSourceSize": {"x":468,"y":1012,"w":248,"h":124}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ThighLeftSpread.png": +"Models/RobeOfChastity/ChestFrill.png": { - "frame": {"x":630,"y":136,"w":166,"h":80}, + "frame": {"x":228,"y":926,"w":221,"h":93}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":604,"y":971,"w":166,"h":80}, + "spriteSourceSize": {"x":482,"y":446,"w":221,"h":93}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ThighRightSpread.png": +"Models/Robes/RibbonBelt.png": { - "frame": {"x":456,"y":354,"w":167,"h":79}, + "frame": {"x":238,"y":609,"w":230,"h":134}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":437,"y":973,"w":167,"h":79}, + "spriteSourceSize": {"x":470,"y":623,"w":230,"h":134}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/WristLeftFront.png": +"Models/Robes/ShoeLeftClosed.png": { - "frame": {"x":1449,"y":1812,"w":75,"h":60}, + "frame": {"x":1227,"y":1190,"w":205,"h":113}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":617,"y":539,"w":75,"h":60}, + "spriteSourceSize": {"x":466,"y":1517,"w":205,"h":113}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/FootSockLeftHogtie.png": +"Models/Robes/ZombieTalismanBent.png": { - "frame": {"x":1615,"y":928,"w":70,"h":64}, + "frame": {"x":659,"y":1532,"w":115,"h":170}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":712,"y":785,"w":70,"h":64}, + "spriteSourceSize": {"x":606,"y":139,"w":115,"h":170}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SockLeftClosed.png": +"Models/Rope/AnklesKneel.png": { - "frame": {"x":624,"y":1252,"w":118,"h":66}, + "frame": {"x":2005,"y":154,"w":38,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":528,"y":1571,"w":118,"h":66}, + "spriteSourceSize": {"x":701,"y":955,"w":38,"h":52}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SuccubusClawRightYoked.png": +"Models/Rope/AnklesKneelOver.png": { - "frame": {"x":416,"y":584,"w":99,"h":77}, + "frame": {"x":2005,"y":154,"w":38,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":304,"y":282,"w":99,"h":77}, + "spriteSourceSize": {"x":701,"y":955,"w":38,"h":52}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SuccubusTailLight.png": +"Models/Rope/ArmHarness.png": { - "frame": {"x":1503,"y":1218,"w":108,"h":98}, + "frame": {"x":1254,"y":241,"w":235,"h":211}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":899,"y":571,"w":108,"h":98}, + "spriteSourceSize": {"x":478,"y":411,"w":235,"h":211}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallSmoothHeels/TallRightHogtie.png": +"Models/Rope/Calf1KneelClosed.png": { - "frame": {"x":1957,"y":556,"w":86,"h":61}, + "frame": {"x":2005,"y":154,"w":38,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":500,"y":1148,"w":86,"h":61}, + "spriteSourceSize": {"x":701,"y":955,"w":38,"h":52}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TallSmoothHeels/TallRightKneel.png": +"Models/Rope/Calf1KneelClosedOver.png": { - "frame": {"x":1374,"y":888,"w":91,"h":107}, + "frame": {"x":2005,"y":154,"w":38,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":302,"y":828,"w":91,"h":107}, + "spriteSourceSize": {"x":701,"y":955,"w":38,"h":52}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/ArmFullRightWristtie.png": +"Models/Rope/LeftFrogtieKneelClosed.png": { - "frame": {"x":1649,"y":1553,"w":70,"h":80}, + "frame": {"x":1227,"y":1307,"w":198,"h":195}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":429,"w":70,"h":80}, + "spriteSourceSize": {"x":555,"y":822,"w":198,"h":195}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/ArmLeftCrossed.png": +"Models/Rope/Thigh2Closed.png": { - "frame": {"x":385,"y":1258,"w":172,"h":61}, + "frame": {"x":760,"y":3,"w":248,"h":45}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":563,"y":629,"w":172,"h":61}, + "spriteSourceSize": {"x":470,"y":1012,"w":248,"h":45}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/Collar.png": +"Models/RopeOld/ShoulderStraps.png": { - "frame": {"x":1542,"y":996,"w":173,"h":95}, + "frame": {"x":1240,"y":456,"w":223,"h":107}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":588,"y":357,"w":173,"h":95}, + "spriteSourceSize": {"x":486,"y":409,"w":223,"h":107}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/FeetHogtie.png": +"Models/Rubber/ArmLeftFront.png": { - "frame": {"x":1481,"y":1321,"w":52,"h":112}, + "frame": {"x":519,"y":1706,"w":95,"h":227}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":730,"y":800,"w":52,"h":112}, + "spriteSourceSize": {"x":429,"y":432,"w":95,"h":227}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/HandLeftFront.png": +"Models/Rubber/FaceEyes.png": { - "frame": {"x":1399,"y":1102,"w":111,"h":112}, + "frame": {"x":1227,"y":1043,"w":217,"h":143}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":565,"y":461,"w":111,"h":112}, + "spriteSourceSize": {"x":505,"y":194,"w":217,"h":143}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/HandRightYoked.png": +"Models/Rubber/HandRightFree.png": { - "frame": {"x":907,"y":437,"w":98,"h":122}, + "frame": {"x":995,"y":1932,"w":109,"h":113}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":296,"y":297,"w":98,"h":122}, + "spriteSourceSize": {"x":268,"y":544,"w":109,"h":113}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/ArmLeftCrossed.png": +"Models/Sailor/CollarStripeUp.png": { - "frame": {"x":385,"y":1258,"w":172,"h":61}, + "frame": {"x":862,"y":1706,"w":154,"h":222}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":563,"y":629,"w":172,"h":61}, + "spriteSourceSize": {"x":548,"y":303,"w":154,"h":222}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/ArmStrapRightBoxtie.png": +"Models/Sailor/CollarUp.png": { - "frame": {"x":1822,"y":1805,"w":75,"h":65}, + "frame": {"x":351,"y":1706,"w":164,"h":227}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":442,"w":75,"h":65}, + "spriteSourceSize": {"x":548,"y":303,"w":164,"h":227}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/RightLegsKneel.png": +"Models/ShadowHands/Feet1KneelClosed.png": { - "frame": {"x":1464,"y":220,"w":161,"h":107}, + "frame": {"x":256,"y":3,"w":248,"h":183}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":368,"y":816,"w":161,"h":107}, + "spriteSourceSize": {"x":516,"y":894,"w":248,"h":183}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ArmFullRightWristtie.png": +"Models/Skirts/ApronSkirtOverKneel.png": { - "frame": {"x":1649,"y":1553,"w":70,"h":80}, + "frame": {"x":227,"y":1023,"w":214,"h":154}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":429,"w":70,"h":80}, + "spriteSourceSize": {"x":498,"y":752,"w":214,"h":154}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ArmLeftCrossed.png": +"Models/Skirts/ApronSkirtOverKneelCrotchStrap.png": { - "frame": {"x":385,"y":1258,"w":172,"h":61}, + "frame": {"x":227,"y":1023,"w":214,"h":154}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":563,"y":629,"w":172,"h":61}, + "spriteSourceSize": {"x":498,"y":752,"w":214,"h":154}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ArmStrapRightBoxtie.png": +"Models/Skirts/StripedSkirtUnderKneelCrotchStrap.png": { - "frame": {"x":1822,"y":1805,"w":75,"h":65}, + "frame": {"x":868,"y":1269,"w":205,"h":77}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":442,"w":75,"h":65}, + "spriteSourceSize": {"x":462,"y":769,"w":205,"h":77}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/HandLeftFree.png": +"Models/Slayer/CapeShoulderLeftTied.png": { - "frame": {"x":1949,"y":946,"w":94,"h":80}, + "frame": {"x":1112,"y":1581,"w":111,"h":116}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":822,"y":785,"w":94,"h":80}, + "spriteSourceSize": {"x":664,"y":413,"w":111,"h":116}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/HandLeftFront.png": +"Models/Slime/ArmLeftFront.png": { - "frame": {"x":1574,"y":1874,"w":106,"h":92}, + "frame": {"x":618,"y":1706,"w":95,"h":227}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":565,"y":461,"w":106,"h":92}, + "spriteSourceSize": {"x":429,"y":432,"w":95,"h":227}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/HandRightFree.png": +"Models/Slime/FaceFull.png": { - "frame": {"x":1371,"y":664,"w":91,"h":107}, + "frame": {"x":1677,"y":603,"w":217,"h":199}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":266,"y":546,"w":91,"h":107}, + "spriteSourceSize": {"x":505,"y":194,"w":217,"h":199}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/HandRightYoked.png": +"Models/Slime/HandRightBoxtie.png": { - "frame": {"x":880,"y":565,"w":98,"h":96}, + "frame": {"x":1185,"y":655,"w":38,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":296,"y":297,"w":98,"h":96}, + "spriteSourceSize": {"x":678,"y":671,"w":38,"h":44}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/ForeGloveLeftFront.png": +"Models/SteelChastity/BraRadial.png": { - "frame": {"x":558,"y":3,"w":136,"h":129}, + "frame": {"x":1898,"y":716,"w":45,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":548,"y":465,"w":136,"h":129}, + "spriteSourceSize": {"x":553,"y":552,"w":45,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/ForeGloveRightFront.png": +"Models/SteelCuffs/AnkleLeftSpread.png": { - "frame": {"x":958,"y":1103,"w":108,"h":132}, + "frame": {"x":1955,"y":465,"w":90,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":477,"y":460,"w":108,"h":132}, + "spriteSourceSize": {"x":668,"y":1429,"w":90,"h":57}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/GloveRightFree.png": +"Models/SteelCuffs/ElbowLeftWristtie.png": { - "frame": {"x":1018,"y":1738,"w":136,"h":135}, + "frame": {"x":787,"y":1440,"w":56,"h":50}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":267,"y":537,"w":136,"h":135}, + "spriteSourceSize": {"x":679,"y":619,"w":56,"h":50}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/NecklaceCharm.png": +"Models/SteelCuffs/RimAnkleLeftKneelClosed.png": { - "frame": {"x":1427,"y":340,"w":41,"h":93}, + "frame": {"x":373,"y":1639,"w":46,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":571,"y":407,"w":41,"h":93}, + "spriteSourceSize": {"x":717,"y":940,"w":46,"h":63}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/RimForeGloveRightFront.png": +"Models/SteelCuffs/RimElbowRightFront.png": { - "frame": {"x":1719,"y":759,"w":69,"h":62}, + "frame": {"x":445,"y":1069,"w":213,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":479,"y":528,"w":69,"h":62}, + "spriteSourceSize": {"x":424,"y":595,"w":213,"h":65}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/RimGloveLeftFree.png": +"Models/Swimsuit/Strappy.png": { - "frame": {"x":857,"y":1681,"w":68,"h":53}, + "frame": {"x":504,"y":319,"w":239,"h":124}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":789,"y":744,"w":68,"h":53}, + "spriteSourceSize": {"x":469,"y":614,"w":239,"h":124}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/RimGloveRightFree.png": +"Models/TallBallet/TallRightKneel.png": { - "frame": {"x":1449,"y":1738,"w":62,"h":70}, + "frame": {"x":623,"y":1291,"w":89,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":338,"y":599,"w":62,"h":70}, + "spriteSourceSize": {"x":309,"y":850,"w":89,"h":85}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/BlouseLeftFront.png": +"Models/TallSmoothHeels/TallLegRightKneelClosed.png": { - "frame": {"x":141,"y":1738,"w":169,"h":194}, + "frame": {"x":1645,"y":1276,"w":204,"h":244}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":624,"y":418,"w":169,"h":194}, + "spriteSourceSize": {"x":315,"y":818,"w":204,"h":244}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/ShoeLeftHogtie.png": +"Models/TapeHeavy/ArmFullRightBoxtie.png": { - "frame": {"x":891,"y":877,"w":50,"h":120}, + "frame": {"x":150,"y":1706,"w":97,"h":233}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":732,"y":794,"w":50,"h":120}, + "spriteSourceSize": {"x":461,"y":424,"w":97,"h":233}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/ShoeLeftKneel.png": +"Models/TapeHeavy/ArmRightCrossed.png": { - "frame": {"x":1326,"y":1219,"w":173,"h":98}, + "frame": {"x":251,"y":365,"w":238,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":720,"y":927,"w":173,"h":98}, + "spriteSourceSize": {"x":462,"y":605,"w":238,"h":85}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/ShoeLeftKneelClosed.png": +"Models/TapeHeavy/HandLeftFree.png": { - "frame": {"x":1546,"y":659,"w":141,"h":95}, + "frame": {"x":1825,"y":1810,"w":104,"h":97}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":752,"y":930,"w":141,"h":95}, + "spriteSourceSize": {"x":812,"y":768,"w":104,"h":97}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Witch/ShoeLeftSpread.png": +"Models/TapeHeavy/HandLeftFront.png": { - "frame": {"x":1254,"y":904,"w":116,"h":92}, + "frame": {"x":1108,"y":1932,"w":111,"h":112}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":635,"y":1544,"w":116,"h":92}, + "spriteSourceSize": {"x":565,"y":461,"w":111,"h":112}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/AnkleLeftKneel.png": +"Models/TapeHeavy/HandRightFront.png": { - "frame": {"x":1684,"y":1874,"w":76,"h":92}, + "frame": {"x":716,"y":1937,"w":101,"h":108}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":695,"y":946,"w":76,"h":92}, + "spriteSourceSize": {"x":488,"y":462,"w":101,"h":108}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/AnkleLeftSpread.png": +"Models/TapeHeavy/PetsuitTopTapedHands.png": { - "frame": {"x":1516,"y":1738,"w":84,"h":63}, + "frame": {"x":1262,"y":3,"w":244,"h":104}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":677,"y":1411,"w":84,"h":63}, + "spriteSourceSize": {"x":474,"y":408,"w":244,"h":104}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/AnkleRightClosed.png": +"Models/TapeLight/AnklesKneelClosed.png": { - "frame": {"x":739,"y":1470,"w":85,"h":60}, + "frame": {"x":3,"y":458,"w":231,"h":86}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":533,"y":1416,"w":85,"h":60}, + "spriteSourceSize": {"x":534,"y":980,"w":231,"h":86}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/AnkleRightSpread.png": +"Models/TapeLight/ArmRightCrossed.png": { - "frame": {"x":739,"y":1470,"w":85,"h":60}, + "frame": {"x":251,"y":365,"w":238,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":486,"y":1412,"w":85,"h":60}, + "spriteSourceSize": {"x":462,"y":605,"w":238,"h":85}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/CollarBand.png": +"Models/TapeLight/PetsuitTopTapedHands.png": { - "frame": {"x":1839,"y":577,"w":114,"h":47}, + "frame": {"x":1757,"y":215,"w":242,"h":74}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":571,"y":382,"w":114,"h":47}, + "spriteSourceSize": {"x":475,"y":418,"w":242,"h":74}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/ButtKneel.png": +"Models/TapeMed/ArmFullRightBoxtie.png": { - "frame": {"x":152,"y":447,"w":148,"h":214}, + "frame": {"x":150,"y":1706,"w":97,"h":233}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":627,"y":750,"w":148,"h":214}, + "spriteSourceSize": {"x":461,"y":424,"w":97,"h":233}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/GloveLeftUp.png": +"Models/TapeMed/ArmRightCrossed.png": { - "frame": {"x":48,"y":890,"w":170,"h":209}, + "frame": {"x":251,"y":365,"w":238,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":664,"y":167,"w":170,"h":209}, + "spriteSourceSize": {"x":462,"y":605,"w":238,"h":85}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegBandLeftClosed.png": +"Models/TapeMed/HandLeftFront.png": { - "frame": {"x":1082,"y":3,"w":150,"h":124}, + "frame": {"x":1623,"y":1870,"w":106,"h":92}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":590,"y":802,"w":150,"h":124}, + "spriteSourceSize": {"x":565,"y":461,"w":106,"h":92}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegBandLeftHogtie.png": +"Models/TapeMed/HandLeftYoked.png": { - "frame": {"x":753,"y":437,"w":150,"h":124}, + "frame": {"x":1520,"y":1930,"w":99,"h":96}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":590,"y":802,"w":150,"h":124}, + "spriteSourceSize": {"x":853,"y":287,"w":99,"h":96}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegBandLeftKneel.png": +"Models/Visors/Dollmaker.png": { - "frame": {"x":1722,"y":1705,"w":76,"h":36}, + "frame": {"x":1825,"y":1538,"w":193,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":663,"y":762,"w":76,"h":36}, + "spriteSourceSize": {"x":506,"y":250,"w":193,"h":85}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegBandLeftKneelClosed.png": +"Models/Wolf/BeltBandMid.png": { - "frame": {"x":1722,"y":1705,"w":76,"h":36}, + "frame": {"x":3,"y":405,"w":237,"h":49}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":663,"y":762,"w":76,"h":36}, + "spriteSourceSize": {"x":468,"y":695,"w":237,"h":49}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegBandRightClosed.png": +"Models/WolfCatsuit/GloveLeftCrossed.png": { - "frame": {"x":1469,"y":886,"w":142,"h":106}, + "frame": {"x":704,"y":669,"w":221,"h":198}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":819,"w":142,"h":106}, + "spriteSourceSize": {"x":552,"y":503,"w":221,"h":198}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegBandRightHogtie.png": +"Models/WolfCatsuit/GloveRightWristtie.png": { - "frame": {"x":1420,"y":549,"w":142,"h":106}, + "frame": {"x":2005,"y":3,"w":40,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":819,"w":142,"h":106}, + "spriteSourceSize": {"x":463,"y":498,"w":40,"h":29}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegBandRightKneel.png": +"Models/WolfCatsuit/LegBandLeftClosed.png": { - "frame": {"x":866,"y":792,"w":79,"h":81}, + "frame": {"x":1422,"y":1633,"w":150,"h":124}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":770,"w":79,"h":81}, + "spriteSourceSize": {"x":590,"y":802,"w":150,"h":124}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegBandRightKneelClosed.png": +"Models/WolfCatsuit/LegBandLeftSpread.png": { - "frame": {"x":949,"y":792,"w":79,"h":81}, + "frame": {"x":570,"y":1937,"w":142,"h":108}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":447,"y":770,"w":79,"h":81}, + "spriteSourceSize": {"x":605,"y":802,"w":142,"h":108}, "sourceSize": {"w":1240,"h":1754} }, "Models/WolfCatsuit/LegBandRightSpread.png": { - "frame": {"x":1288,"y":777,"w":143,"h":107}, + "frame": {"x":848,"y":1392,"w":143,"h":107}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":448,"y":819,"w":143,"h":107}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/LegRimLeftClosed.png": -{ - "frame": {"x":703,"y":1322,"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":935,"y":1885,"w":161,"h":143}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":588,"y":792,"w":161,"h":143}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/WolfCatsuit/LegRimLeftSpread.png": +"Models/WolfCatsuit/LegPadsRightHogtie.png": { - "frame": {"x":1069,"y":1322,"w":154,"h":135}, + "frame": {"x":1098,"y":1245,"w":125,"h":194}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":597,"y":792,"w":154,"h":135}, + "spriteSourceSize": {"x":458,"y":942,"w":125,"h":194}, "sourceSize": {"w":1240,"h":1754} }, "Models/WolfCatsuit/LegRimRightClosed.png": { - "frame": {"x":1158,"y":1738,"w":149,"h":134}, + "frame": {"x":1733,"y":1911,"w":149,"h":134}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":444,"y":805,"w":149,"h":134}, @@ -3090,42 +1618,26 @@ }, "Models/WolfCatsuit/LegRimRightHogtie.png": { - "frame": {"x":1226,"y":1876,"w":149,"h":134}, + "frame": {"x":1886,"y":1911,"w":149,"h":134}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":444,"y":805,"w":149,"h":134}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/RimForeGloveRightFront.png": -{ - "frame": {"x":1719,"y":759,"w":69,"h":62}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":479,"y":528,"w":69,"h":62}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/WolfCatsuit/RimGloveLeftFree.png": -{ - "frame": {"x":857,"y":1681,"w":68,"h":53}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":789,"y":744,"w":68,"h":53}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/WolfCatsuit/RimGloveRightFree.png": +"Models/WolfCatsuit/ShoeLeftKneel.png": { - "frame": {"x":1449,"y":1738,"w":62,"h":70}, + "frame": {"x":3,"y":1945,"w":179,"h":100}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":338,"y":599,"w":62,"h":70}, + "spriteSourceSize": {"x":722,"y":921,"w":179,"h":100}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/ShoeLeftKneel.png": +"Models/WolfCatsuit/ShoeLeftKneelClosed.png": { - "frame": {"x":1853,"y":111,"w":179,"h":100}, + "frame": {"x":1886,"y":1706,"w":159,"h":100}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":722,"y":921,"w":179,"h":100}, + "spriteSourceSize": {"x":742,"y":921,"w":159,"h":100}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -3135,7 +1647,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas39.webp b/TextureAtlas/atlas39.webp index 34c189c3c..71d2d4ea3 100644 Binary files a/TextureAtlas/atlas39.webp and b/TextureAtlas/atlas39.webp differ diff --git a/TextureAtlas/atlas4.json b/TextureAtlas/atlas4.json index 34173a2c3..0c4024fe2 100644 --- a/TextureAtlas/atlas4.json +++ b/TextureAtlas/atlas4.json @@ -255,7 +255,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas40.json b/TextureAtlas/atlas40.json index 7805272fd..c0034caad 100644 --- a/TextureAtlas/atlas40.json +++ b/TextureAtlas/atlas40.json @@ -1,1648 +1,1720 @@ {"frames": { -"Models/ArmorChain/SkirtBeltDecoKneel.png": +"Models/Armbinder/BinderLeftWristtie.png": { - "frame": {"x":779,"y":564,"w":61,"h":60}, + "frame": {"x":112,"y":3,"w":86,"h":213}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":511,"y":772,"w":61,"h":60}, + "spriteSourceSize": {"x":677,"y":531,"w":86,"h":213}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ArmorPlate/GauntletLeftCrossed.png": +"Models/ArmorChain/SkirtBeltDeco.png": { - "frame": {"x":659,"y":550,"w":116,"h":59}, + "frame": {"x":486,"y":1496,"w":153,"h":168}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":507,"y":631,"w":116,"h":59}, + "spriteSourceSize": {"x":543,"y":772,"w":153,"h":168}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/KneeSpread.png": +"Models/ArmorPlate/GauntletRightFront.png": { - "frame": {"x":387,"y":964,"w":108,"h":87}, + "frame": {"x":381,"y":1866,"w":167,"h":179}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":641,"y":1163,"w":108,"h":87}, + "spriteSourceSize": {"x":446,"y":461,"w":167,"h":179}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/WristLeftFree.png": +"Models/ArmorPlate/GauntletRightYoked.png": { - "frame": {"x":810,"y":39,"w":49,"h":39}, + "frame": {"x":202,"y":3,"w":96,"h":205}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":808,"y":765,"w":49,"h":39}, + "spriteSourceSize": {"x":300,"y":289,"w":96,"h":205}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/WristLeftYoked.png": +"Models/Bandit/KneeClosed.png": { - "frame": {"x":505,"y":37,"w":49,"h":38}, + "frame": {"x":885,"y":1370,"w":104,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":879,"y":393,"w":49,"h":38}, + "spriteSourceSize": {"x":575,"y":1158,"w":104,"h":88}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bandit/WristRightFront.png": +"Models/Bandit/KneeSpread.png": { - "frame": {"x":538,"y":80,"w":55,"h":41}, + "frame": {"x":1510,"y":1564,"w":108,"h":87}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":482,"y":541,"w":55,"h":41}, + "spriteSourceSize": {"x":641,"y":1163,"w":108,"h":87}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Belts/Legs2Kneel.png": +"Models/Bandit/PouchKneel.png": { - "frame": {"x":425,"y":886,"w":109,"h":74}, + "frame": {"x":1203,"y":1560,"w":95,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":397,"y":928,"w":109,"h":74}, + "spriteSourceSize": {"x":359,"y":872,"w":95,"h":95}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bubble/Gag.png": +"Models/Bandit/ShoeLeftKneelClosed.png": { - "frame": {"x":451,"y":37,"w":50,"h":38}, + "frame": {"x":1838,"y":646,"w":168,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":107,"y":234,"w":50,"h":38}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":729,"y":929,"w":168,"h":95}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/ProtoDisplay.png": +"Models/Bandit/ShoeRightKneel.png": { - "frame": {"x":799,"y":325,"w":65,"h":48}, + "frame": {"x":1608,"y":425,"w":72,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":535,"y":812,"w":65,"h":48}, + "spriteSourceSize": {"x":321,"y":856,"w":72,"h":95}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Collars/DragonCollar.png": +"Models/Bandit/WristLeftFree.png": { - "frame": {"x":406,"y":3,"w":75,"h":30}, + "frame": {"x":999,"y":1327,"w":49,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":591,"y":389,"w":75,"h":30}, + "spriteSourceSize": {"x":808,"y":765,"w":49,"h":39}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Collars/QuakeHogtie.png": +"Models/Bandit/WristLeftYoked.png": { - "frame": {"x":624,"y":678,"w":80,"h":62}, + "frame": {"x":379,"y":1005,"w":49,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":588,"y":394,"w":80,"h":62}, + "spriteSourceSize": {"x":879,"y":393,"w":49,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/AnkleLeftSpread.png": +"Models/Bandit/WristRightYoked.png": { - "frame": {"x":910,"y":287,"w":67,"h":48}, + "frame": {"x":870,"y":150,"w":52,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":684,"y":1423,"w":67,"h":48}, + "spriteSourceSize": {"x":315,"y":392,"w":52,"h":35}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/AnkleRightClosed.png": +"Models/Belts/LeftArm2Boxtie.png": { - "frame": {"x":67,"y":415,"w":75,"h":51}, + "frame": {"x":1949,"y":1950,"w":95,"h":74}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":540,"y":1424,"w":75,"h":51}, + "spriteSourceSize": {"x":675,"y":576,"w":95,"h":74}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/AnkleRightSpread.png": +"Models/Belts/Legs1KneelClosed.png": { - "frame": {"x":122,"y":310,"w":67,"h":48}, + "frame": {"x":721,"y":648,"w":175,"h":148}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":494,"y":1422,"w":67,"h":48}, + "spriteSourceSize": {"x":500,"y":839,"w":175,"h":148}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/ElbowRightUp.png": +"Models/Belts/Legs2Kneel.png": { - "frame": {"x":566,"y":817,"w":111,"h":70}, + "frame": {"x":1810,"y":1835,"w":109,"h":74}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":252,"w":111,"h":70}, + "spriteSourceSize": {"x":397,"y":928,"w":109,"h":74}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/ThighRightClosed.png": +"Models/Body/ButtKneel.png": { - "frame": {"x":844,"y":566,"w":109,"h":59}, + "frame": {"x":3,"y":222,"w":149,"h":213}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":470,"y":1032,"w":109,"h":59}, + "spriteSourceSize": {"x":627,"y":750,"w":149,"h":213}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/WristLeftFree.png": +"Models/Body/HandLeftFree.png": { - "frame": {"x":73,"y":470,"w":61,"h":55}, + "frame": {"x":1365,"y":1370,"w":139,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":797,"y":749,"w":61,"h":55}, + "spriteSourceSize": {"x":806,"y":779,"w":139,"h":85}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CrystalCuffs/WristLeftYoked.png": +"Models/Bubble/Gag.png": { - "frame": {"x":244,"y":368,"w":64,"h":49}, + "frame": {"x":325,"y":1005,"w":50,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":871,"y":386,"w":64,"h":49}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":107,"y":234,"w":50,"h":38}, + "sourceSize": {"w":321,"h":332} }, -"Models/CrystalCuffs/WristRightFree.png": +"Models/Bunny/FootSockRightKneel.png": { - "frame": {"x":117,"y":796,"w":54,"h":70}, + "frame": {"x":1243,"y":1839,"w":76,"h":100}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":355,"y":602,"w":54,"h":70}, + "spriteSourceSize": {"x":324,"y":851,"w":76,"h":100}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/AnkleLeftSpread.png": +"Models/Bunny/GloveLeftWristtie.png": { - "frame": {"x":461,"y":320,"w":67,"h":48}, + "frame": {"x":3,"y":1303,"w":74,"h":192}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":684,"y":1423,"w":67,"h":48}, + "spriteSourceSize": {"x":679,"y":549,"w":74,"h":192}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/AnkleRightClosed.png": +"Models/Cape/CoatHogtieFree.png": { - "frame": {"x":146,"y":421,"w":75,"h":51}, + "frame": {"x":3,"y":1499,"w":177,"h":190}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":540,"y":1424,"w":75,"h":51}, + "spriteSourceSize": {"x":615,"y":418,"w":177,"h":190}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/AnkleRightSpread.png": +"Models/Catsuit/ArmRightWristtie.png": { - "frame": {"x":532,"y":320,"w":67,"h":48}, + "frame": {"x":1323,"y":1839,"w":49,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":494,"y":1422,"w":67,"h":48}, + "spriteSourceSize": {"x":466,"y":432,"w":49,"h":95}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/ElbowLeftFree.png": +"Models/Catsuit/FootLeftClosed.png": { - "frame": {"x":203,"y":476,"w":82,"h":57}, + "frame": {"x":877,"y":1046,"w":138,"h":149}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":700,"y":582,"w":82,"h":57}, + "spriteSourceSize": {"x":533,"y":1472,"w":138,"h":149}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/ElbowRightUp.png": +"Models/Catsuit/FootLeftHogtie.png": { - "frame": {"x":845,"y":833,"w":111,"h":70}, + "frame": {"x":791,"y":190,"w":119,"h":144}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":445,"y":252,"w":111,"h":70}, + "spriteSourceSize": {"x":663,"y":799,"w":119,"h":144}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/ThighRightClosed.png": +"Models/Catsuit/FootLeftKneelClosed.png": { - "frame": {"x":69,"y":597,"w":109,"h":59}, + "frame": {"x":1829,"y":964,"w":159,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":470,"y":1032,"w":109,"h":59}, + "spriteSourceSize": {"x":726,"y":903,"w":159,"h":83}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/WristLeftFree.png": +"Models/Catsuit/FootLeftSpread.png": { - "frame": {"x":138,"y":476,"w":61,"h":55}, + "frame": {"x":411,"y":648,"w":132,"h":160}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":797,"y":749,"w":61,"h":55}, + "spriteSourceSize": {"x":620,"y":1467,"w":132,"h":160}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/WristLeftFront.png": +"Models/Catsuit/FootRightKneel.png": { - "frame": {"x":3,"y":470,"w":66,"h":55}, + "frame": {"x":1221,"y":1659,"w":70,"h":101}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":623,"y":542,"w":66,"h":55}, + "spriteSourceSize": {"x":323,"y":856,"w":70,"h":101}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/WristLeftYoked.png": +"Models/Catsuit/FootRightSpread.png": { - "frame": {"x":312,"y":368,"w":64,"h":49}, + "frame": {"x":1002,"y":3,"w":109,"h":143}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":871,"y":386,"w":64,"h":49}, + "spriteSourceSize": {"x":496,"y":1482,"w":109,"h":143}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Cuffs/WristRightFree.png": +"Models/Catsuit/HandLeftFree.png": { - "frame": {"x":386,"y":805,"w":54,"h":70}, + "frame": {"x":1811,"y":1657,"w":113,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":355,"y":602,"w":54,"h":70}, + "spriteSourceSize": {"x":805,"y":778,"w":113,"h":85}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/CuffForeLongMittenLeftFront.png": +"Models/Catsuit/ShoulderLeftUp.png": { - "frame": {"x":289,"y":476,"w":76,"h":57}, + "frame": {"x":413,"y":1272,"w":162,"h":168}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":623,"y":537,"w":76,"h":57}, + "spriteSourceSize": {"x":626,"y":394,"w":162,"h":168}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/CuffForeLongMittenRightFront.png": +"Models/Chastity/BeltStrapLining.png": { - "frame": {"x":758,"y":693,"w":75,"h":62}, + "frame": {"x":463,"y":398,"w":164,"h":186}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":469,"y":524,"w":75,"h":62}, + "spriteSourceSize": {"x":557,"y":737,"w":164,"h":186}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/CuffLongMittenLeftBoxtie.png": +"Models/Chastity/BraLock.png": { - "frame": {"x":768,"y":431,"w":75,"h":54}, + "frame": {"x":1389,"y":822,"w":118,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":700,"y":503,"w":75,"h":54}, + "spriteSourceSize": {"x":556,"y":565,"w":118,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/CuffLongMittenLeftUp.png": +"Models/Chastity/ProtoDisplay.png": { - "frame": {"x":286,"y":664,"w":110,"h":62}, + "frame": {"x":1980,"y":1305,"w":65,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":690,"y":360,"w":110,"h":62}, + "spriteSourceSize": {"x":535,"y":812,"w":65,"h":48}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/CuffLongMittenRightUp.png": +"Models/China/Highlights.png": { - "frame": {"x":537,"y":427,"w":110,"h":52}, + "frame": {"x":685,"y":1840,"w":107,"h":132}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":357,"w":110,"h":52}, + "spriteSourceSize": {"x":560,"y":394,"w":107,"h":132}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/GlowLongMittenRightCrossed.png": +"Models/Collars/FutureRim.png": { - "frame": {"x":960,"y":833,"w":52,"h":83}, + "frame": {"x":1338,"y":1521,"w":47,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":413,"y":496,"w":52,"h":83}, + "spriteSourceSize": {"x":588,"y":397,"w":47,"h":33}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/StrapsLongMittenLeftYoked.png": +"Models/CrystalCuffs/AnkleLeftSpread.png": { - "frame": {"x":74,"y":946,"w":106,"h":85}, + "frame": {"x":504,"y":1444,"w":67,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":781,"y":526,"w":106,"h":85}, + "spriteSourceSize": {"x":684,"y":1423,"w":67,"h":48}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/AnkleLeftClosed.png": +"Models/CrystalCuffs/AnkleRightSpread.png": { - "frame": {"x":630,"y":613,"w":75,"h":61}, + "frame": {"x":575,"y":1444,"w":67,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":590,"y":1431,"w":75,"h":61}, + "spriteSourceSize": {"x":494,"y":1422,"w":67,"h":48}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/AnkleLeftKneelClosed.png": +"Models/CrystalCuffs/ElbowLeftWristtie.png": { - "frame": {"x":509,"y":738,"w":54,"h":68}, + "frame": {"x":640,"y":588,"w":65,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":709,"y":938,"w":54,"h":68}, + "spriteSourceSize": {"x":671,"y":599,"w":65,"h":56}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/Collar.png": +"Models/CrystalCuffs/ElbowLeftYoked.png": { - "frame": {"x":668,"y":375,"w":93,"h":50}, + "frame": {"x":1399,"y":1935,"w":69,"h":91}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":582,"y":380,"w":93,"h":50}, + "spriteSourceSize": {"x":764,"y":509,"w":69,"h":91}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayAnkleLeftClosed.png": +"Models/CrystalCuffs/ElbowRightUp.png": { - "frame": {"x":863,"y":273,"w":43,"h":48}, + "frame": {"x":1928,"y":1664,"w":111,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":614,"y":1440,"w":43,"h":48}, + "spriteSourceSize": {"x":445,"y":252,"w":111,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayAnkleLeftSpread.png": +"Models/CrystalCuffs/ElbowRightYoked.png": { - "frame": {"x":77,"y":308,"w":41,"h":48}, + "frame": {"x":1472,"y":1934,"w":55,"h":91}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":704,"y":1437,"w":41,"h":48}, + "spriteSourceSize": {"x":398,"y":520,"w":55,"h":91}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayAnkleRightSpread.png": +"Models/CrystalCuffs/SteelCollar.png": { - "frame": {"x":623,"y":374,"w":41,"h":49}, + "frame": {"x":397,"y":611,"w":97,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":503,"y":1437,"w":41,"h":49}, + "spriteSourceSize": {"x":577,"y":392,"w":97,"h":33}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayElbowRightYoked.png": +"Models/CrystalCuffs/ThighLeftClosed.png": { - "frame": {"x":861,"y":82,"w":41,"h":42}, + "frame": {"x":1260,"y":731,"w":143,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":396,"y":502,"w":41,"h":42}, + "spriteSourceSize": {"x":575,"y":1031,"w":143,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayThighLeftClosed.png": +"Models/CrystalCuffs/ThighLeftKneelClosed.png": { - "frame": {"x":720,"y":431,"w":44,"h":53}, + "frame": {"x":900,"y":648,"w":184,"h":147}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":649,"y":1040,"w":44,"h":53}, + "spriteSourceSize": {"x":470,"y":848,"w":184,"h":147}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayThighLeftKneel.png": +"Models/CrystalCuffs/ThighRightKneel.png": { - "frame": {"x":619,"y":271,"w":59,"h":47}, + "frame": {"x":1671,"y":1332,"w":143,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":571,"y":867,"w":59,"h":47}, + "spriteSourceSize": {"x":368,"y":831,"w":143,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayThighLeftKneelClosed.png": +"Models/CrystalCuffs/ThighRightKneelClosed.png": { - "frame": {"x":682,"y":272,"w":59,"h":47}, + "frame": {"x":1671,"y":1332,"w":143,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":571,"y":867,"w":59,"h":47}, + "spriteSourceSize": {"x":368,"y":831,"w":143,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ElbowLeftWristtie.png": +"Models/CrystalCuffs/WristLeftFront.png": { - "frame": {"x":473,"y":425,"w":60,"h":52}, + "frame": {"x":693,"y":1437,"w":65,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":682,"y":604,"w":60,"h":52}, + "spriteSourceSize": {"x":623,"y":543,"w":65,"h":53}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ElbowLeftYoked.png": +"Models/CrystalCuffs/WristRightFree.png": { - "frame": {"x":538,"y":891,"w":90,"h":82}, + "frame": {"x":1664,"y":1932,"w":54,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":744,"y":494,"w":90,"h":82}, + "spriteSourceSize": {"x":355,"y":602,"w":54,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/LinkCollar.png": +"Models/CrystalCuffs/WristRightFront.png": { - "frame": {"x":765,"y":377,"w":93,"h":50}, + "frame": {"x":498,"y":588,"w":67,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":582,"y":380,"w":93,"h":50}, + "spriteSourceSize": {"x":473,"y":541,"w":67,"h":56}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenAnkleLeftSpread.png": +"Models/Cuffs/AnkleLeftSpread.png": { - "frame": {"x":400,"y":670,"w":53,"h":62}, + "frame": {"x":934,"y":336,"w":67,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":698,"y":1430,"w":53,"h":62}, + "spriteSourceSize": {"x":684,"y":1423,"w":67,"h":48}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenAnkleRightClosed.png": +"Models/Cuffs/AnkleRightClosed.png": { - "frame": {"x":72,"y":726,"w":49,"h":64}, + "frame": {"x":1654,"y":1462,"w":75,"h":51}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":532,"y":1426,"w":49,"h":64}, + "spriteSourceSize": {"x":540,"y":1424,"w":75,"h":51}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenAnkleRightSpread.png": +"Models/Cuffs/AnkleRightSpread.png": { - "frame": {"x":916,"y":693,"w":54,"h":63}, + "frame": {"x":1005,"y":336,"w":67,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":496,"y":1430,"w":54,"h":63}, + "spriteSourceSize": {"x":494,"y":1422,"w":67,"h":48}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenBelt.png": +"Models/Cuffs/Collar.png": { - "frame": {"x":392,"y":736,"w":55,"h":65}, + "frame": {"x":532,"y":1212,"w":89,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":542,"y":687,"w":55,"h":65}, + "spriteSourceSize": {"x":583,"y":374,"w":89,"h":56}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenElbowLeftYoked.png": +"Models/Cuffs/ElbowLeftWristtie.png": { - "frame": {"x":3,"y":655,"w":46,"h":62}, + "frame": {"x":709,"y":588,"w":65,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":791,"y":486,"w":46,"h":62}, + "spriteSourceSize": {"x":671,"y":599,"w":65,"h":56}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenThighLeftClosed.png": +"Models/Cuffs/ElbowLeftYoked.png": { - "frame": {"x":954,"y":760,"w":59,"h":69}, + "frame": {"x":1429,"y":1839,"w":69,"h":91}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":641,"y":1032,"w":59,"h":69}, + "spriteSourceSize": {"x":764,"y":509,"w":69,"h":91}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenThighRightKneel.png": +"Models/Cuffs/ElbowRightUp.png": { - "frame": {"x":3,"y":793,"w":52,"h":69}, + "frame": {"x":1928,"y":1738,"w":111,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":375,"y":814,"w":52,"h":69}, + "spriteSourceSize": {"x":445,"y":252,"w":111,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenThighRightKneelClosed.png": +"Models/Cuffs/ElbowRightYoked.png": { - "frame": {"x":3,"y":793,"w":52,"h":69}, + "frame": {"x":1502,"y":1839,"w":55,"h":91}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":375,"y":814,"w":52,"h":69}, + "spriteSourceSize": {"x":398,"y":520,"w":55,"h":91}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenWristLeftFree.png": +"Models/Cuffs/SteelCollar.png": { - "frame": {"x":369,"y":477,"w":41,"h":58}, + "frame": {"x":397,"y":611,"w":97,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":822,"y":728,"w":41,"h":58}, + "spriteSourceSize": {"x":577,"y":392,"w":97,"h":33}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenWristLeftFront.png": +"Models/Cuffs/ThighLeftClosed.png": { - "frame": {"x":983,"y":238,"w":37,"h":55}, + "frame": {"x":1818,"y":1358,"w":143,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":659,"y":532,"w":37,"h":55}, + "spriteSourceSize": {"x":575,"y":1031,"w":143,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ScreenWristRightFront.png": +"Models/Cuffs/ThighLeftKneel.png": { - "frame": {"x":982,"y":39,"w":37,"h":54}, + "frame": {"x":1055,"y":530,"w":185,"h":114}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":467,"y":530,"w":37,"h":54}, + "spriteSourceSize": {"x":470,"y":848,"w":185,"h":114}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ThighRightClosed.png": +"Models/Cuffs/ThighLeftKneelClosed.png": { - "frame": {"x":256,"y":954,"w":127,"h":87}, + "frame": {"x":780,"y":388,"w":184,"h":147}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":463,"y":1002,"w":127,"h":87}, + "spriteSourceSize": {"x":470,"y":848,"w":184,"h":147}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/WristLeftFree.png": +"Models/Cuffs/ThighLeftSpread.png": { - "frame": {"x":125,"y":728,"w":64,"h":64}, + "frame": {"x":976,"y":952,"w":141,"h":90}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":797,"y":745,"w":64,"h":64}, + "spriteSourceSize": {"x":619,"y":1004,"w":141,"h":90}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/WristLeftFront.png": +"Models/Cuffs/ThighRightKneel.png": { - "frame": {"x":141,"y":662,"w":70,"h":62}, + "frame": {"x":1668,"y":1397,"w":143,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":620,"y":538,"w":70,"h":62}, + "spriteSourceSize": {"x":368,"y":831,"w":143,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/WristLeftYoked.png": +"Models/Cuffs/ThighRightKneelClosed.png": { - "frame": {"x":590,"y":547,"w":65,"h":59}, + "frame": {"x":1668,"y":1397,"w":143,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":870,"y":385,"w":65,"h":59}, + "spriteSourceSize": {"x":368,"y":831,"w":143,"h":61}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/WristRightYoked.png": +"Models/Cuffs/ThighRightSpread.png": { - "frame": {"x":739,"y":489,"w":64,"h":57}, + "frame": {"x":1284,"y":1764,"w":134,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":310,"y":390,"w":64,"h":57}, + "spriteSourceSize": {"x":456,"y":1020,"w":134,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberHeels/GlowBalletRightKneel.png": +"Models/Cuffs/WristRightFree.png": { - "frame": {"x":847,"y":445,"w":55,"h":54}, + "frame": {"x":1722,"y":1975,"w":54,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":335,"y":870,"w":55,"h":54}, + "spriteSourceSize": {"x":355,"y":602,"w":54,"h":70}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberLink/GlowThighLinkSpreadHigh.png": +"Models/Cuffs/WristRightFront.png": { - "frame": {"x":681,"y":817,"w":54,"h":76}, + "frame": {"x":569,"y":588,"w":67,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":571,"y":980,"w":54,"h":76}, + "spriteSourceSize": {"x":473,"y":541,"w":67,"h":56}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CapLongMittenRightBoxtie.png": +"Models/CyberArms/CuffForeLongMittenLeftFront.png": { - "frame": {"x":373,"y":422,"w":49,"h":51}, + "frame": {"x":1733,"y":1515,"w":76,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":680,"y":677,"w":49,"h":51}, + "spriteSourceSize": {"x":623,"y":537,"w":76,"h":57}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CuffForeLongMittenLeftFront.png": +"Models/CyberArms/CuffLongMittenRightUp.png": { - "frame": {"x":289,"y":476,"w":76,"h":57}, + "frame": {"x":1495,"y":328,"w":110,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":623,"y":537,"w":76,"h":57}, + "spriteSourceSize": {"x":458,"y":357,"w":110,"h":52}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CuffForeLongMittenRightFront.png": +"Models/CyberArms/CuffLongMittenRightYoked.png": { - "frame": {"x":758,"y":693,"w":75,"h":62}, + "frame": {"x":877,"y":800,"w":172,"h":148}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":469,"y":524,"w":75,"h":62}, + "spriteSourceSize": {"x":312,"y":393,"w":172,"h":148}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CuffLongMittenLeftBoxtie.png": +"Models/CyberArms/GlowLongMittenRightCrossed.png": { - "frame": {"x":768,"y":431,"w":75,"h":54}, + "frame": {"x":1992,"y":1001,"w":52,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":700,"y":503,"w":75,"h":54}, + "spriteSourceSize": {"x":413,"y":496,"w":52,"h":83}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/CuffLongMittenRightYoked.png": +"Models/CyberArms/LongMittenLeftFront.png": { - "frame": {"x":961,"y":504,"w":60,"h":58}, + "frame": {"x":189,"y":856,"w":132,"h":187}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":312,"y":393,"w":60,"h":58}, + "spriteSourceSize": {"x":637,"y":534,"w":132,"h":187}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/StrapsLongMittenLeftYoked.png": +"Models/CyberArms/LongMittenRightCrossed.png": { - "frame": {"x":74,"y":946,"w":106,"h":85}, + "frame": {"x":3,"y":1879,"w":122,"h":165}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":781,"y":526,"w":106,"h":85}, + "spriteSourceSize": {"x":430,"y":520,"w":122,"h":165}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperCuffLongMittenLeftBoxtie.png": +"Models/CyberArms/StrapsForeLongMittenRightFront.png": { - "frame": {"x":768,"y":431,"w":75,"h":54}, + "frame": {"x":1608,"y":621,"w":72,"h":77}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":700,"y":503,"w":75,"h":54}, + "spriteSourceSize": {"x":421,"y":637,"w":72,"h":77}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperCuffLongMittenLeftCrossed.png": +"Models/CyberArms/StrapsLongMittenLeftCrossed.png": { - "frame": {"x":105,"y":535,"w":83,"h":58}, + "frame": {"x":723,"y":1662,"w":140,"h":126}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":693,"y":510,"w":83,"h":58}, + "spriteSourceSize": {"x":622,"y":586,"w":140,"h":126}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperCuffLongMittenLeftUp.png": +"Models/CyberArms/StrapsLongMittenLeftFree.png": { - "frame": {"x":286,"y":664,"w":110,"h":62}, + "frame": {"x":1044,"y":189,"w":86,"h":139}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":690,"y":360,"w":110,"h":62}, + "spriteSourceSize": {"x":701,"y":593,"w":86,"h":139}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperCuffLongMittenRightUp.png": +"Models/CyberArms/StrapsLongMittenLeftUp.png": { - "frame": {"x":537,"y":427,"w":110,"h":52}, + "frame": {"x":1121,"y":1194,"w":94,"h":79}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":458,"y":357,"w":110,"h":52}, + "spriteSourceSize": {"x":739,"y":176,"w":94,"h":79}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperCuffLongMittenRightYoked.png": +"Models/CyberArms/StrapsLongMittenLeftYoked.png": { - "frame": {"x":567,"y":741,"w":52,"h":68}, + "frame": {"x":1622,"y":1596,"w":106,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":432,"y":473,"w":52,"h":68}, + "spriteSourceSize": {"x":781,"y":526,"w":106,"h":85}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperGlowLongMittenRightCrossed.png": +"Models/CyberArms/StrapsLongMittenRightUp.png": { - "frame": {"x":960,"y":833,"w":52,"h":83}, + "frame": {"x":1121,"y":1019,"w":94,"h":87}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":413,"y":496,"w":52,"h":83}, + "spriteSourceSize": {"x":454,"y":182,"w":94,"h":87}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/LockBeltHighlight.png": +"Models/CyberCuffs/AnkleLeftKneelClosed.png": { - "frame": {"x":720,"y":3,"w":56,"h":31}, + "frame": {"x":1780,"y":1976,"w":54,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":541,"y":816,"w":56,"h":31}, + "spriteSourceSize": {"x":709,"y":938,"w":54,"h":68}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/LockBeltPlate.png": +"Models/CyberCuffs/DisplayThighLeftClosed.png": { - "frame": {"x":353,"y":879,"w":68,"h":71}, + "frame": {"x":1303,"y":329,"w":44,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":538,"y":770,"w":68,"h":71}, + "spriteSourceSize": {"x":649,"y":1040,"w":44,"h":53}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleLeftClosed.png": +"Models/CyberCuffs/DisplayThighRightSpread.png": { - "frame": {"x":748,"y":759,"w":93,"h":68}, + "frame": {"x":646,"y":1437,"w":43,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":582,"y":1416,"w":93,"h":68}, + "spriteSourceSize": {"x":476,"y":1006,"w":43,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleLeftLockKneel.png": +"Models/CyberCuffs/ElbowLeftWristtie.png": { - "frame": {"x":444,"y":372,"w":59,"h":49}, + "frame": {"x":1034,"y":1784,"w":60,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":719,"y":946,"w":59,"h":49}, + "spriteSourceSize": {"x":682,"y":604,"w":60,"h":52}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/BeltLock.png": +"Models/CyberCuffs/ScreenThighRightClosed.png": { - "frame": {"x":3,"y":942,"w":67,"h":85}, + "frame": {"x":1605,"y":1934,"w":55,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":535,"y":693,"w":67,"h":85}, + "spriteSourceSize": {"x":474,"y":1020,"w":55,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/BeltLockBand.png": +"Models/CyberCuffs/ThighLeftClosed.png": { - "frame": {"x":720,"y":3,"w":56,"h":31}, + "frame": {"x":1260,"y":640,"w":143,"h":87}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":538,"y":730,"w":56,"h":31}, + "spriteSourceSize": {"x":577,"y":1011,"w":143,"h":87}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftBoxtie.png": +"Models/CyberCuffs/ThighLeftSpread.png": { - "frame": {"x":414,"y":481,"w":84,"h":57}, + "frame": {"x":1827,"y":1051,"w":156,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":693,"y":570,"w":84,"h":57}, + "spriteSourceSize": {"x":607,"y":977,"w":156,"h":88}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftDecoCleanBoxtie.png": +"Models/CyberCuffs/ThighRightSpread.png": { - "frame": {"x":236,"y":3,"w":82,"h":30}, + "frame": {"x":1684,"y":469,"w":150,"h":82}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":694,"y":596,"w":82,"h":30}, + "spriteSourceSize": {"x":446,"y":981,"w":150,"h":82}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftDecoCleanUp.png": +"Models/CyberHeels/GlowBalletLeftClosed.png": { - "frame": {"x":480,"y":544,"w":106,"h":59}, + "frame": {"x":3,"y":656,"w":41,"h":213}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":721,"y":244,"w":106,"h":59}, + "spriteSourceSize": {"x":642,"y":1418,"w":41,"h":213}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftDecoFront.png": +"Models/CyberHeels/GlowBalletLeftSpread.png": { - "frame": {"x":377,"y":266,"w":80,"h":47}, + "frame": {"x":3,"y":656,"w":41,"h":213}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":683,"y":603,"w":80,"h":47}, + "spriteSourceSize": {"x":725,"y":1431,"w":41,"h":213}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftDecoUp.png": +"Models/CyberHeels/GlowBalletRightClosed.png": { - "frame": {"x":182,"y":599,"w":106,"h":59}, + "frame": {"x":3,"y":873,"w":41,"h":213}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":721,"y":244,"w":106,"h":59}, + "spriteSourceSize": {"x":580,"y":1415,"w":41,"h":213}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftDecoWristtie.png": +"Models/CyberLink/GlowAnkleLinkSpread.png": { - "frame": {"x":461,"y":269,"w":80,"h":47}, + "frame": {"x":1684,"y":555,"w":150,"h":45}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":652,"y":613,"w":80,"h":47}, + "spriteSourceSize": {"x":547,"y":1436,"w":150,"h":45}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighLeftDecoClosed.png": +"Models/CyberLink/GlowThighLinkSpread.png": { - "frame": {"x":138,"y":3,"w":94,"h":30}, + "frame": {"x":1684,"y":604,"w":150,"h":45}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":620,"y":1057,"w":94,"h":30}, + "spriteSourceSize": {"x":527,"y":1026,"w":150,"h":45}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighLeftLockPlateKneel.png": +"Models/CyberLink/GlowThighLinkSpreadHigh.png": { - "frame": {"x":745,"y":272,"w":55,"h":47}, + "frame": {"x":1664,"y":1852,"w":54,"h":76}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":520,"y":839,"w":55,"h":47}, + "spriteSourceSize": {"x":571,"y":980,"w":54,"h":76}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighLeftLockPlateKneelClosed.png": +"Models/CyberMitts/ArmLongMittenLeftFront.png": { - "frame": {"x":745,"y":272,"w":55,"h":47}, + "frame": {"x":189,"y":856,"w":132,"h":187}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":520,"y":839,"w":55,"h":47}, + "spriteSourceSize": {"x":637,"y":534,"w":132,"h":187}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighRightClosed.png": +"Models/CyberMitts/ArmLongMittenRightCrossed.png": { - "frame": {"x":476,"y":607,"w":105,"h":61}, + "frame": {"x":3,"y":1879,"w":122,"h":165}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":472,"y":1026,"w":105,"h":61}, + "spriteSourceSize": {"x":430,"y":520,"w":122,"h":165}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighRightLockPlateClosed.png": +"Models/CyberMitts/CapForeLongMittenLeftFront.png": { - "frame": {"x":3,"y":726,"w":65,"h":63}, + "frame": {"x":1961,"y":1484,"w":84,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":490,"y":1034,"w":65,"h":63}, + "spriteSourceSize": {"x":570,"y":457,"w":84,"h":72}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ThighRightLockPlateSpread.png": +"Models/CyberMitts/CapForeLongMittenRightFront.png": { - "frame": {"x":321,"y":730,"w":67,"h":65}, + "frame": {"x":1732,"y":1629,"w":75,"h":74}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":475,"y":1031,"w":67,"h":65}, + "spriteSourceSize": {"x":513,"y":449,"w":75,"h":74}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristLeftDecoFree.png": +"Models/CyberMitts/CuffForeLongMittenLeftFront.png": { - "frame": {"x":656,"y":3,"w":60,"h":31}, + "frame": {"x":1733,"y":1515,"w":76,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":800,"y":766,"w":60,"h":31}, + "spriteSourceSize": {"x":623,"y":537,"w":76,"h":57}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristLeftDecoFront.png": +"Models/CyberMitts/CuffLongMittenRightYoked.png": { - "frame": {"x":3,"y":73,"w":60,"h":40}, + "frame": {"x":1532,"y":1750,"w":60,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":628,"y":549,"w":60,"h":40}, + "spriteSourceSize": {"x":312,"y":393,"w":60,"h":58}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristLeftFront.png": +"Models/CyberMitts/GlowLongMittenLeftFree.png": { - "frame": {"x":215,"y":662,"w":67,"h":62}, + "frame": {"x":1726,"y":1707,"w":80,"h":80}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":621,"y":537,"w":67,"h":62}, + "spriteSourceSize": {"x":809,"y":725,"w":80,"h":80}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristLeftYoked.png": +"Models/CyberMitts/LongMittenLeftFront.png": { - "frame": {"x":603,"y":322,"w":66,"h":48}, + "frame": {"x":189,"y":856,"w":132,"h":187}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":870,"y":388,"w":66,"h":48}, + "spriteSourceSize": {"x":637,"y":534,"w":132,"h":187}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristRightDecoCleanFront.png": +"Models/CyberMitts/LongMittenRightCrossed.png": { - "frame": {"x":558,"y":37,"w":59,"h":39}, + "frame": {"x":3,"y":1879,"w":122,"h":165}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":479,"y":544,"w":59,"h":39}, + "spriteSourceSize": {"x":430,"y":520,"w":122,"h":165}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristRightYoked.png": +"Models/CyberMitts/MittenRightYoked.png": { - "frame": {"x":868,"y":339,"w":64,"h":48}, + "frame": {"x":1295,"y":1659,"w":85,"h":99}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":308,"y":388,"w":64,"h":48}, + "spriteSourceSize": {"x":292,"y":311,"w":85,"h":99}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineGag/Ball.png": +"Models/CyberMitts/StrapsForeLongMittenRightFront.png": { - "frame": {"x":807,"y":503,"w":62,"h":57}, + "frame": {"x":1608,"y":621,"w":72,"h":77}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":576,"y":330,"w":62,"h":57}, + "spriteSourceSize": {"x":421,"y":637,"w":72,"h":77}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MonocleLensRight.png": +"Models/CyberMitts/StrapsLongMittenLeftCrossed.png": { - "frame": {"x":341,"y":539,"w":64,"h":58}, + "frame": {"x":723,"y":1662,"w":140,"h":126}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":519,"y":273,"w":64,"h":58}, + "spriteSourceSize": {"x":622,"y":586,"w":140,"h":126}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ears/ElfBack.png": +"Models/CyberMitts/StrapsLongMittenLeftFree.png": { - "frame": {"x":457,"y":672,"w":106,"h":62}, + "frame": {"x":1044,"y":189,"w":86,"h":139}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":454,"y":274,"w":106,"h":62}, + "spriteSourceSize": {"x":701,"y":593,"w":86,"h":139}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ears/ElfFloppyBack.png": +"Models/CyberMitts/StrapsLongMittenLeftUp.png": { - "frame": {"x":266,"y":266,"w":107,"h":47}, + "frame": {"x":1121,"y":1194,"w":94,"h":79}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":459,"y":293,"w":107,"h":47}, + "spriteSourceSize": {"x":739,"y":176,"w":94,"h":79}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ears/ElfLongBack.png": +"Models/CyberMitts/StrapsLongMittenLeftYoked.png": { - "frame": {"x":623,"y":745,"w":121,"h":68}, + "frame": {"x":1622,"y":1596,"w":106,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":439,"y":269,"w":121,"h":68}, + "spriteSourceSize": {"x":781,"y":526,"w":106,"h":85}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/BandLeftUp.png": +"Models/CyberMitts/StrapsLongMittenRightUp.png": { - "frame": {"x":844,"y":907,"w":110,"h":85}, + "frame": {"x":1121,"y":1019,"w":94,"h":87}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":684,"y":350,"w":110,"h":85}, + "spriteSourceSize": {"x":454,"y":182,"w":94,"h":87}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/CircletGem.png": +"Models/CyberMitts/UpperCuffLongMittenRightUp.png": { - "frame": {"x":345,"y":79,"w":43,"h":40}, + "frame": {"x":1495,"y":328,"w":110,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":560,"y":169,"w":43,"h":40}, + "spriteSourceSize": {"x":458,"y":357,"w":110,"h":52}, "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesDai1/Brows2Angry.png": +"Models/CyberMitts/UpperCuffLongMittenRightYoked.png": { - "frame": {"x":621,"y":38,"w":59,"h":39}, + "frame": {"x":1838,"y":1976,"w":52,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":588,"y":241,"w":59,"h":39}, - "sourceSize": {"w":703,"h":355} + "spriteSourceSize": {"x":432,"y":473,"w":52,"h":68}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK2/WhitesEyesNeutral.png": +"Models/CyberMitts/UpperGlowLongMittenLeftFree.png": { - "frame": {"x":800,"y":175,"w":62,"h":44}, + "frame": {"x":1965,"y":1393,"w":80,"h":87}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":517,"y":269,"w":62,"h":44}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":733,"y":485,"w":80,"h":87}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK3/Eyes2Closed.png": +"Models/CyberMitts/UpperGlowLongMittenRightCrossed.png": { - "frame": {"x":202,"y":37,"w":52,"h":32}, + "frame": {"x":1992,"y":1001,"w":52,"h":83}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":624,"y":273,"w":52,"h":32}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":413,"y":496,"w":52,"h":83}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK3/Eyes2Neutral.png": +"Models/CyberPetsuit/DisplayLegsKneel.png": { - "frame": {"x":592,"y":172,"w":64,"h":44}, + "frame": {"x":1115,"y":3,"w":158,"h":138}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":616,"y":260,"w":64,"h":44}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":371,"y":761,"w":158,"h":138}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK3/EyesSurprised.png": +"Models/CyberPetsuit/DisplayLegsKneelClosed.png": { - "frame": {"x":463,"y":218,"w":48,"h":46}, + "frame": {"x":1115,"y":3,"w":158,"h":138}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":530,"y":267,"w":48,"h":46}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":371,"y":761,"w":158,"h":138}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK3/WhitesEyes2Closed.png": +"Models/DivineBelt/BeltMetal2.png": { - "frame": {"x":202,"y":37,"w":52,"h":32}, + "frame": {"x":1376,"y":1839,"w":49,"h":92}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":624,"y":273,"w":52,"h":32}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":556,"y":829,"w":49,"h":92}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK3/WhitesEyes2Neutral.png": +"Models/DivineBelt/BeltMetalRunic2.png": { - "frame": {"x":732,"y":175,"w":64,"h":44}, + "frame": {"x":1464,"y":1657,"w":49,"h":92}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":616,"y":260,"w":64,"h":44}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":556,"y":829,"w":49,"h":92}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK3/WhitesEyes2Surprised.png": +"Models/DivineBelt/LockBeltLines.png": { - "frame": {"x":3,"y":258,"w":64,"h":46}, + "frame": {"x":1609,"y":326,"w":71,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":616,"y":258,"w":64,"h":46}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":537,"y":769,"w":71,"h":95}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK3/WhitesEyesSurprised.png": +"Models/DivineBelt/LockBraPlate.png": { - "frame": {"x":71,"y":258,"w":48,"h":46}, + "frame": {"x":48,"y":656,"w":79,"h":208}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":530,"y":267,"w":48,"h":46}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":536,"y":434,"w":79,"h":208}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK4/Eyes2Dazed.png": +"Models/DivineCuffs/AnkleLeftClosed.png": { - "frame": {"x":520,"y":172,"w":68,"h":44}, + "frame": {"x":786,"y":1976,"w":93,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":614,"y":264,"w":68,"h":44}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":582,"y":1416,"w":93,"h":68}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK4/EyesDazed.png": +"Models/DivineCuffs/Collar.png": { - "frame": {"x":507,"y":372,"w":54,"h":49}, + "frame": {"x":1952,"y":1560,"w":93,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":522,"y":268,"w":54,"h":49}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":582,"y":362,"w":93,"h":65}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK4/WhitesEyes2Dazed.png": +"Models/DivineCuffs/ElbowLeftBoxtie.png": { - "frame": {"x":660,"y":174,"w":68,"h":44}, + "frame": {"x":1722,"y":1853,"w":84,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":614,"y":264,"w":68,"h":44}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":693,"y":570,"w":84,"h":57}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK4/WhitesEyesDazed.png": +"Models/DivineCuffs/ElbowLeftDecoCleanUp.png": { - "frame": {"x":565,"y":374,"w":54,"h":49}, + "frame": {"x":1810,"y":1913,"w":106,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":522,"y":268,"w":54,"h":49}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":721,"y":244,"w":106,"h":59}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceDask/Eyes2Dazed.png": +"Models/DivineCuffs/ElbowLeftDecoCleanWristtie.png": { - "frame": {"x":392,"y":79,"w":70,"h":41}, + "frame": {"x":1664,"y":2006,"w":51,"h":31}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":147,"y":168,"w":70,"h":41}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":681,"y":629,"w":51,"h":31}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceDask/Eyes2Surprised.png": +"Models/DivineCuffs/ElbowLeftDecoCleanYoked.png": { - "frame": {"x":545,"y":269,"w":70,"h":47}, + "frame": {"x":1657,"y":1517,"w":72,"h":75}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":146,"y":160,"w":70,"h":47}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":764,"y":523,"w":72,"h":75}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceDask/EyesAngry.png": +"Models/DivineCuffs/ElbowLeftYoked.png": { - "frame": {"x":291,"y":170,"w":54,"h":43}, + "frame": {"x":1157,"y":1462,"w":75,"h":93}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":51,"y":173,"w":54,"h":43}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":760,"y":513,"w":75,"h":93}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceDask/WhitesEyes2Dazed.png": +"Models/DivineCuffs/ElbowRightUp.png": { - "frame": {"x":908,"y":39,"w":70,"h":40}, + "frame": {"x":758,"y":966,"w":113,"h":76}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":147,"y":168,"w":70,"h":40}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":448,"y":260,"w":113,"h":76}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceDask/WhitesEyes2Surprised.png": +"Models/DivineCuffs/ElbowRightYoked.png": { - "frame": {"x":3,"y":308,"w":70,"h":48}, + "frame": {"x":1531,"y":1934,"w":70,"h":90}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":146,"y":160,"w":70,"h":48}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":393,"y":515,"w":70,"h":90}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceDask/WhitesEyesAngry.png": +"Models/DivineCuffs/SteelCollar.png": { - "frame": {"x":349,"y":170,"w":53,"h":43}, + "frame": {"x":397,"y":611,"w":97,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":51,"y":173,"w":53,"h":43}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":577,"y":392,"w":97,"h":33}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceDask/WhitesEyesDazed.png": +"Models/DivineCuffs/ThighLeftClosed.png": { - "frame": {"x":966,"y":143,"w":50,"h":43}, + "frame": {"x":1681,"y":889,"w":148,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":54,"y":173,"w":50,"h":43}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":567,"y":1027,"w":148,"h":61}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceDask/WhitesEyesNeutral.png": +"Models/DivineCuffs/ThighLeftDecoCleanKneel.png": { - "frame": {"x":405,"y":317,"w":52,"h":48}, + "frame": {"x":1836,"y":745,"w":164,"h":123}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":52,"y":168,"w":52,"h":48}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":482,"y":864,"w":164,"h":123}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceDask/WhitesEyesSurprised.png": +"Models/DivineCuffs/ThighLeftDecoCleanKneelClosed.png": { - "frame": {"x":743,"y":323,"w":52,"h":48}, + "frame": {"x":1836,"y":745,"w":164,"h":123}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":52,"y":168,"w":52,"h":48}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":482,"y":864,"w":164,"h":123}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKjus/Eyes2Dazed.png": +"Models/DivineCuffs/ThighLeftDecoKneel.png": { - "frame": {"x":72,"y":37,"w":61,"h":32}, + "frame": {"x":1513,"y":787,"w":164,"h":123}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":618,"y":272,"w":61,"h":32}, - "sourceSize": {"w":753,"h":414} + "spriteSourceSize": {"x":482,"y":864,"w":164,"h":123}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKjus/Eyes2Surprised.png": +"Models/DivineCuffs/ThighLeftDecoKneelClosed.png": { - "frame": {"x":906,"y":83,"w":61,"h":42}, + "frame": {"x":1513,"y":787,"w":164,"h":123}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":617,"y":263,"w":61,"h":42}, - "sourceSize": {"w":791,"h":501} + "spriteSourceSize": {"x":482,"y":864,"w":164,"h":123}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKjus/EyesDazed.png": +"Models/DivineCuffs/ThighRightClosed.png": { - "frame": {"x":684,"y":38,"w":59,"h":39}, + "frame": {"x":1302,"y":1592,"w":105,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":521,"y":275,"w":59,"h":39}, - "sourceSize": {"w":725,"h":425} + "spriteSourceSize": {"x":472,"y":1026,"w":105,"h":61}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKjus/EyesSurprised.png": +"Models/DivineCuffs/ThighRightDecoCleanClosed.png": { - "frame": {"x":406,"y":170,"w":53,"h":43}, + "frame": {"x":1951,"y":1629,"w":94,"h":31}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":527,"y":270,"w":53,"h":43}, - "sourceSize": {"w":791,"h":501} + "spriteSourceSize": {"x":473,"y":1055,"w":94,"h":31}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKjus/WhitesEyes2Dazed.png": +"Models/DivineCuffs/ThighRightDecoCleanKneel.png": { - "frame": {"x":137,"y":37,"w":61,"h":32}, + "frame": {"x":1813,"y":1533,"w":135,"h":45}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":618,"y":272,"w":61,"h":32}, - "sourceSize": {"w":753,"h":414} + "spriteSourceSize": {"x":369,"y":854,"w":135,"h":45}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKjus/WhitesEyes2Surprised.png": +"Models/DivineCuffs/ThighRightDecoCleanKneelClosed.png": { - "frame": {"x":3,"y":117,"w":61,"h":42}, + "frame": {"x":1813,"y":1533,"w":135,"h":45}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":617,"y":263,"w":61,"h":42}, - "sourceSize": {"w":791,"h":501} + "spriteSourceSize": {"x":369,"y":854,"w":135,"h":45}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKjus/WhitesEyesDazed.png": +"Models/DivineCuffs/ThighRightLockClosed.png": { - "frame": {"x":747,"y":39,"w":59,"h":39}, + "frame": {"x":1271,"y":1943,"w":70,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":521,"y":275,"w":59,"h":39}, - "sourceSize": {"w":725,"h":425} + "spriteSourceSize": {"x":486,"y":1033,"w":70,"h":95}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKjus/WhitesEyesNeutral.png": +"Models/DivineCuffs/WristLeftDecoCleanYoked.png": { - "frame": {"x":407,"y":217,"w":52,"h":45}, + "frame": {"x":680,"y":153,"w":61,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":528,"y":269,"w":52,"h":45}, - "sourceSize": {"w":745,"h":461} + "spriteSourceSize": {"x":873,"y":403,"w":61,"h":33}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKjus/WhitesEyesSurprised.png": +"Models/DivineCuffs/WristLeftDecoYoked.png": { - "frame": {"x":463,"y":171,"w":53,"h":43}, + "frame": {"x":745,"y":153,"w":61,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":527,"y":270,"w":53,"h":43}, - "sourceSize": {"w":791,"h":501} + "spriteSourceSize": {"x":873,"y":403,"w":61,"h":33}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/Eyes2Angry.png": +"Models/DivineCuffs/WristRightFront.png": { - "frame": {"x":719,"y":223,"w":62,"h":45}, + "frame": {"x":697,"y":1046,"w":176,"h":153}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":369,"y":431,"w":176,"h":153}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/Eyes2Closed.png": +"Models/DivineCuffs/WristRightLockCrossed.png": { - "frame": {"x":780,"y":3,"w":65,"h":32}, + "frame": {"x":432,"y":1005,"w":56,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":146,"y":159,"w":65,"h":32}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":641,"y":600,"w":56,"h":35}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/Eyes2Dazed.png": +"Models/Dress/BlouseForeArmRightFront.png": { - "frame": {"x":866,"y":176,"w":62,"h":44}, + "frame": {"x":265,"y":212,"w":154,"h":197}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":147,"y":159,"w":62,"h":44}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":409,"y":523,"w":154,"h":197}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/Eyes2Surprised.png": +"Models/Dress/Glasses.png": { - "frame": {"x":135,"y":210,"w":64,"h":45}, + "frame": {"x":1219,"y":880,"w":164,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":516,"y":264,"w":164,"h":71}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/EyesAngry.png": +"Models/Dress/MageCollarHardware.png": { - "frame": {"x":807,"y":82,"w":50,"h":42}, + "frame": {"x":1409,"y":584,"w":100,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":573,"y":408,"w":100,"h":40}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/EyesDazed.png": +"Models/Dress/MonocleRight.png": { - "frame": {"x":67,"y":73,"w":52,"h":40}, + "frame": {"x":1209,"y":1769,"w":71,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":52,"h":40}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":516,"y":269,"w":71,"h":66}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/EyesNeutral.png": +"Models/Dress/ShoeLeftClosed.png": { - "frame": {"x":754,"y":82,"w":49,"h":42}, + "frame": {"x":1671,"y":1227,"w":146,"h":101}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":522,"y":1526,"w":146,"h":101}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/EyesSurprised.png": +"Models/Ears/ElfFloppyBack.png": { - "frame": {"x":343,"y":124,"w":49,"h":42}, + "frame": {"x":393,"y":1445,"w":107,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":459,"y":293,"w":107,"h":47}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/HumanEyes2Angry.png": +"Models/Elf/BandLeftUp.png": { - "frame": {"x":785,"y":223,"w":62,"h":45}, + "frame": {"x":1810,"y":1746,"w":110,"h":85}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":684,"y":350,"w":110,"h":85}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/HumanEyes2Closed.png": +"Models/Elf/ShoeLeftHogtie.png": { - "frame": {"x":849,"y":3,"w":65,"h":32}, + "frame": {"x":1164,"y":388,"w":50,"h":138}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":146,"y":159,"w":65,"h":32}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":729,"y":794,"w":50,"h":138}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/HumanEyes2Dazed.png": +"Models/Elf/ShoeLeftKneel.png": { - "frame": {"x":932,"y":190,"w":62,"h":44}, + "frame": {"x":778,"y":540,"w":184,"h":104}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":147,"y":159,"w":62,"h":44}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":719,"y":920,"w":184,"h":104}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/HumanEyes2Neutral.png": +"Models/Elf/ShoeLeftSpread.png": { - "frame": {"x":203,"y":216,"w":64,"h":45}, + "frame": {"x":177,"y":1079,"w":108,"h":189}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":642,"y":1452,"w":108,"h":189}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/HumanEyes2Surprised.png": +"Models/Elf/SkirtBand.png": { - "frame": {"x":271,"y":217,"w":64,"h":45}, + "frame": {"x":1923,"y":1896,"w":108,"h":50}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":639,"y":781,"w":108,"h":50}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/HumanEyesAngry.png": +"Models/Elf/SkirtBandKneel.png": { - "frame": {"x":971,"y":97,"w":50,"h":42}, + "frame": {"x":921,"y":1786,"w":109,"h":50}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":630,"y":742,"w":109,"h":50}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/HumanEyesDazed.png": +"Models/EyesDai1/Brows2Annoyed.png": { - "frame": {"x":123,"y":73,"w":52,"h":40}, + "frame": {"x":926,"y":150,"w":51,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":52,"h":40}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":603,"y":234,"w":51,"h":35}, + "sourceSize": {"w":717,"h":405} }, -"Models/FaceKoi/HumanEyesHeart.png": +"Models/EyesK2/Eyes2Surprised.png": { - "frame": {"x":396,"y":124,"w":49,"h":42}, + "frame": {"x":757,"y":342,"w":69,"h":42}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":614,"y":262,"w":69,"h":42}, + "sourceSize": {"w":781,"h":560} }, -"Models/FaceKoi/HumanEyesNeutral.png": +"Models/EyesK2/WhitesEyes2Surprised.png": { - "frame": {"x":449,"y":124,"w":49,"h":42}, + "frame": {"x":1308,"y":143,"w":69,"h":42}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":614,"y":262,"w":69,"h":42}, + "sourceSize": {"w":781,"h":560} }, -"Models/FaceKoi/HumanEyesSurprised.png": +"Models/EyesK3/Eyes2Dazed.png": { - "frame": {"x":502,"y":125,"w":49,"h":42}, + "frame": {"x":810,"y":153,"w":56,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":624,"y":271,"w":56,"h":33}, + "sourceSize": {"w":781,"h":560} }, -"Models/FaceKoi/WhitesEyes2Angry.png": +"Models/EyesK3/EyesAngry.png": { - "frame": {"x":851,"y":224,"w":62,"h":45}, + "frame": {"x":981,"y":150,"w":51,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":530,"y":278,"w":51,"h":35}, + "sourceSize": {"w":781,"h":560} }, -"Models/FaceKoi/WhitesEyes2Closed.png": +"Models/EyesK3/EyesDazed.png": { - "frame": {"x":918,"y":3,"w":65,"h":32}, + "frame": {"x":1236,"y":1521,"w":47,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":146,"y":159,"w":65,"h":32}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":530,"y":278,"w":47,"h":35}, + "sourceSize": {"w":781,"h":560} }, -"Models/FaceKoi/WhitesEyes2Dazed.png": +"Models/EyesK3/EyesSurprised.png": { - "frame": {"x":3,"y":210,"w":62,"h":44}, + "frame": {"x":830,"y":338,"w":48,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":147,"y":159,"w":62,"h":44}, - "sourceSize": {"w":321,"h":332} -}, -"Models/FaceKoi/WhitesEyes2Heart.png": + "spriteSourceSize": {"x":530,"y":267,"w":48,"h":46}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/WhitesEyes2Dazed.png": { - "frame": {"x":339,"y":217,"w":64,"h":45}, + "frame": {"x":1597,"y":1521,"w":56,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":624,"y":271,"w":56,"h":33}, + "sourceSize": {"w":781,"h":560} }, -"Models/FaceKoi/WhitesEyes2Neutral.png": +"Models/EyesK3/WhitesEyesAngry.png": { - "frame": {"x":515,"y":220,"w":64,"h":45}, + "frame": {"x":1036,"y":150,"w":51,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":530,"y":278,"w":51,"h":35}, + "sourceSize": {"w":781,"h":560} }, -"Models/FaceKoi/WhitesEyes2Surprised.png": +"Models/EyesK3/WhitesEyesDazed.png": { - "frame": {"x":339,"y":217,"w":64,"h":45}, + "frame": {"x":1287,"y":1521,"w":47,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":530,"y":278,"w":47,"h":35}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK3/WhitesEyesNeutral.png": +{ + "frame": {"x":1236,"y":1462,"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":882,"y":338,"w":48,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":267,"w":48,"h":46}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/WhitesEyes2Angry.png": +{ + "frame": {"x":1381,"y":143,"w":67,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":615,"y":266,"w":67,"h":42}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesKertasu/EyesWhitesBase.png": +{ + "frame": {"x":1219,"y":1200,"w":160,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":525,"y":240,"w":160,"h":84}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoi/WhitesEyesAngry.png": +"Models/FaceDask/WhitesEyes2Neutral.png": { - "frame": {"x":131,"y":117,"w":50,"h":42}, + "frame": {"x":289,"y":1220,"w":70,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, + "spriteSourceSize": {"x":145,"y":160,"w":70,"h":48}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoi/WhitesEyesDazed.png": +"Models/FaceDask/WhitesEyes2Surprised.png": { - "frame": {"x":179,"y":73,"w":52,"h":40}, + "frame": {"x":363,"y":1220,"w":70,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":52,"h":40}, + "spriteSourceSize": {"x":146,"y":160,"w":70,"h":48}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoi/WhitesEyesHeart.png": +"Models/FaceKjus/BlushMedium.png": +{ + "frame": {"x":1076,"y":332,"w":154,"h":52}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":530,"y":295,"w":154,"h":52}, + "sourceSize": {"w":744,"h":433} +}, +"Models/FaceKoi/BlushHigh.png": { - "frame": {"x":555,"y":126,"w":49,"h":42}, + "frame": {"x":1219,"y":955,"w":164,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "spriteSourceSize": {"x":49,"y":188,"w":164,"h":58}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoi/WhitesEyesNeutral.png": +"Models/FaceKoi/BlushLow.png": { - "frame": {"x":608,"y":126,"w":49,"h":42}, + "frame": {"x":1684,"y":189,"w":153,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "spriteSourceSize": {"x":56,"y":187,"w":153,"h":57}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoi/WhitesEyesSurprised.png": +"Models/FaceKoi/Eyes2Dazed.png": { - "frame": {"x":555,"y":126,"w":49,"h":42}, + "frame": {"x":723,"y":1792,"w":62,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":44}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/Eyes2Angry.png": +"Models/FaceKoi/HumanEyes2Dazed.png": { - "frame": {"x":917,"y":238,"w":62,"h":45}, + "frame": {"x":789,"y":1792,"w":62,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":44}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/Eyes2Closed.png": +"Models/FaceKoi/WhitesEyes2Closed.png": { - "frame": {"x":3,"y":37,"w":65,"h":32}, + "frame": {"x":1980,"y":1357,"w":65,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":146,"y":159,"w":65,"h":32}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/Eyes2Dazed.png": +"Models/FaceKoi/WhitesEyes2Dazed.png": { - "frame": {"x":69,"y":210,"w":62,"h":44}, + "frame": {"x":855,"y":1792,"w":62,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":147,"y":159,"w":62,"h":44}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/Eyes2Neutral.png": +"Models/FaceKoiBlank/WhitesEyes2Closed.png": { - "frame": {"x":583,"y":220,"w":64,"h":45}, + "frame": {"x":1980,"y":1357,"w":65,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "spriteSourceSize": {"x":146,"y":159,"w":65,"h":32}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/Eyes2Surprised.png": +"Models/FaceKoiBlank/WhitesEyes2Dazed.png": { - "frame": {"x":651,"y":222,"w":64,"h":45}, + "frame": {"x":855,"y":1792,"w":62,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":44}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/EyesAngry.png": +"Models/FutureHarness/MetalChest.png": { - "frame": {"x":235,"y":123,"w":50,"h":42}, + "frame": {"x":1987,"y":1088,"w":56,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":553,"y":481,"w":56,"h":66}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoiBlank/EyesDazed.png": +"Models/GagCloth/CleaveThick.png": { - "frame": {"x":235,"y":79,"w":52,"h":40}, + "frame": {"x":1146,"y":145,"w":158,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":52,"h":40}, + "spriteSourceSize": {"x":69,"y":236,"w":158,"h":40}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/EyesHeart.png": +"Models/GagFrilly/FrillyHardware.png": { - "frame": {"x":396,"y":124,"w":49,"h":42}, + "frame": {"x":246,"y":1879,"w":131,"h":164}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "spriteSourceSize": {"x":75,"y":102,"w":131,"h":164}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/EyesNeutral.png": +"Models/GagLatex/Harness.png": { - "frame": {"x":661,"y":127,"w":49,"h":42}, + "frame": {"x":67,"y":439,"w":60,"h":208}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "spriteSourceSize": {"x":101,"y":9,"w":60,"h":208}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/EyesSurprised.png": +"Models/GagLatex/NeckCorsetGag2.png": { - "frame": {"x":714,"y":128,"w":49,"h":42}, + "frame": {"x":1676,"y":1015,"w":147,"h":89}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":537,"y":306,"w":147,"h":89}, + "sourceSize": {"w":784,"h":486} }, -"Models/FaceKoiBlank/WhitesEyes2Angry.png": +"Models/GagLatex/OTNFlat.png": { - "frame": {"x":851,"y":224,"w":62,"h":45}, + "frame": {"x":1833,"y":872,"w":160,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, + "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/WhitesEyes2Closed.png": +"Models/GagLeather/FabricMuzzle.png": { - "frame": {"x":918,"y":3,"w":65,"h":32}, + "frame": {"x":1513,"y":914,"w":160,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":146,"y":159,"w":65,"h":32}, + "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/WhitesEyes2Dazed.png": +"Models/GagLeather/GagNecklace.png": { - "frame": {"x":3,"y":210,"w":62,"h":44}, + "frame": {"x":1138,"y":1962,"w":129,"h":82}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":147,"y":159,"w":62,"h":44}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":551,"y":392,"w":129,"h":82}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/FaceKoiBlank/WhitesEyes2Heart.png": +"Models/GagLeather/Muzzle.png": { - "frame": {"x":339,"y":217,"w":64,"h":45}, + "frame": {"x":1684,"y":378,"w":150,"h":87}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "spriteSourceSize": {"x":65,"y":207,"w":150,"h":87}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/WhitesEyes2Neutral.png": +"Models/GagLeather/MuzzleSideStrap.png": { - "frame": {"x":515,"y":220,"w":64,"h":45}, + "frame": {"x":284,"y":1272,"w":50,"h":181}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "spriteSourceSize": {"x":191,"y":46,"w":50,"h":181}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/WhitesEyes2Surprised.png": +"Models/GagLeather/Panel.png": { - "frame": {"x":339,"y":217,"w":64,"h":45}, + "frame": {"x":48,"y":868,"w":137,"h":207}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "spriteSourceSize": {"x":39,"y":74,"w":137,"h":207}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/WhitesEyesAngry.png": +"Models/GagMetal/HarnessMaskDisplay.png": { - "frame": {"x":131,"y":117,"w":50,"h":42}, + "frame": {"x":1207,"y":1398,"w":76,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":50,"h":42}, + "spriteSourceSize": {"x":96,"y":225,"w":76,"h":60}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/WhitesEyesDazed.png": +"Models/GagMetal/OTN.png": { - "frame": {"x":179,"y":73,"w":52,"h":40}, + "frame": {"x":1219,"y":1017,"w":160,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":52,"h":40}, + "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/WhitesEyesHeart.png": +"Models/GagMetal/SciFiMuzzle.png": { - "frame": {"x":555,"y":126,"w":49,"h":42}, + "frame": {"x":1219,"y":1017,"w":160,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/WhitesEyesNeutral.png": +"Models/GagMetal/SciFiMuzzle2.png": { - "frame": {"x":608,"y":126,"w":49,"h":42}, + "frame": {"x":1512,"y":1006,"w":160,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "spriteSourceSize": {"x":64,"y":206,"w":160,"h":88}, "sourceSize": {"w":321,"h":332} }, -"Models/FaceKoiBlank/WhitesEyesSurprised.png": +"Models/GagTape/Wrap.png": { - "frame": {"x":555,"y":126,"w":49,"h":42}, + "frame": {"x":801,"y":1203,"w":172,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "spriteSourceSize": {"x":54,"y":214,"w":172,"h":65}, "sourceSize": {"w":321,"h":332} }, -"Models/Fiddle/FiddleLock.png": +"Models/Hair2/Hair2_FrontC.png": { - "frame": {"x":185,"y":117,"w":46,"h":42}, + "frame": {"x":338,"y":1272,"w":71,"h":169}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":560,"y":583,"w":46,"h":42}, + "spriteSourceSize": {"x":493,"y":157,"w":71,"h":169}, "sourceSize": {"w":1240,"h":1754} }, -"Models/GagLeather/GhostBall.png": +"Models/Hair2/Hair5_FrontD.png": { - "frame": {"x":289,"y":123,"w":50,"h":42}, + "frame": {"x":81,"y":1303,"w":69,"h":190}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":107,"y":233,"w":50,"h":42}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":489,"y":140,"w":69,"h":190}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/GagMetal/HarnessRim.png": +"Models/Harness/BeltsUnderbust.png": { - "frame": {"x":3,"y":3,"w":131,"h":30}, + "frame": {"x":1997,"y":941,"w":48,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":75,"y":243,"w":131,"h":30}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":548,"y":611,"w":48,"h":56}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/GagMetal/OTNRivets.png": +"Models/Heels/BalletLaceLeftClosed.png": { - "frame": {"x":3,"y":591,"w":62,"h":60}, + "frame": {"x":410,"y":3,"w":43,"h":195}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":98,"y":216,"w":62,"h":60}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":582,"y":1391,"w":43,"h":195}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair3_FrontD.png": +"Models/Heels/BalletRightKneel.png": { - "frame": {"x":466,"y":79,"w":68,"h":41}, + "frame": {"x":931,"y":1840,"w":103,"h":119}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":553,"y":145,"w":68,"h":41}, + "spriteSourceSize": {"x":309,"y":839,"w":103,"h":119}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Handcuffs/Irish8AnkleLeftKneelClosed.png": +"Models/Heels/BalletSoleLeftClosed.png": { - "frame": {"x":426,"y":425,"w":43,"h":51}, + "frame": {"x":3,"y":3,"w":105,"h":215}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":718,"y":949,"w":43,"h":51}, + "spriteSourceSize": {"x":578,"y":1465,"w":105,"h":215}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Handcuffs/LegironsLeftKneel.png": +"Models/Heels/BalletSoleLeftKneel.png": { - "frame": {"x":444,"y":807,"w":50,"h":72}, + "frame": {"x":1841,"y":3,"w":188,"h":98}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":710,"y":954,"w":50,"h":72}, + "spriteSourceSize": {"x":742,"y":906,"w":188,"h":98}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Handcuffs/LegironsLeftKneelClosed.png": +"Models/Heels/BalletSoleLeftSpread.png": { - "frame": {"x":426,"y":425,"w":43,"h":51}, + "frame": {"x":156,"y":220,"w":105,"h":205}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":718,"y":949,"w":43,"h":51}, + "spriteSourceSize": {"x":663,"y":1473,"w":105,"h":205}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Handcuffs/WolfCuffsFront.png": +"Models/Heels/BalletSoleRightKneel.png": { - "frame": {"x":175,"y":799,"w":207,"h":68}, + "frame": {"x":1120,"y":1277,"w":95,"h":117}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":477,"y":526,"w":207,"h":68}, + "spriteSourceSize": {"x":309,"y":839,"w":95,"h":117}, "sourceSize": {"w":1240,"h":1754} }, -"Models/KittyLatex/KittyLatexTail2Light.png": +"Models/Heels/BalletSoleRightSpread.png": { - "frame": {"x":193,"y":728,"w":70,"h":65}, + "frame": {"x":302,"y":3,"w":104,"h":195}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":760,"y":1328,"w":70,"h":65}, + "spriteSourceSize": {"x":472,"y":1481,"w":104,"h":195}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/AnkleLeftKneelClosed.png": +"Models/Heels/FlatBalletRightKneel.png": { - "frame": {"x":585,"y":610,"w":41,"h":61}, + "frame": {"x":931,"y":1840,"w":103,"h":119}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":714,"y":940,"w":41,"h":61}, + "spriteSourceSize": {"x":309,"y":839,"w":103,"h":119}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/AnkleLeftSpread.png": +"Models/Heels/LeatherRightKneel.png": { - "frame": {"x":3,"y":360,"w":78,"h":49}, + "frame": {"x":966,"y":539,"w":85,"h":105}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":684,"y":1423,"w":78,"h":49}, + "spriteSourceSize": {"x":311,"y":834,"w":85,"h":105}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/AnkleRightClosed.png": +"Models/Heels/ShinyBalletRightKneel.png": { - "frame": {"x":225,"y":421,"w":75,"h":51}, + "frame": {"x":931,"y":1840,"w":103,"h":119}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":536,"y":1425,"w":75,"h":51}, + "spriteSourceSize": {"x":309,"y":839,"w":103,"h":119}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandAnkleLeftKneel.png": +"Models/Heels/TallLeftHogtie.png": { - "frame": {"x":957,"y":566,"w":41,"h":60}, + "frame": {"x":1053,"y":799,"w":50,"h":147}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":714,"y":964,"w":41,"h":60}, + "spriteSourceSize": {"x":730,"y":797,"w":50,"h":147}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Hood/Gag.png": +{ + "frame": {"x":1825,"y":1143,"w":156,"h":82}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":533,"y":311,"w":156,"h":82}, + "sourceSize": {"w":752,"h":479} +}, +"Models/Jacket/StrapsArmsWristtie.png": +{ + "frame": {"x":1605,"y":2009,"w":55,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":686,"y":597,"w":55,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Labcoat/CoatHogtieFree.png": +{ + "frame": {"x":3,"y":1499,"w":177,"h":190}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":615,"y":418,"w":177,"h":190}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/AnkleLeftSpread.png": +{ + "frame": {"x":1733,"y":1462,"w":78,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":684,"y":1423,"w":78,"h":49}, "sourceSize": {"w":1240,"h":1754} }, "Models/LeatherCuffs/BandElbowLeftFront.png": { - "frame": {"x":554,"y":3,"w":47,"h":30}, + "frame": {"x":1338,"y":1558,"w":47,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":722,"y":614,"w":47,"h":30}, @@ -1650,554 +1722,1338 @@ }, "Models/LeatherCuffs/BandElbowLeftUp.png": { - "frame": {"x":116,"y":163,"w":108,"h":43}, + "frame": {"x":1565,"y":142,"w":108,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":722,"y":265,"w":108,"h":43}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandElbowRightYoked.png": +"Models/LeatherCuffs/BandElbowRightUp.png": { - "frame": {"x":980,"y":630,"w":41,"h":72}, + "frame": {"x":650,"y":342,"w":103,"h":42}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":406,"y":525,"w":41,"h":72}, + "spriteSourceSize": {"x":448,"y":266,"w":103,"h":42}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandWristLeftFree.png": +"Models/LeatherCuffs/BandThighLeftKneelClosed.png": { - "frame": {"x":804,"y":273,"w":55,"h":47}, + "frame": {"x":1688,"y":3,"w":149,"h":132}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":801,"y":756,"w":55,"h":47}, + "spriteSourceSize": {"x":488,"y":860,"w":149,"h":132}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandWristRightCrossed.png": +"Models/LeatherCuffs/BandThighRightClosed.png": { - "frame": {"x":709,"y":82,"w":41,"h":41}, + "frame": {"x":1605,"y":1761,"w":113,"h":41}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":640,"y":597,"w":41,"h":41}, + "spriteSourceSize": {"x":474,"y":1043,"w":113,"h":41}, "sourceSize": {"w":1240,"h":1754} }, "Models/LeatherCuffs/BandWristRightFront.png": { - "frame": {"x":228,"y":169,"w":59,"h":43}, + "frame": {"x":1596,"y":1806,"w":59,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":476,"y":545,"w":59,"h":43}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/BandWristRightYoked.png": +"Models/LeatherCuffs/ElbowLeftBoxtie.png": { - "frame": {"x":485,"y":3,"w":65,"h":30}, + "frame": {"x":1722,"y":1914,"w":84,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":309,"y":402,"w":65,"h":30}, + "spriteSourceSize": {"x":690,"y":573,"w":84,"h":57}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/ElbowLeftBoxtie.png": +"Models/LeatherCuffs/ElbowLeftUp.png": { - "frame": {"x":502,"y":483,"w":84,"h":57}, + "frame": {"x":1387,"y":1001,"w":121,"h":75}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":690,"y":573,"w":84,"h":57}, + "spriteSourceSize": {"x":712,"y":251,"w":121,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ElbowLeftYoked.png": +{ + "frame": {"x":1517,"y":1655,"w":75,"h":91}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":763,"y":507,"w":75,"h":91}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareElbowLeftUp.png": +{ + "frame": {"x":999,"y":1272,"w":117,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":714,"y":263,"w":117,"h":51}, "sourceSize": {"w":1240,"h":1754} }, "Models/LeatherCuffs/HardwareElbowRightUp.png": { - "frame": {"x":767,"y":128,"w":121,"h":43}, + "frame": {"x":631,"y":541,"w":121,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":444,"y":270,"w":121,"h":43}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareThighRightClosed.png": +"Models/LeatherCuffs/HardwareThighLeftClosed.png": +{ + "frame": {"x":284,"y":1457,"w":105,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":589,"y":1051,"w":105,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareThighLeftKneel.png": +{ + "frame": {"x":824,"y":1496,"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":824,"y":1496,"w":51,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":877,"w":51,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ThighLeftClosed.png": { - "frame": {"x":364,"y":37,"w":83,"h":38}, + "frame": {"x":1674,"y":1108,"w":147,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":487,"y":1047,"w":83,"h":38}, + "spriteSourceSize": {"x":572,"y":1029,"w":147,"h":71}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/HardwareWristLeftYoked.png": +"Models/LeatherCuffs/ThighLeftSpread.png": { - "frame": {"x":291,"y":79,"w":50,"h":40}, + "frame": {"x":1508,"y":1431,"w":142,"h":86}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":871,"y":389,"w":50,"h":40}, + "spriteSourceSize": {"x":618,"y":1004,"w":142,"h":86}, "sourceSize": {"w":1240,"h":1754} }, "Models/LeatherCuffs/ThighRightSpread.png": { - "frame": {"x":109,"y":871,"w":134,"h":71}, + "frame": {"x":1813,"y":1582,"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": +"Models/LeatherPetsuit/LeftLegsLacesKneel.png": +{ + "frame": {"x":1841,"y":105,"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":1841,"y":105,"w":178,"h":99}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":536,"y":945,"w":178,"h":99}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Legbinder/LegLegbinderHogtie.png": +{ + "frame": {"x":3,"y":439,"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":1134,"y":189,"w":141,"h":137}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":529,"y":1493,"w":141,"h":137}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/ShoeLeftSpread.png": +{ + "frame": {"x":423,"y":202,"w":123,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":633,"y":1455,"w":123,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ArmRightWristtie.png": +{ + "frame": {"x":867,"y":1662,"w":96,"h":120}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":453,"y":424,"w":96,"h":120}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/BootRightKneel.png": +{ + "frame": {"x":968,"y":388,"w":79,"h":142}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":322,"y":813,"w":79,"h":142}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/FootBootLeftHogtie.png": +{ + "frame": {"x":1436,"y":3,"w":122,"h":135}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":715,"y":765,"w":122,"h":135}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/FootSockLeftHogtie.png": +{ + "frame": {"x":831,"y":1272,"w":50,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":725,"y":785,"w":50,"h":149}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ForeArmLeftFront.png": +{ + "frame": {"x":552,"y":1856,"w":129,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":626,"y":544,"w":129,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/ForeArmRightFront.png": +{ + "frame": {"x":154,"y":1303,"w":126,"h":189}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":422,"y":530,"w":126,"h":189}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GloveRightFree.png": +{ + "frame": {"x":1021,"y":1661,"w":107,"h":119}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":267,"y":537,"w":107,"h":119}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GloveRightFront.png": +{ + "frame": {"x":1387,"y":896,"w":122,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":494,"y":460,"w":122,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardLeftFree.png": +{ + "frame": {"x":161,"y":1693,"w":147,"h":182}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":725,"y":632,"w":147,"h":182}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardLeftFront.png": +{ + "frame": {"x":595,"y":1668,"w":124,"h":168}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":628,"y":529,"w":124,"h":168}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/GuardLeftYoked.png": +{ + "frame": {"x":580,"y":1046,"w":113,"h":157}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":833,"y":381,"w":113,"h":157}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronLeftWristtie.png": +{ + "frame": {"x":325,"y":839,"w":123,"h":162}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":699,"y":391,"w":123,"h":162}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/MaidKnightLight/PauldronLeftYoked.png": +{ + "frame": {"x":680,"y":3,"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":1051,"y":388,"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":1091,"y":150,"w":51,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":804,"y":760,"w":51,"h":35}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LatexLeftFree.png": +{ + "frame": {"x":429,"y":1680,"w":162,"h":172}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":749,"y":682,"w":162,"h":172}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LatexLeftFront.png": +{ + "frame": {"x":131,"y":648,"w":174,"h":204}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":561,"y":468,"w":174,"h":204}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Mittens/LatexRightBoxtie.png": { - "frame": {"x":269,"y":537,"w":68,"h":58}, + "frame": {"x":1052,"y":1327,"w":41,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":623,"y":540,"w":68,"h":58}, + "spriteSourceSize": {"x":678,"y":678,"w":41,"h":39}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/WristLeftYoked.png": +"Models/Mittens/LatexRightCrossed.png": { - "frame": {"x":673,"y":323,"w":66,"h":48}, + "frame": {"x":614,"y":967,"w":140,"h":75}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":869,"y":387,"w":66,"h":48}, + "spriteSourceSize": {"x":563,"y":593,"w":140,"h":75}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/WristRightCrossed.png": +"Models/Mittens/LatexRightFront.png": { - "frame": {"x":3,"y":413,"w":60,"h":50}, + "frame": {"x":131,"y":439,"w":155,"h":205}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":635,"y":594,"w":60,"h":50}, + "spriteSourceSize": {"x":431,"y":466,"w":155,"h":205}, "sourceSize": {"w":1240,"h":1754} }, "Models/Mittens/LeatherRightBoxtie.png": { - "frame": {"x":863,"y":39,"w":41,"h":39}, + "frame": {"x":1506,"y":1521,"w":41,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":678,"y":678,"w":41,"h":39}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Mittens/PawRightYoked.png": +"Models/Mittens/LeatherRightCrossed.png": { - "frame": {"x":498,"y":810,"w":64,"h":72}, + "frame": {"x":1513,"y":606,"w":91,"h":94}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":323,"y":320,"w":64,"h":72}, + "spriteSourceSize": {"x":647,"y":603,"w":91,"h":94}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ninja/ShoeRightKneel.png": +"Models/Mittens/LeatherRightFree.png": { - "frame": {"x":567,"y":675,"w":53,"h":62}, + "frame": {"x":1383,"y":1080,"w":125,"h":117}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":313,"y":882,"w":53,"h":62}, + "spriteSourceSize": {"x":276,"y":551,"w":125,"h":117}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Nipples/ClampsBullet.png": +"Models/Mittens/LongMittenLeftCrossed.png": { - "frame": {"x":193,"y":317,"w":208,"h":47}, + "frame": {"x":312,"y":1681,"w":113,"h":181}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":460,"y":568,"w":208,"h":47}, + "spriteSourceSize": {"x":656,"y":518,"w":113,"h":181}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Pony/Collar.png": +"Models/Mittens/LongMittenLeftFront.png": { - "frame": {"x":322,"y":3,"w":80,"h":30}, + "frame": {"x":309,"y":648,"w":98,"h":187}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":588,"y":394,"w":80,"h":30}, + "spriteSourceSize": {"x":670,"y":527,"w":98,"h":187}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/RightThigh1KneelClosed.png": +"Models/Mittens/LongMittenLeftWristtie.png": { - "frame": {"x":258,"y":37,"w":102,"h":38}, + "frame": {"x":3,"y":1303,"w":74,"h":192}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":335,"y":911,"w":102,"h":38}, + "spriteSourceSize": {"x":679,"y":549,"w":74,"h":192}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Ribbon/TopCalf3KneelClosed.png": +"Models/Mittens/LongMittenRightCrossed.png": { - "frame": {"x":59,"y":794,"w":54,"h":69}, + "frame": {"x":289,"y":1047,"w":137,"h":169}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":521,"y":998,"w":54,"h":69}, + "spriteSourceSize": {"x":433,"y":515,"w":137,"h":169}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Rubber/HandLeftFree.png": +"Models/Mittens/PawLeftFront.png": { - "frame": {"x":499,"y":977,"w":103,"h":87}, + "frame": {"x":1219,"y":1109,"w":160,"h":87}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":815,"y":774,"w":103,"h":87}, + "spriteSourceSize": {"x":483,"y":500,"w":160,"h":87}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/Bust.png": +"Models/Mittens/PawRightFront.png": { - "frame": {"x":451,"y":738,"w":54,"h":65}, + "frame": {"x":1512,"y":1098,"w":158,"h":107}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":566,"y":458,"w":54,"h":65}, + "spriteSourceSize": {"x":520,"y":487,"w":158,"h":107}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/BustStripe.png": +"Models/Ninja/KneeLeftClosed.png": { - "frame": {"x":709,"y":613,"w":46,"h":61}, + "frame": {"x":452,"y":812,"w":123,"h":160}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":567,"y":462,"w":46,"h":61}, + "spriteSourceSize": {"x":574,"y":1151,"w":123,"h":160}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/HemLeftUp.png": +"Models/Ninja/KneeLeftKneel.png": { - "frame": {"x":184,"y":946,"w":68,"h":86}, + "frame": {"x":1277,"y":3,"w":155,"h":136}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":707,"y":350,"w":68,"h":86}, + "spriteSourceSize": {"x":384,"y":952,"w":155,"h":136}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Sailor/HemLeftYoked.png": +"Models/Ninja/KneeLeftKneelClosed.png": { - "frame": {"x":906,"y":446,"w":103,"h":54}, + "frame": {"x":1277,"y":3,"w":155,"h":136}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":730,"y":521,"w":103,"h":54}, + "spriteSourceSize": {"x":384,"y":952,"w":155,"h":136}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeShoulderRightYoked.png": +"Models/Ninja/KneeRightClosed.png": { - "frame": {"x":3,"y":163,"w":109,"h":43}, + "frame": {"x":729,"y":1272,"w":98,"h":156}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":473,"y":416,"w":109,"h":43}, + "spriteSourceSize": {"x":496,"y":1152,"w":98,"h":156}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/AnkleLeftClosed.png": +"Models/Ninja/ShoeLeftClosed.png": { - "frame": {"x":873,"y":504,"w":84,"h":58}, + "frame": {"x":1383,"y":1201,"w":125,"h":77}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":591,"y":1423,"w":84,"h":58}, + "spriteSourceSize": {"x":535,"y":1558,"w":125,"h":77}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/AnkleLeftKneelClosed.png": +"Models/Ninja/ShoeLeftSpread.png": { - "frame": {"x":267,"y":730,"w":50,"h":65}, + "frame": {"x":883,"y":1967,"w":108,"h":77}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":715,"y":939,"w":50,"h":65}, + "spriteSourceSize": {"x":643,"y":1563,"w":108,"h":77}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/AnkleRightClosed.png": +"Models/Ninja/ShoeRightClosed.png": { - "frame": {"x":651,"y":429,"w":65,"h":53}, + "frame": {"x":685,"y":1976,"w":97,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":534,"y":1423,"w":65,"h":53}, + "spriteSourceSize": {"x":459,"y":1561,"w":97,"h":68}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/ElbowLeftBoxtie.png": +"Models/Ninja/SkirtBand.png": { - "frame": {"x":936,"y":339,"w":84,"h":49}, + "frame": {"x":550,"y":199,"w":96,"h":185}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":691,"y":581,"w":84,"h":49}, + "spriteSourceSize": {"x":453,"y":759,"w":96,"h":185}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimAnkleLeftClosed.png": +"Models/Ninja/SkirtBandKneelCrotchStrap.png": { - "frame": {"x":928,"y":392,"w":72,"h":50}, + "frame": {"x":1088,"y":648,"w":168,"h":133}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":595,"y":1430,"w":72,"h":50}, + "spriteSourceSize": {"x":367,"y":759,"w":168,"h":133}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimAnkleLeftKneelClosed.png": +"Models/Ninja/TopBand.png": { - "frame": {"x":708,"y":678,"w":46,"h":63}, + "frame": {"x":879,"y":1462,"w":110,"h":94}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":717,"y":940,"w":46,"h":63}, + "spriteSourceSize": {"x":492,"y":574,"w":110,"h":94}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimAnkleLeftSpread.png": +"Models/Ninja/TopBandRim.png": { - "frame": {"x":165,"y":368,"w":75,"h":49}, + "frame": {"x":885,"y":1272,"w":110,"h":94}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":681,"y":1436,"w":75,"h":49}, + "spriteSourceSize": {"x":492,"y":574,"w":110,"h":94}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimAnkleRightClosed.png": +"Models/OperaGloves/GloveLeftBoxtie.png": { - "frame": {"x":200,"y":265,"w":62,"h":47}, + "frame": {"x":583,"y":3,"w":93,"h":183}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":536,"y":1428,"w":62,"h":47}, + "spriteSourceSize": {"x":676,"y":502,"w":93,"h":183}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimAnkleRightSpread.png": +"Models/Ribbon/Bow.png": { - "frame": {"x":85,"y":362,"w":76,"h":49}, + "frame": {"x":430,"y":1047,"w":146,"h":161}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":490,"y":1437,"w":76,"h":49}, + "spriteSourceSize": {"x":504,"y":479,"w":146,"h":161}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimCollar.png": +"Models/Ribbon/BowCrotch.png": { - "frame": {"x":3,"y":529,"w":98,"h":58}, + "frame": {"x":1441,"y":189,"w":122,"h":135}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":578,"y":374,"w":98,"h":58}, + "spriteSourceSize": {"x":521,"y":791,"w":122,"h":135}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimWristLeftFree.png": +"Models/Ribbon/FeetClosed.png": { - "frame": {"x":304,"y":421,"w":65,"h":51}, + "frame": {"x":1684,"y":751,"w":148,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":799,"y":755,"w":65,"h":51}, + "spriteSourceSize": {"x":513,"y":1513,"w":148,"h":65}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimWristLeftFront.png": +"Models/Ribbon/RightThigh3KneelClosed.png": { - "frame": {"x":192,"y":537,"w":73,"h":58}, + "frame": {"x":1674,"y":1183,"w":147,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":618,"y":540,"w":73,"h":58}, + "spriteSourceSize": {"x":400,"y":812,"w":147,"h":40}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimWristRightYoked.png": +"Models/Ribbon/Thigh3KneelClosed.png": { - "frame": {"x":892,"y":129,"w":70,"h":43}, + "frame": {"x":547,"y":648,"w":170,"h":157}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":305,"y":393,"w":70,"h":43}, + "spriteSourceSize": {"x":516,"y":826,"w":170,"h":157}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/WristLeftYoked.png": +"Models/Ribbon/TopArmStrapCrossed.png": { - "frame": {"x":123,"y":259,"w":73,"h":47}, + "frame": {"x":1985,"y":1158,"w":60,"h":88}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":864,"y":389,"w":73,"h":47}, + "spriteSourceSize": {"x":554,"y":602,"w":60,"h":88}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/WristRightFront.png": +"Models/Ribbon/TopBowBoxtie.png": { - "frame": {"x":590,"y":486,"w":74,"h":57}, + "frame": {"x":579,"y":1272,"w":146,"h":161}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":470,"y":539,"w":74,"h":57}, + "spriteSourceSize": {"x":504,"y":479,"w":146,"h":161}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/bac/SuccubusClawLeftFree.png": +"Models/Ribbon/TopBowCrotch.png": { - "frame": {"x":68,"y":117,"w":59,"h":42}, + "frame": {"x":1562,"y":3,"w":122,"h":135}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":839,"y":824,"w":59,"h":42}, + "spriteSourceSize": {"x":521,"y":791,"w":122,"h":135}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/bac/SuccubusClawLeftFront.png": +"Models/Ribbon/TopFeetClosed.png": { - "frame": {"x":292,"y":601,"w":106,"h":59}, + "frame": {"x":1681,"y":820,"w":148,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":535,"y":463,"w":106,"h":59}, + "spriteSourceSize": {"x":513,"y":1513,"w":148,"h":65}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/bac/SuccubusClawLeftYoked.png": +"Models/Robes/ShoeRightKneel.png": { - "frame": {"x":3,"y":867,"w":102,"h":71}, + "frame": {"x":993,"y":1462,"w":70,"h":94}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":848,"y":280,"w":102,"h":71}, + "spriteSourceSize": {"x":323,"y":856,"w":70,"h":94}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SockLeftKneel.png": +"Models/Robes/ShoeRightSpread.png": { - "frame": {"x":837,"y":693,"w":75,"h":62}, + "frame": {"x":1567,"y":189,"w":113,"h":133}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":831,"y":959,"w":75,"h":62}, + "spriteSourceSize": {"x":497,"y":1508,"w":113,"h":133}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SockLeftSpread.png": +"Models/Rope/AnklesClosedOver.png": { - "frame": {"x":739,"y":831,"w":102,"h":70}, + "frame": {"x":1677,"y":954,"w":148,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":640,"y":1572,"w":102,"h":70}, + "spriteSourceSize": {"x":514,"y":1517,"w":148,"h":57}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Succubus/SuccubusClawLeftYoked.png": +"Models/Rope/ArmStrapHarnessCrossed.png": { - "frame": {"x":247,"y":871,"w":102,"h":71}, + "frame": {"x":2004,"y":745,"w":41,"h":95}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":846,"y":274,"w":102,"h":71}, + "spriteSourceSize": {"x":559,"y":572,"w":41,"h":95}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/ArmStrapLeftWristtie.png": +"Models/Rope/RightThigh1KneelClosed.png": { - "frame": {"x":845,"y":760,"w":105,"h":68}, + "frame": {"x":1098,"y":1784,"w":107,"h":51}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":676,"y":438,"w":105,"h":68}, + "spriteSourceSize": {"x":332,"y":908,"w":107,"h":51}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/ArmStrapRightWristtie.png": +"Models/Rope/RightThigh3KneelClosed.png": { - "frame": {"x":409,"y":542,"w":67,"h":59}, + "frame": {"x":1351,"y":329,"w":140,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":442,"w":67,"h":59}, + "spriteSourceSize": {"x":399,"y":812,"w":140,"h":52}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/HandLeftFront.png": +"Models/Rope/Thigh1KneelClosedOver.png": { - "frame": {"x":734,"y":905,"w":106,"h":82}, + "frame": {"x":1096,"y":1560,"w":103,"h":96}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":565,"y":471,"w":106,"h":82}, + "spriteSourceSize": {"x":415,"y":922,"w":103,"h":96}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Thigh3KneelClosed.png": +{ + "frame": {"x":685,"y":809,"w":188,"h":153}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":499,"y":832,"w":188,"h":153}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Thigh3KneelClosedOver.png": +{ + "frame": {"x":643,"y":1496,"w":177,"h":162}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":510,"y":823,"w":177,"h":162}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/ArmRightWristtie.png": +{ + "frame": {"x":936,"y":1560,"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":1838,"y":409,"w":173,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":302,"w":173,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/FootLeftKneelClosed.png": +{ + "frame": {"x":1510,"y":1338,"w":154,"h":89}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":729,"y":902,"w":154,"h":89}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/HemLeft.png": +{ + "frame": {"x":290,"y":611,"w":103,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":537,"w":103,"h":33}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/HemLeftTied.png": +{ + "frame": {"x":1409,"y":628,"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":1345,"y":1938,"w":50,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":434,"w":50,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Shades/Glasses.png": +{ + "frame": {"x":1838,"y":601,"w":172,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":519,"y":263,"w":172,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/Mouth.png": +{ + "frame": {"x":1684,"y":653,"w":148,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":72,"y":190,"w":148,"h":94}, + "sourceSize": {"w":321,"h":332} +}, +"Models/ShadowHands/RightLegs1Kneel.png": +{ + "frame": {"x":650,"y":190,"w":137,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":363,"y":785,"w":137,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/RightLegs1KneelClosed.png": +{ + "frame": {"x":681,"y":388,"w":95,"h":148}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":405,"y":785,"w":95,"h":148}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Skirts/StripedSkirtUnderOverKneel.png": +{ + "frame": {"x":129,"y":1879,"w":113,"h":165}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":542,"y":802,"w":113,"h":165}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderLeft.png": +{ + "frame": {"x":1389,"y":1459,"w":113,"h":101}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":664,"y":411,"w":113,"h":101}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderLeftYoked.png": +{ + "frame": {"x":995,"y":1963,"w":139,"h":82}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":666,"y":406,"w":139,"h":82}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderRightTied.png": +{ + "frame": {"x":993,"y":1370,"w":121,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":417,"w":121,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slayer/CapeShoulderRightYoked.png": +{ + "frame": {"x":1452,"y":142,"w":109,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":416,"w":109,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/ArmRightWristtie.png": +{ + "frame": {"x":1016,"y":1560,"w":76,"h":97}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":465,"y":429,"w":76,"h":97}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Slime/FaceMouth.png": +{ + "frame": {"x":1838,"y":505,"w":173,"h":92}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":302,"w":173,"h":92}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/PostureCollar.png": +{ + "frame": {"x":1067,"y":1462,"w":86,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":586,"y":356,"w":86,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SMoonlight/ReverseBinderRight.png": +{ + "frame": {"x":914,"y":189,"w":126,"h":143}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":468,"y":376,"w":126,"h":143}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SmoothHeels/RightKneel.png": +{ + "frame": {"x":1132,"y":1660,"w":85,"h":105}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":311,"y":834,"w":85,"h":105}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelChastity/BeltPadlock.png": +{ + "frame": {"x":631,"y":388,"w":46,"h":149}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":547,"y":734,"w":46,"h":149}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/AnkleLeftClosed.png": +{ + "frame": {"x":1722,"y":1791,"w":84,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":1423,"w":84,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/AnkleRightClosed.png": +{ + "frame": {"x":1234,"y":330,"w":65,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":1423,"w":65,"h":53}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/AnkleRightSpread.png": +{ + "frame": {"x":437,"y":1212,"w":91,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":488,"y":1431,"w":91,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ElbowLeftYoked.png": +{ + "frame": {"x":875,"y":966,"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":1409,"y":522,"w":100,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":423,"y":603,"w":100,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimAnkleRightSpread.png": +{ + "frame": {"x":1733,"y":1576,"w":76,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":490,"y":1437,"w":76,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimCollar.png": +{ + "frame": {"x":1287,"y":1459,"w":98,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":578,"y":374,"w":98,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimElbowLeftUp.png": +{ + "frame": {"x":1924,"y":1812,"w":110,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":712,"y":283,"w":110,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimElbowRightBoxtie.png": +{ + "frame": {"x":1751,"y":139,"w":86,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":460,"y":591,"w":86,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimThighLeftKneel.png": +{ + "frame": {"x":1377,"y":385,"w":132,"h":133}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":826,"w":132,"h":133}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimThighLeftKneelClosed.png": +{ + "frame": {"x":350,"y":1496,"w":132,"h":180}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":826,"w":132,"h":180}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimWristLeftFree.png": +{ + "frame": {"x":1980,"y":1250,"w":65,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":799,"y":755,"w":65,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimWristRightYoked.png": +{ + "frame": {"x":1677,"y":142,"w":70,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":305,"y":393,"w":70,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ThighLeftKneel.png": +{ + "frame": {"x":1218,"y":388,"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":3,"y":1693,"w":154,"h":182}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":514,"y":825,"w":154,"h":182}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ThighLeftSpread.png": +{ + "frame": {"x":1219,"y":796,"w":166,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":604,"y":971,"w":166,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ThighRightSpread.png": +{ + "frame": {"x":1513,"y":704,"w":167,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":437,"y":973,"w":167,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/WristRightFront.png": +{ + "frame": {"x":1287,"y":1398,"w":74,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":470,"y":539,"w":74,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/bac/SuccubusClawLeftFree.png": +{ + "frame": {"x":1659,"y":1806,"w":59,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":839,"y":824,"w":59,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/bac/SuccubusClawLeftYoked.png": +{ + "frame": {"x":1407,"y":672,"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":1551,"y":1521,"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":492,"y":976,"w":118,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":528,"y":1571,"w":118,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SockRightClosed.png": +{ + "frame": {"x":762,"y":1432,"w":113,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":440,"y":1566,"w":113,"h":60}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusClawLeftYoked.png": +{ + "frame": {"x":1407,"y":747,"w":102,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":846,"y":274,"w":102,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusClawRightYoked.png": +{ + "frame": {"x":1561,"y":1853,"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":1038,"y":1840,"w":109,"h":118}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":639,"y":85,"w":109,"h":118}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusHornRight.png": +{ + "frame": {"x":1151,"y":1839,"w":88,"h":117}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":481,"y":84,"w":88,"h":117}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SuccubusTailLight.png": +{ + "frame": {"x":824,"y":1560,"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":1513,"y":384,"w":91,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":302,"y":828,"w":91,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ArmLeftCrossed.png": +{ + "frame": {"x":625,"y":1207,"w":172,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":629,"w":172,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/Collar.png": +{ + "frame": {"x":1838,"y":310,"w":173,"h":95}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":357,"w":173,"h":95}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/HandRightYoked.png": +{ + "frame": {"x":1019,"y":1046,"w":98,"h":122}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":296,"y":297,"w":98,"h":122}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmLeftCrossed.png": +{ + "frame": {"x":625,"y":1207,"w":172,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":629,"w":172,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/HandLeftFront.png": +{ + "frame": {"x":1422,"y":1753,"w":106,"h":82}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":565,"y":471,"w":106,"h":82}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/RightLegsKneel.png": +{ + "frame": {"x":1244,"y":529,"w":161,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":368,"y":816,"w":161,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmLeftCrossed.png": +{ + "frame": {"x":625,"y":1207,"w":172,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":563,"y":629,"w":172,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/HandLeftFree.png": +{ + "frame": {"x":1121,"y":1110,"w":94,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":822,"y":785,"w":94,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/HandRightFree.png": +{ + "frame": {"x":1513,"y":495,"w":91,"h":107}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":266,"y":546,"w":91,"h":107}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/HandRightFront.png": +{ + "frame": {"x":1411,"y":1564,"w":95,"h":89}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":494,"y":462,"w":95,"h":89}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/HandRightYoked.png": +{ + "frame": {"x":1019,"y":1172,"w":98,"h":96}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":296,"y":297,"w":98,"h":96}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/ForeGloveRightFront.png": +{ + "frame": {"x":1107,"y":785,"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":796,"y":1840,"w":131,"h":123}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":787,"y":741,"w":131,"h":123}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/GloveLeftYoked.png": +{ + "frame": {"x":579,"y":809,"w":102,"h":154}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":849,"y":278,"w":102,"h":154}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/Necklace.png": +{ + "frame": {"x":1121,"y":921,"w":94,"h":94}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":406,"w":94,"h":94}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/NecklaceCharm.png": +{ + "frame": {"x":2004,"y":844,"w":41,"h":93}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":407,"w":41,"h":93}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseLeftFront.png": +{ + "frame": {"x":290,"y":413,"w":169,"h":194}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":624,"y":418,"w":169,"h":194}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/BlouseRightFront.png": +{ + "frame": {"x":457,"y":3,"w":122,"h":192}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":431,"y":420,"w":122,"h":192}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Witch/ShoeLeftHogtie.png": +{ + "frame": {"x":967,"y":1661,"w":50,"h":120}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":732,"y":794,"w":50,"h":120}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeLight/HandRightYoked.png": +"Models/Witch/ShoeLeftKneel.png": { - "frame": {"x":632,"y":897,"w":98,"h":85}, + "frame": {"x":1841,"y":208,"w":173,"h":98}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":296,"y":308,"w":98,"h":85}, + "spriteSourceSize": {"x":720,"y":927,"w":173,"h":98}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ArmStrapLeftWristtie.png": +"Models/Witch/ShoeRightClosed.png": { - "frame": {"x":845,"y":760,"w":105,"h":68}, + "frame": {"x":1383,"y":1282,"w":123,"h":84}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":676,"y":438,"w":105,"h":68}, + "spriteSourceSize": {"x":451,"y":1535,"w":123,"h":84}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/ArmStrapRightWristtie.png": +"Models/Witch/ShoeRightKneel.png": { - "frame": {"x":409,"y":542,"w":67,"h":59}, + "frame": {"x":1608,"y":524,"w":72,"h":93}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":461,"y":442,"w":67,"h":59}, + "spriteSourceSize": {"x":322,"y":857,"w":72,"h":93}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeMed/FeetKneel.png": +"Models/Witch/SkirtRuffleKneel.png": { - "frame": {"x":402,"y":605,"w":70,"h":61}, + "frame": {"x":1512,"y":1209,"w":155,"h":125}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":770,"y":922,"w":70,"h":61}, + "spriteSourceSize": {"x":587,"y":954,"w":155,"h":125}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/BandForeGloveRightFront.png": +"Models/Witch/SkirtRuffleOverKneel.png": { - "frame": {"x":655,"y":81,"w":50,"h":41}, + "frame": {"x":1821,"y":1229,"w":155,"h":125}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":486,"y":542,"w":50,"h":41}, + "spriteSourceSize": {"x":587,"y":954,"w":155,"h":125}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/BandGloveLeftFree.png": +"Models/Wolf/AnkleLeftKneel.png": { - "frame": {"x":597,"y":81,"w":54,"h":41}, + "frame": {"x":1384,"y":1657,"w":76,"h":92}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":796,"y":752,"w":54,"h":41}, + "spriteSourceSize": {"x":695,"y":946,"w":76,"h":92}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/BandGloveRightYoked.png": +"Models/Wolf/AnkleLeftKneelClosed.png": { - "frame": {"x":605,"y":3,"w":47,"h":30}, + "frame": {"x":1894,"y":1976,"w":51,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":317,"y":403,"w":47,"h":30}, + "spriteSourceSize": {"x":712,"y":942,"w":51,"h":68}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/BeltCharm.png": +"Models/Wolf/AnkleRightClosed.png": { - "frame": {"x":380,"y":369,"w":60,"h":49}, + "frame": {"x":1118,"y":1398,"w":85,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":527,"y":671,"w":60,"h":49}, + "spriteSourceSize": {"x":533,"y":1416,"w":85,"h":60}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/Collar.png": +"Models/Wolf/AnkleRightSpread.png": { - "frame": {"x":406,"y":3,"w":75,"h":30}, + "frame": {"x":1118,"y":1398,"w":85,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":591,"y":389,"w":75,"h":30}, + "spriteSourceSize": {"x":486,"y":1412,"w":85,"h":60}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/RimForeGloveLeftFront.png": +"Models/Wolf/Collar.png": { - "frame": {"x":862,"y":391,"w":62,"h":50}, + "frame": {"x":1596,"y":1685,"w":126,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":620,"y":541,"w":62,"h":50}, + "spriteSourceSize": {"x":565,"y":366,"w":126,"h":72}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/RimGloveLeftYoked.png": +"Models/WolfCatsuit/GloveLeftUp.png": { - "frame": {"x":668,"y":488,"w":67,"h":57}, + "frame": {"x":3,"y":1090,"w":170,"h":209}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":873,"y":373,"w":67,"h":57}, + "spriteSourceSize": {"x":664,"y":167,"w":170,"h":209}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/AnkleLeftClosed.png": +"Models/WolfCatsuit/LegBandLeftHogtie.png": { - "frame": {"x":53,"y":660,"w":84,"h":62}, + "frame": {"x":1684,"y":250,"w":150,"h":124}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":587,"y":1417,"w":84,"h":62}, + "spriteSourceSize": {"x":590,"y":802,"w":150,"h":124}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/BandForeGloveRightFront.png": +"Models/WolfCatsuit/LegBandRightClosed.png": { - "frame": {"x":655,"y":81,"w":50,"h":41}, + "frame": {"x":1815,"y":1423,"w":142,"h":106}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":486,"y":542,"w":50,"h":41}, + "spriteSourceSize": {"x":448,"y":819,"w":142,"h":106}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/BandGloveLeftFree.png": +"Models/WolfCatsuit/LegBandRightHogtie.png": { - "frame": {"x":597,"y":81,"w":54,"h":41}, + "frame": {"x":1219,"y":1288,"w":142,"h":106}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":796,"y":752,"w":54,"h":41}, + "spriteSourceSize": {"x":448,"y":819,"w":142,"h":106}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/BandGloveRightYoked.png": +"Models/WolfCatsuit/LegPadsRightKneel.png": { - "frame": {"x":605,"y":3,"w":47,"h":30}, + "frame": {"x":184,"y":1496,"w":162,"h":181}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":317,"y":403,"w":47,"h":30}, + "spriteSourceSize": {"x":332,"y":813,"w":162,"h":181}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/RimForeGloveLeftFront.png": +"Models/WolfCatsuit/LegPadsRightKneelClosed.png": { - "frame": {"x":862,"y":391,"w":62,"h":50}, + "frame": {"x":184,"y":1496,"w":162,"h":181}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":620,"y":541,"w":62,"h":50}, + "spriteSourceSize": {"x":332,"y":813,"w":162,"h":181}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/RimGloveLeftYoked.png": +"Models/WolfCatsuit/LegRimLeftHogtie.png": { - "frame": {"x":668,"y":488,"w":67,"h":57}, + "frame": {"x":837,"y":3,"w":161,"h":143}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":873,"y":373,"w":67,"h":57}, + "spriteSourceSize": {"x":588,"y":792,"w":161,"h":143}, "sourceSize": {"w":1240,"h":1754} }, -"Models/WolfCatsuit/TorsoUpperRim.png": +"Models/WolfCatsuit/LegRimRightSpread.png": { - "frame": {"x":759,"y":630,"w":217,"h":59}, + "frame": {"x":1279,"y":189,"w":158,"h":136}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":478,"y":641,"w":217,"h":59}, + "spriteSourceSize": {"x":444,"y":803,"w":158,"h":136}, "sourceSize": {"w":1240,"h":1754} }}, "meta": { @@ -2205,9 +3061,9 @@ "version": "1.1", "image": "atlas40.webp", "format": "RGBA8888", - "size": {"w":1024,"h":1067}, + "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas40.webp b/TextureAtlas/atlas40.webp index 6fa8c8ae6..1cd7481fe 100644 Binary files a/TextureAtlas/atlas40.webp and b/TextureAtlas/atlas40.webp differ diff --git a/TextureAtlas/atlas41.json b/TextureAtlas/atlas41.json new file mode 100644 index 000000000..f200820f1 --- /dev/null +++ b/TextureAtlas/atlas41.json @@ -0,0 +1,1821 @@ +{"frames": { + +"Models/Bandit/ChokerHogtie.png": +{ + "frame": {"x":3,"y":3,"w":80,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":590,"y":396,"w":80,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Bandit/WristRightFront.png": +{ + "frame": {"x":235,"y":160,"w":55,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":482,"y":541,"w":55,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Feet1Kneel.png": +{ + "frame": {"x":153,"y":1279,"w":59,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":707,"y":949,"w":59,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Belts/Feet2KneelClosed.png": +{ + "frame": {"x":53,"y":1193,"w":51,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":585,"y":984,"w":51,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Chastity/CyberDisplay.png": +{ + "frame": {"x":87,"y":3,"w":48,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":550,"y":841,"w":48,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Collars/DragonCollar.png": +{ + "frame": {"x":395,"y":3,"w":75,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":389,"w":75,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/AnkleLeftClosed.png": +{ + "frame": {"x":307,"y":598,"w":71,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":1430,"w":71,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/ElbowLeftFree.png": +{ + "frame": {"x":229,"y":812,"w":82,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":582,"w":82,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CrystalCuffs/WristLeftYoked.png": +{ + "frame": {"x":61,"y":592,"w":64,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":871,"y":386,"w":64,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/AnkleLeftClosed.png": +{ + "frame": {"x":382,"y":598,"w":71,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":1430,"w":71,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/ElbowLeftFree.png": +{ + "frame": {"x":3,"y":866,"w":82,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":582,"w":82,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/WristLeftYoked.png": +{ + "frame": {"x":61,"y":645,"w":64,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":871,"y":386,"w":64,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Cuffs/WristRightCrossed.png": +{ + "frame": {"x":3,"y":194,"w":42,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":650,"y":602,"w":42,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffLongMittenLeftFront.png": +{ + "frame": {"x":386,"y":881,"w":72,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":510,"w":72,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/CuffLongMittenLeftWristtie.png": +{ + "frame": {"x":49,"y":203,"w":56,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":707,"y":533,"w":56,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/AnkleRightSpread.png": +{ + "frame": {"x":234,"y":999,"w":72,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":492,"y":1428,"w":72,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/Collar.png": +{ + "frame": {"x":360,"y":704,"w":93,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":582,"y":380,"w":93,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayAnkleLeftClosed.png": +{ + "frame": {"x":442,"y":546,"w":43,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":614,"y":1440,"w":43,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayAnkleLeftSpread.png": +{ + "frame": {"x":3,"y":286,"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":457,"y":598,"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":3,"y":240,"w":41,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":396,"y":502,"w":41,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/DisplayThighLeftKneel.png": +{ + "frame": {"x":69,"y":489,"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":440,"y":495,"w":59,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":571,"y":867,"w":59,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ElbowLeftFree.png": +{ + "frame": {"x":69,"y":993,"w":82,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":579,"w":82,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/LinkCollar.png": +{ + "frame": {"x":3,"y":751,"w":93,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":582,"y":380,"w":93,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenAnkleRightClosed.png": +{ + "frame": {"x":434,"y":1011,"w":49,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":532,"y":1426,"w":49,"h":64}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenBelt.png": +{ + "frame": {"x":3,"y":1053,"w":55,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":542,"y":687,"w":55,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenElbowRightUp.png": +{ + "frame": {"x":343,"y":1216,"w":50,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":511,"y":243,"w":50,"h":73}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenElbowRightYoked.png": +{ + "frame": {"x":457,"y":759,"w":51,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":394,"y":496,"w":51,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/ScreenWristLeftFree.png": +{ + "frame": {"x":390,"y":818,"w":41,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":822,"y":728,"w":41,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/WristLeftFree.png": +{ + "frame": {"x":62,"y":1056,"w":64,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":797,"y":745,"w":64,"h":64}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/WristRightCrossed.png": +{ + "frame": {"x":398,"y":758,"w":55,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":651,"y":593,"w":55,"h":56}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberCuffs/WristRightYoked.png": +{ + "frame": {"x":435,"y":820,"w":64,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":310,"y":390,"w":64,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberLink/ThighLinkSpreadHigh.png": +{ + "frame": {"x":406,"y":160,"w":44,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":573,"y":1012,"w":44,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CapLongMittenRightBoxtie.png": +{ + "frame": {"x":3,"y":696,"w":49,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":677,"w":49,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/CapLongMittenRightYoked.png": +{ + "frame": {"x":233,"y":1064,"w":86,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":291,"y":284,"w":86,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/MittenLeftFree.png": +{ + "frame": {"x":232,"y":1367,"w":88,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":819,"y":778,"w":88,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenLeftFront.png": +{ + "frame": {"x":386,"y":881,"w":72,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":702,"y":510,"w":72,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenLeftWristtie.png": +{ + "frame": {"x":49,"y":203,"w":56,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":707,"y":533,"w":56,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineBelt/LockBeltHighlight.png": +{ + "frame": {"x":317,"y":37,"w":56,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":541,"y":816,"w":56,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/AnkleLeftLockKneel.png": +{ + "frame": {"x":327,"y":651,"w":59,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":719,"y":946,"w":59,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/BeltLockBand.png": +{ + "frame": {"x":317,"y":37,"w":56,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":538,"y":730,"w":56,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/BeltLockPlate.png": +{ + "frame": {"x":268,"y":1210,"w":71,"h":73}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":534,"y":683,"w":71,"h":73}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/CollarLock.png": +{ + "frame": {"x":162,"y":870,"w":44,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":597,"y":380,"w":44,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoBoxtie.png": +{ + "frame": {"x":139,"y":3,"w":82,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":694,"y":596,"w":82,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoCleanBoxtie.png": +{ + "frame": {"x":225,"y":3,"w":82,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":694,"y":596,"w":82,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftDecoFront.png": +{ + "frame": {"x":390,"y":444,"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":162,"y":934,"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":132,"y":491,"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":3,"y":1268,"w":72,"h":75}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":764,"y":523,"w":72,"h":75}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowLeftFree.png": +{ + "frame": {"x":71,"y":930,"w":87,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":694,"y":582,"w":87,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightDecoYoked.png": +{ + "frame": {"x":337,"y":1298,"w":67,"h":79}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":391,"y":525,"w":67,"h":79}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftDecoCleanSpread.png": +{ + "frame": {"x":3,"y":341,"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":154,"y":344,"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":377,"y":37,"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":377,"y":37,"w":51,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":503,"y":855,"w":51,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftLockKneel.png": +{ + "frame": {"x":210,"y":873,"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":210,"y":873,"w":95,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":480,"y":838,"w":95,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighLeftLockPlateSpread.png": +{ + "frame": {"x":233,"y":1133,"w":69,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":654,"y":1023,"w":69,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightDecoClosed.png": +{ + "frame": {"x":155,"y":37,"w":94,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":473,"y":1055,"w":94,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ThighRightLockPlateSpread.png": +{ + "frame": {"x":115,"y":1130,"w":67,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":475,"y":1031,"w":67,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftDecoCleanFront.png": +{ + "frame": {"x":3,"y":106,"w":60,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":628,"y":549,"w":60,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftDecoFree.png": +{ + "frame": {"x":253,"y":37,"w":60,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":800,"y":766,"w":60,"h":31}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftDecoFront.png": +{ + "frame": {"x":215,"y":116,"w":60,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":628,"y":549,"w":60,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftFree.png": +{ + "frame": {"x":89,"y":868,"w":69,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":792,"y":748,"w":69,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristLeftYoked.png": +{ + "frame": {"x":62,"y":540,"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":265,"y":297,"w":51,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":644,"y":601,"w":51,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/WristRightYoked.png": +{ + "frame": {"x":202,"y":542,"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":163,"y":809,"w":62,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":576,"y":330,"w":62,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Dress/MonocleLensRight.png": +{ + "frame": {"x":3,"y":927,"w":64,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":519,"y":273,"w":64,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Ears/ElfFront.png": +{ + "frame": {"x":130,"y":1061,"w":99,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":271,"w":99,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandLeftWristtie.png": +{ + "frame": {"x":416,"y":1382,"w":70,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":700,"y":499,"w":70,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandRightFront.png": +{ + "frame": {"x":113,"y":160,"w":44,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":459,"y":494,"w":44,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandRightUp.png": +{ + "frame": {"x":105,"y":1449,"w":101,"h":86}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":349,"w":101,"h":86}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/EyesDai2/Brows2Annoyed.png": +{ + "frame": {"x":432,"y":37,"w":45,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":601,"y":236,"w":45,"h":31}, + "sourceSize": {"w":717,"h":405} +}, +"Models/EyesK2/Eyes2Closed.png": +{ + "frame": {"x":72,"y":71,"w":71,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":265,"w":71,"h":40}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/EyesSurprised.png": +{ + "frame": {"x":129,"y":647,"w":63,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":265,"w":63,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/WhitesEyes2Closed.png": +{ + "frame": {"x":72,"y":71,"w":71,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":613,"y":265,"w":71,"h":40}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK2/WhitesEyesSurprised.png": +{ + "frame": {"x":196,"y":648,"w":63,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":517,"y":265,"w":63,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/EyesDazed.png": +{ + "frame": {"x":3,"y":590,"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":390,"y":651,"w":56,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":268,"w":56,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/EyesSurprised.png": +{ + "frame": {"x":450,"y":651,"w":56,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":268,"w":56,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/WhitesEyesDazed.png": +{ + "frame": {"x":3,"y":643,"w":54,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":268,"w":54,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/WhitesEyesNeutral.png": +{ + "frame": {"x":56,"y":698,"w":56,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":268,"w":56,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/EyesK4/WhitesEyesSurprised.png": +{ + "frame": {"x":116,"y":700,"w":56,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":522,"y":268,"w":56,"h":49}, + "sourceSize": {"w":781,"h":560} +}, +"Models/FaceDask/Eyes2Angry.png": +{ + "frame": {"x":435,"y":72,"w":70,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":168,"w":70,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/Eyes2Dazed.png": +{ + "frame": {"x":161,"y":160,"w":70,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":168,"w":70,"h":41}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/Eyes2Surprised.png": +{ + "frame": {"x":293,"y":492,"w":70,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":160,"w":70,"h":47}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/EyesAngry.png": +{ + "frame": {"x":207,"y":297,"w":54,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":51,"y":173,"w":54,"h":43}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/EyesSurprised.png": +{ + "frame": {"x":320,"y":297,"w":51,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":52,"y":168,"w":51,"h":43}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyes2Angry.png": +{ + "frame": {"x":67,"y":115,"w":70,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":168,"w":70,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyes2Dazed.png": +{ + "frame": {"x":141,"y":116,"w":70,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":168,"w":70,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyesDazed.png": +{ + "frame": {"x":375,"y":297,"w":50,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":54,"y":173,"w":50,"h":43}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyesNeutral.png": +{ + "frame": {"x":330,"y":546,"w":52,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":52,"y":168,"w":52,"h":48}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceDask/WhitesEyesSurprised.png": +{ + "frame": {"x":386,"y":546,"w":52,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":52,"y":168,"w":52,"h":48}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKjus/EyesNeutral.png": +{ + "frame": {"x":98,"y":342,"w":52,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":528,"y":269,"w":52,"h":45}, + "sourceSize": {"w":745,"h":461} +}, +"Models/FaceKjus/MouthSmile.png": +{ + "frame": {"x":107,"y":37,"w":44,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":584,"y":322,"w":44,"h":30}, + "sourceSize": {"w":700,"h":436} +}, +"Models/FaceKjus/WhitesEyes2Surprised.png": +{ + "frame": {"x":159,"y":205,"w":61,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":617,"y":263,"w":61,"h":42}, + "sourceSize": {"w":791,"h":501} +}, +"Models/FaceKjus/WhitesEyesNeutral.png": +{ + "frame": {"x":334,"y":443,"w":52,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":528,"y":269,"w":52,"h":45}, + "sourceSize": {"w":745,"h":461} +}, +"Models/FaceKoi/Eyes2Angry.png": +{ + "frame": {"x":70,"y":440,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/Eyes2Heart.png": +{ + "frame": {"x":323,"y":344,"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":391,"y":345,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/Eyes2Surprised.png": +{ + "frame": {"x":3,"y":390,"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":334,"y":205,"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":339,"y":116,"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":156,"y":251,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/EyesSurprised.png": +{ + "frame": {"x":209,"y":251,"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":136,"y":442,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyes2Heart.png": +{ + "frame": {"x":323,"y":344,"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":71,"y":391,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyes2Surprised.png": +{ + "frame": {"x":139,"y":393,"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":388,"y":205,"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":395,"y":116,"w":52,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":52,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyesHeart.png": +{ + "frame": {"x":262,"y":251,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyesNeutral.png": +{ + "frame": {"x":315,"y":251,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/HumanEyesSurprised.png": +{ + "frame": {"x":368,"y":251,"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":202,"y":442,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyes2Heart.png": +{ + "frame": {"x":207,"y":393,"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":275,"y":393,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyes2Surprised.png": +{ + "frame": {"x":207,"y":393,"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":442,"y":205,"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":451,"y":116,"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":421,"y":251,"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":48,"y":295,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoi/WhitesEyesSurprised.png": +{ + "frame": {"x":421,"y":251,"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":268,"y":442,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/Eyes2Closed.png": +{ + "frame": {"x":3,"y":70,"w":65,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":146,"y":159,"w":65,"h":32}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/Eyes2Dazed.png": +{ + "frame": {"x":429,"y":297,"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":323,"y":344,"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":343,"y":394,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/Eyes2Surprised.png": +{ + "frame": {"x":411,"y":395,"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":48,"y":249,"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":3,"y":150,"w":52,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":52,"h":40}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/EyesHeart.png": +{ + "frame": {"x":262,"y":251,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/EyesNeutral.png": +{ + "frame": {"x":101,"y":296,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/EyesSurprised.png": +{ + "frame": {"x":154,"y":297,"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":202,"y":442,"w":62,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":147,"y":159,"w":62,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyes2Heart.png": +{ + "frame": {"x":207,"y":393,"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":275,"y":393,"w":64,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":145,"y":159,"w":64,"h":45}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyes2Surprised.png": +{ + "frame": {"x":207,"y":393,"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":442,"y":205,"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":451,"y":116,"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":421,"y":251,"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":48,"y":295,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/FaceKoiBlank/WhitesEyesSurprised.png": +{ + "frame": {"x":421,"y":251,"w":49,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":58,"y":169,"w":49,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Fiddle/FiddleLock.png": +{ + "frame": {"x":109,"y":204,"w":46,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":560,"y":583,"w":46,"h":42}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLeather/Ball_Teeth.png": +{ + "frame": {"x":224,"y":205,"w":51,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":233,"w":51,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagLeather/GagNecklaceBall.png": +{ + "frame": {"x":459,"y":345,"w":46,"h":46}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":566,"y":438,"w":46,"h":46}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/GagLeather/GhostBall.png": +{ + "frame": {"x":102,"y":250,"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_Teeth.png": +{ + "frame": {"x":279,"y":205,"w":51,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":107,"y":233,"w":51,"h":42}, + "sourceSize": {"w":321,"h":332} +}, +"Models/GagMetal/OTNRivets.png": +{ + "frame": {"x":3,"y":989,"w":62,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":98,"y":216,"w":62,"h":60}, + "sourceSize": {"w":321,"h":332} +}, +"Models/Handcuffs/Irish8AnkleLeftKneelClosed.png": +{ + "frame": {"x":457,"y":704,"w":43,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":718,"y":949,"w":43,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/LegironsLeftKneel.png": +{ + "frame": {"x":214,"y":1203,"w":50,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":710,"y":954,"w":50,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Handcuffs/LegironsLeftKneelClosed.png": +{ + "frame": {"x":457,"y":704,"w":43,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":718,"y":949,"w":43,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Kigu/Eyes.png": +{ + "frame": {"x":79,"y":1274,"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":402,"y":1079,"w":70,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":760,"y":1328,"w":70,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/KittyLatex/KittyLatexTailLight.png": +{ + "frame": {"x":315,"y":813,"w":71,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":896,"y":1290,"w":71,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/AnkleLeftKneel.png": +{ + "frame": {"x":3,"y":1347,"w":59,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":705,"y":947,"w":59,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/AnkleLeftKneelClosed.png": +{ + "frame": {"x":462,"y":881,"w":41,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":714,"y":940,"w":41,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/AnkleRightClosed.png": +{ + "frame": {"x":319,"y":758,"w":75,"h":51}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":536,"y":1425,"w":75,"h":51}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandElbowRightYoked.png": +{ + "frame": {"x":354,"y":1140,"w":41,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":406,"y":525,"w":41,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandWristLeftFree.png": +{ + "frame": {"x":3,"y":539,"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":3,"y":439,"w":63,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":626,"y":545,"w":63,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/BandWristRightCrossed.png": +{ + "frame": {"x":454,"y":160,"w":41,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":640,"y":597,"w":41,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/Collar.png": +{ + "frame": {"x":399,"y":1148,"w":105,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":574,"y":364,"w":105,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ElbowLeftFree.png": +{ + "frame": {"x":3,"y":805,"w":85,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":699,"y":582,"w":85,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/ElbowLeftWristtie.png": +{ + "frame": {"x":270,"y":543,"w":56,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":680,"y":610,"w":56,"h":48}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareElbowLeftYoked.png": +{ + "frame": {"x":264,"y":1287,"w":69,"h":76}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":766,"y":515,"w":69,"h":76}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareElbowRightYoked.png": +{ + "frame": {"x":216,"y":1279,"w":44,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":402,"y":523,"w":44,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/LeatherCuffs/HardwareWristLeftYoked.png": +{ + "frame": {"x":59,"y":159,"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":132,"y":542,"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":166,"y":755,"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":367,"y":495,"w":69,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":307,"y":394,"w":69,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Maid/StripeSockRightKneel.png": +{ + "frame": {"x":147,"y":72,"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":246,"y":72,"w":95,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":398,"y":840,"w":95,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Pony/Collar.png": +{ + "frame": {"x":311,"y":3,"w":80,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":588,"y":394,"w":80,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Arm1OverWristtie.png": +{ + "frame": {"x":279,"y":116,"w":56,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":686,"y":580,"w":56,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rope/Calf2KneelClosed.png": +{ + "frame": {"x":186,"y":1130,"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":186,"y":1130,"w":43,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":610,"y":981,"w":43,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Rubber/HandLeftFree.png": +{ + "frame": {"x":210,"y":1455,"w":103,"h":87}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":815,"y":774,"w":103,"h":87}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Sailor/Bust.png": +{ + "frame": {"x":3,"y":1122,"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":310,"y":999,"w":46,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":567,"y":462,"w":46,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/ShadowHands/LeftArm2Wristtie.png": +{ + "frame": {"x":306,"y":1140,"w":44,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":681,"y":639,"w":44,"h":66}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelChastity/BraPadlock.png": +{ + "frame": {"x":3,"y":1191,"w":46,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":552,"y":556,"w":46,"h":71}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/AnkleLeftKneelClosed.png": +{ + "frame": {"x":61,"y":1124,"w":50,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":715,"y":939,"w":50,"h":65}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/ElbowLeftFront.png": +{ + "frame": {"x":230,"y":758,"w":85,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":688,"y":595,"w":85,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimAnkleLeftClosed.png": +{ + "frame": {"x":176,"y":701,"w":72,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":595,"y":1430,"w":72,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimAnkleLeftSpread.png": +{ + "frame": {"x":228,"y":595,"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":3,"y":488,"w":62,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":536,"y":1428,"w":62,"h":47}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimElbowLeftFree.png": +{ + "frame": {"x":129,"y":594,"w":95,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":691,"y":592,"w":95,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimWristLeftFront.png": +{ + "frame": {"x":309,"y":874,"w":73,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":618,"y":540,"w":73,"h":58}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/RimWristLeftYoked.png": +{ + "frame": {"x":249,"y":344,"w":70,"h":45}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":866,"y":390,"w":70,"h":45}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/SteelCuffs/WristLeftFront.png": +{ + "frame": {"x":155,"y":997,"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":216,"y":491,"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":272,"y":936,"w":106,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":535,"y":463,"w":106,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SockLeftSpread.png": +{ + "frame": {"x":108,"y":1200,"w":102,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":640,"y":1572,"w":102,"h":70}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Succubus/SockRightSpread.png": +{ + "frame": {"x":397,"y":1222,"w":104,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":503,"y":1571,"w":104,"h":72}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeHeavy/ArmFullRightWristtie.png": +{ + "frame": {"x":408,"y":1298,"w":70,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":429,"w":70,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/ArmStrapRightBoxtie.png": +{ + "frame": {"x":323,"y":1071,"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":382,"y":943,"w":67,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":442,"w":67,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/FeetKneel.png": +{ + "frame": {"x":453,"y":946,"w":51,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":789,"y":922,"w":51,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/HandRightFront.png": +{ + "frame": {"x":324,"y":1382,"w":88,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":494,"y":467,"w":88,"h":84}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeLight/HandRightYoked.png": +{ + "frame": {"x":3,"y":1438,"w":98,"h":85}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":296,"y":308,"w":98,"h":85}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmFullRightWristtie.png": +{ + "frame": {"x":408,"y":1298,"w":70,"h":80}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":461,"y":429,"w":70,"h":80}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/TapeMed/ArmStrapRightBoxtie.png": +{ + "frame": {"x":323,"y":1071,"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":382,"y":943,"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":360,"y":1006,"w":70,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":770,"y":922,"w":70,"h":61}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/BandForeGloveLeftFront.png": +{ + "frame": {"x":54,"y":36,"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":352,"y":160,"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":294,"y":160,"w":54,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":796,"y":752,"w":54,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/BandGloveRightYoked.png": +{ + "frame": {"x":3,"y":36,"w":47,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":317,"y":403,"w":47,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/BeltCharm.png": +{ + "frame": {"x":263,"y":651,"w":60,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":527,"y":671,"w":60,"h":49}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/Collar.png": +{ + "frame": {"x":395,"y":3,"w":75,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":591,"y":389,"w":75,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/RimForeGloveLeftFront.png": +{ + "frame": {"x":100,"y":753,"w":62,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":620,"y":541,"w":62,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Warrior/RimGloveLeftYoked.png": +{ + "frame": {"x":92,"y":807,"w":67,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":873,"y":373,"w":67,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Wolf/FCollar.png": +{ + "frame": {"x":345,"y":72,"w":86,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":586,"y":390,"w":86,"h":40}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/BandForeGloveLeftFront.png": +{ + "frame": {"x":54,"y":36,"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":352,"y":160,"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":294,"y":160,"w":54,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":796,"y":752,"w":54,"h":41}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/BandGloveRightYoked.png": +{ + "frame": {"x":3,"y":36,"w":47,"h":30}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":317,"y":403,"w":47,"h":30}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegBandRightKneel.png": +{ + "frame": {"x":66,"y":1353,"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":149,"y":1364,"w":79,"h":81}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":447,"y":770,"w":79,"h":81}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/LegRimLeftKneel.png": +{ + "frame": {"x":252,"y":704,"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":252,"y":704,"w":104,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":645,"y":755,"w":104,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/RimForeGloveLeftFront.png": +{ + "frame": {"x":100,"y":753,"w":62,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":620,"y":541,"w":62,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/WolfCatsuit/RimGloveLeftYoked.png": +{ + "frame": {"x":92,"y":807,"w":67,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":873,"y":373,"w":67,"h":57}, + "sourceSize": {"w":1240,"h":1754} +}}, +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.1", + "image": "atlas41.webp", + "format": "RGBA8888", + "size": {"w":511,"h":1545}, + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" +} +} diff --git a/TextureAtlas/atlas41.webp b/TextureAtlas/atlas41.webp new file mode 100644 index 000000000..a782f9e96 Binary files /dev/null and b/TextureAtlas/atlas41.webp differ diff --git a/TextureAtlas/atlas5.json b/TextureAtlas/atlas5.json index 88057032c..08a4b379d 100644 --- a/TextureAtlas/atlas5.json +++ b/TextureAtlas/atlas5.json @@ -1,11 +1,11 @@ {"frames": { -"Models/Bandit/PouchSpread.png": +"Models/Armbinder/BinderRightBoxtie.png": { - "frame": {"x":1859,"y":1179,"w":186,"h":179}, + "frame": {"x":2021,"y":922,"w":24,"h":166}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":403,"y":938,"w":186,"h":179}, + "spriteSourceSize": {"x":463,"y":518,"w":24,"h":166}, "sourceSize": {"w":1240,"h":1754} }, "Models/Body/ArmRightCrossed.png": @@ -48,6 +48,14 @@ "spriteSourceSize": {"x":446,"y":413,"w":270,"h":226}, "sourceSize": {"w":1240,"h":1754} }, +"Models/Collars/TrackingModuleDisplay.png": +{ + "frame": {"x":410,"y":1564,"w":15,"h":12}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":569,"y":409,"w":15,"h":12}, + "sourceSize": {"w":1240,"h":1754} +}, "Models/Crystal/EncaseUnder.png": { "frame": {"x":3,"y":3,"w":403,"h":1573}, @@ -56,12 +64,68 @@ "spriteSourceSize": {"x":407,"y":81,"w":403,"h":1573}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/SkirtBackKneel.png": +"Models/CrystalCuffs/ElbowRightFront.png": +{ + "frame": {"x":2021,"y":1251,"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":1303,"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":1355,"w":24,"h":44}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":451,"y":510,"w":24,"h":44}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberArms/StrapsLongMittenRightBoxtie.png": +{ + "frame": {"x":2021,"y":1492,"w":23,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":620,"w":23,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/StrapsLongMittenRightBoxtie.png": +{ + "frame": {"x":2021,"y":1492,"w":23,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":620,"w":23,"h":59}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/CyberMitts/UpperCuffLongMittenRightCrossed.png": +{ + "frame": {"x":2021,"y":1355,"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":1197,"w":24,"h":50}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":768,"y":590,"w":24,"h":50}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/DivineCuffs/ElbowRightBoxtie.png": { - "frame": {"x":1859,"y":1362,"w":116,"h":198}, + "frame": {"x":2021,"y":1471,"w":24,"h":17}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":702,"y":773,"w":116,"h":198}, + "spriteSourceSize": {"x":461,"y":610,"w":24,"h":17}, "sourceSize": {"w":1240,"h":1754} }, "Models/FaceKoi/MouthEmbarrassed.png": @@ -80,6 +144,14 @@ "spriteSourceSize": {"x":116,"y":245,"w":38,"h":7}, "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}, @@ -96,20 +168,20 @@ "spriteSourceSize": {"x":454,"y":98,"w":294,"h":465}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Leash/LeashFree.png": +"Models/Hair2/Hair5_FrontC.png": { - "frame": {"x":598,"y":1564,"w":310,"h":479}, + "frame": {"x":2021,"y":1445,"w":24,"h":22}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":582,"y":436,"w":310,"h":479}, + "spriteSourceSize": {"x":536,"y":173,"w":24,"h":22}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/ElbowRightYoked.png": +"Models/Leash/LeashFree.png": { - "frame": {"x":1979,"y":1468,"w":56,"h":92}, + "frame": {"x":598,"y":1564,"w":310,"h":479}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":398,"y":520,"w":56,"h":92}, + "spriteSourceSize": {"x":582,"y":436,"w":310,"h":479}, "sourceSize": {"w":1240,"h":1754} }, "Models/MaidKnightLight/BootRightSpread.png": @@ -120,20 +192,20 @@ "spriteSourceSize": {"x":464,"y":1215,"w":135,"h":464}, "sourceSize": {"w":1240,"h":1754} }, -"Models/OperaGloves/GloveLeftCrossed.png": +"Models/MaidKnightLight/SockRightSpread.png": { - "frame": {"x":1821,"y":1846,"w":224,"h":192}, + "frame": {"x":1859,"y":922,"w":158,"h":638}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":547,"y":508,"w":224,"h":192}, + "spriteSourceSize": {"x":451,"y":994,"w":158,"h":638}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Panties/Bow.png": +"Models/OperaGloves/GloveLeftCrossed.png": { - "frame": {"x":410,"y":1564,"w":21,"h":12}, + "frame": {"x":1821,"y":1846,"w":224,"h":192}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":561,"y":810,"w":21,"h":12}, + "spriteSourceSize": {"x":547,"y":508,"w":224,"h":192}, "sourceSize": {"w":1240,"h":1754} }, "Models/Robes/ZombieChestTalismanKneel.png": @@ -152,12 +224,12 @@ "spriteSourceSize": {"x":472,"y":237,"w":308,"h":199}, "sourceSize": {"w":1240,"h":1754} }, -"Models/ShadowHands/CrotchStrap.png": +"Models/Sailor/HemRightTied.png": { - "frame": {"x":1979,"y":1362,"w":66,"h":102}, + "frame": {"x":2021,"y":1403,"w":24,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":541,"y":818,"w":66,"h":102}, + "spriteSourceSize": {"x":428,"y":548,"w":24,"h":38}, "sourceSize": {"w":1240,"h":1754} }, "Models/SmoothHeels/LeftKneel.png": @@ -176,14 +248,6 @@ "spriteSourceSize": {"x":235,"y":359,"w":803,"h":272}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Visors/DollmakerFull.png": -{ - "frame": {"x":1859,"y":922,"w":186,"h":253}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":506,"y":142,"w":186,"h":253}, - "sourceSize": {"w":1240,"h":1754} -}, "Models/Witch/BlouseRightUp.png": { "frame": {"x":440,"y":1564,"w":154,"h":481}, @@ -207,7 +271,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas5.webp b/TextureAtlas/atlas5.webp index 1fc8589ed..4268c2cc5 100644 Binary files a/TextureAtlas/atlas5.webp and b/TextureAtlas/atlas5.webp differ diff --git a/TextureAtlas/atlas6.json b/TextureAtlas/atlas6.json index aee70f666..a3c98d1e2 100644 --- a/TextureAtlas/atlas6.json +++ b/TextureAtlas/atlas6.json @@ -1,5 +1,13 @@ {"frames": { +"Models/Armbinder/StrapsRightWristtie.png": +{ + "frame": {"x":2020,"y":1513,"w":16,"h":11}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":469,"y":515,"w":16,"h":11}, + "sourceSize": {"w":1240,"h":1754} +}, "Models/Belts/LeftArm1Wristtie.png": { "frame": {"x":1968,"y":609,"w":77,"h":70}, @@ -24,14 +32,6 @@ "spriteSourceSize": {"x":388,"y":808,"w":495,"h":272}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Collars/TrackingModuleDisplay.png": -{ - "frame": {"x":1263,"y":2013,"w":15,"h":12}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":569,"y":409,"w":15,"h":12}, - "sourceSize": {"w":1240,"h":1754} -}, "Models/Crystal/EncaseOver.png": { "frame": {"x":672,"y":3,"w":408,"h":1543}, @@ -56,14 +56,6 @@ "spriteSourceSize": {"x":694,"y":573,"w":77,"h":55}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberArms/DisplayLongMittenLeftWristtie.png": -{ - "frame": {"x":1263,"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":1263,"y":1934,"w":15,"h":16}, @@ -96,14 +88,6 @@ "spriteSourceSize": {"x":561,"y":861,"w":77,"h":65}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/UpperDisplayLongMittenLeftWristtie.png": -{ - "frame": {"x":1263,"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":1263,"y":1934,"w":15,"h":16}, @@ -112,14 +96,6 @@ "spriteSourceSize": {"x":443,"y":495,"w":15,"h":16}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineBelt/LockBraShackle.png": -{ - "frame": {"x":1968,"y":1173,"w":76,"h":195}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":544,"y":444,"w":76,"h":195}, - "sourceSize": {"w":1240,"h":1754} -}, "Models/DivineCuffs/AnkleLeftLockBandSpread.png": { "frame": {"x":1263,"y":1954,"w":15,"h":16}, @@ -144,29 +120,13 @@ "spriteSourceSize": {"x":699,"y":487,"w":77,"h":99}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/ShoeRightKneel.png": +"Models/FaceKoi/Brows2Neutral.png": { - "frame": {"x":1968,"y":1372,"w":76,"h":108}, + "frame": {"x":1968,"y":1513,"w":48,"h":11}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":320,"y":849,"w":76,"h":108}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/EyesK2/Eyes2Closed.png": -{ - "frame": {"x":1968,"y":1484,"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":1968,"y":1484,"w":71,"h":40}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":613,"y":265,"w":71,"h":40}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":142,"y":139,"w":48,"h":11}, + "sourceSize": {"w":321,"h":332} }, "Models/Furniture/LatexCubeBack.png": { @@ -184,6 +144,14 @@ "spriteSourceSize": {"x":91,"y":10,"w":77,"h":223}, "sourceSize": {"w":321,"h":332} }, +"Models/GagMetal/SciFiPanel.png": +{ + "frame": {"x":1968,"y":1442,"w":76,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":97,"y":228,"w":76,"h":67}, + "sourceSize": {"w":321,"h":332} +}, "Models/Gothic/LinesCrotchStrap.png": { "frame": {"x":242,"y":1557,"w":657,"h":484}, @@ -200,6 +168,14 @@ "spriteSourceSize": {"x":550,"y":436,"w":77,"h":272}, "sourceSize": {"w":1240,"h":1754} }, +"Models/MaidKnightLight/BootLeftHogtie.png": +{ + "frame": {"x":1968,"y":1173,"w":76,"h":265}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":674,"y":898,"w":76,"h":265}, + "sourceSize": {"w":1240,"h":1754} +}, "Models/Nipples/RingsBullet.png": { "frame": {"x":1084,"y":1528,"w":194,"h":18}, @@ -248,6 +224,14 @@ "spriteSourceSize": {"x":449,"y":162,"w":143,"h":344}, "sourceSize": {"w":1240,"h":1754} }, +"Models/SMoonlight/PostureCollarLoop.png": +{ + "frame": {"x":1263,"y":2013,"w":14,"h":29}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":600,"y":399,"w":14,"h":29}, + "sourceSize": {"w":1240,"h":1754} +}, "Models/TapeMed/RightLegsHogtie.png": { "frame": {"x":903,"y":1550,"w":228,"h":494}, @@ -295,7 +279,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas6.webp b/TextureAtlas/atlas6.webp index 5f00a7ee7..d19997f27 100644 Binary files a/TextureAtlas/atlas6.webp and b/TextureAtlas/atlas6.webp differ diff --git a/TextureAtlas/atlas7.json b/TextureAtlas/atlas7.json index c55bd6b07..51803d0ae 100644 --- a/TextureAtlas/atlas7.json +++ b/TextureAtlas/atlas7.json @@ -191,7 +191,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas8.json b/TextureAtlas/atlas8.json index 63aacf7a3..cbd828ba0 100644 --- a/TextureAtlas/atlas8.json +++ b/TextureAtlas/atlas8.json @@ -1,35 +1,19 @@ {"frames": { -"Models/Armbinder/StrapsRightBoxtie.png": -{ - "frame": {"x":511,"y":2032,"w":14,"h":13}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":465,"y":518,"w":14,"h":13}, - "sourceSize": {"w":1240,"h":1754} -}, "Models/Bra/BraUnderRim.png": { - "frame": {"x":599,"y":2032,"w":38,"h":12}, + "frame": {"x":408,"y":2032,"w":38,"h":12}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":557,"y":570,"w":38,"h":12}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Bubble/BallSuit.png": +"Models/Cape/CapeHogtie.png": { - "frame": {"x":1264,"y":3,"w":771,"h":770}, + "frame": {"x":1781,"y":1371,"w":263,"h":674}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":221,"y":387,"w":771,"h":770}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Bubble/BubbleSquishyBack.png": -{ - "frame": {"x":1666,"y":1058,"w":312,"h":986}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":444,"y":139,"w":312,"h":986}, + "spriteSourceSize": {"x":336,"y":415,"w":263,"h":674}, "sourceSize": {"w":1240,"h":1754} }, "Models/Catsuit/LegRightSpread.png": @@ -40,41 +24,41 @@ "spriteSourceSize": {"x":444,"y":919,"w":151,"h":566}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Chastity/CyberPlug.png": +"Models/CyberArms/CuffLongMittenRightBoxtie.png": { - "frame": {"x":451,"y":2032,"w":35,"h":13}, + "frame": {"x":1756,"y":1406,"w":21,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":571,"y":911,"w":35,"h":13}, + "spriteSourceSize": {"x":461,"y":508,"w":21,"h":30}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayElbowLeftBoxtie.png": +"Models/CyberCuffs/DisplayElbowLeftWristtie.png": { - "frame": {"x":646,"y":1982,"w":28,"h":46}, + "frame": {"x":1230,"y":832,"w":29,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":749,"y":579,"w":28,"h":46}, + "spriteSourceSize": {"x":710,"y":612,"w":29,"h":44}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayElbowLeftWristtie.png": +"Models/CyberCuffs/DisplayWristLeftFree.png": { - "frame": {"x":1230,"y":638,"w":29,"h":44}, + "frame": {"x":1230,"y":385,"w":30,"h":36}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":710,"y":612,"w":29,"h":44}, + "spriteSourceSize": {"x":829,"y":744,"w":30,"h":36}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayWristLeftFree.png": +"Models/CyberCuffs/DisplayWristLeftYoked.png": { - "frame": {"x":1230,"y":209,"w":30,"h":36}, + "frame": {"x":1086,"y":1947,"w":19,"h":41}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":829,"y":744,"w":30,"h":36}, + "spriteSourceSize": {"x":918,"y":404,"w":19,"h":41}, "sourceSize": {"w":1240,"h":1754} }, "Models/CyberCuffs/LockElbowLeftYoked.png": { - "frame": {"x":1230,"y":686,"w":29,"h":33}, + "frame": {"x":1230,"y":880,"w":29,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":801,"y":499,"w":29,"h":33}, @@ -82,7 +66,7 @@ }, "Models/CyberCuffs/LockWristRightCrossed.png": { - "frame": {"x":1056,"y":2031,"w":30,"h":14}, + "frame": {"x":1230,"y":642,"w":30,"h":14}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":661,"y":592,"w":30,"h":14}, @@ -90,7 +74,7 @@ }, "Models/CyberCuffs/LockWristRightFree.png": { - "frame": {"x":1230,"y":447,"w":30,"h":15}, + "frame": {"x":1230,"y":623,"w":30,"h":15}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":373,"y":602,"w":30,"h":15}, @@ -98,7 +82,7 @@ }, "Models/CyberCuffs/ScreenWristLeftYoked.png": { - "frame": {"x":1230,"y":526,"w":29,"h":54}, + "frame": {"x":1230,"y":720,"w":29,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":910,"y":397,"w":29,"h":54}, @@ -106,151 +90,87 @@ }, "Models/CyberCuffs/ScreenWristRightYoked.png": { - "frame": {"x":1230,"y":466,"w":29,"h":56}, + "frame": {"x":1230,"y":660,"w":29,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":304,"y":396,"w":29,"h":56}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberMitts/LockLongMittenLeftFree.png": +"Models/CyberMitts/UpperCuffLongMittenRightBoxtie.png": { - "frame": {"x":529,"y":2032,"w":13,"h":13}, + "frame": {"x":1756,"y":1406,"w":21,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":838,"y":759,"w":13,"h":13}, + "spriteSourceSize": {"x":461,"y":508,"w":21,"h":30}, "sourceSize": {"w":1240,"h":1754} }, "Models/DivineCuffs/ElbowLeftLockBandUp.png": { - "frame": {"x":1230,"y":249,"w":30,"h":35}, + "frame": {"x":1230,"y":425,"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": +"Models/DivineCuffs/ElbowLeftLockBandWristtie.png": { - "frame": {"x":1230,"y":288,"w":30,"h":35}, + "frame": {"x":1086,"y":2029,"w":16,"h":16}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":533,"y":243,"w":30,"h":35}, + "spriteSourceSize": {"x":727,"y":643,"w":16,"h":16}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowRightLockPlateFront.png": +"Models/DivineCuffs/ElbowLeftLockFront.png": { - "frame": {"x":1230,"y":584,"w":29,"h":50}, + "frame": {"x":1230,"y":938,"w":28,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":421,"y":593,"w":29,"h":50}, + "spriteSourceSize": {"x":751,"y":601,"w":28,"h":58}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristRightDecoCleanFree.png": +"Models/DivineCuffs/ElbowRightLockBandUp.png": { - "frame": {"x":646,"y":1918,"w":30,"h":60}, + "frame": {"x":1230,"y":464,"w":30,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":365,"y":608,"w":30,"h":60}, + "spriteSourceSize": {"x":533,"y":243,"w":30,"h":35}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/WristRightDecoFree.png": +"Models/DivineCuffs/ElbowRightLockBoxtie.png": { - "frame": {"x":1230,"y":3,"w":30,"h":60}, + "frame": {"x":1230,"y":1000,"w":17,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":365,"y":608,"w":30,"h":60}, + "spriteSourceSize": {"x":453,"y":601,"w":17,"h":37}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Dress/MonocleLensLeft.png": +"Models/DivineCuffs/ElbowRightLockPlateFront.png": { - "frame": {"x":1982,"y":1058,"w":63,"h":59}, + "frame": {"x":1230,"y":778,"w":29,"h":50}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":609,"y":268,"w":63,"h":59}, + "spriteSourceSize": {"x":421,"y":593,"w":29,"h":50}, "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesDai1/RidgeAngry.png": -{ - "frame": {"x":490,"y":2032,"w":17,"h":13}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":584,"y":267,"w":17,"h":13}, - "sourceSize": {"w":703,"h":355} -}, -"Models/EyesK2/EyesAngry.png": -{ - "frame": {"x":1982,"y":1339,"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":1982,"y":1387,"w":63,"h":44}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":516,"y":269,"w":63,"h":44}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK2/EyesNeutral.png": -{ - "frame": {"x":1982,"y":2001,"w":62,"h":44}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":517,"y":269,"w":62,"h":44}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK2/EyesSurprised.png": -{ - "frame": {"x":1982,"y":1184,"w":63,"h":49}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":517,"y":265,"w":63,"h":49}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK2/WhitesEyesAngry.png": -{ - "frame": {"x":1982,"y":1435,"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":1982,"y":1483,"w":63,"h":44}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":516,"y":269,"w":63,"h":44}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK2/WhitesEyesSurprised.png": -{ - "frame": {"x":1982,"y":1237,"w":63,"h":49}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":517,"y":265,"w":63,"h":49}, - "sourceSize": {"w":781,"h":560} -}, -"Models/EyesK3/Eyes2Angry.png": +"Models/DivineCuffs/WristRightDecoCleanFree.png": { - "frame": {"x":1982,"y":1531,"w":63,"h":44}, + "frame": {"x":1230,"y":115,"w":30,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":617,"y":260,"w":63,"h":44}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":365,"y":608,"w":30,"h":60}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/EyesK3/WhitesEyes2Angry.png": +"Models/DivineCuffs/WristRightDecoFree.png": { - "frame": {"x":1982,"y":1579,"w":63,"h":44}, + "frame": {"x":1230,"y":179,"w":30,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":617,"y":260,"w":63,"h":44}, - "sourceSize": {"w":781,"h":560} + "spriteSourceSize": {"x":365,"y":608,"w":30,"h":60}, + "sourceSize": {"w":1240,"h":1754} }, "Models/FaceDask/Brows2Neutral.png": { - "frame": {"x":1230,"y":401,"w":30,"h":20}, + "frame": {"x":1230,"y":577,"w":30,"h":20}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":612,"y":232,"w":30,"h":20}, @@ -258,7 +178,7 @@ }, "Models/FaceDask/BrowsNeutral.png": { - "frame": {"x":1230,"y":425,"w":30,"h":18}, + "frame": {"x":1230,"y":601,"w":30,"h":18}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":539,"y":241,"w":30,"h":18}, @@ -266,39 +186,23 @@ }, "Models/FaceDask/BrowsSurprised.png": { - "frame": {"x":1230,"y":723,"w":29,"h":17}, + "frame": {"x":1230,"y":917,"w":29,"h":17}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":543,"y":254,"w":29,"h":17}, "sourceSize": {"w":700,"h":400} }, -"Models/FaceKjus/Brows2Surprised.png": -{ - "frame": {"x":546,"y":2032,"w":49,"h":12}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":613,"y":253,"w":49,"h":12}, - "sourceSize": {"w":813,"h":502} -}, -"Models/FaceKjus/BrowsAnnoyed.png": +"Models/FaceKjus/MouthDazed.png": { - "frame": {"x":408,"y":2032,"w":39,"h":13}, + "frame": {"x":526,"y":2032,"w":39,"h":11}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":534,"y":268,"w":39,"h":13}, - "sourceSize": {"w":765,"h":427} -}, -"Models/FaceKjus/BrowsSurprised.png": -{ - "frame": {"x":1006,"y":2031,"w":46,"h":14}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":524,"y":259,"w":46,"h":14}, - "sourceSize": {"w":738,"h":409} + "spriteSourceSize": {"x":588,"y":342,"w":39,"h":11}, + "sourceSize": {"w":706,"h":455} }, "Models/FaceKjus/MouthEmbarrassed.png": { - "frame": {"x":1230,"y":327,"w":30,"h":35}, + "frame": {"x":1230,"y":503,"w":30,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":589,"y":322,"w":30,"h":35}, @@ -306,138 +210,122 @@ }, "Models/FaceKoi/MouthDistracted.png": { - "frame": {"x":641,"y":2032,"w":35,"h":12}, + "frame": {"x":450,"y":2032,"w":35,"h":12}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":118,"y":242,"w":35,"h":12}, "sourceSize": {"w":321,"h":332} }, -"Models/Furniture/SarcoWebs.png": -{ - "frame": {"x":3,"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/FutureBox/BackFade.png": -{ - "frame": {"x":458,"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/GagLatex/LatexPlug.png": +"Models/FaceKoi/MouthPout.png": { - "frame": {"x":1230,"y":125,"w":30,"h":38}, + "frame": {"x":489,"y":2032,"w":33,"h":12}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":116,"y":238,"w":30,"h":38}, + "spriteSourceSize": {"x":116,"y":243,"w":33,"h":12}, "sourceSize": {"w":321,"h":332} }, -"Models/GagMetal/SciFiPlug.png": +"Models/FaceKoi/MouthSurprised.png": { - "frame": {"x":1230,"y":167,"w":30,"h":38}, + "frame": {"x":569,"y":2032,"w":27,"h":11}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":116,"y":238,"w":30,"h":38}, + "spriteSourceSize": {"x":121,"y":243,"w":27,"h":11}, "sourceSize": {"w":321,"h":332} }, -"Models/Gothic/HemLowerBackCrotchStrap.png": +"Models/Furniture/BedStraps.png": { - "frame": {"x":1982,"y":1716,"w":62,"h":189}, + "frame": {"x":1264,"y":3,"w":774,"h":1034}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":576,"y":911,"w":62,"h":189}, + "spriteSourceSize": {"x":247,"y":457,"w":774,"h":1034}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hair2/Hair3_FrontC.png": +"Models/Furniture/SarcoWebs.png": { - "frame": {"x":1264,"y":1742,"w":309,"h":303}, + "frame": {"x":3,"y":3,"w":451,"h":1509}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":478,"y":114,"w":309,"h":303}, + "spriteSourceSize": {"x":394,"y":101,"w":451,"h":1509}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Handcuffs/ThumbcuffsFront.png": +"Models/FutureBox/BackFade.png": { - "frame": {"x":1230,"y":366,"w":30,"h":31}, + "frame": {"x":458,"y":3,"w":768,"h":1472}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":571,"y":509,"w":30,"h":31}, + "spriteSourceSize": {"x":231,"y":121,"w":768,"h":1472}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Hood/BunnyEars.png": +"Models/FutureHarness/LockChest.png": { - "frame": {"x":680,"y":1806,"w":322,"h":239}, + "frame": {"x":1756,"y":1371,"w":21,"h":31}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":366,"y":17,"w":322,"h":239}, - "sourceSize": {"w":752,"h":479} + "spriteSourceSize": {"x":570,"y":497,"w":21,"h":31}, + "sourceSize": {"w":1240,"h":1754} }, -"Models/KittyLatex/KittyLatexTail.png": +"Models/GagFrilly/Duster.png": { - "frame": {"x":1230,"y":777,"w":432,"h":696}, + "frame": {"x":1619,"y":1371,"w":133,"h":103}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":539,"y":746,"w":432,"h":696}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":5,"y":213,"w":133,"h":103}, + "sourceSize": {"w":321,"h":332} }, -"Models/LeatherCuffs/BandElbowLeftFree.png": +"Models/GagLatex/LatexPlug.png": { - "frame": {"x":1577,"y":2013,"w":82,"h":32}, + "frame": {"x":1230,"y":301,"w":30,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":700,"y":594,"w":82,"h":32}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":116,"y":238,"w":30,"h":38}, + "sourceSize": {"w":321,"h":332} }, -"Models/LeatherCuffs/BandWristLeftFront.png": +"Models/GagMetal/SciFiPlug.png": { - "frame": {"x":1982,"y":1290,"w":63,"h":45}, + "frame": {"x":1230,"y":343,"w":30,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":626,"y":545,"w":63,"h":45}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":116,"y":238,"w":30,"h":38}, + "sourceSize": {"w":321,"h":332} }, -"Models/LeatherCuffs/HardwareAnkleLeftClosed.png": +"Models/Hair2/Hair2_Left.png": { - "frame": {"x":1982,"y":1627,"w":63,"h":26}, + "frame": {"x":972,"y":1806,"w":133,"h":137}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":610,"y":1444,"w":63,"h":26}, + "spriteSourceSize": {"x":650,"y":82,"w":133,"h":137}, "sourceSize": {"w":1240,"h":1754} }, -"Models/LeatherCuffs/WristLeftFree.png": +"Models/Hair2/Hair3_FrontA.png": { - "frame": {"x":1982,"y":1121,"w":63,"h":59}, + "frame": {"x":1230,"y":1041,"w":385,"h":433}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":797,"y":748,"w":63,"h":59}, + "spriteSourceSize": {"x":421,"y":97,"w":385,"h":433}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Maid/ShoeRightKneel.png": +"Models/Handcuffs/ThumbcuffsFront.png": { - "frame": {"x":1577,"y":1893,"w":85,"h":116}, + "frame": {"x":1230,"y":542,"w":30,"h":31}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":315,"y":845,"w":85,"h":116}, + "spriteSourceSize": {"x":571,"y":509,"w":30,"h":31}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Petsuit/LeftLegsKneelClosed.png": +"Models/Hood/BunnyEars.png": { - "frame": {"x":1666,"y":777,"w":379,"h":277}, + "frame": {"x":646,"y":1806,"w":322,"h":239}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":366,"y":816,"w":379,"h":277}, - "sourceSize": {"w":1240,"h":1754} + "spriteSourceSize": {"x":366,"y":17,"w":322,"h":239}, + "sourceSize": {"w":752,"h":479} }, -"Models/Ribbon/ArmStrapCrossed.png": +"Models/MaidKnightLight/DressSkirt.png": { - "frame": {"x":1982,"y":1909,"w":62,"h":88}, + "frame": {"x":1619,"y":1041,"w":426,"h":326}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":553,"y":602,"w":62,"h":88}, + "spriteSourceSize": {"x":392,"y":661,"w":426,"h":326}, "sourceSize": {"w":1240,"h":1754} }, "Models/Robes/PantsKneel.png": @@ -458,60 +346,12 @@ }, "Models/Rope/CrotchropeStrap.png": { - "frame": {"x":646,"y":1806,"w":30,"h":108}, + "frame": {"x":1230,"y":3,"w":30,"h":108}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":563,"y":809,"w":30,"h":108}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Skirts/MaidSkirt.png": -{ - "frame": {"x":1264,"y":1477,"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":1264,"y":1477,"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":1264,"y":1477,"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":1264,"y":1477,"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":1264,"y":1477,"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":1264,"y":1477,"w":398,"h":261}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":394,"y":731,"w":398,"h":261}, - "sourceSize": {"w":1240,"h":1754} -}, "Models/SMoonlight/BondageHarness.png": { "frame": {"x":408,"y":1516,"w":234,"h":512}, @@ -522,74 +362,42 @@ }, "Models/SteelCuffs/WristRightFree.png": { - "frame": {"x":1230,"y":67,"w":30,"h":54}, + "frame": {"x":1230,"y":243,"w":30,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":359,"y":607,"w":30,"h":54}, "sourceSize": {"w":1240,"h":1754} }, -"Models/TapeHeavy/HandLeftYoked.png": -{ - "frame": {"x":1006,"y":1806,"w":99,"h":121}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":853,"y":287,"w":99,"h":121}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/TapeMed/HandLeftYoked.png": -{ - "frame": {"x":1006,"y":1931,"w":99,"h":96}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":853,"y":287,"w":99,"h":96}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Warrior/ShoeRightKneel.png": -{ - "frame": {"x":1577,"y":1742,"w":85,"h":147}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":311,"y":855,"w":85,"h":147}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Wolf/BandAnkleLeftClosed.png": -{ - "frame": {"x":1982,"y":1687,"w":63,"h":25}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":597,"y":1441,"w":63,"h":25}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Wolf/BandAnkleLeftSpread.png": +"Models/Warrior/ArmbandBoxtie.png": { - "frame": {"x":1982,"y":1657,"w":63,"h":26}, + "frame": {"x":1086,"y":1992,"w":19,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":687,"y":1435,"w":63,"h":26}, + "spriteSourceSize": {"x":455,"y":510,"w":19,"h":33}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/BandAnkleRightClosed.png": +"Models/Warrior/ArmbandFree.png": { - "frame": {"x":1982,"y":1687,"w":63,"h":25}, + "frame": {"x":1756,"y":1440,"w":20,"h":34}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":544,"y":1438,"w":63,"h":25}, + "spriteSourceSize": {"x":461,"y":506,"w":20,"h":34}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/BandAnkleRightSpread.png": +"Models/Witch/ShoeRightSpread.png": { - "frame": {"x":1982,"y":1687,"w":63,"h":25}, + "frame": {"x":972,"y":1947,"w":110,"h":98}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":497,"y":1434,"w":63,"h":25}, + "spriteSourceSize": {"x":498,"y":1537,"w":110,"h":98}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Wolf/Module.png": +"Models/Witch/SkirtRuffleClosed.png": { - "frame": {"x":1230,"y":744,"w":28,"h":29}, + "frame": {"x":1264,"y":1478,"w":513,"h":567}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":631,"y":402,"w":28,"h":29}, + "spriteSourceSize": {"x":347,"y":821,"w":513,"h":567}, "sourceSize": {"w":1240,"h":1754} }, "Models/WolfCatsuit/LegPadsLeftClosed.png": @@ -623,7 +431,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas8.webp b/TextureAtlas/atlas8.webp index 299cf0f1e..bd4cbcfd7 100644 Binary files a/TextureAtlas/atlas8.webp and b/TextureAtlas/atlas8.webp differ diff --git a/TextureAtlas/atlas9.json b/TextureAtlas/atlas9.json index da3f2a0b1..acb6eb5ba 100644 --- a/TextureAtlas/atlas9.json +++ b/TextureAtlas/atlas9.json @@ -1,21 +1,5 @@ {"frames": { -"Models/Armbinder/StrapsRightWristtie.png": -{ - "frame": {"x":2024,"y":1318,"w":16,"h":11}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":469,"y":515,"w":16,"h":11}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/Bandit/WristLeftFront.png": -{ - "frame": {"x":1987,"y":1111,"w":58,"h":40}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":622,"y":543,"w":58,"h":40}, - "sourceSize": {"w":1240,"h":1754} -}, "Models/Body/ArmLeftCrossed.png": { "frame": {"x":307,"y":1404,"w":555,"h":639}, @@ -32,22 +16,6 @@ "spriteSourceSize": {"x":602,"y":919,"w":166,"h":708}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Body/LegRightSpread.png": -{ - "frame": {"x":1267,"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":1098,"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/Catsuit/ArmRightHogtie.png": { "frame": {"x":866,"y":1950,"w":49,"h":95}, @@ -80,6 +48,14 @@ "spriteSourceSize": {"x":712,"y":602,"w":58,"h":54}, "sourceSize": {"w":1240,"h":1754} }, +"Models/CyberArms/StrapsLongMittenRightFree.png": +{ + "frame": {"x":2006,"y":1813,"w":39,"h":43}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":449,"y":658,"w":39,"h":43}, + "sourceSize": {"w":1240,"h":1754} +}, "Models/CyberCuffs/AnkleRightClosed.png": { "frame": {"x":866,"y":1666,"w":58,"h":58}, @@ -88,60 +64,68 @@ "spriteSourceSize": {"x":539,"y":1428,"w":58,"h":58}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayElbowLeftFront.png": +"Models/CyberCuffs/ElbowLeftFront.png": { - "frame": {"x":2015,"y":1946,"w":28,"h":46}, + "frame": {"x":866,"y":1600,"w":58,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":751,"y":604,"w":28,"h":46}, + "spriteSourceSize": {"x":713,"y":594,"w":58,"h":62}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/DisplayElbowRightFront.png": +"Models/CyberCuffs/ScreenElbowLeftWristtie.png": { - "frame": {"x":2015,"y":1996,"w":27,"h":48}, + "frame": {"x":2006,"y":1753,"w":39,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":423,"y":595,"w":27,"h":48}, + "spriteSourceSize": {"x":703,"y":605,"w":39,"h":56}, "sourceSize": {"w":1240,"h":1754} }, -"Models/CyberCuffs/ElbowLeftFront.png": +"Models/CyberMitts/StrapsLongMittenRightFree.png": { - "frame": {"x":866,"y":1600,"w":58,"h":62}, + "frame": {"x":2006,"y":1813,"w":39,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":713,"y":594,"w":58,"h":62}, + "spriteSourceSize": {"x":449,"y":658,"w":39,"h":43}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleLeftLockSpread.png": +"Models/CyberPetsuit/LegsBeltsKneel.png": { - "frame": {"x":2015,"y":1826,"w":28,"h":56}, + "frame": {"x":1633,"y":649,"w":411,"h":663}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":738,"y":1422,"w":28,"h":56}, + "spriteSourceSize": {"x":308,"y":412,"w":411,"h":663}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/AnkleRightLockSpread.png": +"Models/CyberPetsuit/LegsBeltsKneelClosed.png": { - "frame": {"x":2015,"y":1886,"w":28,"h":56}, + "frame": {"x":1633,"y":649,"w":411,"h":663}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":480,"y":1422,"w":28,"h":56}, + "spriteSourceSize": {"x":308,"y":412,"w":411,"h":663}, "sourceSize": {"w":1240,"h":1754} }, -"Models/DivineCuffs/ElbowLeftLockFront.png": +"Models/DivineCuffs/ElbowRightLockFront.png": { - "frame": {"x":2015,"y":1764,"w":28,"h":58}, + "frame": {"x":2006,"y":1989,"w":35,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":751,"y":601,"w":28,"h":58}, + "spriteSourceSize": {"x":416,"y":592,"w":35,"h":56}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Elf/SkirtBack.png": +"Models/Dress/SkirtOverKneel.png": { - "frame": {"x":1633,"y":1016,"w":350,"h":316}, + "frame": {"x":1098,"y":1336,"w":435,"h":293}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":436,"y":781,"w":350,"h":316}, + "spriteSourceSize": {"x":390,"y":799,"w":435,"h":293}, + "sourceSize": {"w":1240,"h":1754} +}, +"Models/Elf/BandRightBoxtie.png": +{ + "frame": {"x":2006,"y":1860,"w":39,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":464,"y":494,"w":39,"h":40}, "sourceSize": {"w":1240,"h":1754} }, "Models/EyesK4/EyesAngry.png": @@ -160,13 +144,13 @@ "spriteSourceSize": {"x":522,"y":268,"w":58,"h":49}, "sourceSize": {"w":781,"h":560} }, -"Models/FaceKoi/MouthPout.png": +"Models/FaceKjus/Brows2Neutral.png": { - "frame": {"x":1987,"y":1318,"w":33,"h":12}, + "frame": {"x":1537,"y":1605,"w":81,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":116,"y":243,"w":33,"h":12}, - "sourceSize": {"w":321,"h":332} + "spriteSourceSize": {"x":575,"y":243,"w":81,"h":24}, + "sourceSize": {"w":725,"h":424} }, "Models/Furniture/Barrel.png": { @@ -184,28 +168,12 @@ "spriteSourceSize": {"x":113,"y":35,"w":701,"h":1397}, "sourceSize": {"w":1240,"h":1754} }, -"Models/GagLeather/BigBall.png": -{ - "frame": {"x":1987,"y":1064,"w":58,"h":43}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":103,"y":234,"w":58,"h":43}, - "sourceSize": {"w":321,"h":332} -}, -"Models/GagMetal/BigBall.png": -{ - "frame": {"x":1987,"y":1016,"w":58,"h":44}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":103,"y":233,"w":58,"h":44}, - "sourceSize": {"w":321,"h":332} -}, -"Models/Gothic/LaceLowerKneelCrotchStrap..png": +"Models/Gothic/HemUpper.png": { - "frame": {"x":1452,"y":1336,"w":593,"h":148}, + "frame": {"x":1445,"y":1633,"w":600,"h":116}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":296,"y":847,"w":593,"h":148}, + "spriteSourceSize": {"x":287,"y":941,"w":600,"h":116}, "sourceSize": {"w":1240,"h":1754} }, "Models/Hair/BackStraight.png": @@ -224,22 +192,6 @@ "spriteSourceSize": {"x":442,"y":113,"w":412,"h":642}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Heels/LeatherLeftSpread.png": -{ - "frame": {"x":1452,"y":1488,"w":125,"h":553}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":643,"y":1129,"w":125,"h":553}, - "sourceSize": {"w":1240,"h":1754} -}, -"Models/LatexPetsuit/LeftLegsBeltsKneelClosed.png": -{ - "frame": {"x":1710,"y":1488,"w":335,"h":272}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":366,"y":824,"w":335,"h":272}, - "sourceSize": {"w":1240,"h":1754} -}, "Models/LeatherCuffs/ElbowLeftFront.png": { "frame": {"x":866,"y":1530,"w":58,"h":66}, @@ -248,68 +200,68 @@ "spriteSourceSize": {"x":713,"y":602,"w":58,"h":66}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Petsuit/LeftLegsBeltsKneelClosed.png": +"Models/Petsuit/Arms.png": { - "frame": {"x":1710,"y":1488,"w":335,"h":272}, + "frame": {"x":1633,"y":1316,"w":411,"h":313}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":366,"y":824,"w":335,"h":272}, + "spriteSourceSize": {"x":386,"y":404,"w":411,"h":313}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Robes/SkirtKneelCrotchStrap.png": +"Models/Robes/PantsSpread.png": { - "frame": {"x":1633,"y":649,"w":410,"h":190}, + "frame": {"x":1098,"y":1633,"w":343,"h":411}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":390,"y":716,"w":410,"h":190}, + "spriteSourceSize": {"x":434,"y":710,"w":343,"h":411}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeShoulderLeftUp.png": +"Models/Rubber/ArmLeftBoxtie.png": { - "frame": {"x":1987,"y":1197,"w":57,"h":117}, + "frame": {"x":1537,"y":1336,"w":92,"h":265}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":670,"y":297,"w":57,"h":117}, + "spriteSourceSize": {"x":678,"y":423,"w":92,"h":265}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Slayer/CapeUp.png": +"Models/SteelCuffs/RimElbowRightUp.png": { - "frame": {"x":1710,"y":1764,"w":301,"h":281}, + "frame": {"x":708,"y":1336,"w":107,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":466,"y":262,"w":301,"h":281}, + "spriteSourceSize": {"x":448,"y":267,"w":107,"h":64}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SmoothHeels/LeftSpread.png": +"Models/TapeHeavy/HandRightBoxtie.png": { - "frame": {"x":1581,"y":1488,"w":125,"h":553}, + "frame": {"x":2006,"y":1904,"w":39,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":643,"y":1129,"w":125,"h":553}, + "spriteSourceSize": {"x":681,"y":679,"w":39,"h":39}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/RimElbowRightUp.png": +"Models/TapeMed/HandRightBoxtie.png": { - "frame": {"x":708,"y":1336,"w":107,"h":64}, + "frame": {"x":2006,"y":1904,"w":39,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":448,"y":267,"w":107,"h":64}, + "spriteSourceSize": {"x":681,"y":679,"w":39,"h":39}, "sourceSize": {"w":1240,"h":1754} }, -"Models/SteelCuffs/WristLeftFree.png": +"Models/Warrior/GloveRightBoxtie.png": { - "frame": {"x":1987,"y":1155,"w":58,"h":38}, + "frame": {"x":2006,"y":1947,"w":39,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":797,"y":765,"w":58,"h":38}, + "spriteSourceSize": {"x":678,"y":678,"w":39,"h":38}, "sourceSize": {"w":1240,"h":1754} }, -"Models/Warrior/ShoeLeftKneel.png": +"Models/Witch/SkirtSplitOverKneel.png": { - "frame": {"x":1633,"y":843,"w":408,"h":169}, + "frame": {"x":1098,"y":1336,"w":435,"h":293}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":495,"y":921,"w":408,"h":169}, + "spriteSourceSize": {"x":390,"y":799,"w":435,"h":293}, "sourceSize": {"w":1240,"h":1754} }, "Models/WolfCatsuit/ShoeLeftHogtie.png": @@ -319,6 +271,14 @@ "trimmed": true, "spriteSourceSize": {"x":725,"y":791,"w":58,"h":122}, "sourceSize": {"w":1240,"h":1754} +}, +"Models/Yukata/SkirtKneelCrotchStrap.png": +{ + "frame": {"x":1445,"y":1753,"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", @@ -327,7 +287,7 @@ "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" ], - "smartupdate": "$TexturePacker:SmartUpdate:e89eeefa1daeed455d49e8c4db927578:a8edbd059fb5408187a70954c8a6a813:020190614cb96e73b01b911d57fa5e2c$" + "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" ], + "smartupdate": "$TexturePacker:SmartUpdate:d7ca8f20aa2b402488556103c8964a69:d6348c791da199447b3b702ede9ee7f9:088b2bb9e8d2917f449e4ad5aa694cfc$" } } diff --git a/TextureAtlas/atlas9.webp b/TextureAtlas/atlas9.webp index b654ca72d..0de47b5ff 100644 Binary files a/TextureAtlas/atlas9.webp and b/TextureAtlas/atlas9.webp differ diff --git a/TextureAtlas/game0.json b/TextureAtlas/game0.json index fa0c753f7..5bf9e944b 100644 --- a/TextureAtlas/game0.json +++ b/TextureAtlas/game0.json @@ -983,6 +983,7 @@ "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/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"], @@ -1006,6 +1007,6 @@ "size": {"w":2048,"h":2048}, "scale": "1", "related_multi_packs": [ "game1.json", "game2.json", "game3.json", "game4.json", "game5.json" ], - "smartupdate": "$TexturePacker:SmartUpdate:76d784dd5df773dd2e2ebbec4425c54f:c9bd94d932662e62f0f3a8268b0ee477:54a7432a0665349a58c0c74f51e75c65$" + "smartupdate": "$TexturePacker:SmartUpdate:cd45dd3b98fe2739696c2386a6ef9b3c:9b1095aa07d6e300e2f0b7c24c8c3454:54a7432a0665349a58c0c74f51e75c65$" } } diff --git a/TextureAtlas/game1.json b/TextureAtlas/game1.json index c805cec49..f27cc3146 100644 --- a/TextureAtlas/game1.json +++ b/TextureAtlas/game1.json @@ -16,14 +16,6 @@ "spriteSourceSize": {"x":2,"y":92,"w":18,"h":18}, "sourceSize": {"w":144,"h":144} }, -"Game/Aura/Missiles3.png": -{ - "frame": {"x":2026,"y":1830,"w":18,"h":57}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":1,"y":54,"w":18,"h":57}, - "sourceSize": {"w":144,"h":144} -}, "Game/AutoStruggleOff.png": { "frame": {"x":2030,"y":764,"w":17,"h":34}, @@ -34,7 +26,7 @@ }, "Game/Bullets/ArrowBolt.png": { - "frame": {"x":2002,"y":297,"w":44,"h":15}, + "frame": {"x":413,"y":1468,"w":44,"h":15}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":27,"w":44,"h":15}, @@ -42,7 +34,7 @@ }, "Game/Bullets/ArrowBoltHeavy.png": { - "frame": {"x":2002,"y":297,"w":44,"h":15}, + "frame": {"x":413,"y":1468,"w":44,"h":15}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":27,"w":44,"h":15}, @@ -50,7 +42,7 @@ }, "Game/Bullets/ArrowBoltPistol.png": { - "frame": {"x":2002,"y":297,"w":44,"h":15}, + "frame": {"x":413,"y":1468,"w":44,"h":15}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":27,"w":44,"h":15}, @@ -218,7 +210,7 @@ }, "Game/Bullets/FissureTrail.png": { - "frame": {"x":1444,"y":571,"w":55,"h":69}, + "frame": {"x":1444,"y":643,"w":55,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":0,"w":55,"h":69}, @@ -272,14 +264,6 @@ "spriteSourceSize": {"x":6,"y":24,"w":60,"h":26}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/MagicRope.png": -{ - "frame": {"x":1148,"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/MiniCable.png": { "frame": {"x":1637,"y":2023,"w":62,"h":19}, @@ -320,14 +304,6 @@ "spriteSourceSize": {"x":5,"y":22,"w":58,"h":28}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/RubberMissile.png": -{ - "frame": {"x":1881,"y":2023,"w":55,"h":22}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":4,"y":25,"w":55,"h":22}, - "sourceSize": {"w":72,"h":72} -}, "Game/Bullets/RuneTrap_VacCube.png": { "frame": {"x":1967,"y":530,"w":74,"h":74}, @@ -496,6 +472,14 @@ "spriteSourceSize": {"x":49,"y":59,"w":23,"h":12}, "sourceSize": {"w":72,"h":72} }, +"Game/Conditions/Silence.png": +{ + "frame": {"x":497,"y":1468,"w":29,"h":16}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":9,"w":29,"h":16}, + "sourceSize": {"w":72,"h":72} +}, "Game/Down.png": { "frame": {"x":1571,"y":84,"w":60,"h":17}, @@ -506,7 +490,7 @@ }, "Game/EffectTiles/PressurePlate.png": { - "frame": {"x":489,"y":1468,"w":34,"h":13}, + "frame": {"x":616,"y":2034,"w":34,"h":13}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":45,"w":34,"h":13}, @@ -514,7 +498,7 @@ }, "Game/EffectTiles/PressurePlateHold.png": { - "frame": {"x":650,"y":2034,"w":26,"h":13}, + "frame": {"x":686,"y":2034,"w":26,"h":13}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":45,"w":26,"h":13}, @@ -522,15 +506,31 @@ }, "Game/EffectTiles/PressurePlateOneUse.png": { - "frame": {"x":489,"y":1468,"w":34,"h":13}, + "frame": {"x":616,"y":2034,"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":1701,"y":2023,"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":537,"y":1547,"w":22,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":6,"w":22,"h":60}, + "sourceSize": {"w":72,"h":72} +}, "Game/Enemies/Apprentice.png": { - "frame": {"x":2000,"y":1435,"w":43,"h":67}, + "frame": {"x":2000,"y":1504,"w":43,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":0,"w":43,"h":67}, @@ -538,7 +538,7 @@ }, "Game/Enemies/ApprenticeQuest.png": { - "frame": {"x":2000,"y":1435,"w":43,"h":67}, + "frame": {"x":2000,"y":1504,"w":43,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":0,"w":43,"h":67}, @@ -546,7 +546,7 @@ }, "Game/Enemies/Barricade.png": { - "frame": {"x":1444,"y":499,"w":51,"h":70}, + "frame": {"x":1444,"y":571,"w":51,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":1,"w":51,"h":70}, @@ -562,7 +562,7 @@ }, "Game/Enemies/Bat.png": { - "frame": {"x":1701,"y":2023,"w":58,"h":23}, + "frame": {"x":1764,"y":2023,"w":58,"h":23}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":15,"w":58,"h":23}, @@ -570,7 +570,7 @@ }, "Game/Enemies/BindableEnemies/Apprentice.png": { - "frame": {"x":2000,"y":1435,"w":43,"h":67}, + "frame": {"x":2000,"y":1504,"w":43,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":0,"w":43,"h":67}, @@ -578,7 +578,7 @@ }, "Game/Enemies/BindableEnemies/ApprenticeQuest.png": { - "frame": {"x":2000,"y":1435,"w":43,"h":67}, + "frame": {"x":2000,"y":1504,"w":43,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":0,"w":43,"h":67}, @@ -594,7 +594,7 @@ }, "Game/Enemies/BindableEnemies/WitchEarth.png": { - "frame": {"x":2002,"y":228,"w":44,"h":67}, + "frame": {"x":1998,"y":1264,"w":44,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":0,"w":44,"h":67}, @@ -610,7 +610,7 @@ }, "Game/Enemies/BindableEnemies/WitchWater.png": { - "frame": {"x":2000,"y":1504,"w":43,"h":67}, + "frame": {"x":2000,"y":1573,"w":43,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":0,"w":43,"h":67}, @@ -618,7 +618,7 @@ }, "Game/Enemies/BowyerQuest.png": { - "frame": {"x":2002,"y":88,"w":39,"h":68}, + "frame": {"x":2002,"y":159,"w":39,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":0,"w":39,"h":68}, @@ -626,15 +626,23 @@ }, "Game/Enemies/Bunny_Favourite.png": { - "frame": {"x":2002,"y":158,"w":30,"h":68}, + "frame": {"x":2002,"y":229,"w":30,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":0,"w":30,"h":68}, "sourceSize": {"w":72,"h":72} }, +"Game/Enemies/CuffedGirl3.png": +{ + "frame": {"x":1444,"y":499,"w":52,"h":70}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":0,"w":52,"h":70}, + "sourceSize": {"w":72,"h":72} +}, "Game/Enemies/CustomSprite/Selly.png": { - "frame": {"x":1998,"y":1264,"w":44,"h":67}, + "frame": {"x":2000,"y":1366,"w":44,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":0,"w":44,"h":67}, @@ -664,15 +672,15 @@ "spriteSourceSize": {"x":11,"y":3,"w":48,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/MaidforceMafia.png": +"Game/Enemies/ForcefieldBot.png": { - "frame": {"x":1998,"y":1195,"w":47,"h":67}, + "frame": {"x":1444,"y":785,"w":54,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":12,"y":0,"w":47,"h":67}, + "spriteSourceSize": {"x":9,"y":21,"w":54,"h":38}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/MaidforceQuest.png": +"Game/Enemies/MaidforceMafia.png": { "frame": {"x":1998,"y":1195,"w":47,"h":67}, "rotated": false, @@ -680,17 +688,17 @@ "spriteSourceSize": {"x":12,"y":0,"w":47,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/OrbOfLight.png": +"Game/Enemies/MaidforceQuest.png": { - "frame": {"x":1444,"y":784,"w":55,"h":39}, + "frame": {"x":1998,"y":1195,"w":47,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":12,"y":5,"w":55,"h":39}, + "spriteSourceSize": {"x":12,"y":0,"w":47,"h":67}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/WitchEarth.png": { - "frame": {"x":2000,"y":1366,"w":44,"h":67}, + "frame": {"x":2000,"y":1435,"w":44,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":0,"w":44,"h":67}, @@ -704,17 +712,9 @@ "spriteSourceSize": {"x":12,"y":0,"w":48,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/WitchShibari.png": -{ - "frame": {"x":2000,"y":1642,"w":41,"h":67}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":19,"y":0,"w":41,"h":67}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/WitchWater.png": { - "frame": {"x":2000,"y":1573,"w":43,"h":67}, + "frame": {"x":2000,"y":1642,"w":43,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":0,"w":43,"h":67}, @@ -730,7 +730,7 @@ }, "Game/EnemiesBound/CyborgGuardian.png": { - "frame": {"x":1444,"y":642,"w":40,"h":69}, + "frame": {"x":1444,"y":714,"w":40,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":1,"w":40,"h":69}, @@ -762,7 +762,7 @@ }, "Game/EnemiesBound/Head/TemplateHead.png": { - "frame": {"x":1486,"y":696,"w":13,"h":14}, + "frame": {"x":1486,"y":768,"w":13,"h":14}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":28,"y":18,"w":13,"h":14}, @@ -770,7 +770,7 @@ }, "Game/EnemiesBound/LesserSkeleton.png": { - "frame": {"x":537,"y":1547,"w":22,"h":58}, + "frame": {"x":537,"y":1609,"w":22,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":26,"y":8,"w":22,"h":58}, @@ -792,17 +792,9 @@ "spriteSourceSize": {"x":5,"y":35,"w":60,"h":28}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/Skeleton.png": -{ - "frame": {"x":537,"y":1607,"w":22,"h":58}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":26,"y":8,"w":22,"h":58}, - "sourceSize": {"w":72,"h":72} -}, "Game/FloorGeneric/Bars.png": { - "frame": {"x":1477,"y":713,"w":18,"h":64}, + "frame": {"x":2026,"y":1711,"w":18,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":27,"y":8,"w":18,"h":64}, @@ -874,7 +866,7 @@ }, "Game/HideTrue.png": { - "frame": {"x":451,"y":1468,"w":36,"h":13}, + "frame": {"x":459,"y":1468,"w":36,"h":13}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":25,"w":36,"h":13}, @@ -898,7 +890,7 @@ }, "Game/Items/Arbiter.png": { - "frame": {"x":1444,"y":713,"w":31,"h":69}, + "frame": {"x":2002,"y":88,"w":31,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":2,"w":31,"h":69}, @@ -906,7 +898,7 @@ }, "Game/Items/BoltCutters.png": { - "frame": {"x":1821,"y":2023,"w":58,"h":18}, + "frame": {"x":1148,"y":2018,"w":58,"h":18}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":26,"w":58,"h":18}, @@ -922,7 +914,7 @@ }, "Game/Items/DildoBat.png": { - "frame": {"x":2026,"y":1771,"w":21,"h":57}, + "frame": {"x":2026,"y":1837,"w":21,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":26,"y":9,"w":21,"h":57}, @@ -930,7 +922,7 @@ }, "Game/Items/DildoBatPlus.png": { - "frame": {"x":2026,"y":1711,"w":21,"h":58}, + "frame": {"x":2026,"y":1777,"w":21,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":26,"y":6,"w":21,"h":58}, @@ -962,12 +954,20 @@ }, "Game/Items/Group/ItemHead.png": { - "frame": {"x":413,"y":1468,"w":36,"h":14}, + "frame": {"x":2002,"y":299,"w":36,"h":14}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":36,"y":46,"w":36,"h":14}, "sourceSize": {"w":72,"h":72} }, +"Game/Items/Hammer.png": +{ + "frame": {"x":1884,"y":2023,"w":50,"h":24}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":22,"w":50,"h":24}, + "sourceSize": {"w":72,"h":72} +}, "Game/Items/MagicHammer.png": { "frame": {"x":380,"y":2016,"w":63,"h":28}, @@ -978,7 +978,7 @@ }, "Game/Items/MistressKey.png": { - "frame": {"x":1761,"y":2023,"w":58,"h":19}, + "frame": {"x":1824,"y":2023,"w":58,"h":19}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":24,"w":58,"h":19}, @@ -1170,7 +1170,7 @@ }, "Game/Lock.png": { - "frame": {"x":2034,"y":203,"w":13,"h":17}, + "frame": {"x":2034,"y":274,"w":13,"h":17}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":29,"y":0,"w":13,"h":17}, @@ -1250,7 +1250,7 @@ }, "Game/Poses/BlushNeutral.png": { - "frame": {"x":616,"y":2034,"w":32,"h":13}, + "frame": {"x":652,"y":2034,"w":32,"h":13}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":17,"w":32,"h":13}, @@ -1266,7 +1266,7 @@ }, "Game/Poses/Closed.png": { - "frame": {"x":1486,"y":642,"w":13,"h":25}, + "frame": {"x":1486,"y":714,"w":13,"h":25}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":10,"w":13,"h":25}, @@ -1274,7 +1274,7 @@ }, "Game/Poses/Eyes2Neutral.png": { - "frame": {"x":2034,"y":824,"w":12,"h":15}, + "frame": {"x":2035,"y":88,"w":12,"h":15}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":27,"y":14,"w":12,"h":15}, @@ -1282,7 +1282,7 @@ }, "Game/Poses/EyesNeutral.png": { - "frame": {"x":2034,"y":841,"w":11,"h":15}, + "frame": {"x":2035,"y":105,"w":11,"h":15}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":14,"w":11,"h":15}, @@ -1354,7 +1354,7 @@ }, "Game/Spells/CanUpcast.png": { - "frame": {"x":678,"y":2034,"w":21,"h":13}, + "frame": {"x":714,"y":2034,"w":21,"h":13}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":21,"h":13}, @@ -1386,7 +1386,7 @@ }, "Game/Spells/Fissure.png": { - "frame": {"x":1444,"y":571,"w":55,"h":69}, + "frame": {"x":1444,"y":643,"w":55,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":0,"w":55,"h":69}, @@ -1418,7 +1418,7 @@ }, "Game/Spells/ZeroResistance.png": { - "frame": {"x":537,"y":1667,"w":23,"h":40}, + "frame": {"x":537,"y":1669,"w":23,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":16,"w":23,"h":40}, @@ -1432,6 +1432,14 @@ "spriteSourceSize": {"x":9,"y":4,"w":32,"h":47}, "sourceSize": {"w":42,"h":56} }, +"Game/UI/CheckSmall.png": +{ + "frame": {"x":2026,"y":1896,"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/EscapeRisk.png": { "frame": {"x":1423,"y":862,"w":18,"h":66}, @@ -1474,7 +1482,7 @@ }, "Game/UI/NoSprint.png": { - "frame": {"x":2034,"y":158,"w":13,"h":21}, + "frame": {"x":2034,"y":229,"w":13,"h":21}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":19,"w":13,"h":21}, @@ -1506,7 +1514,7 @@ }, "Game/UI/TickPerk.png": { - "frame": {"x":1486,"y":669,"w":13,"h":25}, + "frame": {"x":1486,"y":741,"w":13,"h":25}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":5,"w":13,"h":25}, @@ -1514,23 +1522,15 @@ }, "Game/UI/UsePotionAncient.png": { - "frame": {"x":2034,"y":181,"w":11,"h":20}, + "frame": {"x":2034,"y":252,"w":11,"h":20}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":4,"w":11,"h":20}, "sourceSize": {"w":44,"h":26} }, -"Game/UI/UsePotionFrigid.png": -{ - "frame": {"x":2026,"y":1889,"w":19,"h":22}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":3,"y":2,"w":19,"h":22}, - "sourceSize": {"w":44,"h":26} -}, "Game/UI/Wait.png": { - "frame": {"x":537,"y":1667,"w":23,"h":40}, + "frame": {"x":537,"y":1669,"w":23,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":10,"w":23,"h":40}, @@ -1576,6 +1576,6 @@ "size": {"w":2048,"h":2048}, "scale": "1", "related_multi_packs": [ "game0.json", "game2.json", "game3.json", "game4.json", "game5.json" ], - "smartupdate": "$TexturePacker:SmartUpdate:76d784dd5df773dd2e2ebbec4425c54f:c9bd94d932662e62f0f3a8268b0ee477:54a7432a0665349a58c0c74f51e75c65$" + "smartupdate": "$TexturePacker:SmartUpdate:cd45dd3b98fe2739696c2386a6ef9b3c:9b1095aa07d6e300e2f0b7c24c8c3454:54a7432a0665349a58c0c74f51e75c65$" } } diff --git a/TextureAtlas/game1.png b/TextureAtlas/game1.png index 91f7b04df..b332aecc8 100644 Binary files a/TextureAtlas/game1.png and b/TextureAtlas/game1.png differ diff --git a/TextureAtlas/game2.json b/TextureAtlas/game2.json index 5a0fc1759..e97751a5a 100644 --- a/TextureAtlas/game2.json +++ b/TextureAtlas/game2.json @@ -1,16 +1,8 @@ {"frames": { -"Game/Aura/Airbender1.png": -{ - "frame": {"x":988,"y":1264,"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":988,"y":1118,"w":19,"h":36}, + "frame": {"x":988,"y":1177,"w":19,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":75,"w":19,"h":36}, @@ -26,55 +18,47 @@ }, "Game/Aura/BondageBuster.png": { - "frame": {"x":1941,"y":536,"w":73,"h":74}, + "frame": {"x":1940,"y":830,"w":73,"h":74}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":36,"y":35,"w":73,"h":74}, "sourceSize": {"w":144,"h":144} }, -"Game/Aura/Missiles2.png": +"Game/Aura/DoublePlugged.png": { - "frame": {"x":988,"y":1078,"w":18,"h":38}, + "frame": {"x":2015,"y":963,"w":30,"h":17}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":73,"w":18,"h":38}, + "spriteSourceSize": {"x":57,"y":127,"w":30,"h":17}, "sourceSize": {"w":144,"h":144} }, -"Game/Aura/Plugged.png": +"Game/Aura/Missiles2.png": { - "frame": {"x":854,"y":1568,"w":14,"h":17}, + "frame": {"x":988,"y":1137,"w":18,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":65,"y":127,"w":14,"h":17}, + "spriteSourceSize": {"x":1,"y":73,"w":18,"h":38}, "sourceSize": {"w":144,"h":144} }, -"Game/Bullets/AllyCrackle.png": -{ - "frame": {"x":1944,"y":688,"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": +"Game/Aura/Missiles3.png": { - "frame": {"x":1944,"y":688,"w":72,"h":72}, + "frame": {"x":988,"y":1078,"w":18,"h":57}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, - "sourceSize": {"w":72,"h":72} + "trimmed": true, + "spriteSourceSize": {"x":1,"y":54,"w":18,"h":57}, + "sourceSize": {"w":144,"h":144} }, -"Game/Bullets/AllyFireboltHit.png": +"Game/Aura/Plugged.png": { - "frame": {"x":1944,"y":762,"w":72,"h":72}, + "frame": {"x":854,"y":1568,"w":14,"h":17}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, - "sourceSize": {"w":72,"h":72} + "trimmed": true, + "spriteSourceSize": {"x":65,"y":127,"w":14,"h":17}, + "sourceSize": {"w":144,"h":144} }, "Game/Bullets/BigBoulder.png": { - "frame": {"x":1635,"y":1912,"w":159,"h":118}, + "frame": {"x":1635,"y":1916,"w":159,"h":118}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":49,"w":159,"h":118}, @@ -130,7 +114,7 @@ }, "Game/Bullets/BubbleBurstLatexHit.png": { - "frame": {"x":1733,"y":836,"w":205,"h":206}, + "frame": {"x":1733,"y":839,"w":205,"h":206}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":5,"w":205,"h":206}, @@ -138,7 +122,7 @@ }, "Game/Bullets/BubbleBurstSlimeHit.png": { - "frame": {"x":1734,"y":391,"w":205,"h":206}, + "frame": {"x":1734,"y":196,"w":205,"h":206}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":5,"w":205,"h":206}, @@ -154,12 +138,20 @@ }, "Game/Bullets/CrystalShockBoltHit.png": { - "frame": {"x":1644,"y":1698,"w":211,"h":212}, + "frame": {"x":1644,"y":1702,"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":1941,"y":333,"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":1088,"y":425,"w":214,"h":210}, @@ -184,14 +176,6 @@ "spriteSourceSize": {"x":0,"y":0,"w":210,"h":216}, "sourceSize": {"w":216,"h":216} }, -"Game/Bullets/DragonIceBolt.png": -{ - "frame": {"x":1940,"y":1001,"w":72,"h":40}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":17,"w":72,"h":40}, - "sourceSize": {"w":72,"h":72} -}, "Game/Bullets/DynamiteItemHit.png": { "frame": {"x":437,"y":1308,"w":216,"h":207}, @@ -202,7 +186,7 @@ }, "Game/Bullets/Earthfield.png": { - "frame": {"x":1849,"y":1483,"w":196,"h":208}, + "frame": {"x":1849,"y":1482,"w":196,"h":208}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":8,"w":196,"h":208}, @@ -210,7 +194,7 @@ }, "Game/Bullets/EarthfieldHit.png": { - "frame": {"x":1734,"y":181,"w":196,"h":208}, + "frame": {"x":1733,"y":629,"w":196,"h":208}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":8,"w":196,"h":208}, @@ -218,7 +202,7 @@ }, "Game/Bullets/Earthrune.png": { - "frame": {"x":1849,"y":1483,"w":196,"h":208}, + "frame": {"x":1849,"y":1482,"w":196,"h":208}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":8,"w":196,"h":208}, @@ -226,7 +210,7 @@ }, "Game/Bullets/EarthruneHit.png": { - "frame": {"x":1734,"y":181,"w":196,"h":208}, + "frame": {"x":1733,"y":629,"w":196,"h":208}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":8,"w":196,"h":208}, @@ -288,6 +272,14 @@ "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, "sourceSize": {"w":216,"h":216} }, +"Game/Bullets/EncaseBoltDrone.png": +{ + "frame": {"x":1881,"y":607,"w":41,"h":20}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":27,"w":41,"h":20}, + "sourceSize": {"w":72,"h":72} +}, "Game/Bullets/EnemyFlash.png": { "frame": {"x":350,"y":1963,"w":83,"h":79}, @@ -330,7 +322,7 @@ }, "Game/Bullets/FeatherCloudHit.png": { - "frame": {"x":1500,"y":1,"w":202,"h":193}, + "frame": {"x":1704,"y":1,"w":202,"h":193}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":19,"w":202,"h":193}, @@ -344,17 +336,9 @@ "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, "sourceSize": {"w":216,"h":216} }, -"Game/Bullets/FireboltHit.png": -{ - "frame": {"x":1944,"y":762,"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":1944,"y":612,"w":73,"h":74}, + "frame": {"x":1940,"y":906,"w":73,"h":74}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":72,"y":71,"w":73,"h":74}, @@ -368,14 +352,6 @@ "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, "sourceSize": {"w":216,"h":216} }, -"Game/Bullets/FireexpHit.png": -{ - "frame": {"x":1944,"y":762,"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":219,"y":219,"w":216,"h":216}, @@ -410,10 +386,10 @@ }, "Game/Bullets/FlashFreezeHit.png": { - "frame": {"x":1654,"y":1058,"w":200,"h":211}, + "frame": {"x":1500,"y":1,"w":202,"h":202}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":7,"y":0,"w":200,"h":211}, + "spriteSourceSize": {"x":7,"y":7,"w":202,"h":202}, "sourceSize": {"w":212,"h":212} }, "Game/Bullets/FlashHit.png": @@ -426,7 +402,7 @@ }, "Game/Bullets/Glue.png": { - "frame": {"x":1903,"y":1,"w":136,"h":177}, + "frame": {"x":1908,"y":1,"w":136,"h":177}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":43,"y":20,"w":136,"h":177}, @@ -450,7 +426,7 @@ }, "Game/Bullets/GravityPullEarthHit.png": { - "frame": {"x":1519,"y":196,"w":213,"h":213}, + "frame": {"x":1519,"y":205,"w":213,"h":213}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":213,"h":213}, @@ -488,25 +464,9 @@ "spriteSourceSize": {"x":0,"y":1,"w":212,"h":211}, "sourceSize": {"w":212,"h":212} }, -"Game/Bullets/HeatBoltHit.png": -{ - "frame": {"x":1944,"y":762,"w":72,"h":72}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Bullets/Icebolt.png": -{ - "frame": {"x":1940,"y":1001,"w":72,"h":40}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":17,"w":72,"h":40}, - "sourceSize": {"w":72,"h":72} -}, "Game/Bullets/IceBreath.png": { - "frame": {"x":1857,"y":1693,"w":182,"h":205}, + "frame": {"x":1857,"y":1692,"w":182,"h":205}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":4,"w":182,"h":205}, @@ -530,7 +490,7 @@ }, "Game/Bullets/Icerune.png": { - "frame": {"x":1856,"y":1044,"w":182,"h":205}, + "frame": {"x":1865,"y":1047,"w":182,"h":205}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":4,"w":182,"h":205}, @@ -552,30 +512,6 @@ "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, "sourceSize": {"w":216,"h":216} }, -"Game/Bullets/Knife.png": -{ - "frame": {"x":2002,"y":1449,"w":43,"h":32}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":15,"y":24,"w":43,"h":32}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Bullets/LightningBolt.png": -{ - "frame": {"x":1944,"y":688,"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":1944,"y":688,"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":219,"y":873,"w":216,"h":216}, @@ -616,6 +552,14 @@ "spriteSourceSize": {"x":2,"y":2,"w":213,"h":213}, "sourceSize": {"w":216,"h":216} }, +"Game/Bullets/MagicRope.png": +{ + "frame": {"x":1865,"y":1452,"w":57,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":22,"w":57,"h":27}, + "sourceSize": {"w":72,"h":72} +}, "Game/Bullets/MinerBombHit.png": { "frame": {"x":437,"y":1308,"w":216,"h":207}, @@ -666,7 +610,7 @@ }, "Game/Bullets/RestrainingBolt.png": { - "frame": {"x":1857,"y":2029,"w":56,"h":18}, + "frame": {"x":1857,"y":2028,"w":56,"h":18}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":26,"w":56,"h":18}, @@ -674,7 +618,7 @@ }, "Game/Bullets/RibbonBurst.png": { - "frame": {"x":1704,"y":1,"w":197,"h":178}, + "frame": {"x":655,"y":1510,"w":197,"h":178}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":22,"w":197,"h":178}, @@ -696,6 +640,14 @@ "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, "sourceSize": {"w":216,"h":216} }, +"Game/Bullets/RubberMissile.png": +{ + "frame": {"x":1249,"y":2018,"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":219,"y":1527,"w":216,"h":216}, @@ -826,7 +778,7 @@ }, "Game/Bullets/SporesHappyHit.png": { - "frame": {"x":1644,"y":1483,"w":203,"h":213}, + "frame": {"x":1644,"y":1487,"w":203,"h":213}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":3,"w":203,"h":213}, @@ -922,7 +874,7 @@ }, "Game/Bullets/TrapCableWeakHit.png": { - "frame": {"x":1932,"y":180,"w":111,"h":143}, + "frame": {"x":1932,"y":404,"w":111,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":51,"y":22,"w":111,"h":143}, @@ -938,7 +890,7 @@ }, "Game/Bullets/TrapLatexBallHit.png": { - "frame": {"x":1733,"y":836,"w":205,"h":206}, + "frame": {"x":1733,"y":839,"w":205,"h":206}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":5,"w":205,"h":206}, @@ -946,7 +898,7 @@ }, "Game/Bullets/TrapLatexBubbleHit.png": { - "frame": {"x":1733,"y":836,"w":205,"h":206}, + "frame": {"x":1733,"y":839,"w":205,"h":206}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":5,"w":205,"h":206}, @@ -960,9 +912,17 @@ "spriteSourceSize": {"x":0,"y":0,"w":216,"h":216}, "sourceSize": {"w":216,"h":216} }, +"Game/Bullets/TrapLustCloud.png": +{ + "frame": {"x":1734,"y":404,"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":1644,"y":1483,"w":203,"h":213}, + "frame": {"x":1644,"y":1487,"w":203,"h":213}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":3,"w":203,"h":213}, @@ -970,7 +930,7 @@ }, "Game/Bullets/TrapMagicChainsWeak.png": { - "frame": {"x":1654,"y":1271,"w":209,"h":210}, + "frame": {"x":1654,"y":1058,"w":209,"h":210}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":6,"w":209,"h":210}, @@ -978,28 +938,12 @@ }, "Game/Bullets/TrapMummyWeak.png": { - "frame": {"x":1865,"y":1251,"w":182,"h":196}, + "frame": {"x":1865,"y":1254,"w":182,"h":196}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":8,"w":182,"h":196}, "sourceSize": {"w":216,"h":216} }, -"Game/Bullets/TrapObsidian.png": -{ - "frame": {"x":999,"y":1294,"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":999,"y":1294,"w":184,"h":178}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":15,"y":12,"w":184,"h":178}, - "sourceSize": {"w":216,"h":216} -}, "Game/Bullets/TrapSCloudHit.png": { "frame": {"x":1430,"y":1705,"w":203,"h":213}, @@ -1010,7 +954,7 @@ }, "Game/Bullets/TrapShackleWeak.png": { - "frame": {"x":1733,"y":624,"w":209,"h":210}, + "frame": {"x":1654,"y":1270,"w":209,"h":210}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":6,"w":209,"h":210}, @@ -1018,7 +962,7 @@ }, "Game/Bullets/TrapShadowLatex.png": { - "frame": {"x":1520,"y":411,"w":212,"h":211}, + "frame": {"x":1519,"y":845,"w":212,"h":211}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":212,"h":211}, @@ -1026,7 +970,7 @@ }, "Game/Bullets/TrapShadowLatexHit.png": { - "frame": {"x":1519,"y":845,"w":212,"h":211}, + "frame": {"x":1440,"y":1274,"w":212,"h":211}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":212,"h":211}, @@ -1042,7 +986,7 @@ }, "Game/Bullets/TremorHit.png": { - "frame": {"x":655,"y":1510,"w":197,"h":178}, + "frame": {"x":999,"y":1294,"w":197,"h":178}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":7,"w":197,"h":178}, @@ -1056,14 +1000,6 @@ "spriteSourceSize": {"x":1,"y":21,"w":71,"h":35}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/Wall.png": -{ - "frame": {"x":1944,"y":688,"w":72,"h":72}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, - "sourceSize": {"w":72,"h":72} -}, "Game/Bullets/WaterRune.png": { "frame": {"x":1304,"y":420,"w":214,"h":210}, @@ -1074,7 +1010,7 @@ }, "Game/Bullets/WaterRuneHit.png": { - "frame": {"x":1440,"y":1274,"w":212,"h":207}, + "frame": {"x":1520,"y":420,"w":212,"h":207}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":7,"w":212,"h":207}, @@ -1152,36 +1088,20 @@ "spriteSourceSize": {"x":2,"y":0,"w":214,"h":216}, "sourceSize": {"w":216,"h":216} }, -"Game/Conditions/ShieldBuff.png": +"Game/Conditions/BlockBuff.png": { - "frame": {"x":2021,"y":2024,"w":25,"h":23}, + "frame": {"x":2027,"y":238,"w":18,"h":17}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":23,"y":0,"w":25,"h":23}, + "spriteSourceSize": {"x":52,"y":1,"w":18,"h":17}, "sourceSize": {"w":72,"h":72} }, -"Game/Conditions/Silence.png": -{ - "frame": {"x":2018,"y":817,"w":29,"h":16}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":2,"y":9,"w":29,"h":16}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Conditions/Slow.png": -{ - "frame": {"x":2019,"y":665,"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": +"Game/Conditions/ShieldBuff.png": { - "frame": {"x":2019,"y":665,"w":28,"h":21}, + "frame": {"x":2021,"y":2023,"w":25,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "spriteSourceSize": {"x":23,"y":0,"w":25,"h":23}, "sourceSize": {"w":72,"h":72} }, "Game/Conditions/vp.png": @@ -1192,161 +1112,33 @@ "spriteSourceSize": {"x":29,"y":8,"w":14,"h":26}, "sourceSize": {"w":72,"h":72} }, -"Game/DamageTypes/crush.png": -{ - "frame": {"x":2019,"y":665,"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":2019,"y":665,"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":2019,"y":665,"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":2019,"y":665,"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":2019,"y":665,"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":2019,"y":665,"w":28,"h":21}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, - "sourceSize": {"w":72,"h":72} -}, -"Game/DamageTypes/magic.png": -{ - "frame": {"x":2019,"y":665,"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":2019,"y":665,"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":2019,"y":665,"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":2019,"y":665,"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":2019,"y":665,"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":2019,"y":665,"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":2019,"y":665,"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":2019,"y":665,"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":2019,"y":665,"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":2019,"y":665,"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": +"Game/DamageTypes/cold.png": { - "frame": {"x":2019,"y":665,"w":28,"h":21}, + "frame": {"x":2032,"y":605,"w":15,"h":25}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "spriteSourceSize": {"x":3,"y":47,"w":15,"h":25}, "sourceSize": {"w":72,"h":72} }, -"Game/DamageTypes/unstoppable.png": +"Game/DamageTypes/frost.png": { - "frame": {"x":2019,"y":665,"w":28,"h":21}, + "frame": {"x":2032,"y":632,"w":15,"h":17}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "spriteSourceSize": {"x":2,"y":52,"w":15,"h":17}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Angel.png": +"Game/DamageTypes/ice.png": { - "frame": {"x":610,"y":1916,"w":36,"h":67}, + "frame": {"x":2032,"y":632,"w":15,"h":17}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":20,"y":3,"w":36,"h":67}, + "spriteSourceSize": {"x":2,"y":52,"w":15,"h":17}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/AnimBlindfold.png": { - "frame": {"x":1192,"y":2018,"w":55,"h":27}, + "frame": {"x":1924,"y":1452,"w":55,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":22,"w":55,"h":27}, @@ -1354,82 +1146,66 @@ }, "Game/Enemies/AnimHarness.png": { - "frame": {"x":1796,"y":1912,"w":59,"h":71}, + "frame": {"x":1796,"y":1916,"w":59,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":0,"w":59,"h":71}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/FastZombie.png": -{ - "frame": {"x":1185,"y":1294,"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": +"Game/Enemies/BarricadeShadowMetal.png": { - "frame": {"x":2018,"y":688,"w":28,"h":64}, + "frame": {"x":1940,"y":982,"w":72,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":25,"y":3,"w":28,"h":64}, + "spriteSourceSize": {"x":0,"y":12,"w":72,"h":58}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Chef.png": +"Game/Enemies/CustomSprite/Nara.png": { - "frame": {"x":1185,"y":1362,"w":38,"h":66}, + "frame": {"x":2015,"y":333,"w":32,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":13,"y":1,"w":38,"h":66}, + "spriteSourceSize": {"x":19,"y":3,"w":32,"h":66}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/FastZombie.png": +"Game/Enemies/CustomSpriteBound/Melissa.png": { - "frame": {"x":1185,"y":1294,"w":38,"h":66}, + "frame": {"x":1401,"y":1764,"w":27,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":16,"y":1,"w":38,"h":66}, + "spriteSourceSize": {"x":25,"y":8,"w":27,"h":53}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/Gag.png": { - "frame": {"x":1249,"y":2018,"w":55,"h":27}, + "frame": {"x":1981,"y":1452,"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":2018,"y":688,"w":28,"h":64}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":25,"y":3,"w":28,"h":64}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Enemies/Jailer.png": +"Game/Enemies/LesserSkeleton.png": { - "frame": {"x":2018,"y":688,"w":28,"h":64}, + "frame": {"x":2021,"y":1963,"w":26,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":25,"y":3,"w":28,"h":64}, + "spriteSourceSize": {"x":25,"y":8,"w":26,"h":58}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/LesserSkeleton.png": +"Game/Enemies/Monolith.png": { - "frame": {"x":2021,"y":1964,"w":26,"h":58}, + "frame": {"x":1401,"y":1706,"w":21,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":25,"y":8,"w":26,"h":58}, + "spriteSourceSize": {"x":26,"y":7,"w":21,"h":56}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Monolith.png": +"Game/Enemies/PlayerGag.png": { - "frame": {"x":1401,"y":1824,"w":21,"h":56}, + "frame": {"x":1192,"y":2018,"w":55,"h":27}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":26,"y":7,"w":21,"h":56}, + "spriteSourceSize": {"x":8,"y":22,"w":55,"h":27}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/PrisonerBandit.png": @@ -1448,22 +1224,30 @@ "spriteSourceSize": {"x":11,"y":32,"w":47,"h":19}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/ShopkeeperStart.png": +"Game/Enemies/Slime.png": { - "frame": {"x":1796,"y":1985,"w":59,"h":62}, + "frame": {"x":1796,"y":1989,"w":59,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":9,"w":59,"h":62}, + "spriteSourceSize": {"x":8,"y":7,"w":59,"h":58}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/SummonedDrone.png": { - "frame": {"x":988,"y":1156,"w":19,"h":36}, + "frame": {"x":988,"y":1215,"w":19,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":26,"y":22,"w":19,"h":36}, "sourceSize": {"w":72,"h":72} }, +"Game/Enemies/WitchShibari.png": +{ + "frame": {"x":610,"y":1916,"w":41,"h":67}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":0,"w":41,"h":67}, + "sourceSize": {"w":72,"h":72} +}, "Game/EnemiesBound/BanditPet.png": { "frame": {"x":800,"y":2012,"w":37,"h":35}, @@ -1472,52 +1256,68 @@ "spriteSourceSize": {"x":21,"y":23,"w":37,"h":35}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/Dressmaker.png": +"Game/EnemiesBound/FastZombie.png": { - "frame": {"x":2018,"y":754,"w":29,"h":61}, + "frame": {"x":2017,"y":257,"w":29,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":22,"y":7,"w":29,"h":61}, + "spriteSourceSize": {"x":25,"y":1,"w":29,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/FastZombie.png": +"Game/EnemiesBound/GreaterSkeleton.png": { - "frame": {"x":2016,"y":536,"w":29,"h":65}, + "frame": {"x":2015,"y":897,"w":32,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":25,"y":1,"w":29,"h":65}, + "spriteSourceSize": {"x":25,"y":2,"w":32,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/JungleDryad.png": +"Game/EnemiesBound/MageZombie.png": { - "frame": {"x":1865,"y":1449,"w":69,"h":32}, + "frame": {"x":1401,"y":1819,"w":22,"h":49}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":3,"y":31,"w":69,"h":32}, + "spriteSourceSize": {"x":27,"y":11,"w":22,"h":49}, "sourceSize": {"w":72,"h":72} }, "Game/EnemiesBound/Nurse.png": { - "frame": {"x":2021,"y":1900,"w":26,"h":62}, + "frame": {"x":2021,"y":1899,"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":1198,"y":1294,"w":22,"h":58}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":8,"w":22,"h":58}, + "sourceSize": {"w":72,"h":72} +}, "Game/EnemiesBound/Zombie.png": { - "frame": {"x":2016,"y":536,"w":29,"h":65}, + "frame": {"x":2017,"y":257,"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": +"Game/FloorGeneric/Charger.png": +{ + "frame": {"x":2014,"y":982,"w":32,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":0,"w":32,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/CrackLeft.png": { - "frame": {"x":610,"y":1916,"w":36,"h":67}, + "frame": {"x":1401,"y":1870,"w":26,"h":45}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":20,"y":1,"w":36,"h":67}, + "spriteSourceSize": {"x":0,"y":18,"w":26,"h":45}, "sourceSize": {"w":72,"h":72} }, "Game/FloorGeneric/Rubble.png": @@ -1530,7 +1330,7 @@ }, "Game/InventoryAction/Sell.png": { - "frame": {"x":1915,"y":2029,"w":47,"h":18}, + "frame": {"x":1969,"y":2028,"w":47,"h":18}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":28,"w":47,"h":18}, @@ -1538,31 +1338,23 @@ }, "Game/InvFilter.png": { - "frame": {"x":1932,"y":325,"w":112,"h":56}, + "frame": {"x":1931,"y":772,"w":112,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":112,"h":56}, "sourceSize": {"w":116,"h":56} }, -"Game/InvItemSortLeft.png": -{ - "frame": {"x":988,"y":1194,"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": +"Game/InvHide.png": { - "frame": {"x":988,"y":1229,"w":18,"h":33}, + "frame": {"x":1932,"y":549,"w":112,"h":54}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":58,"y":21,"w":18,"h":33}, - "sourceSize": {"w":76,"h":76} + "spriteSourceSize": {"x":0,"y":2,"w":112,"h":54}, + "sourceSize": {"w":116,"h":56} }, "Game/Items/AncientPowerSourceSpent.png": { - "frame": {"x":1401,"y":1706,"w":22,"h":57}, + "frame": {"x":1198,"y":1354,"w":22,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":7,"w":22,"h":57}, @@ -1570,7 +1362,7 @@ }, "Game/Items/Axe.png": { - "frame": {"x":1840,"y":599,"w":50,"h":20}, + "frame": {"x":1734,"y":607,"w":50,"h":20}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":29,"w":50,"h":20}, @@ -1578,7 +1370,7 @@ }, "Game/Items/Blaster.png": { - "frame": {"x":1734,"y":599,"w":52,"h":19}, + "frame": {"x":1915,"y":2028,"w":52,"h":19}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":26,"w":52,"h":19}, @@ -1586,7 +1378,7 @@ }, "Game/Items/ElfCrystal.png": { - "frame": {"x":1401,"y":1765,"w":22,"h":57}, + "frame": {"x":1198,"y":1413,"w":22,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":7,"w":22,"h":57}, @@ -1594,12 +1386,20 @@ }, "Game/Items/Gold.png": { - "frame": {"x":1915,"y":2029,"w":47,"h":18}, + "frame": {"x":1969,"y":2028,"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":988,"y":1253,"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/ItemMouth.png": { "frame": {"x":1087,"y":1061,"w":30,"h":14}, @@ -1616,41 +1416,17 @@ "spriteSourceSize": {"x":48,"y":43,"w":14,"h":28}, "sourceSize": {"w":72,"h":72} }, -"Game/Items/Knives.png": -{ - "frame": {"x":1788,"y":599,"w":50,"h":23}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":11,"y":26,"w":50,"h":23}, - "sourceSize": {"w":72,"h":72} -}, "Game/Items/PotionWill.png": { - "frame": {"x":2017,"y":460,"w":28,"h":65}, + "frame": {"x":2015,"y":830,"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":1892,"y":599,"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.png": -{ - "frame": {"x":1401,"y":1882,"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/BallGags.png": { - "frame": {"x":1249,"y":2018,"w":55,"h":27}, + "frame": {"x":1981,"y":1452,"w":55,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":22,"w":55,"h":27}, @@ -1666,7 +1442,7 @@ }, "Game/Items/Restraint/Blindfolds.png": { - "frame": {"x":1192,"y":2018,"w":55,"h":27}, + "frame": {"x":1924,"y":1452,"w":55,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":22,"w":55,"h":27}, @@ -1714,7 +1490,7 @@ }, "Game/Items/Restraint/Gags.png": { - "frame": {"x":1249,"y":2018,"w":55,"h":27}, + "frame": {"x":1981,"y":1452,"w":55,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":22,"w":55,"h":27}, @@ -1730,7 +1506,7 @@ }, "Game/Items/Restraint/Harnesses.png": { - "frame": {"x":1796,"y":1912,"w":59,"h":71}, + "frame": {"x":1796,"y":1916,"w":59,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":0,"w":59,"h":71}, @@ -1786,7 +1562,7 @@ }, "Game/Items/Restraint/SteelSkirt.png": { - "frame": {"x":1857,"y":1900,"w":162,"h":127}, + "frame": {"x":1857,"y":1899,"w":162,"h":127}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":37,"w":162,"h":127}, @@ -1794,7 +1570,7 @@ }, "Game/Items/Restraint/Stuffing.png": { - "frame": {"x":1941,"y":383,"w":84,"h":75}, + "frame": {"x":1941,"y":180,"w":84,"h":75}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":51,"y":63,"w":84,"h":75}, @@ -1802,7 +1578,7 @@ }, "Game/Items/Restraint/Swimsuit.png": { - "frame": {"x":1940,"y":836,"w":99,"h":163}, + "frame": {"x":1931,"y":607,"w":99,"h":163}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":51,"y":16,"w":99,"h":163}, @@ -1826,28 +1602,12 @@ }, "Game/Items/StaffFlame.png": { - "frame": {"x":2027,"y":383,"w":20,"h":56}, + "frame": {"x":2027,"y":180,"w":20,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":27,"y":7,"w":20,"h":56}, "sourceSize": {"w":72,"h":72} }, -"Game/Items/StaffIncineration.png": -{ - "frame": {"x":2019,"y":603,"w":28,"h":60}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":23,"y":3,"w":28,"h":60}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Items/StormBreaker.png": -{ - "frame": {"x":1936,"y":1449,"w":64,"h":32}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":5,"y":20,"w":64,"h":32}, - "sourceSize": {"w":72,"h":72} -}, "Game/Outfits/Elven.png": { "frame": {"x":182,"y":1963,"w":166,"h":62}, @@ -1872,14 +1632,6 @@ "spriteSourceSize": {"x":0,"y":0,"w":14,"h":14}, "sourceSize": {"w":14,"h":14} }, -"Game/Particles/nnn.png": -{ - "frame": {"x":2014,"y":1001,"w":33,"h":40}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":7,"y":3,"w":33,"h":40}, - "sourceSize": {"w":50,"h":50} -}, "Game/Poses/Eyes2Surprised.png": { "frame": {"x":1119,"y":1061,"w":15,"h":15}, @@ -1920,12 +1672,12 @@ "spriteSourceSize": {"x":9,"y":49,"w":183,"h":95}, "sourceSize": {"w":200,"h":200} }, -"Game/Spells/AllyFireboltHit.png": +"Game/Spells/AnimateLarge.png": { - "frame": {"x":1944,"y":762,"w":72,"h":72}, + "frame": {"x":1796,"y":1989,"w":59,"h":58}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":7,"w":59,"h":58}, "sourceSize": {"w":72,"h":72} }, "Game/Spells/Gust.png": @@ -1936,31 +1688,23 @@ "spriteSourceSize": {"x":0,"y":19,"w":71,"h":33}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/Icebolt.png": +"Game/Spells/SlimeBall.png": { - "frame": {"x":1940,"y":1001,"w":72,"h":40}, + "frame": {"x":654,"y":2012,"w":71,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":17,"w":72,"h":40}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Spells/Ignite.png": -{ - "frame": {"x":1944,"y":762,"w":72,"h":72}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "spriteSourceSize": {"x":1,"y":21,"w":71,"h":35}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/SlimeBall.png": +"Game/Spells/SummonBlindfold.png": { - "frame": {"x":654,"y":2012,"w":71,"h":35}, + "frame": {"x":1924,"y":1452,"w":55,"h":27}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":21,"w":71,"h":35}, + "spriteSourceSize": {"x":8,"y":22,"w":55,"h":27}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/SummonBlindfold.png": +"Game/Spells/SummonGag.png": { "frame": {"x":1192,"y":2018,"w":55,"h":27}, "rotated": false, @@ -1970,19 +1714,19 @@ }, "Game/Spells/SummonHarness.png": { - "frame": {"x":1796,"y":1912,"w":59,"h":71}, + "frame": {"x":1796,"y":1916,"w":59,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":0,"w":59,"h":71}, "sourceSize": {"w":72,"h":72} }, -"Game/UI/CheckSmall.png": +"Game/UI/Buttons/Ransom.png": { - "frame": {"x":2027,"y":441,"w":19,"h":16}, + "frame": {"x":1786,"y":607,"w":49,"h":20}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":9,"y":8,"w":19,"h":16}, - "sourceSize": {"w":30,"h":30} + "spriteSourceSize": {"x":15,"y":31,"w":49,"h":20}, + "sourceSize": {"w":80,"h":80} }, "Game/UI/Heart.png": { @@ -2000,25 +1744,9 @@ "spriteSourceSize": {"x":0,"y":0,"w":14,"h":14}, "sourceSize": {"w":14,"h":14} }, -"Game/UI/Help.png": -{ - "frame": {"x":1185,"y":1430,"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/Ambient.png": -{ - "frame": {"x":1185,"y":1430,"w":38,"h":42}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":11,"y":9,"w":38,"h":42}, - "sourceSize": {"w":60,"h":60} -}, "Game/WarningHighlightBasic.png": { - "frame": {"x":1941,"y":460,"w":74,"h":74}, + "frame": {"x":1941,"y":257,"w":74,"h":74}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":74,"h":74}, @@ -2026,7 +1754,7 @@ }, "Game/WarningMove.png": { - "frame": {"x":1964,"y":2029,"w":42,"h":18}, + "frame": {"x":1837,"y":607,"w":42,"h":18}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":27,"w":42,"h":18}, @@ -2040,6 +1768,6 @@ "size": {"w":2048,"h":2048}, "scale": "1", "related_multi_packs": [ "game0.json", "game1.json", "game3.json", "game4.json", "game5.json" ], - "smartupdate": "$TexturePacker:SmartUpdate:76d784dd5df773dd2e2ebbec4425c54f:c9bd94d932662e62f0f3a8268b0ee477:54a7432a0665349a58c0c74f51e75c65$" + "smartupdate": "$TexturePacker:SmartUpdate:cd45dd3b98fe2739696c2386a6ef9b3c:9b1095aa07d6e300e2f0b7c24c8c3454:54a7432a0665349a58c0c74f51e75c65$" } } diff --git a/TextureAtlas/game2.png b/TextureAtlas/game2.png index e44988807..b21a29dbc 100644 Binary files a/TextureAtlas/game2.png and b/TextureAtlas/game2.png differ diff --git a/TextureAtlas/game3.json b/TextureAtlas/game3.json index f09603d28..06364fcc7 100644 --- a/TextureAtlas/game3.json +++ b/TextureAtlas/game3.json @@ -1,8 +1,24 @@ {"frames": { +"Game/Aura.png": +{ + "frame": {"x":1976,"y":1526,"w":71,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":71,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Aura/Airbender1.png": +{ + "frame": {"x":1035,"y":2019,"w":19,"h":19}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":92,"w":19,"h":19}, + "sourceSize": {"w":144,"h":144} +}, "Game/Aura/Armored.png": { - "frame": {"x":1665,"y":213,"w":144,"h":110}, + "frame": {"x":1487,"y":621,"w":144,"h":110}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":34,"w":144,"h":110}, @@ -10,7 +26,7 @@ }, "Game/Aura/Aura.png": { - "frame": {"x":1477,"y":1452,"w":142,"h":142}, + "frame": {"x":1636,"y":293,"w":142,"h":142}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, @@ -18,7 +34,7 @@ }, "Game/Aura/AuraX.png": { - "frame": {"x":1,"y":1815,"w":126,"h":126}, + "frame": {"x":1920,"y":145,"w":126,"h":126}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":126,"h":126}, @@ -26,7 +42,7 @@ }, "Game/Aura/Chastity.png": { - "frame": {"x":744,"y":954,"w":26,"h":33}, + "frame": {"x":918,"y":1762,"w":26,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":115,"y":108,"w":26,"h":33}, @@ -34,7 +50,7 @@ }, "Game/Aura/Conduction.png": { - "frame": {"x":650,"y":1357,"w":21,"h":33}, + "frame": {"x":351,"y":515,"w":21,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":98,"w":21,"h":33}, @@ -42,7 +58,7 @@ }, "Game/Aura/Disrobe.png": { - "frame": {"x":1101,"y":1510,"w":136,"h":139}, + "frame": {"x":998,"y":1413,"w":136,"h":139}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":1,"w":136,"h":139}, @@ -50,23 +66,15 @@ }, "Game/Aura/DistractionShield.png": { - "frame": {"x":1477,"y":1306,"w":144,"h":144}, + "frame": {"x":1424,"y":1152,"w":144,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, "sourceSize": {"w":144,"h":144} }, -"Game/Aura/DoublePlugged.png": -{ - "frame": {"x":595,"y":781,"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":267,"y":1822,"w":123,"h":119}, + "frame": {"x":1131,"y":1554,"w":123,"h":119}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":15,"w":123,"h":119}, @@ -74,7 +82,7 @@ }, "Game/Aura/EnergyShield.png": { - "frame": {"x":1617,"y":1061,"w":144,"h":144}, + "frame": {"x":1481,"y":869,"w":144,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, @@ -82,7 +90,7 @@ }, "Game/Aura/Fast.png": { - "frame": {"x":422,"y":1732,"w":137,"h":122}, + "frame": {"x":1481,"y":1015,"w":137,"h":122}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":16,"w":137,"h":122}, @@ -90,7 +98,7 @@ }, "Game/Aura/Flaming.png": { - "frame": {"x":1659,"y":863,"w":144,"h":132}, + "frame": {"x":1490,"y":487,"w":144,"h":132}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":132}, @@ -98,7 +106,7 @@ }, "Game/Aura/Glued.png": { - "frame": {"x":561,"y":1727,"w":111,"h":114}, + "frame": {"x":1256,"y":1542,"w":111,"h":114}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":13,"w":111,"h":114}, @@ -106,7 +114,7 @@ }, "Game/Aura/HealingAura.png": { - "frame": {"x":1101,"y":1651,"w":112,"h":113}, + "frame": {"x":804,"y":1719,"w":112,"h":113}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":15,"w":112,"h":113}, @@ -114,7 +122,7 @@ }, "Game/Aura/Heart.png": { - "frame": {"x":768,"y":1524,"w":143,"h":141}, + "frame": {"x":1633,"y":621,"w":143,"h":141}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":143,"h":141}, @@ -122,7 +130,7 @@ }, "Game/Aura/LatexBubble.png": { - "frame": {"x":1659,"y":717,"w":144,"h":144}, + "frame": {"x":1490,"y":341,"w":144,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, @@ -130,7 +138,7 @@ }, "Game/Aura/Missiles1.png": { - "frame": {"x":1641,"y":324,"w":18,"h":19}, + "frame": {"x":1324,"y":2028,"w":18,"h":19}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":92,"w":18,"h":19}, @@ -138,7 +146,7 @@ }, "Game/Aura/NoWP.png": { - "frame": {"x":1824,"y":324,"w":144,"h":144}, + "frame": {"x":1491,"y":1,"w":144,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, @@ -146,7 +154,7 @@ }, "Game/Aura/Reload.png": { - "frame": {"x":957,"y":1519,"w":142,"h":142}, + "frame": {"x":1637,"y":1,"w":142,"h":142}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, @@ -154,7 +162,7 @@ }, "Game/Aura/Select.png": { - "frame": {"x":480,"y":1527,"w":142,"h":142}, + "frame": {"x":1637,"y":145,"w":142,"h":142}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, @@ -162,7 +170,7 @@ }, "Game/Aura/Slimed.png": { - "frame": {"x":1,"y":1541,"w":142,"h":142}, + "frame": {"x":1636,"y":437,"w":142,"h":142}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, @@ -170,7 +178,7 @@ }, "Game/Aura/Toy.png": { - "frame": {"x":650,"y":1484,"w":20,"h":26}, + "frame": {"x":447,"y":1764,"w":20,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":116,"w":20,"h":26}, @@ -178,15 +186,39 @@ }, "Game/Aura/WaterBubble.png": { - "frame": {"x":1824,"y":470,"w":144,"h":144}, + "frame": {"x":1491,"y":147,"w":144,"h":144}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":144,"h":144}, "sourceSize": {"w":144,"h":144} }, +"Game/Bullets/AllyCrackle.png": +{ + "frame": {"x":464,"y":1945,"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":464,"y":1945,"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":311,"y":1971,"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":670,"y":800,"w":72,"h":72}, + "frame": {"x":385,"y":1971,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -194,7 +226,7 @@ }, "Game/Bullets/ArcaneBlastHit.png": { - "frame": {"x":670,"y":874,"w":72,"h":72}, + "frame": {"x":1620,"y":1015,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -202,7 +234,7 @@ }, "Game/Bullets/AreaElectrify.png": { - "frame": {"x":1,"y":1007,"w":164,"h":182}, + "frame": {"x":186,"y":989,"w":164,"h":182}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":20,"w":164,"h":182}, @@ -210,7 +242,7 @@ }, "Game/Bullets/ArrowVine.png": { - "frame": {"x":865,"y":1136,"w":61,"h":31}, + "frame": {"x":1633,"y":764,"w":61,"h":31}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":20,"w":61,"h":31}, @@ -218,7 +250,7 @@ }, "Game/Bullets/AwakenStrikeHit.png": { - "frame": {"x":865,"y":988,"w":72,"h":72}, + "frame": {"x":1627,"y":860,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -226,7 +258,7 @@ }, "Game/Bullets/BearTrapHit.png": { - "frame": {"x":1664,"y":624,"w":52,"h":28}, + "frame": {"x":760,"y":566,"w":52,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":30,"w":52,"h":28}, @@ -234,7 +266,7 @@ }, "Game/Bullets/BearTrapStrike.png": { - "frame": {"x":1664,"y":624,"w":52,"h":28}, + "frame": {"x":760,"y":566,"w":52,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":82,"y":102,"w":52,"h":28}, @@ -242,7 +274,7 @@ }, "Game/Bullets/BearTrapStrikeHit.png": { - "frame": {"x":1,"y":1685,"w":133,"h":128}, + "frame": {"x":1428,"y":1466,"w":133,"h":128}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":44,"w":133,"h":128}, @@ -250,7 +282,7 @@ }, "Game/Bullets/BeltStrike.png": { - "frame": {"x":1573,"y":144,"w":46,"h":27}, + "frame": {"x":1036,"y":1384,"w":46,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":22,"w":46,"h":27}, @@ -258,7 +290,7 @@ }, "Game/Bullets/BeltStrikeHit.png": { - "frame": {"x":1573,"y":144,"w":46,"h":27}, + "frame": {"x":1036,"y":1384,"w":46,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":22,"w":46,"h":27}, @@ -266,7 +298,7 @@ }, "Game/Bullets/BigBoulderLaunch.png": { - "frame": {"x":860,"y":1988,"w":72,"h":46}, + "frame": {"x":888,"y":1365,"w":72,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":12,"w":72,"h":46}, @@ -274,7 +306,7 @@ }, "Game/Bullets/BladeDanceBullet.png": { - "frame": {"x":1343,"y":345,"w":168,"h":168}, + "frame": {"x":1317,"y":529,"w":168,"h":168}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":23,"w":168,"h":168}, @@ -282,7 +314,7 @@ }, "Game/Bullets/BlasterBlast.png": { - "frame": {"x":865,"y":1062,"w":72,"h":72}, + "frame": {"x":1627,"y":934,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -290,7 +322,7 @@ }, "Game/Bullets/Blink.png": { - "frame": {"x":1948,"y":210,"w":72,"h":72}, + "frame": {"x":1620,"y":1089,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -298,7 +330,7 @@ }, "Game/Bullets/BlinkHit.png": { - "frame": {"x":1961,"y":114,"w":72,"h":72}, + "frame": {"x":1609,"y":1163,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -306,7 +338,7 @@ }, "Game/Bullets/BondageBust.png": { - "frame": {"x":865,"y":1062,"w":72,"h":72}, + "frame": {"x":1627,"y":934,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -314,7 +346,7 @@ }, "Game/Bullets/BondageBustHit.png": { - "frame": {"x":1969,"y":1,"w":72,"h":72}, + "frame": {"x":1683,"y":1163,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -322,7 +354,7 @@ }, "Game/Bullets/BubbleBurst.png": { - "frame": {"x":1514,"y":173,"w":149,"h":149}, + "frame": {"x":161,"y":1684,"w":149,"h":149}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":33,"y":33,"w":149,"h":149}, @@ -330,7 +362,7 @@ }, "Game/Bullets/BubbleBurstLatex.png": { - "frame": {"x":1513,"y":503,"w":149,"h":149}, + "frame": {"x":469,"y":1535,"w":149,"h":149}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":33,"y":33,"w":149,"h":149}, @@ -338,7 +370,7 @@ }, "Game/Bullets/BubbleBurstSlime.png": { - "frame": {"x":1498,"y":871,"w":149,"h":149}, + "frame": {"x":469,"y":1686,"w":149,"h":149}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":33,"y":33,"w":149,"h":149}, @@ -346,23 +378,15 @@ }, "Game/Bullets/BubbleexpHit.png": { - "frame": {"x":1616,"y":1207,"w":72,"h":72}, + "frame": {"x":1701,"y":860,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/CelestialBoltHit.png": -{ - "frame": {"x":1698,"y":1742,"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":674,"y":1722,"w":72,"h":72}, + "frame": {"x":1757,"y":764,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -370,7 +394,7 @@ }, "Game/Bullets/ClericBeam.png": { - "frame": {"x":1378,"y":1508,"w":72,"h":72}, + "frame": {"x":1782,"y":577,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -378,7 +402,7 @@ }, "Game/Bullets/ClericBeamHit.png": { - "frame": {"x":1378,"y":1582,"w":72,"h":72}, + "frame": {"x":1778,"y":651,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -386,7 +410,7 @@ }, "Game/Bullets/Corona.png": { - "frame": {"x":865,"y":1062,"w":72,"h":72}, + "frame": {"x":1627,"y":934,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -394,7 +418,7 @@ }, "Game/Bullets/CoronaHit.png": { - "frame": {"x":1969,"y":1,"w":72,"h":72}, + "frame": {"x":1683,"y":1163,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -402,7 +426,7 @@ }, "Game/Bullets/CrystalBoltHit.png": { - "frame": {"x":551,"y":1856,"w":72,"h":72}, + "frame": {"x":1701,"y":934,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -410,7 +434,7 @@ }, "Game/Bullets/CrystalBoltSingleHit.png": { - "frame": {"x":551,"y":1856,"w":72,"h":72}, + "frame": {"x":1701,"y":934,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -418,7 +442,7 @@ }, "Game/Bullets/CrystalPuff.png": { - "frame": {"x":1085,"y":1350,"w":156,"h":158}, + "frame": {"x":1,"y":1541,"w":156,"h":158}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":29,"y":25,"w":156,"h":158}, @@ -426,7 +450,7 @@ }, "Game/Bullets/CrystalPuffHit.png": { - "frame": {"x":1882,"y":288,"w":54,"h":34}, + "frame": {"x":1958,"y":1681,"w":54,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":19,"w":54,"h":34}, @@ -434,7 +458,7 @@ }, "Game/Bullets/CrystalShockBolt.png": { - "frame": {"x":1811,"y":213,"w":135,"h":73}, + "frame": {"x":152,"y":1960,"w":135,"h":73}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":70,"w":135,"h":73}, @@ -442,7 +466,7 @@ }, "Game/Bullets/CrystalShockHit.png": { - "frame": {"x":551,"y":1856,"w":72,"h":72}, + "frame": {"x":1701,"y":934,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -450,7 +474,7 @@ }, "Game/Bullets/CrystalSlash.png": { - "frame": {"x":673,"y":1353,"w":155,"h":169}, + "frame": {"x":689,"y":1358,"w":155,"h":169}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":40,"y":23,"w":155,"h":169}, @@ -458,7 +482,7 @@ }, "Game/Bullets/CrystalSlashHit.png": { - "frame": {"x":171,"y":1364,"w":155,"h":169}, + "frame": {"x":1267,"y":1160,"w":155,"h":169}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":40,"y":23,"w":155,"h":169}, @@ -466,39 +490,31 @@ }, "Game/Bullets/CuffsBolt.png": { - "frame": {"x":785,"y":2014,"w":51,"h":33}, + "frame": {"x":1945,"y":2013,"w":51,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":19,"w":51,"h":33}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/CursedArrowHit.png": +"Game/Bullets/DragonIceBolt.png": { - "frame": {"x":664,"y":1978,"w":72,"h":69}, + "frame": {"x":1130,"y":1823,"w":72,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, + "spriteSourceSize": {"x":0,"y":17,"w":72,"h":40}, "sourceSize": {"w":72,"h":72} }, "Game/Bullets/DryadBlast.png": { - "frame": {"x":1811,"y":288,"w":69,"h":34}, + "frame": {"x":996,"y":1685,"w":69,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":19,"w":69,"h":34}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/EncaseBoltDrone.png": -{ - "frame": {"x":448,"y":385,"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":786,"y":1792,"w":72,"h":72}, + "frame": {"x":1694,"y":1008,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -506,7 +522,7 @@ }, "Game/Bullets/EncaseBoltHit.png": { - "frame": {"x":786,"y":1792,"w":72,"h":72}, + "frame": {"x":1694,"y":1008,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -514,7 +530,7 @@ }, "Game/Bullets/EnchantRope.png": { - "frame": {"x":333,"y":1177,"w":168,"h":178}, + "frame": {"x":523,"y":1171,"w":168,"h":178}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":17,"w":168,"h":178}, @@ -522,7 +538,7 @@ }, "Game/Bullets/EnemyBlast.png": { - "frame": {"x":1018,"y":1713,"w":72,"h":72}, + "frame": {"x":1694,"y":1082,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -530,7 +546,7 @@ }, "Game/Bullets/EnemyCorona.png": { - "frame": {"x":865,"y":1062,"w":72,"h":72}, + "frame": {"x":1627,"y":934,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -538,7 +554,7 @@ }, "Game/Bullets/EnemyCoronaHit.png": { - "frame": {"x":1969,"y":1,"w":72,"h":72}, + "frame": {"x":1683,"y":1163,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -546,7 +562,7 @@ }, "Game/Bullets/EnemyEnchantRope.png": { - "frame": {"x":1,"y":1191,"w":168,"h":178}, + "frame": {"x":349,"y":1355,"w":168,"h":178}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":17,"w":168,"h":178}, @@ -554,7 +570,7 @@ }, "Game/Bullets/EnemyEnchantRope2.png": { - "frame": {"x":503,"y":1177,"w":168,"h":178}, + "frame": {"x":1,"y":1361,"w":168,"h":178}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":17,"w":168,"h":178}, @@ -562,7 +578,7 @@ }, "Game/Bullets/EnemyEnchantRope2Hit.png": { - "frame": {"x":673,"y":1173,"w":168,"h":178}, + "frame": {"x":171,"y":1361,"w":168,"h":178}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":17,"w":168,"h":178}, @@ -570,7 +586,7 @@ }, "Game/Bullets/EnemyEnchantRopeHit.png": { - "frame": {"x":843,"y":1170,"w":168,"h":178}, + "frame": {"x":519,"y":1355,"w":168,"h":178}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":17,"w":168,"h":178}, @@ -578,7 +594,7 @@ }, "Game/Bullets/EnemyLatexLegbinderBolt.png": { - "frame": {"x":956,"y":1914,"w":56,"h":69}, + "frame": {"x":1369,"y":1532,"w":56,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":2,"w":56,"h":69}, @@ -586,23 +602,15 @@ }, "Game/Bullets/EnemySteelRainPlug.png": { - "frame": {"x":1718,"y":624,"w":48,"h":28}, + "frame": {"x":1177,"y":1383,"w":48,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":22,"w":48,"h":28}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/EnemyWinterblastHit.png": -{ - "frame": {"x":1970,"y":546,"w":72,"h":68}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":1,"w":72,"h":68}, - "sourceSize": {"w":72,"h":72} -}, "Game/Bullets/Entangle.png": { - "frame": {"x":1158,"y":189,"w":183,"h":180}, + "frame": {"x":962,"y":181,"w":183,"h":180}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":19,"w":183,"h":180}, @@ -610,7 +618,7 @@ }, "Game/Bullets/EntangleHit.png": { - "frame": {"x":1145,"y":760,"w":177,"h":174}, + "frame": {"x":1096,"y":984,"w":177,"h":174}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":19,"w":177,"h":174}, @@ -618,7 +626,7 @@ }, "Game/Bullets/FeatherCloud.png": { - "frame": {"x":958,"y":572,"w":183,"h":190}, + "frame": {"x":915,"y":792,"w":183,"h":190}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":19,"w":183,"h":190}, @@ -626,7 +634,7 @@ }, "Game/Bullets/Feathers.png": { - "frame": {"x":1143,"y":572,"w":183,"h":186}, + "frame": {"x":1,"y":991,"w":183,"h":186}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":19,"w":183,"h":186}, @@ -634,7 +642,7 @@ }, "Game/Bullets/FeathersHit.png": { - "frame": {"x":1158,"y":371,"w":183,"h":180}, + "frame": {"x":959,"y":363,"w":183,"h":180}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":16,"w":183,"h":180}, @@ -642,39 +650,47 @@ }, "Game/Bullets/Fireball.png": { - "frame": {"x":1671,"y":1,"w":150,"h":123}, + "frame": {"x":161,"y":1835,"w":150,"h":123}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":26,"y":47,"w":150,"h":123}, "sourceSize": {"w":216,"h":216} }, -"Game/Bullets/FlameRune.png": +"Game/Bullets/FireboltHit.png": { - "frame": {"x":1,"y":1943,"w":72,"h":72}, + "frame": {"x":311,"y":1971,"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": +"Game/Bullets/FireexpHit.png": { - "frame": {"x":75,"y":1943,"w":72,"h":72}, + "frame": {"x":311,"y":1971,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/FlameRuneStrike.png": +"Game/Bullets/FlameRune.png": { - "frame": {"x":1649,"y":997,"w":72,"h":62}, + "frame": {"x":1609,"y":1237,"w":72,"h":72}, "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":71,"y":71,"w":72,"h":62}, - "sourceSize": {"w":216,"h":216} + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/FlameRuneHit.png": +{ + "frame": {"x":1683,"y":1237,"w":72,"h":72}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "sourceSize": {"w":72,"h":72} }, "Game/Bullets/FlameStrikeHit.png": { - "frame": {"x":1328,"y":726,"w":168,"h":168}, + "frame": {"x":1321,"y":1,"w":168,"h":168}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":23,"w":168,"h":168}, @@ -682,7 +698,7 @@ }, "Game/Bullets/FreezeRune.png": { - "frame": {"x":149,"y":1943,"w":72,"h":72}, + "frame": {"x":1609,"y":1311,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -690,7 +706,7 @@ }, "Game/Bullets/FreezeRuneHit.png": { - "frame": {"x":223,"y":1943,"w":72,"h":72}, + "frame": {"x":1683,"y":1311,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -698,15 +714,15 @@ }, "Game/Bullets/FreezeRuneStrikeHit.png": { - "frame": {"x":1,"y":1,"w":196,"h":206}, + "frame": {"x":1139,"y":701,"w":170,"h":170}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":10,"y":9,"w":196,"h":206}, + "spriteSourceSize": {"x":23,"y":23,"w":170,"h":170}, "sourceSize": {"w":216,"h":216} }, "Game/Bullets/GlueBombHit.png": { - "frame": {"x":1,"y":412,"w":185,"h":197}, + "frame": {"x":386,"y":1,"w":185,"h":197}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":8,"w":185,"h":197}, @@ -714,47 +730,55 @@ }, "Game/Bullets/GreaterFlash.png": { - "frame": {"x":769,"y":384,"w":187,"h":187}, + "frame": {"x":770,"y":189,"w":187,"h":187}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":25,"w":187,"h":187}, "sourceSize": {"w":216,"h":216} }, -"Game/Bullets/GreaterShield.png": +"Game/Bullets/HeatBoltHit.png": { - "frame": {"x":1991,"y":1596,"w":55,"h":68}, + "frame": {"x":311,"y":1971,"w":72,"h":72}, "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":8,"y":3,"w":55,"h":68}, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/GreaterShieldHit.png": +"Game/Bullets/Icebolt.png": { - "frame": {"x":1991,"y":1666,"w":55,"h":68}, + "frame": {"x":1130,"y":1823,"w":72,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":8,"y":3,"w":55,"h":68}, + "spriteSourceSize": {"x":0,"y":17,"w":72,"h":40}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/HarnessBolt.png": +"Game/Bullets/IceOrb.png": { - "frame": {"x":1088,"y":1988,"w":71,"h":59}, + "frame": {"x":1214,"y":1936,"w":63,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":8,"w":71,"h":59}, + "spriteSourceSize": {"x":0,"y":2,"w":63,"h":68}, "sourceSize": {"w":72,"h":72} }, "Game/Bullets/KineticLanceHit.png": { - "frame": {"x":328,"y":1357,"w":150,"h":169}, + "frame": {"x":846,"y":1414,"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":1898,"y":2014,"w":43,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":24,"w":43,"h":32}, + "sourceSize": {"w":72,"h":72} +}, "Game/Bullets/KnifeHit.png": { - "frame": {"x":650,"y":1392,"w":21,"h":30}, + "frame": {"x":314,"y":1648,"w":21,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":28,"y":17,"w":21,"h":30}, @@ -762,7 +786,7 @@ }, "Game/Bullets/LatexBubbleexpHit.png": { - "frame": {"x":1616,"y":1207,"w":72,"h":72}, + "frame": {"x":1701,"y":860,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -770,7 +794,7 @@ }, "Game/Bullets/LatexLegbinderBolt.png": { - "frame": {"x":956,"y":1914,"w":56,"h":69}, + "frame": {"x":1369,"y":1532,"w":56,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":2,"w":56,"h":69}, @@ -778,23 +802,15 @@ }, "Game/Bullets/LatexWallHoriz.png": { - "frame": {"x":297,"y":1943,"w":72,"h":72}, + "frame": {"x":1603,"y":1385,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/LatexWallHorizHit.png": -{ - "frame": {"x":952,"y":1663,"w":72,"h":48}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":13,"w":72,"h":48}, - "sourceSize": {"w":72,"h":72} -}, "Game/Bullets/LatexWallVert.png": { - "frame": {"x":297,"y":1943,"w":72,"h":72}, + "frame": {"x":1603,"y":1385,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -802,7 +818,7 @@ }, "Game/Bullets/Leap.png": { - "frame": {"x":1215,"y":1651,"w":72,"h":72}, + "frame": {"x":1677,"y":1385,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -810,7 +826,7 @@ }, "Game/Bullets/LeapHit.png": { - "frame": {"x":1289,"y":1648,"w":72,"h":72}, + "frame": {"x":1563,"y":1572,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -818,15 +834,31 @@ }, "Game/Bullets/LegbinderBolt.png": { - "frame": {"x":1985,"y":1037,"w":56,"h":69}, + "frame": {"x":1990,"y":1059,"w":56,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":2,"w":56,"h":69}, "sourceSize": {"w":72,"h":72} }, +"Game/Bullets/LightningBolt.png": +{ + "frame": {"x":464,"y":1945,"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":464,"y":1945,"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":1476,"y":1596,"w":72,"h":72}, + "frame": {"x":1369,"y":1603,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -834,7 +866,7 @@ }, "Game/Bullets/LightningRuneHit.png": { - "frame": {"x":1363,"y":1656,"w":72,"h":72}, + "frame": {"x":1131,"y":1675,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -842,7 +874,7 @@ }, "Game/Bullets/LiquidMetalBurstHit.png": { - "frame": {"x":397,"y":197,"w":190,"h":186}, + "frame": {"x":541,"y":597,"w":190,"h":186}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":17,"w":190,"h":186}, @@ -850,23 +882,15 @@ }, "Game/Bullets/LockBulletHit.png": { - "frame": {"x":1215,"y":1725,"w":72,"h":72}, + "frame": {"x":946,"y":1721,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/LustBomb.png": -{ - "frame": {"x":241,"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/MagicChainHit.png": { - "frame": {"x":1018,"y":1787,"w":72,"h":72}, + "frame": {"x":1020,"y":1721,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -874,7 +898,7 @@ }, "Game/Bullets/ManyMithrilBolts.png": { - "frame": {"x":883,"y":1840,"w":72,"h":72}, + "frame": {"x":1205,"y":1675,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -882,7 +906,7 @@ }, "Game/Bullets/ManyMithrilBoltsHit.png": { - "frame": {"x":786,"y":1866,"w":72,"h":72}, + "frame": {"x":1279,"y":1658,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -890,7 +914,7 @@ }, "Game/Bullets/ManyObsidianBolts.png": { - "frame": {"x":674,"y":1904,"w":72,"h":72}, + "frame": {"x":1443,"y":1596,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -898,7 +922,7 @@ }, "Game/Bullets/ManyObsidianBoltsHit.png": { - "frame": {"x":551,"y":1930,"w":72,"h":72}, + "frame": {"x":1637,"y":1572,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -906,7 +930,7 @@ }, "Game/Bullets/ManyOrbsHit.png": { - "frame": {"x":551,"y":1930,"w":72,"h":72}, + "frame": {"x":1637,"y":1572,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -914,7 +938,7 @@ }, "Game/Bullets/ManyShadowHands.png": { - "frame": {"x":422,"y":1962,"w":72,"h":72}, + "frame": {"x":1692,"y":1459,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -922,23 +946,15 @@ }, "Game/Bullets/ManyShadowHandsHit.png": { - "frame": {"x":1092,"y":1766,"w":72,"h":72}, + "frame": {"x":1751,"y":1385,"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":1698,"y":1816,"w":70,"h":72}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":1,"y":0,"w":70,"h":72}, - "sourceSize": {"w":72,"h":72} -}, "Game/Bullets/ManySlimesHit.png": { - "frame": {"x":297,"y":1943,"w":72,"h":72}, + "frame": {"x":1603,"y":1385,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -946,7 +962,7 @@ }, "Game/Bullets/MiniSlime.png": { - "frame": {"x":563,"y":781,"w":30,"h":18}, + "frame": {"x":1570,"y":1275,"w":30,"h":18}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":28,"w":30,"h":18}, @@ -954,7 +970,7 @@ }, "Game/Bullets/MiniSlimeHit.png": { - "frame": {"x":297,"y":1943,"w":72,"h":72}, + "frame": {"x":1603,"y":1385,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -962,7 +978,7 @@ }, "Game/Bullets/MithrilBolt.png": { - "frame": {"x":1003,"y":1135,"w":59,"h":33}, + "frame": {"x":1131,"y":2013,"w":59,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":20,"w":59,"h":33}, @@ -970,7 +986,7 @@ }, "Game/Bullets/MonolithBeam.png": { - "frame": {"x":551,"y":1930,"w":72,"h":72}, + "frame": {"x":1637,"y":1572,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -978,7 +994,7 @@ }, "Game/Bullets/MonolithBeamHit.png": { - "frame": {"x":674,"y":1904,"w":72,"h":72}, + "frame": {"x":1443,"y":1596,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -986,7 +1002,7 @@ }, "Game/Bullets/MummyBolt.png": { - "frame": {"x":670,"y":948,"w":72,"h":40}, + "frame": {"x":1204,"y":1823,"w":72,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":17,"w":72,"h":40}, @@ -994,7 +1010,7 @@ }, "Game/Bullets/NatureMoteBolt.png": { - "frame": {"x":1811,"y":288,"w":69,"h":34}, + "frame": {"x":996,"y":1685,"w":69,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":19,"w":69,"h":34}, @@ -1002,7 +1018,7 @@ }, "Game/Bullets/ObserverBeam.png": { - "frame": {"x":1123,"y":1308,"w":72,"h":38}, + "frame": {"x":1636,"y":581,"w":72,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":17,"w":72,"h":38}, @@ -1010,7 +1026,7 @@ }, "Game/Bullets/ObserverBeamHit.png": { - "frame": {"x":1289,"y":1722,"w":72,"h":72}, + "frame": {"x":1757,"y":1156,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -1018,7 +1034,7 @@ }, "Game/Bullets/OrbHealHit.png": { - "frame": {"x":1324,"y":896,"w":168,"h":168}, + "frame": {"x":1321,"y":171,"w":168,"h":168}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":23,"w":168,"h":168}, @@ -1026,7 +1042,7 @@ }, "Game/Bullets/PoisonBreath.png": { - "frame": {"x":582,"y":385,"w":185,"h":197}, + "frame": {"x":386,"y":200,"w":185,"h":197}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":8,"w":185,"h":197}, @@ -1034,7 +1050,7 @@ }, "Game/Bullets/PoisonDaggerHit.png": { - "frame": {"x":650,"y":1392,"w":21,"h":30}, + "frame": {"x":314,"y":1648,"w":21,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":28,"y":17,"w":21,"h":30}, @@ -1042,7 +1058,7 @@ }, "Game/Bullets/PoisonDragonBlast.png": { - "frame": {"x":1811,"y":288,"w":69,"h":34}, + "frame": {"x":996,"y":1685,"w":69,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":19,"w":69,"h":34}, @@ -1050,7 +1066,7 @@ }, "Game/Bullets/RedSlime.png": { - "frame": {"x":53,"y":2017,"w":46,"h":28}, + "frame": {"x":459,"y":2019,"w":46,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":23,"w":46,"h":28}, @@ -1058,7 +1074,7 @@ }, "Game/Bullets/RibbonBurstHit.png": { - "frame": {"x":960,"y":764,"w":183,"h":187}, + "frame": {"x":358,"y":982,"w":183,"h":187}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":13,"w":183,"h":187}, @@ -1066,7 +1082,7 @@ }, "Game/Bullets/Ribbons.png": { - "frame": {"x":149,"y":2017,"w":44,"h":27}, + "frame": {"x":1131,"y":1384,"w":44,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":22,"w":44,"h":27}, @@ -1074,7 +1090,7 @@ }, "Game/Bullets/RibbonsHit.png": { - "frame": {"x":149,"y":2017,"w":44,"h":27}, + "frame": {"x":1131,"y":1384,"w":44,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":22,"w":44,"h":27}, @@ -1082,7 +1098,7 @@ }, "Game/Bullets/RopeEngulf.png": { - "frame": {"x":188,"y":407,"w":195,"h":194}, + "frame": {"x":375,"y":399,"w":195,"h":194}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":2,"w":195,"h":194}, @@ -1090,7 +1106,7 @@ }, "Game/Bullets/RopeEngulfHit.png": { - "frame": {"x":163,"y":810,"w":160,"h":194}, + "frame": {"x":163,"y":601,"w":160,"h":194}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":16,"w":160,"h":194}, @@ -1098,7 +1114,7 @@ }, "Game/Bullets/RopeEngulfWeak.png": { - "frame": {"x":385,"y":407,"w":195,"h":194}, + "frame": {"x":573,"y":1,"w":195,"h":194}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":2,"w":195,"h":194}, @@ -1106,7 +1122,7 @@ }, "Game/Bullets/RopeEngulfWeakHit.png": { - "frame": {"x":163,"y":810,"w":160,"h":194}, + "frame": {"x":163,"y":601,"w":160,"h":194}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":16,"w":160,"h":194}, @@ -1114,7 +1130,7 @@ }, "Game/Bullets/RopeRuneStrikeHit.png": { - "frame": {"x":163,"y":810,"w":160,"h":194}, + "frame": {"x":163,"y":601,"w":160,"h":194}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":16,"w":160,"h":194}, @@ -1122,7 +1138,7 @@ }, "Game/Bullets/RopeStrike.png": { - "frame": {"x":1158,"y":1,"w":183,"h":186}, + "frame": {"x":543,"y":978,"w":183,"h":186}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":13,"w":183,"h":186}, @@ -1130,7 +1146,7 @@ }, "Game/Bullets/RopeStrikeHit.png": { - "frame": {"x":163,"y":810,"w":160,"h":194}, + "frame": {"x":163,"y":601,"w":160,"h":194}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":16,"w":160,"h":194}, @@ -1138,7 +1154,7 @@ }, "Game/Bullets/RuneTrap_BeltHit.png": { - "frame": {"x":960,"y":953,"w":172,"h":180}, + "frame": {"x":1,"y":1179,"w":172,"h":180}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":21,"w":172,"h":180}, @@ -1146,7 +1162,7 @@ }, "Game/Bullets/RuneTrap_ChainHit.png": { - "frame": {"x":325,"y":802,"w":167,"h":191}, + "frame": {"x":1,"y":798,"w":167,"h":191}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":37,"y":25,"w":167,"h":191}, @@ -1154,7 +1170,7 @@ }, "Game/Bullets/RuneTrap_LatexBallHit.png": { - "frame": {"x":1343,"y":173,"w":169,"h":170}, + "frame": {"x":1096,"y":1160,"w":169,"h":170}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":22,"w":169,"h":170}, @@ -1162,7 +1178,7 @@ }, "Game/Bullets/RuneTrap_LatexSphereHit.png": { - "frame": {"x":1343,"y":173,"w":169,"h":170}, + "frame": {"x":1096,"y":1160,"w":169,"h":170}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":22,"w":169,"h":170}, @@ -1170,7 +1186,7 @@ }, "Game/Bullets/RuneTrap_LeatherHit.png": { - "frame": {"x":333,"y":995,"w":172,"h":180}, + "frame": {"x":175,"y":1179,"w":172,"h":180}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":21,"w":172,"h":180}, @@ -1178,7 +1194,7 @@ }, "Game/Bullets/RuneTrap_RibbonHit.png": { - "frame": {"x":960,"y":764,"w":183,"h":187}, + "frame": {"x":358,"y":982,"w":183,"h":187}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":13,"w":183,"h":187}, @@ -1186,7 +1202,7 @@ }, "Game/Bullets/RuneTrap_RopeHit.png": { - "frame": {"x":163,"y":810,"w":160,"h":194}, + "frame": {"x":163,"y":601,"w":160,"h":194}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":16,"w":160,"h":194}, @@ -1194,7 +1210,7 @@ }, "Game/Bullets/RuneTrap_SlimeHit.png": { - "frame": {"x":591,"y":1,"w":190,"h":186}, + "frame": {"x":770,"y":1,"w":190,"h":186}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":17,"w":190,"h":186}, @@ -1202,7 +1218,7 @@ }, "Game/Bullets/RuneTrap_VineHit.png": { - "frame": {"x":1,"y":611,"w":185,"h":197}, + "frame": {"x":1,"y":204,"w":185,"h":197}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":8,"w":185,"h":197}, @@ -1210,7 +1226,7 @@ }, "Game/Bullets/SagittaHit.png": { - "frame": {"x":1343,"y":345,"w":168,"h":168}, + "frame": {"x":1317,"y":529,"w":168,"h":168}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":23,"w":168,"h":168}, @@ -1218,7 +1234,7 @@ }, "Game/Bullets/ShadowDance.png": { - "frame": {"x":1550,"y":1596,"w":72,"h":72}, + "frame": {"x":1768,"y":1008,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -1226,7 +1242,7 @@ }, "Game/Bullets/ShadowGrasp.png": { - "frame": {"x":1307,"y":1306,"w":168,"h":168}, + "frame": {"x":1320,"y":341,"w":168,"h":168}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":23,"w":168,"h":168}, @@ -1234,7 +1250,7 @@ }, "Game/Bullets/ShadowGraspHit.png": { - "frame": {"x":1,"y":209,"w":185,"h":201}, + "frame": {"x":199,"y":1,"w":185,"h":201}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":4,"w":185,"h":201}, @@ -1242,7 +1258,7 @@ }, "Game/Bullets/ShadowScythe.png": { - "frame": {"x":830,"y":1353,"w":125,"h":168}, + "frame": {"x":689,"y":1529,"w":125,"h":168}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":68,"y":23,"w":125,"h":168}, @@ -1250,7 +1266,7 @@ }, "Game/Bullets/ShadowShroud.png": { - "frame": {"x":136,"y":1685,"w":129,"h":127}, + "frame": {"x":1136,"y":1413,"w":129,"h":127}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":39,"y":43,"w":129,"h":127}, @@ -1258,7 +1274,7 @@ }, "Game/Bullets/ShadowShroudHit.png": { - "frame": {"x":289,"y":1679,"w":131,"h":129}, + "frame": {"x":998,"y":1554,"w":131,"h":129}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":38,"y":42,"w":131,"h":129}, @@ -1266,7 +1282,7 @@ }, "Game/Bullets/ShadowSlashHit.png": { - "frame": {"x":1,"y":1371,"w":168,"h":168}, + "frame": {"x":1317,"y":699,"w":168,"h":168}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":23,"w":168,"h":168}, @@ -1274,7 +1290,7 @@ }, "Game/Bullets/Shatter.png": { - "frame": {"x":480,"y":1357,"w":168,"h":168}, + "frame": {"x":1311,"y":869,"w":168,"h":168}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":23,"w":168,"h":168}, @@ -1282,7 +1298,7 @@ }, "Game/Bullets/ShatterStrikeHit.png": { - "frame": {"x":494,"y":801,"w":174,"h":188}, + "frame": {"x":358,"y":792,"w":174,"h":188}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":20,"w":174,"h":188}, @@ -1290,7 +1306,7 @@ }, "Game/Bullets/Shield.png": { - "frame": {"x":149,"y":1943,"w":72,"h":72}, + "frame": {"x":1609,"y":1311,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -1298,31 +1314,15 @@ }, "Game/Bullets/ShieldHit.png": { - "frame": {"x":223,"y":1943,"w":72,"h":72}, + "frame": {"x":1683,"y":1311,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/ShockHit.png": -{ - "frame": {"x":1621,"y":1527,"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":1621,"y":1527,"w":72,"h":66}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":3,"w":72,"h":66}, - "sourceSize": {"w":72,"h":72} -}, "Game/Bullets/SingleBelt.png": { - "frame": {"x":1573,"y":144,"w":46,"h":27}, + "frame": {"x":1036,"y":1384,"w":46,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":22,"w":46,"h":27}, @@ -1330,7 +1330,7 @@ }, "Game/Bullets/SleepDart.png": { - "frame": {"x":286,"y":2017,"w":43,"h":25}, + "frame": {"x":1998,"y":541,"w":43,"h":25}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":23,"w":43,"h":25}, @@ -1338,7 +1338,7 @@ }, "Game/Bullets/SleepGas.png": { - "frame": {"x":582,"y":385,"w":185,"h":197}, + "frame": {"x":386,"y":200,"w":185,"h":197}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":8,"w":185,"h":197}, @@ -1346,7 +1346,7 @@ }, "Game/Bullets/SleepGasHit.png": { - "frame": {"x":188,"y":603,"w":185,"h":197}, + "frame": {"x":188,"y":204,"w":185,"h":197}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":8,"w":185,"h":197}, @@ -1354,7 +1354,7 @@ }, "Game/Bullets/SlimeBallTrail.png": { - "frame": {"x":1623,"y":1305,"w":72,"h":72}, + "frame": {"x":1831,"y":763,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -1362,7 +1362,7 @@ }, "Game/Bullets/SlimeEruptionHit.png": { - "frame": {"x":1623,"y":1305,"w":72,"h":72}, + "frame": {"x":1831,"y":763,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -1370,7 +1370,7 @@ }, "Game/Bullets/SlimePuddle.png": { - "frame": {"x":101,"y":2017,"w":46,"h":28}, + "frame": {"x":616,"y":2018,"w":46,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":23,"w":46,"h":28}, @@ -1378,7 +1378,7 @@ }, "Game/Bullets/SlimeWallHoriz.png": { - "frame": {"x":297,"y":1943,"w":72,"h":72}, + "frame": {"x":1603,"y":1385,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -1386,7 +1386,7 @@ }, "Game/Bullets/SlimeWallVert.png": { - "frame": {"x":297,"y":1943,"w":72,"h":72}, + "frame": {"x":1603,"y":1385,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -1394,23 +1394,31 @@ }, "Game/Bullets/SmokeBomb.png": { - "frame": {"x":1465,"y":2019,"w":29,"h":28}, + "frame": {"x":507,"y":2019,"w":29,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":95,"y":92,"w":29,"h":28}, "sourceSize": {"w":216,"h":216} }, -"Game/Bullets/SnowballHit.png": +"Game/Bullets/SmokePuff.png": +{ + "frame": {"x":1979,"y":759,"w":68,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":68,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/Snare.png": { - "frame": {"x":1970,"y":546,"w":72,"h":68}, + "frame": {"x":690,"y":1944,"w":63,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":1,"w":72,"h":68}, + "spriteSourceSize": {"x":4,"y":2,"w":63,"h":70}, "sourceSize": {"w":72,"h":72} }, "Game/Bullets/SoulCrystalBind.png": { - "frame": {"x":1134,"y":953,"w":181,"h":178}, + "frame": {"x":913,"y":984,"w":181,"h":178}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":12,"w":181,"h":178}, @@ -1418,7 +1426,7 @@ }, "Game/Bullets/SoulCrystalBind_2.png": { - "frame": {"x":1134,"y":953,"w":181,"h":178}, + "frame": {"x":913,"y":984,"w":181,"h":178}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":12,"w":181,"h":178}, @@ -1426,31 +1434,31 @@ }, "Game/Bullets/SporesSickHit.png": { - "frame": {"x":582,"y":385,"w":185,"h":197}, + "frame": {"x":386,"y":200,"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": +"Game/Bullets/SteelRainPlug.png": { - "frame": {"x":1621,"y":1527,"w":72,"h":66}, + "frame": {"x":1177,"y":1383,"w":48,"h":28}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":3,"w":72,"h":66}, + "spriteSourceSize": {"x":13,"y":22,"w":48,"h":28}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/SteelRainPlug.png": +"Game/Bullets/SummonCrystalsHit.png": { - "frame": {"x":1718,"y":624,"w":48,"h":28}, + "frame": {"x":690,"y":1944,"w":63,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":13,"y":22,"w":48,"h":28}, + "spriteSourceSize": {"x":4,"y":2,"w":63,"h":70}, "sourceSize": {"w":72,"h":72} }, "Game/Bullets/SummonSkeleton.png": { - "frame": {"x":1823,"y":1,"w":144,"h":111}, + "frame": {"x":1311,"y":1039,"w":144,"h":111}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":70,"w":144,"h":111}, @@ -1458,7 +1466,7 @@ }, "Game/Bullets/SummonSkeletons.png": { - "frame": {"x":971,"y":194,"w":185,"h":184}, + "frame": {"x":728,"y":792,"w":185,"h":184}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":23,"w":185,"h":184}, @@ -1466,23 +1474,15 @@ }, "Game/Bullets/SummonZombies.png": { - "frame": {"x":591,"y":189,"w":187,"h":193}, + "frame": {"x":733,"y":597,"w":187,"h":193}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":14,"w":187,"h":193}, "sourceSize": {"w":216,"h":216} }, -"Game/Bullets/TickleCloudHit.png": -{ - "frame": {"x":1480,"y":1266,"w":65,"h":38}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":2,"y":27,"w":65,"h":38}, - "sourceSize": {"w":72,"h":72} -}, "Game/Bullets/TidalBall.png": { - "frame": {"x":1501,"y":654,"w":135,"h":58}, + "frame": {"x":1487,"y":797,"w":135,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":80,"w":135,"h":58}, @@ -1490,7 +1490,7 @@ }, "Game/Bullets/TrapCableWeak.png": { - "frame": {"x":1513,"y":345,"w":158,"h":156}, + "frame": {"x":1,"y":1701,"w":158,"h":156}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":33,"y":22,"w":158,"h":156}, @@ -1498,7 +1498,7 @@ }, "Game/Bullets/TrapCharmWeak.png": { - "frame": {"x":681,"y":990,"w":182,"h":178}, + "frame": {"x":955,"y":545,"w":182,"h":178}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":27,"w":182,"h":178}, @@ -1506,7 +1506,7 @@ }, "Game/Bullets/TrapCharmWeakHit.png": { - "frame": {"x":171,"y":1189,"w":147,"h":173}, + "frame": {"x":894,"y":1190,"w":147,"h":173}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":35,"y":29,"w":147,"h":173}, @@ -1514,7 +1514,7 @@ }, "Game/Bullets/TrapCrystal.png": { - "frame": {"x":397,"y":1,"w":192,"h":194}, + "frame": {"x":573,"y":197,"w":192,"h":194}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":12,"w":192,"h":194}, @@ -1522,7 +1522,7 @@ }, "Game/Bullets/TrapCrystalHit.png": { - "frame": {"x":772,"y":770,"w":186,"h":190}, + "frame": {"x":170,"y":797,"w":186,"h":190}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":8,"w":186,"h":190}, @@ -1530,7 +1530,7 @@ }, "Game/Bullets/TrapLatexBall.png": { - "frame": {"x":1673,"y":476,"w":149,"h":146}, + "frame": {"x":313,"y":1823,"w":149,"h":146}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":33,"y":36,"w":149,"h":146}, @@ -1538,7 +1538,7 @@ }, "Game/Bullets/TrapLatexBubble.png": { - "frame": {"x":1673,"y":325,"w":149,"h":149}, + "frame": {"x":1,"y":1859,"w":149,"h":149}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":33,"y":33,"w":149,"h":149}, @@ -1546,7 +1546,7 @@ }, "Game/Bullets/TrapLeatherWeak.png": { - "frame": {"x":507,"y":991,"w":172,"h":180}, + "frame": {"x":349,"y":1173,"w":172,"h":180}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":21,"w":172,"h":180}, @@ -1554,39 +1554,47 @@ }, "Game/Bullets/TrapLeatherWeakHit.png": { - "frame": {"x":957,"y":1350,"w":126,"h":167}, + "frame": {"x":341,"y":1535,"w":126,"h":167}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":38,"y":14,"w":126,"h":167}, "sourceSize": {"w":216,"h":216} }, -"Game/Bullets/TrapLustCloud.png": +"Game/Bullets/TrapMagicChainsWeakHit.png": { - "frame": {"x":199,"y":1,"w":196,"h":201}, + "frame": {"x":1,"y":798,"w":167,"h":191}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":14,"y":6,"w":196,"h":201}, + "spriteSourceSize": {"x":37,"y":25,"w":167,"h":191}, "sourceSize": {"w":216,"h":216} }, -"Game/Bullets/TrapMagicChainsWeakHit.png": +"Game/Bullets/TrapMummyWeakHit.png": { - "frame": {"x":325,"y":802,"w":167,"h":191}, + "frame": {"x":351,"y":595,"w":188,"h":195}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":37,"y":25,"w":167,"h":191}, + "spriteSourceSize": {"x":23,"y":15,"w":188,"h":195}, "sourceSize": {"w":216,"h":216} }, -"Game/Bullets/TrapMummyWeakHit.png": +"Game/Bullets/TrapObsidian.png": { - "frame": {"x":582,"y":584,"w":188,"h":195}, + "frame": {"x":962,"y":1,"w":184,"h":178}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":23,"y":15,"w":188,"h":195}, + "spriteSourceSize": {"x":15,"y":12,"w":184,"h":178}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/TrapObsidianHit.png": +{ + "frame": {"x":962,"y":1,"w":184,"h":178}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":15,"y":12,"w":184,"h":178}, "sourceSize": {"w":216,"h":216} }, "Game/Bullets/TrapRibbons.png": { - "frame": {"x":1307,"y":1133,"w":171,"h":171}, + "frame": {"x":1148,"y":1,"w":171,"h":171}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":28,"y":18,"w":171,"h":171}, @@ -1594,7 +1602,7 @@ }, "Game/Bullets/TrapRibbonsHit.png": { - "frame": {"x":772,"y":573,"w":160,"h":195}, + "frame": {"x":189,"y":403,"w":160,"h":195}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":16,"w":160,"h":195}, @@ -1602,7 +1610,7 @@ }, "Game/Bullets/TrapRopeHoly.png": { - "frame": {"x":783,"y":1,"w":186,"h":196}, + "frame": {"x":1,"y":403,"w":186,"h":196}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":14,"w":186,"h":196}, @@ -1610,7 +1618,7 @@ }, "Game/Bullets/TrapRopeHolyHit.png": { - "frame": {"x":375,"y":603,"w":186,"h":196}, + "frame": {"x":572,"y":399,"w":186,"h":196}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":14,"w":186,"h":196}, @@ -1618,7 +1626,7 @@ }, "Game/Bullets/TrapRopeStrong.png": { - "frame": {"x":1328,"y":553,"w":171,"h":171}, + "frame": {"x":1147,"y":356,"w":171,"h":171}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":28,"y":18,"w":171,"h":171}, @@ -1626,7 +1634,7 @@ }, "Game/Bullets/TrapRopeStrongHit.png": { - "frame": {"x":1,"y":810,"w":160,"h":195}, + "frame": {"x":1,"y":601,"w":160,"h":195}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":16,"w":160,"h":195}, @@ -1634,7 +1642,7 @@ }, "Game/Bullets/TrapRopeWeak.png": { - "frame": {"x":1343,"y":1,"w":171,"h":170}, + "frame": {"x":1144,"y":529,"w":171,"h":170}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":28,"y":18,"w":171,"h":170}, @@ -1642,7 +1650,7 @@ }, "Game/Bullets/TrapRopeWeakHit.png": { - "frame": {"x":163,"y":810,"w":160,"h":194}, + "frame": {"x":163,"y":601,"w":160,"h":194}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":16,"w":160,"h":194}, @@ -1650,7 +1658,7 @@ }, "Game/Bullets/TrapSCloud.png": { - "frame": {"x":199,"y":204,"w":196,"h":201}, + "frame": {"x":1,"y":1,"w":196,"h":201}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":6,"w":196,"h":201}, @@ -1658,7 +1666,7 @@ }, "Game/Bullets/TrapShackleWeakHit.png": { - "frame": {"x":971,"y":1,"w":185,"h":191}, + "frame": {"x":541,"y":785,"w":185,"h":191}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":25,"w":185,"h":191}, @@ -1666,7 +1674,7 @@ }, "Game/Bullets/TrapSleepDart.png": { - "frame": {"x":286,"y":2017,"w":43,"h":25}, + "frame": {"x":1998,"y":541,"w":43,"h":25}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":23,"w":43,"h":25}, @@ -1674,15 +1682,23 @@ }, "Game/Bullets/TrapSlimeWeakHit.png": { - "frame": {"x":591,"y":1,"w":190,"h":186}, + "frame": {"x":770,"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/Wall.png": +{ + "frame": {"x":464,"y":1945,"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":674,"y":1722,"w":72,"h":72}, + "frame": {"x":1757,"y":764,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -1690,7 +1706,7 @@ }, "Game/Bullets/WitchElectrify.png": { - "frame": {"x":1690,"y":1207,"w":72,"h":72}, + "frame": {"x":1856,"y":577,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -1698,15 +1714,23 @@ }, "Game/Bullets/WitchSlimeBallHit.png": { - "frame": {"x":297,"y":1943,"w":72,"h":72}, + "frame": {"x":1603,"y":1385,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, +"Game/ChangeSpell.png": +{ + "frame": {"x":538,"y":2013,"w":36,"h":34}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":2,"w":36,"h":34}, + "sourceSize": {"w":38,"h":38} +}, "Game/Color.png": { - "frame": {"x":860,"y":1792,"w":21,"h":21}, + "frame": {"x":1108,"y":2015,"w":21,"h":21}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":21,"h":21}, @@ -1714,39 +1738,23 @@ }, "Game/Conditions/Bind.png": { - "frame": {"x":929,"y":962,"w":28,"h":22}, + "frame": {"x":1562,"y":1646,"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":1249,"y":553,"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":1596,"y":324,"w":21,"h":19}, + "frame": {"x":1279,"y":2028,"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":860,"y":1861,"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":1146,"y":553,"w":25,"h":17}, + "frame": {"x":1932,"y":1133,"w":25,"h":17}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":22,"w":25,"h":17}, @@ -1754,39 +1762,39 @@ }, "Game/Conditions/EvasionBuff.png": { - "frame": {"x":1199,"y":553,"w":24,"h":16}, + "frame": {"x":1320,"y":511,"w":24,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":2,"w":24,"h":16}, "sourceSize": {"w":72,"h":72} }, -"Game/Conditions/Heart.png": +"Game/Conditions/Shop.png": { - "frame": {"x":1771,"y":1493,"w":32,"h":31}, + "frame": {"x":351,"y":403,"w":21,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":20,"y":6,"w":32,"h":31}, + "spriteSourceSize": {"x":25,"y":2,"w":21,"h":37}, "sourceSize": {"w":72,"h":72} }, -"Game/Conditions/ShieldDebuff.png": +"Game/Conditions/Slow.png": { - "frame": {"x":1844,"y":1501,"w":33,"h":23}, + "frame": {"x":1830,"y":985,"w":28,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":20,"y":0,"w":33,"h":23}, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, "sourceSize": {"w":72,"h":72} }, -"Game/Conditions/Shop.png": +"Game/Conditions/Slow_3.png": { - "frame": {"x":934,"y":624,"w":21,"h":37}, + "frame": {"x":1830,"y":985,"w":28,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":25,"y":2,"w":21,"h":37}, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, "sourceSize": {"w":72,"h":72} }, "Game/Conditions/Sneak.png": { - "frame": {"x":627,"y":781,"w":28,"h":18}, + "frame": {"x":1902,"y":1133,"w":28,"h":18}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":0,"w":28,"h":18}, @@ -1794,79 +1802,183 @@ }, "Game/Conditions/Stun.png": { - "frame": {"x":1763,"y":1057,"w":72,"h":72}, + "frame": {"x":1852,"y":651,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Conditions/Thought/Angry.png": +"Game/Conditions/Tired.png": { - "frame": {"x":2016,"y":284,"w":31,"h":36}, + "frame": {"x":1139,"y":960,"w":44,"h":22}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, + "spriteSourceSize": {"x":15,"y":4,"w":44,"h":22}, "sourceSize": {"w":72,"h":72} }, -"Game/Conditions/Tired.png": +"Game/Conditions/VulnerableBlocked.png": { - "frame": {"x":1614,"y":1281,"w":44,"h":22}, + "frame": {"x":1457,"y":1039,"w":22,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":15,"y":4,"w":44,"h":22}, + "spriteSourceSize": {"x":46,"y":9,"w":22,"h":24}, "sourceSize": {"w":72,"h":72} }, -"Game/Conditions/VulnerableBlocked.png": +"Game/DamageTypes/charm.png": { - "frame": {"x":1452,"y":1508,"w":22,"h":24}, + "frame": {"x":1192,"y":2013,"w":18,"h":22}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":46,"y":9,"w":22,"h":24}, + "spriteSourceSize": {"x":1,"y":49,"w":18,"h":22}, "sourceSize": {"w":72,"h":72} }, -"Game/DamageTypes/chain.png": +"Game/DamageTypes/crush.png": { - "frame": {"x":267,"y":1733,"w":20,"h":21}, + "frame": {"x":1830,"y":985,"w":28,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":51,"w":20,"h":21}, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, "sourceSize": {"w":72,"h":72} }, -"Game/DamageTypes/charm.png": +"Game/DamageTypes/drain.png": { - "frame": {"x":267,"y":1709,"w":18,"h":22}, + "frame": {"x":1830,"y":985,"w":28,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":49,"w":18,"h":22}, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/electric.png": +{ + "frame": {"x":1830,"y":985,"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":1830,"y":985,"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":1830,"y":985,"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":1830,"y":985,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/magic.png": +{ + "frame": {"x":1830,"y":985,"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":1830,"y":985,"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":1830,"y":985,"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":1830,"y":985,"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":1830,"y":985,"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":1830,"y":985,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, "sourceSize": {"w":72,"h":72} }, -"Game/DamageTypes/cold.png": +"Game/DamageTypes/souldrain.png": { - "frame": {"x":563,"y":665,"w":15,"h":25}, + "frame": {"x":1830,"y":985,"w":28,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":3,"y":47,"w":15,"h":25}, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, "sourceSize": {"w":72,"h":72} }, -"Game/DamageTypes/frost.png": +"Game/DamageTypes/stun.png": { - "frame": {"x":563,"y":692,"w":15,"h":17}, + "frame": {"x":1830,"y":985,"w":28,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":52,"w":15,"h":17}, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, "sourceSize": {"w":72,"h":72} }, -"Game/DamageTypes/ice.png": +"Game/DamageTypes/tickle.png": { - "frame": {"x":563,"y":692,"w":15,"h":17}, + "frame": {"x":1830,"y":985,"w":28,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":52,"w":15,"h":17}, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, + "sourceSize": {"w":72,"h":72} +}, +"Game/DamageTypes/unarmed.png": +{ + "frame": {"x":1830,"y":985,"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":1830,"y":985,"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":1830,"y":985,"w":28,"h":21}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":50,"w":28,"h":21}, "sourceSize": {"w":72,"h":72} }, "Game/EffectTiles/BoobyTrap.png": { - "frame": {"x":878,"y":962,"w":49,"h":23}, + "frame": {"x":965,"y":1164,"w":49,"h":23}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":31,"w":49,"h":23}, @@ -1874,7 +1986,7 @@ }, "Game/EffectTiles/BoobyTrapMagic.png": { - "frame": {"x":1969,"y":75,"w":66,"h":36}, + "frame": {"x":1692,"y":1533,"w":66,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":25,"w":66,"h":36}, @@ -1882,7 +1994,7 @@ }, "Game/EffectTiles/FateBoundGround.png": { - "frame": {"x":1805,"y":717,"w":72,"h":72}, + "frame": {"x":1831,"y":837,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -1890,7 +2002,7 @@ }, "Game/EffectTiles/Ice.png": { - "frame": {"x":1805,"y":791,"w":72,"h":72}, + "frame": {"x":1830,"y":911,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -1898,7 +2010,7 @@ }, "Game/EffectTiles/IllusOrbDead.png": { - "frame": {"x":1225,"y":553,"w":22,"h":16}, + "frame": {"x":1346,"y":511,"w":22,"h":16}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":29,"w":22,"h":16}, @@ -1906,7 +2018,7 @@ }, "Game/EffectTiles/Latex.png": { - "frame": {"x":1805,"y":865,"w":72,"h":72}, + "frame": {"x":1768,"y":1082,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -1914,7 +2026,7 @@ }, "Game/EffectTiles/LatexBlue.png": { - "frame": {"x":1763,"y":1131,"w":72,"h":72}, + "frame": {"x":1757,"y":1230,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -1922,23 +2034,15 @@ }, "Game/EffectTiles/LiquidMetal.png": { - "frame": {"x":1623,"y":1379,"w":72,"h":72}, + "frame": {"x":1757,"y":1304,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/EffectTiles/MotionLamp.png": -{ - "frame": {"x":1570,"y":2011,"w":50,"h":36}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":11,"y":18,"w":50,"h":36}, - "sourceSize": {"w":72,"h":72} -}, "Game/EffectTiles/MotionLampLight.png": { - "frame": {"x":1496,"y":2016,"w":51,"h":31}, + "frame": {"x":1986,"y":725,"w":51,"h":31}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":17,"w":51,"h":31}, @@ -1946,7 +2050,7 @@ }, "Game/EffectTiles/Radiance.png": { - "frame": {"x":1932,"y":1491,"w":51,"h":31}, + "frame": {"x":690,"y":2016,"w":51,"h":31}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":33,"w":51,"h":31}, @@ -1954,7 +2058,7 @@ }, "Game/EffectTiles/Runes.png": { - "frame": {"x":1494,"y":1022,"w":72,"h":42}, + "frame": {"x":1491,"y":293,"w":72,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":22,"w":72,"h":42}, @@ -1962,7 +2066,7 @@ }, "Game/EffectTiles/RunesTrap.png": { - "frame": {"x":1969,"y":75,"w":66,"h":36}, + "frame": {"x":1692,"y":1533,"w":66,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":25,"w":66,"h":36}, @@ -1970,7 +2074,7 @@ }, "Game/EffectTiles/Sleet.png": { - "frame": {"x":1621,"y":1453,"w":72,"h":72}, + "frame": {"x":1924,"y":273,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -1978,7 +2082,7 @@ }, "Game/EffectTiles/Soap.png": { - "frame": {"x":1772,"y":1594,"w":69,"h":72}, + "frame": {"x":1978,"y":907,"w":69,"h":72}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":69,"h":72}, @@ -1986,23 +2090,15 @@ }, "Game/EffectTiles/TauntGround.png": { - "frame": {"x":1624,"y":1595,"w":72,"h":72}, + "frame": {"x":1924,"y":347,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/EffectTiles/Torch.png": -{ - "frame": {"x":2019,"y":983,"w":28,"h":52}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":23,"y":19,"w":28,"h":52}, - "sourceSize": {"w":72,"h":72} -}, "Game/EffectTiles/Water.png": { - "frame": {"x":1697,"y":1304,"w":72,"h":72}, + "frame": {"x":1924,"y":421,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2010,47 +2106,63 @@ }, "Game/EffectTiles/WaterFrozen.png": { - "frame": {"x":1764,"y":1205,"w":72,"h":72}, + "frame": {"x":1924,"y":495,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/EffectTiles/Wire.png": +"Game/Enemies/AlchemistPet.png": { - "frame": {"x":1837,"y":1047,"w":72,"h":72}, + "frame": {"x":1275,"y":983,"w":34,"h":64}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "trimmed": true, + "spriteSourceSize": {"x":22,"y":6,"w":34,"h":64}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/Alkahestor.png": { - "frame": {"x":496,"y":1962,"w":53,"h":68}, + "frame": {"x":1775,"y":860,"w":53,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":0,"w":53,"h":68}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/AnimYoke.png": +"Game/Enemies/Angel.png": { - "frame": {"x":939,"y":1135,"w":62,"h":33}, + "frame": {"x":1100,"y":791,"w":36,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":17,"w":62,"h":33}, + "spriteSourceSize": {"x":20,"y":3,"w":36,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/ApprenticeSlime.png": +"Game/Enemies/AnimYoke.png": { - "frame": {"x":1570,"y":1942,"w":50,"h":67}, + "frame": {"x":1067,"y":1685,"w":62,"h":33}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":17,"w":62,"h":33}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/ApprenticeSlime.png": +{ + "frame": {"x":1043,"y":1188,"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":2000,"y":643,"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":1243,"y":1419,"w":59,"h":70}, + "frame": {"x":1649,"y":1670,"w":59,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":1,"w":59,"h":70}, @@ -2058,47 +2170,39 @@ }, "Game/Enemies/BarricadeBlastDoor.png": { - "frame": {"x":1837,"y":1121,"w":72,"h":72}, + "frame": {"x":1711,"y":1571,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BarricadeEarth.png": -{ - "frame": {"x":1992,"y":1736,"w":55,"h":68}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":8,"y":3,"w":55,"h":68}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/BarricadeRobot.png": { - "frame": {"x":1945,"y":989,"w":72,"h":46}, + "frame": {"x":962,"y":1365,"w":72,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":13,"w":72,"h":46}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BarricadeShadowMetal.png": +"Game/Enemies/BarricadeWater.png": { - "frame": {"x":1723,"y":997,"w":72,"h":58}, + "frame": {"x":1267,"y":1476,"w":72,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":12,"w":72,"h":58}, + "spriteSourceSize": {"x":0,"y":9,"w":72,"h":55}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BarricadeWater.png": +"Game/Enemies/BindableEnemies/AlchemistPet.png": { - "frame": {"x":473,"y":1671,"w":72,"h":55}, + "frame": {"x":1275,"y":983,"w":34,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":9,"w":72,"h":55}, + "spriteSourceSize": {"x":22,"y":6,"w":34,"h":64}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/BindableEnemies/Alkahestor.png": { - "frame": {"x":496,"y":1962,"w":53,"h":68}, + "frame": {"x":1775,"y":860,"w":53,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":0,"w":53,"h":68}, @@ -2106,47 +2210,87 @@ }, "Game/Enemies/BindableEnemies/ApprenticeSlime.png": { - "frame": {"x":1570,"y":1942,"w":50,"h":67}, + "frame": {"x":1043,"y":1188,"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":2000,"y":643,"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":1243,"y":1419,"w":59,"h":70}, + "frame": {"x":1649,"y":1670,"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/Conjurer.png": +"Game/Enemies/BindableEnemies/BlindZombie.png": { - "frame": {"x":1992,"y":1876,"w":55,"h":67}, + "frame": {"x":755,"y":1892,"w":38,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":0,"w":55,"h":67}, + "spriteSourceSize": {"x":16,"y":2,"w":38,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/ElementalIce.png": +"Game/Enemies/BindableEnemies/Dryad.png": { - "frame": {"x":956,"y":1985,"w":56,"h":61}, + "frame": {"x":1998,"y":273,"w":48,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":9,"y":7,"w":56,"h":61}, + "spriteSourceSize": {"x":12,"y":3,"w":48,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/MageZombie.png": +"Game/Enemies/BindableEnemies/FastZombie.png": { - "frame": {"x":1695,"y":1526,"w":72,"h":66}, + "frame": {"x":1227,"y":1332,"w":38,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":2,"w":72,"h":66}, + "spriteSourceSize": {"x":16,"y":1,"w":38,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/BindableEnemies/Fuuka1.png": +{ + "frame": {"x":576,"y":1973,"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/Guard.png": +{ + "frame": {"x":922,"y":662,"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/JungleDryad.png": +{ + "frame": {"x":1998,"y":340,"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/MaidforcePara.png": +{ + "frame": {"x":2006,"y":1717,"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":625,"y":1843,"w":47,"h":66}, + "frame": {"x":947,"y":1653,"w":47,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":1,"w":47,"h":66}, @@ -2154,95 +2298,119 @@ }, "Game/Enemies/BindableEnemies/SamuraiZombie.png": { - "frame": {"x":913,"y":1523,"w":37,"h":66}, + "frame": {"x":1100,"y":860,"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/SlimeEnthusiast.png": +{ + "frame": {"x":794,"y":1982,"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/SummonedZombie.png": { - "frame": {"x":433,"y":1596,"w":39,"h":66}, + "frame": {"x":576,"y":1837,"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/WitchFlame.png": +"Game/Enemies/BindableEnemies/WolfgirlPet.png": { - "frame": {"x":1992,"y":1945,"w":54,"h":67}, + "frame": {"x":1275,"y":1049,"w":34,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":6,"y":0,"w":54,"h":67}, + "spriteSourceSize": {"x":22,"y":6,"w":34,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Conjurer.png": +"Game/Enemies/BlindZombie.png": { - "frame": {"x":1992,"y":1876,"w":55,"h":67}, + "frame": {"x":755,"y":1892,"w":38,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":0,"w":55,"h":67}, + "spriteSourceSize": {"x":16,"y":2,"w":38,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/ConjurerTickler.png": +"Game/Enemies/Chef.png": { - "frame": {"x":1992,"y":1876,"w":55,"h":67}, + "frame": {"x":576,"y":1905,"w":38,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":0,"w":55,"h":67}, + "spriteSourceSize": {"x":13,"y":1,"w":38,"h":66}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/Cuffs.png": { - "frame": {"x":785,"y":2014,"w":51,"h":33}, + "frame": {"x":1945,"y":2013,"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/Nara.png": +"Game/Enemies/CustomSpriteBound/Rook.png": { - "frame": {"x":1166,"y":1766,"w":32,"h":66}, + "frame": {"x":1979,"y":1152,"w":64,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":19,"y":3,"w":32,"h":66}, + "spriteSourceSize": {"x":5,"y":0,"w":64,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/CustomSprite/Rook.png": +"Game/Enemies/Cyborg.png": { - "frame": {"x":1991,"y":1526,"w":56,"h":68}, + "frame": {"x":1043,"y":1257,"w":51,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":13,"y":3,"w":56,"h":68}, + "spriteSourceSize": {"x":7,"y":4,"w":51,"h":66}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/CyborgGuardian.png": { - "frame": {"x":957,"y":1840,"w":59,"h":69}, + "frame": {"x":1649,"y":1742,"w":59,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":59,"h":69}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/DemonVoid.png": +"Game/Enemies/DemonEye.png": +{ + "frame": {"x":620,"y":1535,"w":67,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":0,"w":67,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DirtPile.png": { - "frame": {"x":1698,"y":1890,"w":70,"h":72}, + "frame": {"x":1998,"y":2013,"w":47,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":0,"w":70,"h":72}, + "spriteSourceSize": {"x":12,"y":28,"w":47,"h":33}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/DollDoor.png": { - "frame": {"x":1879,"y":717,"w":72,"h":72}, + "frame": {"x":1766,"y":1459,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, +"Game/Enemies/DollsmithDoll.png": +{ + "frame": {"x":1998,"y":407,"w":40,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":3,"w":40,"h":65}, + "sourceSize": {"w":72,"h":72} +}, "Game/Enemies/DragonQueenCrystal.png": { - "frame": {"x":1239,"y":1510,"w":137,"h":136}, + "frame": {"x":1781,"y":145,"w":137,"h":136}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":137,"h":136}, @@ -2250,7 +2418,7 @@ }, "Game/Enemies/DragonQueenIce.png": { - "frame": {"x":883,"y":1727,"w":133,"h":111}, + "frame": {"x":620,"y":1831,"w":133,"h":111}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":16,"w":133,"h":111}, @@ -2258,7 +2426,7 @@ }, "Game/Enemies/DragonQueenPoison.png": { - "frame": {"x":1013,"y":1170,"w":114,"h":126}, + "frame": {"x":1925,"y":1,"w":114,"h":126}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":3,"w":114,"h":126}, @@ -2266,23 +2434,23 @@ }, "Game/Enemies/DragonQueenShadow.png": { - "frame": {"x":136,"y":1814,"w":129,"h":127}, + "frame": {"x":816,"y":1590,"w":129,"h":127}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":10,"w":129,"h":127}, "sourceSize": {"w":144,"h":144} }, -"Game/Enemies/ElementalIce.png": +"Game/Enemies/Dryad.png": { - "frame": {"x":956,"y":1985,"w":56,"h":61}, + "frame": {"x":1998,"y":273,"w":48,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":9,"y":7,"w":56,"h":61}, + "spriteSourceSize": {"x":12,"y":3,"w":48,"h":65}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/EpicenterCursed.png": { - "frame": {"x":1879,"y":791,"w":72,"h":72}, + "frame": {"x":1825,"y":1378,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2290,7 +2458,7 @@ }, "Game/Enemies/EpicenterCursed2.png": { - "frame": {"x":1879,"y":865,"w":72,"h":72}, + "frame": {"x":1831,"y":1156,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2298,7 +2466,7 @@ }, "Game/Enemies/FactoryDoll.png": { - "frame": {"x":913,"y":1591,"w":37,"h":66}, + "frame": {"x":1570,"y":1139,"w":37,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":3,"w":37,"h":66}, @@ -2306,7 +2474,15 @@ }, "Game/Enemies/FaithfulZombie.png": { - "frame": {"x":433,"y":1664,"w":38,"h":66}, + "frame": {"x":755,"y":1824,"w":38,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":1,"w":38,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/FastZombie.png": +{ + "frame": {"x":1227,"y":1332,"w":38,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":1,"w":38,"h":66}, @@ -2314,15 +2490,23 @@ }, "Game/Enemies/FreeDoll.png": { - "frame": {"x":913,"y":1659,"w":37,"h":66}, + "frame": {"x":1570,"y":1207,"w":37,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":4,"w":37,"h":66}, "sourceSize": {"w":72,"h":72} }, +"Game/Enemies/Fuuka1.png": +{ + "frame": {"x":869,"y":1834,"w":38,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":2,"w":38,"h":65}, + "sourceSize": {"w":72,"h":72} +}, "Game/Enemies/GhostAdventurer.png": { - "frame": {"x":392,"y":1810,"w":28,"h":59}, + "frame": {"x":816,"y":1529,"w":28,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":8,"w":28,"h":59}, @@ -2330,15 +2514,39 @@ }, "Game/Enemies/GreaterSkeleton.png": { - "frame": {"x":1585,"y":1854,"w":37,"h":64}, + "frame": {"x":1785,"y":1637,"w":37,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":2,"w":37,"h":64}, "sourceSize": {"w":72,"h":72} }, +"Game/Enemies/Guard.png": +{ + "frame": {"x":922,"y":662,"w":28,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":3,"w":28,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Jailer.png": +{ + "frame": {"x":922,"y":662,"w":28,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":3,"w":28,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/JungleDryad.png": +{ + "frame": {"x":1998,"y":340,"w":48,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":3,"w":48,"h":65}, + "sourceSize": {"w":72,"h":72} +}, "Game/Enemies/LatexCube.png": { - "frame": {"x":1970,"y":324,"w":72,"h":72}, + "frame": {"x":1860,"y":985,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2346,23 +2554,23 @@ }, "Game/Enemies/LiquidMetalCube.png": { - "frame": {"x":1970,"y":398,"w":72,"h":72}, + "frame": {"x":1904,"y":911,"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": +"Game/Enemies/MaidforcePara.png": { - "frame": {"x":1695,"y":1526,"w":72,"h":66}, + "frame": {"x":2006,"y":1717,"w":41,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":2,"w":72,"h":66}, + "spriteSourceSize": {"x":16,"y":3,"w":41,"h":64}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/MikoGhost.png": { - "frame": {"x":748,"y":1972,"w":35,"h":65}, + "frame": {"x":1094,"y":1720,"w":35,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":2,"w":35,"h":65}, @@ -2370,7 +2578,7 @@ }, "Game/Enemies/NakedElemental.png": { - "frame": {"x":1437,"y":1656,"w":37,"h":65}, + "frame": {"x":1564,"y":1398,"w":37,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":3,"w":37,"h":65}, @@ -2378,7 +2586,7 @@ }, "Game/Enemies/NawashiZombie.png": { - "frame": {"x":625,"y":1843,"w":47,"h":66}, + "frame": {"x":947,"y":1653,"w":47,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":1,"w":47,"h":66}, @@ -2386,7 +2594,7 @@ }, "Game/Enemies/PetChastity.png": { - "frame": {"x":625,"y":1911,"w":37,"h":66}, + "frame": {"x":1564,"y":1330,"w":37,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":5,"w":37,"h":66}, @@ -2394,7 +2602,7 @@ }, "Game/Enemies/PetDisplay.png": { - "frame": {"x":625,"y":1979,"w":37,"h":65}, + "frame": {"x":755,"y":1959,"w":37,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":5,"w":37,"h":65}, @@ -2402,7 +2610,7 @@ }, "Game/Enemies/PinkAlkahestor.png": { - "frame": {"x":1992,"y":1806,"w":53,"h":68}, + "frame": {"x":1775,"y":930,"w":53,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":0,"w":53,"h":68}, @@ -2410,47 +2618,39 @@ }, "Game/Enemies/Pixie.png": { - "frame": {"x":1571,"y":324,"w":23,"h":19}, + "frame": {"x":2017,"y":1130,"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":1516,"y":144,"w":55,"h":27}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":8,"y":22,"w":55,"h":27}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/SamuraiZombie.png": { - "frame": {"x":913,"y":1523,"w":37,"h":66}, + "frame": {"x":1100,"y":860,"w":37,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":1,"w":37,"h":66}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/ShrineMaiden.png": +"Game/Enemies/SlimeEnthusiast.png": { - "frame": {"x":1695,"y":1526,"w":72,"h":66}, + "frame": {"x":794,"y":1982,"w":72,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":2,"w":72,"h":66}, + "spriteSourceSize": {"x":0,"y":6,"w":72,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/ShrineMaiden_2.png": +"Game/Enemies/SlimeMoldLeaper.png": { - "frame": {"x":1695,"y":1526,"w":72,"h":66}, + "frame": {"x":1214,"y":1865,"w":63,"h":69}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":2,"w":72,"h":66}, + "spriteSourceSize": {"x":6,"y":1,"w":63,"h":69}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/SteelDoor.png": { - "frame": {"x":1970,"y":472,"w":72,"h":72}, + "frame": {"x":1905,"y":759,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2458,7 +2658,7 @@ }, "Game/Enemies/StoneDoor.png": { - "frame": {"x":1697,"y":1378,"w":72,"h":72}, + "frame": {"x":1926,"y":651,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2466,31 +2666,39 @@ }, "Game/Enemies/SummonedZombie.png": { - "frame": {"x":433,"y":1596,"w":39,"h":66}, + "frame": {"x":576,"y":1837,"w":39,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":1,"w":39,"h":66}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/TapeBot.png": +"Game/Enemies/WolfDrone.png": { - "frame": {"x":1547,"y":1266,"w":65,"h":38}, + "frame": {"x":1063,"y":1164,"w":31,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":21,"w":65,"h":38}, + "spriteSourceSize": {"x":22,"y":17,"w":31,"h":21}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/WolfDrone.png": +"Game/Enemies/WolfInstructor.png": { - "frame": {"x":1699,"y":1281,"w":31,"h":21}, + "frame": {"x":869,"y":1968,"w":35,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":22,"y":17,"w":31,"h":21}, + "spriteSourceSize": {"x":22,"y":6,"w":35,"h":64}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/WolfOperative.png": +{ + "frame": {"x":2008,"y":981,"w":38,"h":64}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":6,"w":38,"h":64}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/WolfShieldDrone.png": { - "frame": {"x":1697,"y":1452,"w":72,"h":72}, + "frame": {"x":1930,"y":569,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2498,15 +2706,23 @@ }, "Game/EnemiesBound/BanditHunter.png": { - "frame": {"x":1304,"y":1476,"w":53,"h":30}, + "frame": {"x":1424,"y":1298,"w":53,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":27,"w":53,"h":30}, "sourceSize": {"w":72,"h":72} }, +"Game/EnemiesBound/Conjurer.png": +{ + "frame": {"x":2004,"y":568,"w":39,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":0,"w":39,"h":65}, + "sourceSize": {"w":72,"h":72} +}, "Game/EnemiesBound/Cyborg.png": { - "frame": {"x":748,"y":1904,"w":36,"h":66}, + "frame": {"x":538,"y":1945,"w":36,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":4,"w":36,"h":66}, @@ -2514,7 +2730,7 @@ }, "Game/EnemiesBound/CyborgBerserker.png": { - "frame": {"x":433,"y":1528,"w":40,"h":66}, + "frame": {"x":846,"y":1346,"w":40,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":4,"w":40,"h":66}, @@ -2522,63 +2738,47 @@ }, "Game/EnemiesBound/Dollmaker.png": { - "frame": {"x":1166,"y":1966,"w":30,"h":64}, + "frame": {"x":922,"y":596,"w":30,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":1,"w":30,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/DragonPoison.png": +"Game/EnemiesBound/EncasedDoll.png": { - "frame": {"x":371,"y":1990,"w":49,"h":57}, + "frame": {"x":1100,"y":928,"w":37,"h":54}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":18,"y":9,"w":49,"h":57}, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":54}, "sourceSize": {"w":72,"h":72} }, "Game/EnemiesBound/EncasedFactoryDoll.png": { - "frame": {"x":1585,"y":1720,"w":37,"h":65}, + "frame": {"x":869,"y":1901,"w":37,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":7,"w":37,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/GreaterSkeleton.png": -{ - "frame": {"x":1166,"y":1834,"w":32,"h":64}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":25,"y":2,"w":32,"h":64}, - "sourceSize": {"w":72,"h":72} -}, -"Game/EnemiesBound/Guard.png": -{ - "frame": {"x":392,"y":1931,"w":28,"h":57}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":25,"y":3,"w":28,"h":57}, - "sourceSize": {"w":72,"h":72} -}, -"Game/EnemiesBound/Head/Cleric.png": +"Game/EnemiesBound/Head/LesserSkeleton.png": { - "frame": {"x":331,"y":2017,"w":38,"h":30}, + "frame": {"x":1457,"y":1065,"w":22,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":22,"y":2,"w":38,"h":30}, + "spriteSourceSize": {"x":26,"y":8,"w":22,"h":24}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/Head/LesserSkeleton.png": +"Game/EnemiesBound/Head/MaidforceHead.png": { - "frame": {"x":1452,"y":1534,"w":22,"h":24}, + "frame": {"x":920,"y":566,"w":32,"h":28}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":26,"y":8,"w":22,"h":24}, + "spriteSourceSize": {"x":25,"y":5,"w":32,"h":28}, "sourceSize": {"w":72,"h":72} }, "Game/EnemiesBound/Head/Nawashi.png": { - "frame": {"x":1198,"y":2021,"w":41,"h":24}, + "frame": {"x":906,"y":2019,"w":41,"h":24}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":8,"w":41,"h":24}, @@ -2586,7 +2786,7 @@ }, "Game/EnemiesBound/Head/Skeleton.png": { - "frame": {"x":1452,"y":1534,"w":22,"h":24}, + "frame": {"x":1457,"y":1065,"w":22,"h":24}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":26,"y":8,"w":22,"h":24}, @@ -2594,7 +2794,7 @@ }, "Game/EnemiesBound/HeavySkeleton.png": { - "frame": {"x":1166,"y":1900,"w":32,"h":64}, + "frame": {"x":693,"y":1166,"w":32,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":2,"w":32,"h":64}, @@ -2602,23 +2802,23 @@ }, "Game/EnemiesBound/Jailer.png": { - "frame": {"x":883,"y":1667,"w":28,"h":58}, + "frame": {"x":2019,"y":1849,"w":28,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":3,"w":28,"h":58}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/MageZombie.png": +"Game/EnemiesBound/JungleDryad.png": { - "frame": {"x":934,"y":573,"w":22,"h":49}, + "frame": {"x":1849,"y":725,"w":69,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":27,"y":11,"w":22,"h":49}, + "spriteSourceSize": {"x":3,"y":31,"w":69,"h":32}, "sourceSize": {"w":72,"h":72} }, "Game/EnemiesBound/MaidforceHead.png": { - "frame": {"x":1761,"y":680,"w":66,"h":35}, + "frame": {"x":1760,"y":1533,"w":66,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":32,"w":66,"h":35}, @@ -2626,31 +2826,31 @@ }, "Game/EnemiesBound/SlimeAdv.png": { - "frame": {"x":1585,"y":1787,"w":37,"h":65}, + "frame": {"x":1785,"y":1570,"w":37,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":7,"w":37,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/FloorGeneric/Bed.png": +"Game/FloorGeneric/Angel.png": { - "frame": {"x":1624,"y":1669,"w":72,"h":72}, + "frame": {"x":1100,"y":791,"w":36,"h":67}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":1,"w":36,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/FloorGeneric/BondageMachine/ChastityHoriz.png": +"Game/FloorGeneric/Bed.png": { - "frame": {"x":1769,"y":1526,"w":72,"h":66}, + "frame": {"x":1905,"y":833,"w":72,"h":72}, "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":6,"w":72,"h":66}, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, "Game/FloorGeneric/BondageMachine/ChastityVert.png": { - "frame": {"x":1363,"y":1730,"w":72,"h":72}, + "frame": {"x":1842,"y":1059,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2658,39 +2858,23 @@ }, "Game/FloorGeneric/BondageMachine/DollVert.png": { - "frame": {"x":1200,"y":1799,"w":72,"h":72}, + "frame": {"x":1831,"y":1230,"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/LatexHoriz.png": -{ - "frame": {"x":1843,"y":1674,"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/LatexVert.png": { - "frame": {"x":1018,"y":1861,"w":72,"h":72}, + "frame": {"x":1831,"y":1304,"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/MetalHoriz.png": -{ - "frame": {"x":1917,"y":1674,"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/MetalVert.png": { - "frame": {"x":882,"y":1914,"w":72,"h":72}, + "frame": {"x":1916,"y":1059,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2698,7 +2882,7 @@ }, "Game/FloorGeneric/BondageMachine/PlugVert.png": { - "frame": {"x":786,"y":1940,"w":72,"h":72}, + "frame": {"x":1934,"y":985,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2706,23 +2890,15 @@ }, "Game/FloorGeneric/BondageMachine/TapeVert.png": { - "frame": {"x":1092,"y":1840,"w":72,"h":72}, + "frame": {"x":1711,"y":1645,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/FloorGeneric/Charger.png": -{ - "frame": {"x":1771,"y":1304,"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":1771,"y":1367,"w":32,"h":61}, + "frame": {"x":693,"y":1232,"w":32,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":0,"w":32,"h":61}, @@ -2730,7 +2906,7 @@ }, "Game/FloorGeneric/ChargerSpent.png": { - "frame": {"x":1771,"y":1430,"w":32,"h":61}, + "frame": {"x":693,"y":1295,"w":32,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":0,"w":32,"h":61}, @@ -2738,7 +2914,7 @@ }, "Game/FloorGeneric/ChestShadow.png": { - "frame": {"x":547,"y":1671,"w":72,"h":54}, + "frame": {"x":1341,"y":1476,"w":72,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":14,"w":72,"h":54}, @@ -2746,7 +2922,7 @@ }, "Game/FloorGeneric/CollapsedStairs.png": { - "frame": {"x":1274,"y":1799,"w":72,"h":72}, + "frame": {"x":1353,"y":1677,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2754,7 +2930,7 @@ }, "Game/FloorGeneric/Conveyor/Conveyor.png": { - "frame": {"x":1437,"y":1723,"w":72,"h":72}, + "frame": {"x":1131,"y":1749,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2762,7 +2938,7 @@ }, "Game/FloorGeneric/Conveyor/Down.png": { - "frame": {"x":1511,"y":1720,"w":72,"h":72}, + "frame": {"x":918,"y":1797,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2770,23 +2946,15 @@ }, "Game/FloorGeneric/Conveyor/DownLeft.png": { - "frame": {"x":1624,"y":1743,"w":72,"h":72}, + "frame": {"x":795,"y":1834,"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/DownOff.png": -{ - "frame": {"x":267,"y":1756,"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/DownRight.png": { - "frame": {"x":1437,"y":1797,"w":72,"h":72}, + "frame": {"x":616,"y":1944,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2794,47 +2962,23 @@ }, "Game/FloorGeneric/Conveyor/DownSwitch.png": { - "frame": {"x":650,"y":1424,"w":20,"h":28}, + "frame": {"x":289,"y":1960,"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/Left.png": -{ - "frame": {"x":1026,"y":1663,"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":1797,"y":997,"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/LeftOff.png": -{ - "frame": {"x":267,"y":1756,"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/LeftRightDown.png": +"Game/FloorGeneric/Conveyor/LeftOn.png": { - "frame": {"x":1882,"y":616,"w":72,"h":48}, + "frame": {"x":1622,"y":1646,"w":27,"h":22}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":24,"w":72,"h":48}, + "spriteSourceSize": {"x":21,"y":37,"w":27,"h":22}, "sourceSize": {"w":72,"h":72} }, "Game/FloorGeneric/Conveyor/LeftRightUp.png": { - "frame": {"x":1348,"y":1804,"w":72,"h":72}, + "frame": {"x":992,"y":1795,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2842,7 +2986,7 @@ }, "Game/FloorGeneric/Conveyor/LeftSwitch.png": { - "frame": {"x":1585,"y":1920,"w":28,"h":20}, + "frame": {"x":1783,"y":838,"w":28,"h":20}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":38,"w":28,"h":20}, @@ -2850,39 +2994,23 @@ }, "Game/FloorGeneric/Conveyor/LeftUp.png": { - "frame": {"x":1200,"y":1873,"w":72,"h":72}, + "frame": {"x":1205,"y":1749,"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":1805,"y":939,"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": +"Game/FloorGeneric/Conveyor/RightOn.png": { - "frame": {"x":1871,"y":989,"w":72,"h":48}, + "frame": {"x":1651,"y":1646,"w":27,"h":22}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":24,"w":72,"h":48}, - "sourceSize": {"w":72,"h":72} -}, -"Game/FloorGeneric/Conveyor/RightOff.png": -{ - "frame": {"x":267,"y":1756,"w":20,"h":20}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":27,"y":38,"w":20,"h":20}, + "spriteSourceSize": {"x":24,"y":37,"w":27,"h":22}, "sourceSize": {"w":72,"h":72} }, "Game/FloorGeneric/Conveyor/RightSwitch.png": { - "frame": {"x":1327,"y":2026,"w":28,"h":20}, + "frame": {"x":1842,"y":1133,"w":28,"h":20}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":26,"y":38,"w":28,"h":20}, @@ -2890,7 +3018,7 @@ }, "Game/FloorGeneric/Conveyor/RightUp.png": { - "frame": {"x":1092,"y":1914,"w":72,"h":72}, + "frame": {"x":1279,"y":1732,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2898,31 +3026,15 @@ }, "Game/FloorGeneric/Conveyor/SafetyDown.png": { - "frame": {"x":1014,"y":1935,"w":72,"h":72}, + "frame": {"x":1427,"y":1677,"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":1896,"y":666,"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/SafetyRight.png": -{ - "frame": {"x":1956,"y":616,"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":1274,"y":1873,"w":72,"h":72}, + "frame": {"x":1501,"y":1670,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2930,7 +3042,7 @@ }, "Game/FloorGeneric/Conveyor/Up.png": { - "frame": {"x":1511,"y":1794,"w":72,"h":72}, + "frame": {"x":1575,"y":1670,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2938,7 +3050,7 @@ }, "Game/FloorGeneric/Conveyor/UpDownLeft.png": { - "frame": {"x":1624,"y":1817,"w":72,"h":72}, + "frame": {"x":1710,"y":1719,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -2946,39 +3058,15 @@ }, "Game/FloorGeneric/Conveyor/UpDownRight.png": { - "frame": {"x":1511,"y":1868,"w":72,"h":72}, + "frame": {"x":1501,"y":1744,"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/UpLeft.png": -{ - "frame": {"x":1879,"y":939,"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/UpOff.png": -{ - "frame": {"x":267,"y":1756,"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/UpRight.png": -{ - "frame": {"x":1476,"y":1670,"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/UpSwitch.png": { - "frame": {"x":650,"y":1454,"w":20,"h":28}, + "frame": {"x":447,"y":1704,"w":20,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":26,"y":19,"w":20,"h":28}, @@ -2986,23 +3074,15 @@ }, "Game/FloorGeneric/CrackHoriz.png": { - "frame": {"x":1621,"y":144,"w":45,"h":26}, + "frame": {"x":1084,"y":1384,"w":45,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":45,"h":26}, "sourceSize": {"w":72,"h":72} }, -"Game/FloorGeneric/CrackLeft.png": -{ - "frame": {"x":744,"y":781,"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":621,"y":1671,"w":72,"h":49}, + "frame": {"x":1153,"y":1332,"w":72,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":14,"w":72,"h":49}, @@ -3010,7 +3090,7 @@ }, "Game/FloorGeneric/DimensionRift.png": { - "frame": {"x":1359,"y":1476,"w":53,"h":30}, + "frame": {"x":1479,"y":1298,"w":53,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":40,"w":53,"h":30}, @@ -3018,7 +3098,7 @@ }, "Game/FloorGeneric/DollSupply.png": { - "frame": {"x":1348,"y":1878,"w":72,"h":72}, + "frame": {"x":1279,"y":1806,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3026,7 +3106,7 @@ }, "Game/FloorGeneric/EmptyPipe.png": { - "frame": {"x":744,"y":828,"w":26,"h":41}, + "frame": {"x":312,"y":1684,"w":26,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":31,"w":26,"h":41}, @@ -3034,7 +3114,7 @@ }, "Game/FloorGeneric/Ghost.png": { - "frame": {"x":392,"y":1810,"w":28,"h":59}, + "frame": {"x":816,"y":1529,"w":28,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":8,"w":28,"h":59}, @@ -3042,7 +3122,7 @@ }, "Game/FloorGeneric/HookLow.png": { - "frame": {"x":1514,"y":324,"w":28,"h":19}, + "frame": {"x":1872,"y":1133,"w":28,"h":19}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":48,"w":28,"h":19}, @@ -3050,47 +3130,23 @@ }, "Game/FloorGeneric/LatexPipe.png": { - "frame": {"x":744,"y":871,"w":26,"h":41}, + "frame": {"x":918,"y":1719,"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":860,"y":1815,"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":551,"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/Sarcophagus.png": { - "frame": {"x":772,"y":962,"w":52,"h":26}, + "frame": {"x":814,"y":566,"w":52,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":23,"w":52,"h":26}, "sourceSize": {"w":72,"h":72} }, -"Game/FloorGeneric/Signal/AutoLock.png": -{ - "frame": {"x":267,"y":1778,"w":20,"h":20}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":26,"y":29,"w":20,"h":20}, - "sourceSize": {"w":72,"h":72} -}, "Game/FloorGeneric/Spores.png": { - "frame": {"x":1200,"y":1947,"w":72,"h":72}, + "frame": {"x":1066,"y":1867,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3098,31 +3154,15 @@ }, "Game/FloorGeneric/StairsDown.png": { - "frame": {"x":1274,"y":1947,"w":72,"h":72}, + "frame": {"x":909,"y":1871,"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":1970,"y":666,"w":69,"h":43}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":3,"y":28,"w":69,"h":43}, - "sourceSize": {"w":72,"h":72} -}, -"Game/FloorGeneric/TablePizza.png": -{ - "frame": {"x":1953,"y":938,"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":1422,"y":1871,"w":72,"h":72}, + "frame": {"x":795,"y":1908,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3130,7 +3170,7 @@ }, "Game/FloorGeneric/WaterFoam.png": { - "frame": {"x":1624,"y":1891,"w":72,"h":72}, + "frame": {"x":983,"y":1871,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3138,7 +3178,7 @@ }, "Game/Floors/Floor_bel/Barrel.png": { - "frame": {"x":1496,"y":1942,"w":72,"h":72}, + "frame": {"x":1140,"y":1865,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3146,7 +3186,7 @@ }, "Game/Floors/Floor_bel/Bars.png": { - "frame": {"x":1422,"y":1945,"w":72,"h":72}, + "frame": {"x":1353,"y":1751,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3154,7 +3194,7 @@ }, "Game/Floors/Floor_bel/BarsVert.png": { - "frame": {"x":1348,"y":1952,"w":72,"h":72}, + "frame": {"x":1427,"y":1751,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3162,7 +3202,7 @@ }, "Game/Floors/Floor_bel/BarsVertCont.png": { - "frame": {"x":1622,"y":1965,"w":72,"h":72}, + "frame": {"x":1575,"y":1744,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3170,7 +3210,7 @@ }, "Game/Floors/Floor_bel/Brickwork.png": { - "frame": {"x":1696,"y":1965,"w":72,"h":72}, + "frame": {"x":1784,"y":1719,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3178,7 +3218,7 @@ }, "Game/Floors/Floor_bel/DollDropoff.png": { - "frame": {"x":1698,"y":1594,"w":72,"h":72}, + "frame": {"x":1828,"y":1533,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3186,7 +3226,7 @@ }, "Game/Floors/Floor_bel/Doodad.png": { - "frame": {"x":1805,"y":1279,"w":72,"h":72}, + "frame": {"x":1899,"y":1378,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3194,7 +3234,7 @@ }, "Game/Floors/Floor_bel/Door.png": { - "frame": {"x":1838,"y":1195,"w":72,"h":72}, + "frame": {"x":1840,"y":1452,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3202,7 +3242,7 @@ }, "Game/Floors/Floor_bel/DoorOpen.png": { - "frame": {"x":1911,"y":1039,"w":72,"h":72}, + "frame": {"x":1824,"y":1607,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3210,7 +3250,7 @@ }, "Game/Floors/Floor_bel/DoorVert.png": { - "frame": {"x":1911,"y":1113,"w":72,"h":72}, + "frame": {"x":1905,"y":1153,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3218,7 +3258,7 @@ }, "Game/Floors/Floor_bel/DoorVertCont.png": { - "frame": {"x":1805,"y":1353,"w":72,"h":72}, + "frame": {"x":1905,"y":1227,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3226,7 +3266,7 @@ }, "Game/Floors/Floor_bel/DoorVertOpen.png": { - "frame": {"x":1805,"y":1427,"w":72,"h":72}, + "frame": {"x":1905,"y":1301,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3234,7 +3274,7 @@ }, "Game/Floors/Floor_bel/DoorVertOpenCont.png": { - "frame": {"x":1953,"y":716,"w":72,"h":72}, + "frame": {"x":1858,"y":1718,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3242,7 +3282,7 @@ }, "Game/Floors/Floor_bel/Floor.png": { - "frame": {"x":1953,"y":790,"w":72,"h":72}, + "frame": {"x":1898,"y":1607,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3250,7 +3290,7 @@ }, "Game/Floors/Floor_bel/Grate.png": { - "frame": {"x":1953,"y":864,"w":72,"h":72}, + "frame": {"x":1902,"y":1526,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3258,7 +3298,7 @@ }, "Game/Floors/Floor_bel/GrateHoriz.png": { - "frame": {"x":1698,"y":1668,"w":72,"h":72}, + "frame": {"x":1914,"y":1452,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3266,7 +3306,7 @@ }, "Game/Floors/Floor_bel/GrateVert.png": { - "frame": {"x":1770,"y":1742,"w":72,"h":72}, + "frame": {"x":1973,"y":1375,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3274,7 +3314,7 @@ }, "Game/Floors/Floor_bel/MimicBlock.png": { - "frame": {"x":1843,"y":1526,"w":72,"h":72}, + "frame": {"x":1858,"y":1792,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3282,7 +3322,7 @@ }, "Game/Floors/Floor_bel/OrbEmpty.png": { - "frame": {"x":1843,"y":1600,"w":72,"h":72}, + "frame": {"x":1649,"y":1813,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3290,7 +3330,7 @@ }, "Game/Floors/Floor_bel/RubbleLooted.png": { - "frame": {"x":1879,"y":1269,"w":72,"h":72}, + "frame": {"x":1501,"y":1818,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3298,7 +3338,7 @@ }, "Game/Floors/Floor_bel/Shrine.png": { - "frame": {"x":1912,"y":1187,"w":72,"h":72}, + "frame": {"x":1279,"y":1880,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3306,7 +3346,7 @@ }, "Game/Floors/Floor_bel/ShrineBroken.png": { - "frame": {"x":1879,"y":1343,"w":72,"h":72}, + "frame": {"x":1140,"y":1939,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3314,7 +3354,7 @@ }, "Game/Floors/Floor_bel/ShrineC.png": { - "frame": {"x":1879,"y":1417,"w":72,"h":72}, + "frame": {"x":1057,"y":1941,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3322,7 +3362,7 @@ }, "Game/Floors/Floor_bel/ShrineEmpty.png": { - "frame": {"x":1770,"y":1816,"w":72,"h":72}, + "frame": {"x":908,"y":1945,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3330,7 +3370,7 @@ }, "Game/Floors/Floor_bel/StairsDown.png": { - "frame": {"x":1770,"y":1890,"w":72,"h":72}, + "frame": {"x":982,"y":1945,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3338,7 +3378,7 @@ }, "Game/Floors/Floor_bel/StairsUp.png": { - "frame": {"x":1770,"y":1964,"w":72,"h":72}, + "frame": {"x":1353,"y":1825,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3346,7 +3386,7 @@ }, "Game/Floors/Floor_bel/Trap.png": { - "frame": {"x":1844,"y":1742,"w":72,"h":72}, + "frame": {"x":1427,"y":1825,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3354,7 +3394,23 @@ }, "Game/Floors/Floor_bel/Wall.png": { - "frame": {"x":1917,"y":1526,"w":72,"h":72}, + "frame": {"x":1575,"y":1818,"w":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":1723,"y":1793,"w":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":1797,"y":1866,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3362,7 +3418,7 @@ }, "Game/Floors/Floor_bel/WallVert.png": { - "frame": {"x":1917,"y":1600,"w":72,"h":72}, + "frame": {"x":1649,"y":1887,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3370,7 +3426,7 @@ }, "Game/Floors/Floor_cat/Barrel.png": { - "frame": {"x":1953,"y":1261,"w":72,"h":72}, + "frame": {"x":1501,"y":1892,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3378,7 +3434,7 @@ }, "Game/Floors/Floor_cat/Bars.png": { - "frame": {"x":1953,"y":1335,"w":72,"h":72}, + "frame": {"x":1353,"y":1899,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3386,7 +3442,7 @@ }, "Game/Floors/Floor_cat/BarsOld.png": { - "frame": {"x":1953,"y":1409,"w":72,"h":72}, + "frame": {"x":1279,"y":1954,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3394,7 +3450,7 @@ }, "Game/Floors/Floor_cat/BarsVert.png": { - "frame": {"x":1844,"y":1816,"w":72,"h":72}, + "frame": {"x":1427,"y":1899,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3402,7 +3458,7 @@ }, "Game/Floors/Floor_cat/BarsVertCont.png": { - "frame": {"x":1844,"y":1890,"w":72,"h":72}, + "frame": {"x":1575,"y":1892,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3410,7 +3466,7 @@ }, "Game/Floors/Floor_cat/Brickwork.png": { - "frame": {"x":1844,"y":1964,"w":72,"h":72}, + "frame": {"x":1723,"y":1867,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3418,7 +3474,7 @@ }, "Game/Floors/Floor_cat/Doodad.png": { - "frame": {"x":1918,"y":1742,"w":72,"h":72}, + "frame": {"x":1871,"y":1866,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3426,7 +3482,7 @@ }, "Game/Floors/Floor_cat/Door.png": { - "frame": {"x":1918,"y":1816,"w":72,"h":72}, + "frame": {"x":1932,"y":1717,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3434,7 +3490,7 @@ }, "Game/Floors/Floor_cat/DoorOpen.png": { - "frame": {"x":1918,"y":1890,"w":72,"h":72}, + "frame": {"x":1972,"y":1600,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3442,7 +3498,111 @@ }, "Game/Floors/Floor_cat/DoorVert.png": { - "frame": {"x":1918,"y":1964,"w":72,"h":72}, + "frame": {"x":1932,"y":1791,"w":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":1945,"y":1865,"w":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":1945,"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/Floors/Floor_cat/DoorVertOpenCont.png": +{ + "frame": {"x":1797,"y":1940,"w":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":1723,"y":1941,"w":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":1649,"y":1961,"w":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":1871,"y":1940,"w":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":1501,"y":1966,"w":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":1575,"y":1966,"w":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":1353,"y":1973,"w":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":1427,"y":1973,"w":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":1723,"y":1793,"w":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":1797,"y":1866,"w":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":1575,"y":1966,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3450,7 +3610,7 @@ }, "Game/Floors/Floor_ore/StairsDown.png": { - "frame": {"x":1770,"y":1890,"w":72,"h":72}, + "frame": {"x":982,"y":1945,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3458,7 +3618,7 @@ }, "Game/Floors/Floor_ore/StairsUp.png": { - "frame": {"x":1770,"y":1964,"w":72,"h":72}, + "frame": {"x":1353,"y":1825,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3466,7 +3626,7 @@ }, "Game/Floors/Floor_shoppe/Barrel.png": { - "frame": {"x":1496,"y":1942,"w":72,"h":72}, + "frame": {"x":1140,"y":1865,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3474,7 +3634,7 @@ }, "Game/HideFull.png": { - "frame": {"x":531,"y":385,"w":36,"h":20}, + "frame": {"x":340,"y":1704,"w":36,"h":20}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":18,"w":36,"h":20}, @@ -3482,7 +3642,7 @@ }, "Game/InvDrop.png": { - "frame": {"x":1013,"y":1298,"w":108,"h":50}, + "frame": {"x":1043,"y":1332,"w":108,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":6,"w":108,"h":50}, @@ -3490,47 +3650,55 @@ }, "Game/InvHidden.png": { - "frame": {"x":1961,"y":188,"w":36,"h":20}, + "frame": {"x":378,"y":1704,"w":36,"h":20}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":40,"y":1,"w":36,"h":20}, "sourceSize": {"w":76,"h":76} }, -"Game/InvHide.png": +"Game/InvItemSortLeft.png": { - "frame": {"x":1768,"y":624,"w":112,"h":54}, + "frame": {"x":351,"y":550,"w":18,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":2,"w":112,"h":54}, - "sourceSize": {"w":116,"h":56} + "spriteSourceSize": {"x":0,"y":21,"w":18,"h":33}, + "sourceSize": {"w":76,"h":76} +}, +"Game/InvItemSortRight.png": +{ + "frame": {"x":325,"y":710,"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":531,"y":385,"w":36,"h":20}, + "frame": {"x":340,"y":1704,"w":36,"h":20}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":40,"y":1,"w":36,"h":20}, "sourceSize": {"w":76,"h":76} }, -"Game/Items/Claymore.png": +"Game/Items/Brownies.png": { - "frame": {"x":1197,"y":1308,"w":72,"h":37}, + "frame": {"x":1275,"y":1115,"w":34,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":18,"w":72,"h":37}, + "spriteSourceSize": {"x":19,"y":13,"w":34,"h":43}, "sourceSize": {"w":72,"h":72} }, -"Game/Items/Crossbow.png": +"Game/Items/Claymore.png": { - "frame": {"x":1985,"y":1483,"w":61,"h":41}, + "frame": {"x":1,"y":2010,"w":72,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":9,"y":15,"w":61,"h":41}, + "spriteSourceSize": {"x":0,"y":18,"w":72,"h":37}, "sourceSize": {"w":72,"h":72} }, "Game/Items/EnchantedGrinder.png": { - "frame": {"x":1064,"y":1135,"w":59,"h":30}, + "frame": {"x":1696,"y":764,"w":59,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":21,"w":59,"h":30}, @@ -3538,23 +3706,23 @@ }, "Game/Items/Flashlight.png": { - "frame": {"x":1992,"y":2014,"w":50,"h":32}, + "frame": {"x":1056,"y":2015,"w":50,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":20,"w":50,"h":32}, "sourceSize": {"w":72,"h":72} }, -"Game/Items/Group/ItemButt.png": +"Game/Items/Group/ItemDevices.png": { - "frame": {"x":939,"y":1020,"w":18,"h":29}, + "frame": {"x":1771,"y":2015,"w":24,"h":26}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":45,"y":39,"w":18,"h":29}, + "spriteSourceSize": {"x":42,"y":41,"w":24,"h":26}, "sourceSize": {"w":72,"h":72} }, "Game/Items/Group/ItemLegs.png": { - "frame": {"x":1486,"y":515,"w":24,"h":33}, + "frame": {"x":325,"y":640,"w":24,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":42,"y":38,"w":24,"h":33}, @@ -3562,7 +3730,7 @@ }, "Game/Items/Group/ItemNeck.png": { - "frame": {"x":1732,"y":1281,"w":29,"h":21}, + "frame": {"x":416,"y":1704,"w":29,"h":21}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":40,"y":46,"w":29,"h":21}, @@ -3570,7 +3738,7 @@ }, "Game/Items/Group/ItemNeckRestraints.png": { - "frame": {"x":934,"y":736,"w":20,"h":32}, + "frame": {"x":314,"y":1580,"w":20,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":44,"y":38,"w":20,"h":32}, @@ -3578,7 +3746,7 @@ }, "Game/Items/Group/ItemNipples.png": { - "frame": {"x":939,"y":1051,"w":19,"h":28}, + "frame": {"x":447,"y":1734,"w":19,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":47,"y":40,"w":19,"h":28}, @@ -3586,31 +3754,31 @@ }, "Game/Items/Group/ItemVulva.png": { - "frame": {"x":934,"y":701,"w":22,"h":33}, + "frame": {"x":351,"y":480,"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": +"Game/Items/IceCube.png": { - "frame": {"x":826,"y":962,"w":50,"h":24}, + "frame": {"x":1534,"y":1298,"w":52,"h":30}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":10,"y":22,"w":50,"h":24}, + "spriteSourceSize": {"x":10,"y":24,"w":52,"h":30}, "sourceSize": {"w":72,"h":72} }, -"Game/Items/IceCube.png": +"Game/Items/Knives.png": { - "frame": {"x":1414,"y":1476,"w":52,"h":30}, + "frame": {"x":913,"y":1164,"w":50,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":10,"y":24,"w":52,"h":30}, + "spriteSourceSize": {"x":11,"y":26,"w":50,"h":23}, "sourceSize": {"w":72,"h":72} }, "Game/Items/Lore.png": { - "frame": {"x":1619,"y":324,"w":20,"h":19}, + "frame": {"x":1302,"y":2028,"w":20,"h":19}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":52,"w":20,"h":19}, @@ -3618,15 +3786,31 @@ }, "Game/Items/MagicSpear.png": { - "frame": {"x":1343,"y":515,"w":70,"h":35}, + "frame": {"x":1710,"y":581,"w":70,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":19,"w":70,"h":35}, "sourceSize": {"w":72,"h":72} }, +"Game/Items/PotionStamina.png": +{ + "frame": {"x":1998,"y":474,"w":40,"h":65}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":16,"y":4,"w":40,"h":65}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/RedKey.png": +{ + "frame": {"x":1016,"y":1164,"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/AutoTape.png": { - "frame": {"x":1241,"y":2021,"w":41,"h":24}, + "frame": {"x":949,"y":2019,"w":41,"h":24}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":24,"w":41,"h":24}, @@ -3634,7 +3818,7 @@ }, "Game/Items/Restraint/ChainBikini.png": { - "frame": {"x":422,"y":1856,"w":127,"h":104}, + "frame": {"x":1563,"y":1466,"w":127,"h":104}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":33,"y":41,"w":127,"h":104}, @@ -3642,7 +3826,7 @@ }, "Game/Items/Restraint/Charms.png": { - "frame": {"x":1284,"y":2021,"w":41,"h":24}, + "frame": {"x":992,"y":2019,"w":41,"h":24}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":24,"w":41,"h":24}, @@ -3650,7 +3834,7 @@ }, "Game/Items/Restraint/ClothGagOver.png": { - "frame": {"x":1638,"y":654,"w":121,"h":61}, + "frame": {"x":1624,"y":797,"w":121,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":46,"y":39,"w":121,"h":61}, @@ -3658,7 +3842,7 @@ }, "Game/Items/Restraint/Corsets.png": { - "frame": {"x":1134,"y":1133,"w":171,"h":173}, + "frame": {"x":1147,"y":181,"w":171,"h":173}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":40,"y":23,"w":171,"h":173}, @@ -3666,7 +3850,7 @@ }, "Game/Items/Restraint/CyberMittens.png": { - "frame": {"x":768,"y":1667,"w":113,"h":123}, + "frame": {"x":689,"y":1699,"w":113,"h":123}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":113,"h":123}, @@ -3674,7 +3858,7 @@ }, "Game/Items/Restraint/Ice.png": { - "frame": {"x":1414,"y":1476,"w":52,"h":30}, + "frame": {"x":1534,"y":1298,"w":52,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":24,"w":52,"h":30}, @@ -3682,7 +3866,7 @@ }, "Game/Items/Restraint/LeatherGloves.png": { - "frame": {"x":1516,"y":1,"w":153,"h":141}, + "frame": {"x":159,"y":1541,"w":153,"h":141}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":32,"w":153,"h":141}, @@ -3690,7 +3874,7 @@ }, "Game/Items/Restraint/MagicArmbands.png": { - "frame": {"x":1317,"y":1066,"w":152,"h":64}, + "frame": {"x":952,"y":725,"w":152,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":61,"w":152,"h":64}, @@ -3698,23 +3882,15 @@ }, "Game/Items/Restraint/Mittens.png": { - "frame": {"x":1826,"y":114,"w":133,"h":94}, + "frame": {"x":312,"y":1727,"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/MysticDuctTape.png": -{ - "frame": {"x":1422,"y":2019,"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/PlugGags.png": { - "frame": {"x":1829,"y":680,"w":65,"h":35}, + "frame": {"x":1824,"y":1681,"w":65,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":23,"w":65,"h":35}, @@ -3722,7 +3898,7 @@ }, "Game/Items/Restraint/RedLatexOTNGag.png": { - "frame": {"x":1671,"y":126,"w":153,"h":85}, + "frame": {"x":1139,"y":873,"w":153,"h":85}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":73,"w":153,"h":85}, @@ -3730,7 +3906,7 @@ }, "Game/Items/Restraint/SteelArmor.png": { - "frame": {"x":167,"y":1006,"w":164,"h":181}, + "frame": {"x":728,"y":1163,"w":164,"h":181}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":10,"w":164,"h":181}, @@ -3738,7 +3914,7 @@ }, "Game/Items/Restraint/Sunglasses.png": { - "frame": {"x":1471,"y":1066,"w":144,"h":62}, + "frame": {"x":1487,"y":733,"w":144,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":29,"y":68,"w":144,"h":62}, @@ -3746,23 +3922,15 @@ }, "Game/Items/Restraint/Thumbcuffs.png": { - "frame": {"x":674,"y":1796,"w":110,"h":106}, + "frame": {"x":464,"y":1837,"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/Vibes.png": -{ - "frame": {"x":1805,"y":1501,"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/WiredVibe.png": { - "frame": {"x":1498,"y":726,"w":159,"h":143}, + "frame": {"x":1267,"y":1331,"w":159,"h":143}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":3,"w":159,"h":143}, @@ -3770,7 +3938,7 @@ }, "Game/Items/Restraint/Yokes.png": { - "frame": {"x":939,"y":1135,"w":62,"h":33}, + "frame": {"x":1067,"y":1685,"w":62,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":17,"w":62,"h":33}, @@ -3778,7 +3946,7 @@ }, "Game/Items/SlimeClaymore.png": { - "frame": {"x":1568,"y":1022,"w":72,"h":37}, + "frame": {"x":75,"y":2010,"w":72,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":18,"w":72,"h":37}, @@ -3786,23 +3954,47 @@ }, "Game/Items/Slimethrower.png": { - "frame": {"x":695,"y":1671,"w":69,"h":46}, + "frame": {"x":1565,"y":293,"w":69,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":11,"w":69,"h":46}, "sourceSize": {"w":72,"h":72} }, +"Game/Items/StaffElectric.png": +{ + "frame": {"x":1106,"y":725,"w":31,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":2,"w":31,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Items/StaffIncineration.png": +{ + "frame": {"x":922,"y":728,"w":28,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":3,"w":28,"h":60}, + "sourceSize": {"w":72,"h":72} +}, "Game/Items/StaffPermafrost.png": { - "frame": {"x":392,"y":1871,"w":28,"h":58}, + "frame": {"x":2019,"y":1909,"w":28,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":5,"w":28,"h":58}, "sourceSize": {"w":72,"h":72} }, +"Game/Items/StormBreaker.png": +{ + "frame": {"x":1920,"y":725,"w":64,"h":32}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":20,"w":64,"h":32}, + "sourceSize": {"w":72,"h":72} +}, "Game/Items/Sunglasses.png": { - "frame": {"x":1471,"y":1066,"w":144,"h":62}, + "frame": {"x":1487,"y":733,"w":144,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":29,"y":68,"w":144,"h":62}, @@ -3810,7 +4002,7 @@ }, "Game/Items/VibeRemote.png": { - "frame": {"x":744,"y":914,"w":23,"h":38}, + "frame": {"x":325,"y":600,"w":23,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":19,"w":23,"h":38}, @@ -3818,31 +4010,23 @@ }, "Game/Outfits/Dragon.png": { - "frame": {"x":958,"y":384,"w":186,"h":186}, + "frame": {"x":767,"y":378,"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":267,"y":1800,"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": +"Game/Particles/nnn.png": { - "frame": {"x":860,"y":1883,"w":20,"h":20}, + "frame": {"x":2014,"y":1674,"w":33,"h":40}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":20,"h":20}, - "sourceSize": {"w":20,"h":20} + "trimmed": true, + "spriteSourceSize": {"x":7,"y":3,"w":33,"h":40}, + "sourceSize": {"w":50,"h":50} }, "Game/Poses/BlushExtreme.png": { - "frame": {"x":491,"y":385,"w":38,"h":17}, + "frame": {"x":1231,"y":960,"w":38,"h":17}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":16,"w":38,"h":17}, @@ -3850,7 +4034,7 @@ }, "Game/Poses/Hogtie.png": { - "frame": {"x":195,"y":2017,"w":44,"h":21}, + "frame": {"x":1185,"y":960,"w":44,"h":21}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":14,"w":44,"h":21}, @@ -3858,31 +4042,31 @@ }, "Game/Poses/Kneel.png": { - "frame": {"x":1357,"y":2026,"w":25,"h":21}, + "frame": {"x":1680,"y":1646,"w":25,"h":21}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":10,"w":25,"h":21}, "sourceSize": {"w":46,"h":45} }, -"Game/Poses/KneelClosed.png": +"Game/Poses/Spread.png": { - "frame": {"x":860,"y":1838,"w":21,"h":21}, + "frame": {"x":894,"y":1163,"w":17,"h":25}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":15,"y":10,"w":21,"h":21}, + "spriteSourceSize": {"x":15,"y":10,"w":17,"h":25}, "sourceSize": {"w":46,"h":45} }, -"Game/Poses/Spread.png": +"Game/Ranged.png": { - "frame": {"x":563,"y":638,"w":17,"h":25}, + "frame": {"x":1517,"y":1596,"w":43,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":15,"y":10,"w":17,"h":25}, - "sourceSize": {"w":46,"h":45} + "spriteSourceSize": {"x":1,"y":11,"w":43,"h":65}, + "sourceSize": {"w":50,"h":86} }, "Game/ShopBasic/Dragon.png": { - "frame": {"x":958,"y":384,"w":186,"h":186}, + "frame": {"x":767,"y":378,"w":186,"h":186}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":7,"w":186,"h":186}, @@ -3890,23 +4074,39 @@ }, "Game/ShrineAura.png": { - "frame": {"x":860,"y":1792,"w":21,"h":21}, + "frame": {"x":1108,"y":2015,"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":311,"y":1971,"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":2022,"y":210,"w":25,"h":37}, + "frame": {"x":314,"y":1541,"w":25,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":17,"w":25,"h":37}, "sourceSize": {"w":72,"h":72} }, +"Game/Spells/ApprenticeLightning.png": +{ + "frame": {"x":2019,"y":1969,"w":28,"h":35}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":20,"w":28,"h":35}, + "sourceSize": {"w":72,"h":72} +}, "Game/Spells/ApprenticeWater.png": { - "frame": {"x":934,"y":663,"w":20,"h":36}, + "frame": {"x":351,"y":442,"w":20,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":27,"y":19,"w":20,"h":36}, @@ -3914,7 +4114,7 @@ }, "Game/Spells/ArrowVineSpell.png": { - "frame": {"x":865,"y":1136,"w":61,"h":31}, + "frame": {"x":1633,"y":764,"w":61,"h":31}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":20,"w":61,"h":31}, @@ -3922,7 +4122,7 @@ }, "Game/Spells/Awaken.png": { - "frame": {"x":865,"y":988,"w":72,"h":72}, + "frame": {"x":1627,"y":860,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -3930,7 +4130,7 @@ }, "Game/Spells/Blink.png": { - "frame": {"x":1014,"y":2009,"w":65,"h":34}, + "frame": {"x":1891,"y":1681,"w":65,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":17,"w":65,"h":34}, @@ -3938,23 +4138,31 @@ }, "Game/Spells/Corona.png": { - "frame": {"x":865,"y":1062,"w":72,"h":72}, + "frame": {"x":1627,"y":934,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/FlashFreeze.png": +"Game/Spells/Empower.png": { - "frame": {"x":1772,"y":1668,"w":69,"h":72}, + "frame": {"x":1214,"y":2006,"w":63,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":0,"w":69,"h":72}, + "spriteSourceSize": {"x":5,"y":17,"w":63,"h":40}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/FeatherCloud.png": +{ + "frame": {"x":1979,"y":833,"w":68,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":4,"y":0,"w":68,"h":72}, "sourceSize": {"w":72,"h":72} }, "Game/Spells/FloatingWeapon.png": { - "frame": {"x":1415,"y":515,"w":69,"h":36}, + "frame": {"x":1778,"y":725,"w":69,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":19,"w":69,"h":36}, @@ -3962,71 +4170,71 @@ }, "Game/Spells/Frustration.png": { - "frame": {"x":625,"y":1911,"w":37,"h":66}, + "frame": {"x":1564,"y":1330,"w":37,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":5,"w":37,"h":66}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/GreaterShield.png": +"Game/Spells/Icebolt.png": { - "frame": {"x":1991,"y":1596,"w":55,"h":68}, + "frame": {"x":1130,"y":1823,"w":72,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":8,"y":3,"w":55,"h":68}, + "spriteSourceSize": {"x":0,"y":17,"w":72,"h":40}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/Ignition.png": +"Game/Spells/IceOrb.png": { - "frame": {"x":1243,"y":1347,"w":62,"h":70}, + "frame": {"x":1214,"y":1936,"w":63,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":4,"y":1,"w":62,"h":70}, + "spriteSourceSize": {"x":0,"y":2,"w":63,"h":68}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/LatexWall.png": +"Game/Spells/Ignite.png": { - "frame": {"x":1550,"y":1670,"w":72,"h":48}, + "frame": {"x":311,"y":1971,"w":72,"h":72}, "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":13,"w":72,"h":48}, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/LatexWallHoriz.png": +"Game/Spells/Ignition.png": { - "frame": {"x":1550,"y":1670,"w":72,"h":48}, + "frame": {"x":1066,"y":1795,"w":62,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":13,"w":72,"h":48}, + "spriteSourceSize": {"x":4,"y":1,"w":62,"h":70}, "sourceSize": {"w":72,"h":72} }, "Game/Spells/Leap.png": { - "frame": {"x":1948,"y":210,"w":72,"h":72}, + "frame": {"x":1620,"y":1089,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/Quickness.png": +"Game/Spells/LightningBolt.png": { - "frame": {"x":1764,"y":1279,"w":39,"h":23}, + "frame": {"x":2006,"y":1783,"w":41,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":18,"y":24,"w":39,"h":23}, + "spriteSourceSize": {"x":17,"y":6,"w":41,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/ShadowBlade.png": +"Game/Spells/SteelRainBurst.png": { - "frame": {"x":1948,"y":284,"w":66,"h":38}, + "frame": {"x":620,"y":1757,"w":65,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":3,"y":13,"w":66,"h":38}, + "spriteSourceSize": {"x":1,"y":0,"w":65,"h":72}, "sourceSize": {"w":72,"h":72} }, "Game/Spells/SteelRainPlug.png": { - "frame": {"x":1718,"y":624,"w":48,"h":28}, + "frame": {"x":1177,"y":1383,"w":48,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":22,"w":48,"h":28}, @@ -4034,23 +4242,23 @@ }, "Game/Spells/SummonCuffs.png": { - "frame": {"x":1879,"y":1491,"w":51,"h":33}, + "frame": {"x":1797,"y":2014,"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": +"Game/Spells/SummonUp1.png": { - "frame": {"x":1516,"y":144,"w":55,"h":27}, + "frame": {"x":1797,"y":1793,"w":57,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":8,"y":22,"w":55,"h":27}, + "spriteSourceSize": {"x":8,"y":3,"w":57,"h":68}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/SummonUp1.png": +"Game/Spells/SummonUp2.png": { - "frame": {"x":1986,"y":1178,"w":57,"h":68}, + "frame": {"x":1988,"y":1449,"w":57,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":3,"w":57,"h":68}, @@ -4058,31 +4266,47 @@ }, "Game/Spells/SummonYoke.png": { - "frame": {"x":939,"y":1135,"w":62,"h":33}, + "frame": {"x":1067,"y":1685,"w":62,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":17,"w":62,"h":33}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/ZoneOfPurity.png": +"Game/Spells/Thunderstorm.png": +{ + "frame": {"x":947,"y":1585,"w":48,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":4,"w":48,"h":66}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/WindBlast.png": +{ + "frame": {"x":620,"y":1609,"w":67,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":0,"w":67,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/CollectionFilter/Rank0.png": { - "frame": {"x":1985,"y":1108,"w":62,"h":68}, + "frame": {"x":1723,"y":2015,"w":46,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":6,"y":2,"w":62,"h":68}, + "spriteSourceSize": {"x":14,"y":20,"w":46,"h":32}, "sourceSize": {"w":72,"h":72} }, -"Game/UI/Buttons/Ransom.png": +"Game/UI/Demote.png": { - "frame": {"x":397,"y":385,"w":49,"h":20}, + "frame": {"x":1850,"y":2014,"w":46,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":15,"y":31,"w":49,"h":20}, - "sourceSize": {"w":80,"h":80} + "spriteSourceSize": {"x":15,"y":24,"w":46,"h":32}, + "sourceSize": {"w":76,"h":76} }, "Game/UI/Disperse.png": { - "frame": {"x":1999,"y":188,"w":34,"h":20}, + "frame": {"x":1747,"y":838,"w":34,"h":20}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":7,"w":34,"h":20}, @@ -4090,7 +4314,7 @@ }, "Game/UI/DollmakerTarget.png": { - "frame": {"x":145,"y":1541,"w":142,"h":142}, + "frame": {"x":1780,"y":289,"w":142,"h":142}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, @@ -4098,7 +4322,7 @@ }, "Game/UI/escaped.png": { - "frame": {"x":2022,"y":249,"w":24,"h":33}, + "frame": {"x":325,"y":675,"w":24,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":2,"w":24,"h":33}, @@ -4106,15 +4330,31 @@ }, "Game/UI/evasion.png": { - "frame": {"x":1544,"y":324,"w":25,"h":19}, + "frame": {"x":1990,"y":1130,"w":25,"h":19}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":7,"w":25,"h":19}, "sourceSize": {"w":36,"h":36} }, +"Game/UI/Facility/TrainingDojo.png": +{ + "frame": {"x":620,"y":1683,"w":67,"h":72}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":0,"w":67,"h":72}, + "sourceSize": {"w":72,"h":72} +}, +"Game/UI/Facility_Servants.png": +{ + "frame": {"x":664,"y":2018,"w":24,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":47,"y":4,"w":24,"h":27}, + "sourceSize": {"w":76,"h":76} +}, "Game/UI/Hands.png": { - "frame": {"x":657,"y":781,"w":28,"h":17}, + "frame": {"x":1592,"y":1646,"w":28,"h":17}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":8,"w":28,"h":17}, @@ -4122,7 +4362,7 @@ }, "Game/UI/HighValueTarget.png": { - "frame": {"x":289,"y":1535,"w":142,"h":142}, + "frame": {"x":1780,"y":433,"w":142,"h":142}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, @@ -4130,63 +4370,63 @@ }, "Game/UI/Log/Action.png": { - "frame": {"x":939,"y":986,"w":19,"h":32}, + "frame": {"x":314,"y":1614,"w":19,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":14,"w":19,"h":32}, "sourceSize": {"w":60,"h":60} }, -"Game/UI/LogDown.png": +"Game/UI/MiniMap/ChargerCrystal.png": { - "frame": {"x":1271,"y":1308,"w":33,"h":36}, + "frame": {"x":1457,"y":1091,"w":22,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":4,"y":2,"w":33,"h":36}, - "sourceSize": {"w":41,"h":41} + "spriteSourceSize": {"x":1,"y":0,"w":22,"h":24}, + "sourceSize": {"w":24,"h":24} }, -"Game/UI/MiniMap/ChargerCrystal.png": +"Game/UI/MiniMap/ChargerEmpty.png": { - "frame": {"x":1452,"y":1560,"w":22,"h":24}, + "frame": {"x":1457,"y":1117,"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": +"Game/UI/MiniMap/Chest.png": { - "frame": {"x":1452,"y":1586,"w":22,"h":24}, + "frame": {"x":770,"y":2026,"w":22,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":0,"w":22,"h":24}, + "spriteSourceSize": {"x":1,"y":1,"w":22,"h":21}, "sourceSize": {"w":24,"h":24} }, "Game/UI/MiniMap/Key.png": { - "frame": {"x":1173,"y":553,"w":24,"h":17}, + "frame": {"x":1959,"y":1133,"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/Orb.png": +"Game/UI/Rank/Rank0.png": { - "frame": {"x":2024,"y":938,"w":23,"h":23}, + "frame": {"x":1723,"y":2015,"w":46,"h":32}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":1,"w":23,"h":23}, - "sourceSize": {"w":24,"h":24} + "spriteSourceSize": {"x":14,"y":20,"w":46,"h":32}, + "sourceSize": {"w":72,"h":72} }, -"Game/UI/MiniMap/Tablet.png": +"Game/UI/Rank/Rank5.png": { - "frame": {"x":1452,"y":1612,"w":22,"h":24}, + "frame": {"x":1979,"y":1226,"w":64,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":0,"w":22,"h":24}, - "sourceSize": {"w":24,"h":24} + "spriteSourceSize": {"x":4,"y":0,"w":64,"h":72}, + "sourceSize": {"w":72,"h":72} }, "Game/UI/Resource/Rune.png": { - "frame": {"x":1,"y":2017,"w":50,"h":29}, + "frame": {"x":868,"y":566,"w":50,"h":29}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":27,"w":50,"h":29}, @@ -4194,7 +4434,7 @@ }, "Game/UI/Select.png": { - "frame": {"x":939,"y":986,"w":19,"h":32}, + "frame": {"x":314,"y":1614,"w":19,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":0,"w":19,"h":32}, @@ -4202,7 +4442,7 @@ }, "Game/UI/speed.png": { - "frame": {"x":1384,"y":2026,"w":25,"h":21}, + "frame": {"x":743,"y":2026,"w":25,"h":21}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":7,"w":25,"h":21}, @@ -4210,7 +4450,7 @@ }, "Game/UI/Sprint.png": { - "frame": {"x":1660,"y":1281,"w":37,"h":21}, + "frame": {"x":1271,"y":960,"w":37,"h":21}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":19,"w":37,"h":21}, @@ -4218,7 +4458,7 @@ }, "Game/UI/StageTarget.png": { - "frame": {"x":624,"y":1527,"w":142,"h":142}, + "frame": {"x":1781,"y":1,"w":142,"h":142}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":142,"h":142}, @@ -4226,39 +4466,47 @@ }, "Game/UI/Tick.png": { - "frame": {"x":563,"y":603,"w":17,"h":33}, + "frame": {"x":325,"y":745,"w":17,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":4,"w":17,"h":33}, "sourceSize": {"w":18,"h":41} }, -"Game/UI/UsePotionMana.png": +"Game/UI/Tighten.png": +{ + "frame": {"x":1979,"y":1300,"w":67,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":2,"w":67,"h":71}, + "sourceSize": {"w":76,"h":76} +}, +"Game/UI/UsePotionFrigid.png": { - "frame": {"x":939,"y":1081,"w":19,"h":22}, + "frame": {"x":447,"y":1792,"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": +"Game/UI/UsePotionMana.png": { - "frame": {"x":939,"y":1105,"w":19,"h":22}, + "frame": {"x":289,"y":1990,"w":19,"h":22}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":19,"h":22}, "sourceSize": {"w":44,"h":26} }, -"Game/UI/UsePotionUnavailable.png": +"Game/UI/UsePotionStamina.png": { - "frame": {"x":860,"y":1905,"w":20,"h":20}, + "frame": {"x":289,"y":2014,"w":19,"h":22}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":3,"y":4,"w":20,"h":20}, + "spriteSourceSize": {"x":3,"y":2,"w":19,"h":22}, "sourceSize": {"w":44,"h":26} }, "Game/UI/UsePotionWill.png": { - "frame": {"x":267,"y":1685,"w":19,"h":22}, + "frame": {"x":1588,"y":1295,"w":19,"h":22}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":19,"h":22}, @@ -4266,7 +4514,7 @@ }, "Game/UI/vision.png": { - "frame": {"x":657,"y":781,"w":28,"h":17}, + "frame": {"x":1592,"y":1646,"w":28,"h":17}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":8,"w":28,"h":17}, @@ -4274,7 +4522,7 @@ }, "Game/Vision.png": { - "frame": {"x":1480,"y":1130,"w":134,"h":134}, + "frame": {"x":1428,"y":1330,"w":134,"h":134}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":5,"w":134,"h":134}, @@ -4282,7 +4530,7 @@ }, "Game/VisionNeg.png": { - "frame": {"x":780,"y":199,"w":183,"h":183}, + "frame": {"x":728,"y":978,"w":183,"h":183}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":17,"w":183,"h":183}, @@ -4296,6 +4544,6 @@ "size": {"w":2048,"h":2048}, "scale": "1", "related_multi_packs": [ "game0.json", "game1.json", "game2.json", "game4.json", "game5.json" ], - "smartupdate": "$TexturePacker:SmartUpdate:76d784dd5df773dd2e2ebbec4425c54f:c9bd94d932662e62f0f3a8268b0ee477:54a7432a0665349a58c0c74f51e75c65$" + "smartupdate": "$TexturePacker:SmartUpdate:cd45dd3b98fe2739696c2386a6ef9b3c:9b1095aa07d6e300e2f0b7c24c8c3454:54a7432a0665349a58c0c74f51e75c65$" } } diff --git a/TextureAtlas/game3.png b/TextureAtlas/game3.png index f6e01f416..1eeed705f 100644 Binary files a/TextureAtlas/game3.png and b/TextureAtlas/game3.png differ diff --git a/TextureAtlas/game4.json b/TextureAtlas/game4.json index 47b8ca539..664347dfa 100644 --- a/TextureAtlas/game4.json +++ b/TextureAtlas/game4.json @@ -1,32 +1,24 @@ {"frames": { -"Game/Aura.png": +"Game/Backpack.png": { - "frame": {"x":1037,"y":1,"w":71,"h":72}, + "frame": {"x":1153,"y":1655,"w":47,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":0,"w":71,"h":72}, - "sourceSize": {"w":72,"h":72} + "spriteSourceSize": {"x":4,"y":28,"w":47,"h":48}, + "sourceSize": {"w":56,"h":86} }, "Game/BackpackOpen.png": { - "frame": {"x":1994,"y":203,"w":50,"h":66}, + "frame": {"x":1220,"y":1227,"w":50,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":10,"w":50,"h":66}, "sourceSize": {"w":56,"h":86} }, -"Game/Buffs/BuffDotsSide.png": -{ - "frame": {"x":1658,"y":1008,"w":26,"h":28}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":12,"y":9,"w":26,"h":28}, - "sourceSize": {"w":46,"h":46} -}, "Game/Bullets/AllyCrackleTrail.png": { - "frame": {"x":1253,"y":1153,"w":69,"h":62}, + "frame": {"x":1618,"y":1003,"w":69,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":6,"w":69,"h":62}, @@ -34,7 +26,7 @@ }, "Game/Bullets/AllyCrackleTrailHit.png": { - "frame": {"x":1253,"y":1153,"w":69,"h":62}, + "frame": {"x":1618,"y":1003,"w":69,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":6,"w":69,"h":62}, @@ -42,7 +34,7 @@ }, "Game/Bullets/AllyFirebolt.png": { - "frame": {"x":1893,"y":1737,"w":41,"h":33}, + "frame": {"x":1582,"y":1884,"w":41,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":20,"w":41,"h":33}, @@ -50,15 +42,23 @@ }, "Game/Bullets/AllyHolyBoltHit.png": { - "frame": {"x":1688,"y":937,"w":65,"h":63}, + "frame": {"x":1748,"y":1412,"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":1288,"y":1546,"w":52,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "sourceSize": {"w":72,"h":72} +}, "Game/Bullets/AllyWindBlast.png": { - "frame": {"x":1684,"y":71,"w":67,"h":67}, + "frame": {"x":1980,"y":817,"w":67,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":1,"w":67,"h":67}, @@ -66,7 +66,7 @@ }, "Game/Bullets/AllyWindBlastHit.png": { - "frame": {"x":1688,"y":937,"w":65,"h":63}, + "frame": {"x":1748,"y":1412,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -74,7 +74,7 @@ }, "Game/Bullets/AmpuleBlueHit.png": { - "frame": {"x":1620,"y":876,"w":66,"h":64}, + "frame": {"x":1556,"y":741,"w":66,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":66,"h":64}, @@ -82,7 +82,7 @@ }, "Game/Bullets/AmpuleGreenHit.png": { - "frame": {"x":1673,"y":563,"w":66,"h":64}, + "frame": {"x":1613,"y":1290,"w":66,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":66,"h":64}, @@ -90,47 +90,39 @@ }, "Game/Bullets/AmpuleRedHit.png": { - "frame": {"x":1673,"y":629,"w":66,"h":64}, + "frame": {"x":1896,"y":1209,"w":66,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":66,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/AmpuleYellowHit.png": +"Game/Bullets/AmpuleYellow.png": { - "frame": {"x":1672,"y":695,"w":66,"h":64}, + "frame": {"x":1525,"y":1139,"w":49,"h":46}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":3,"w":66,"h":64}, + "spriteSourceSize": {"x":17,"y":11,"w":49,"h":46}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/ArcaneBlast.png": +"Game/Bullets/AmpuleYellowHit.png": { - "frame": {"x":1967,"y":1359,"w":60,"h":56}, + "frame": {"x":1825,"y":1245,"w":66,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":9,"w":60,"h":56}, + "spriteSourceSize": {"x":0,"y":3,"w":66,"h":64}, "sourceSize": {"w":72,"h":72} }, "Game/Bullets/AreaElectrifyHit.png": { - "frame": {"x":1253,"y":1153,"w":69,"h":62}, + "frame": {"x":1618,"y":1003,"w":69,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":6,"w":69,"h":62}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/ArmbinderBolt.png": -{ - "frame": {"x":1037,"y":2012,"w":40,"h":35}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":16,"y":19,"w":40,"h":35}, - "sourceSize": {"w":72,"h":72} -}, "Game/Bullets/ArrowBoltHeavyHit.png": { - "frame": {"x":1686,"y":1002,"w":65,"h":63}, + "frame": {"x":1660,"y":1434,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -138,7 +130,7 @@ }, "Game/Bullets/ArrowBoltHit.png": { - "frame": {"x":1643,"y":1168,"w":65,"h":63}, + "frame": {"x":1591,"y":1481,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -146,7 +138,7 @@ }, "Game/Bullets/ArrowLongbowHit.png": { - "frame": {"x":1686,"y":1002,"w":65,"h":63}, + "frame": {"x":1660,"y":1434,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -154,7 +146,7 @@ }, "Game/Bullets/ArrowRecurveHit.png": { - "frame": {"x":1643,"y":1168,"w":65,"h":63}, + "frame": {"x":1591,"y":1481,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -162,7 +154,7 @@ }, "Game/Bullets/BanditBolaHit.png": { - "frame": {"x":764,"y":1999,"w":65,"h":44}, + "frame": {"x":1792,"y":1565,"w":65,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":11,"w":65,"h":44}, @@ -170,23 +162,15 @@ }, "Game/Bullets/BanditBoltaHit.png": { - "frame": {"x":831,"y":1999,"w":65,"h":44}, + "frame": {"x":1720,"y":1601,"w":65,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":11,"w":65,"h":44}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/BigBoulderLaunchHit.png": -{ - "frame": {"x":1808,"y":694,"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":1629,"y":1858,"w":48,"h":63}, + "frame": {"x":1999,"y":1,"w":48,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":5,"w":48,"h":63}, @@ -194,7 +178,7 @@ }, "Game/Bullets/BindRopeHit.png": { - "frame": {"x":1959,"y":1,"w":65,"h":57}, + "frame": {"x":1725,"y":1542,"w":65,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":7,"w":65,"h":57}, @@ -202,7 +186,7 @@ }, "Game/Bullets/BlasterBlastHit.png": { - "frame": {"x":1688,"y":937,"w":65,"h":63}, + "frame": {"x":1748,"y":1412,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -210,7 +194,7 @@ }, "Game/Bullets/BlindfoldBolt.png": { - "frame": {"x":1397,"y":495,"w":42,"h":29}, + "frame": {"x":1133,"y":1928,"w":42,"h":29}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":20,"w":42,"h":29}, @@ -218,7 +202,7 @@ }, "Game/Bullets/Bomb.png": { - "frame": {"x":1387,"y":1867,"w":46,"h":64}, + "frame": {"x":1467,"y":1685,"w":46,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":84,"y":76,"w":46,"h":64}, @@ -226,7 +210,7 @@ }, "Game/Bullets/BombItem.png": { - "frame": {"x":1387,"y":1867,"w":46,"h":64}, + "frame": {"x":1467,"y":1685,"w":46,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":84,"y":76,"w":46,"h":64}, @@ -234,7 +218,7 @@ }, "Game/Bullets/BondageBustBeam.png": { - "frame": {"x":1688,"y":937,"w":65,"h":63}, + "frame": {"x":1748,"y":1412,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -242,7 +226,7 @@ }, "Game/Bullets/BondageBustBeamHit.png": { - "frame": {"x":1642,"y":1233,"w":65,"h":63}, + "frame": {"x":1519,"y":1538,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -250,7 +234,7 @@ }, "Game/Bullets/BondageBustBeamTrail.png": { - "frame": {"x":1688,"y":937,"w":65,"h":63}, + "frame": {"x":1748,"y":1412,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -258,7 +242,7 @@ }, "Game/Bullets/BondageBustBeamTrailHit.png": { - "frame": {"x":1642,"y":1233,"w":65,"h":63}, + "frame": {"x":1519,"y":1538,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -266,31 +250,23 @@ }, "Game/Bullets/BoulderHit.png": { - "frame": {"x":963,"y":1403,"w":72,"h":70}, + "frame": {"x":649,"y":667,"w":72,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":72,"h":70}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/BoulderKickedHit.png": -{ - "frame": {"x":1808,"y":694,"w":51,"h":59}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Bullets/BoulderLaunchHit.png": +"Game/Bullets/CelestialBoltHit.png": { - "frame": {"x":1808,"y":694,"w":51,"h":59}, + "frame": {"x":593,"y":1034,"w":70,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, + "spriteSourceSize": {"x":1,"y":0,"w":70,"h":72}, "sourceSize": {"w":72,"h":72} }, "Game/Bullets/ClericBeamBeam.png": { - "frame": {"x":1636,"y":1298,"w":65,"h":63}, + "frame": {"x":1272,"y":1661,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -298,7 +274,7 @@ }, "Game/Bullets/ClericBeamBeamHit.png": { - "frame": {"x":1636,"y":1363,"w":65,"h":63}, + "frame": {"x":1202,"y":1676,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -306,7 +282,7 @@ }, "Game/Bullets/ClericBeamBeamTrail.png": { - "frame": {"x":1636,"y":1298,"w":65,"h":63}, + "frame": {"x":1272,"y":1661,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -314,7 +290,7 @@ }, "Game/Bullets/ClericBeamBeamTrailHit.png": { - "frame": {"x":1636,"y":1363,"w":65,"h":63}, + "frame": {"x":1202,"y":1676,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -322,7 +298,7 @@ }, "Game/Bullets/CoronaBeam.png": { - "frame": {"x":1688,"y":937,"w":65,"h":63}, + "frame": {"x":1748,"y":1412,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -330,7 +306,7 @@ }, "Game/Bullets/CoronaBeamHit.png": { - "frame": {"x":1642,"y":1233,"w":65,"h":63}, + "frame": {"x":1519,"y":1538,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -338,7 +314,7 @@ }, "Game/Bullets/CoronaBeamTrail.png": { - "frame": {"x":1688,"y":937,"w":65,"h":63}, + "frame": {"x":1748,"y":1412,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -346,7 +322,7 @@ }, "Game/Bullets/CoronaBeamTrailHit.png": { - "frame": {"x":1642,"y":1233,"w":65,"h":63}, + "frame": {"x":1519,"y":1538,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -354,7 +330,7 @@ }, "Game/Bullets/Crackle.png": { - "frame": {"x":963,"y":1475,"w":72,"h":70}, + "frame": {"x":723,"y":741,"w":72,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, @@ -362,7 +338,7 @@ }, "Game/Bullets/CrackleHit.png": { - "frame": {"x":963,"y":1547,"w":72,"h":70}, + "frame": {"x":593,"y":1548,"w":72,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, @@ -370,7 +346,7 @@ }, "Game/Bullets/CrackleTrailHit.png": { - "frame": {"x":1394,"y":570,"w":69,"h":61}, + "frame": {"x":1616,"y":1067,"w":69,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":7,"w":69,"h":61}, @@ -378,7 +354,7 @@ }, "Game/Bullets/CrystalBolt.png": { - "frame": {"x":1592,"y":510,"w":68,"h":51}, + "frame": {"x":1686,"y":1197,"w":68,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":11,"w":68,"h":51}, @@ -386,79 +362,63 @@ }, "Game/Bullets/CrystalBoltSingle.png": { - "frame": {"x":1592,"y":510,"w":68,"h":51}, + "frame": {"x":1686,"y":1197,"w":68,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":11,"w":68,"h":51}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/DragonIceBoltHit.png": -{ - "frame": {"x":963,"y":1907,"w":72,"h":69}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Bullets/DragonSlashHit.png": +"Game/Bullets/DaggerHit.png": { - "frame": {"x":1377,"y":1457,"w":64,"h":68}, + "frame": {"x":1288,"y":1546,"w":52,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":3,"y":1,"w":64,"h":68}, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/DragonVineHit.png": +"Game/Bullets/DistractionBurstBullet.png": { - "frame": {"x":1309,"y":1526,"w":64,"h":68}, + "frame": {"x":1467,"y":1349,"w":56,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":2,"w":64,"h":68}, + "spriteSourceSize": {"x":8,"y":8,"w":56,"h":56}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/DryadBlastHit.png": +"Game/Bullets/DragonIceBoltHit.png": { - "frame": {"x":963,"y":1978,"w":72,"h":69}, + "frame": {"x":219,"y":1978,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/EarthformLine.png": -{ - "frame": {"x":1808,"y":694,"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": +"Game/Bullets/DragonSlashHit.png": { - "frame": {"x":1808,"y":694,"w":51,"h":59}, + "frame": {"x":883,"y":1244,"w":64,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, + "spriteSourceSize": {"x":3,"y":1,"w":64,"h":68}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/EarthformLineTrail.png": +"Game/Bullets/DragonVineHit.png": { - "frame": {"x":1808,"y":694,"w":51,"h":59}, + "frame": {"x":948,"y":1170,"w":64,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, + "spriteSourceSize": {"x":2,"y":2,"w":64,"h":68}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/EarthformLineTrailHit.png": +"Game/Bullets/DryadBlastHit.png": { - "frame": {"x":1808,"y":694,"w":51,"h":59}, + "frame": {"x":869,"y":741,"w":72,"h":69}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, "sourceSize": {"w":72,"h":72} }, "Game/Bullets/Electrify.png": { - "frame": {"x":1394,"y":570,"w":69,"h":61}, + "frame": {"x":1616,"y":1067,"w":69,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":7,"w":69,"h":61}, @@ -466,7 +426,7 @@ }, "Game/Bullets/ElectrifyHit.png": { - "frame": {"x":1103,"y":1251,"w":68,"h":70}, + "frame": {"x":223,"y":276,"w":68,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":68,"h":70}, @@ -474,7 +434,7 @@ }, "Game/Bullets/ElfArrowHit.png": { - "frame": {"x":963,"y":1978,"w":72,"h":69}, + "frame": {"x":869,"y":741,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -482,7 +442,7 @@ }, "Game/Bullets/EncaseBolt.png": { - "frame": {"x":1294,"y":1217,"w":33,"h":24}, + "frame": {"x":1142,"y":1999,"w":33,"h":24}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":25,"w":33,"h":24}, @@ -490,7 +450,7 @@ }, "Game/Bullets/EnemyBlastHit.png": { - "frame": {"x":1688,"y":937,"w":65,"h":63}, + "frame": {"x":1748,"y":1412,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -498,7 +458,7 @@ }, "Game/Bullets/EnemyCoronaBeam.png": { - "frame": {"x":1688,"y":937,"w":65,"h":63}, + "frame": {"x":1748,"y":1412,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -506,7 +466,7 @@ }, "Game/Bullets/EnemyCoronaBeamHit.png": { - "frame": {"x":1642,"y":1233,"w":65,"h":63}, + "frame": {"x":1519,"y":1538,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -514,7 +474,7 @@ }, "Game/Bullets/EnemyCoronaBeamTrail.png": { - "frame": {"x":1688,"y":937,"w":65,"h":63}, + "frame": {"x":1748,"y":1412,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -522,7 +482,7 @@ }, "Game/Bullets/EnemyCoronaBeamTrailHit.png": { - "frame": {"x":1642,"y":1233,"w":65,"h":63}, + "frame": {"x":1519,"y":1538,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -530,7 +490,7 @@ }, "Game/Bullets/EnemyLatexGagBolt.png": { - "frame": {"x":1515,"y":880,"w":55,"h":35}, + "frame": {"x":1467,"y":1407,"w":55,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":19,"w":55,"h":35}, @@ -538,7 +498,7 @@ }, "Game/Bullets/EnemyMiscastHit.png": { - "frame": {"x":1254,"y":1243,"w":68,"h":70}, + "frame": {"x":297,"y":348,"w":68,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":68,"h":70}, @@ -546,7 +506,7 @@ }, "Game/Bullets/EnemySteelRainBurst.png": { - "frame": {"x":1109,"y":959,"w":70,"h":70}, + "frame": {"x":737,"y":1107,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -554,7 +514,7 @@ }, "Game/Bullets/EnemySteelRainBurstHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -562,7 +522,7 @@ }, "Game/Bullets/EnemySummonLatexArmbinder.png": { - "frame": {"x":1110,"y":1176,"w":70,"h":70}, + "frame": {"x":739,"y":886,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -570,7 +530,7 @@ }, "Game/Bullets/EnemySummonLatexArmbinderHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -578,7 +538,7 @@ }, "Game/Bullets/EnemySummonLatexGag.png": { - "frame": {"x":1181,"y":886,"w":70,"h":70}, + "frame": {"x":739,"y":813,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -586,7 +546,7 @@ }, "Game/Bullets/EnemySummonLatexGagHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -594,7 +554,7 @@ }, "Game/Bullets/EnemySummonLatexLegbinder.png": { - "frame": {"x":1250,"y":599,"w":70,"h":70}, + "frame": {"x":797,"y":741,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -602,7 +562,7 @@ }, "Game/Bullets/EnemySummonLatexLegbinderHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -610,7 +570,7 @@ }, "Game/Bullets/EnemySummonLatexRestraint.png": { - "frame": {"x":1257,"y":1,"w":70,"h":70}, + "frame": {"x":739,"y":958,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -618,7 +578,7 @@ }, "Game/Bullets/EnemySummonLatexRestraintHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -626,7 +586,7 @@ }, "Game/Bullets/EnemyWindBlast.png": { - "frame": {"x":1684,"y":71,"w":67,"h":67}, + "frame": {"x":1980,"y":817,"w":67,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":1,"w":67,"h":67}, @@ -634,7 +594,7 @@ }, "Game/Bullets/EnemyWindBlastHit.png": { - "frame": {"x":1688,"y":937,"w":65,"h":63}, + "frame": {"x":1748,"y":1412,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -642,15 +602,23 @@ }, "Game/Bullets/EnemyWinterblast.png": { - "frame": {"x":1037,"y":1814,"w":56,"h":64}, + "frame": {"x":1467,"y":1217,"w":56,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":5,"w":56,"h":64}, "sourceSize": {"w":72,"h":72} }, +"Game/Bullets/EnemyWinterblastHit.png": +{ + "frame": {"x":739,"y":1545,"w":72,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":68}, + "sourceSize": {"w":72,"h":72} +}, "Game/Bullets/Firebolt.png": { - "frame": {"x":1543,"y":243,"w":69,"h":51}, + "frame": {"x":218,"y":223,"w":69,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":11,"w":69,"h":51}, @@ -658,7 +626,7 @@ }, "Game/Bullets/Fissure.png": { - "frame": {"x":963,"y":1619,"w":72,"h":70}, + "frame": {"x":664,"y":1475,"w":72,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, @@ -666,7 +634,7 @@ }, "Game/Bullets/FissureHit.png": { - "frame": {"x":963,"y":1619,"w":72,"h":70}, + "frame": {"x":664,"y":1475,"w":72,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, @@ -674,7 +642,7 @@ }, "Game/Bullets/FissureTrailHit.png": { - "frame": {"x":963,"y":1619,"w":72,"h":70}, + "frame": {"x":664,"y":1475,"w":72,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, @@ -682,23 +650,15 @@ }, "Game/Bullets/FreezeHit.png": { - "frame": {"x":1900,"y":790,"w":63,"h":63}, + "frame": {"x":1853,"y":1649,"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":1037,"y":1178,"w":68,"h":71}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":74,"y":74,"w":68,"h":71}, - "sourceSize": {"w":216,"h":216} -}, "Game/Bullets/FuukaOrb.png": { - "frame": {"x":214,"y":1999,"w":69,"h":40}, + "frame": {"x":297,"y":420,"w":69,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":16,"w":69,"h":40}, @@ -706,7 +666,7 @@ }, "Game/Bullets/FuukaOrbHit.png": { - "frame": {"x":1325,"y":949,"w":68,"h":68}, + "frame": {"x":804,"y":1685,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, @@ -714,7 +674,7 @@ }, "Game/Bullets/FuukaOrbMulti.png": { - "frame": {"x":214,"y":1999,"w":69,"h":40}, + "frame": {"x":297,"y":420,"w":69,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":16,"w":69,"h":40}, @@ -722,7 +682,7 @@ }, "Game/Bullets/FuukaOrbMultiHit.png": { - "frame": {"x":1325,"y":949,"w":68,"h":68}, + "frame": {"x":804,"y":1685,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, @@ -730,15 +690,31 @@ }, "Game/Bullets/GlueHit.png": { - "frame": {"x":1217,"y":1743,"w":62,"h":65}, + "frame": {"x":1278,"y":813,"w":62,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":2,"w":62,"h":65}, "sourceSize": {"w":72,"h":72} }, +"Game/Bullets/GreaterShield.png": +{ + "frame": {"x":666,"y":739,"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":948,"y":1314,"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":1684,"y":71,"w":67,"h":67}, + "frame": {"x":1980,"y":817,"w":67,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":1,"w":67,"h":67}, @@ -746,23 +722,23 @@ }, "Game/Bullets/GustHit.png": { - "frame": {"x":1688,"y":937,"w":65,"h":63}, + "frame": {"x":1748,"y":1412,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/HeartArrowHit.png": +"Game/Bullets/HarnessBolt.png": { - "frame": {"x":1386,"y":1993,"w":58,"h":54}, + "frame": {"x":1907,"y":879,"w":71,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":6,"y":10,"w":58,"h":54}, + "spriteSourceSize": {"x":1,"y":8,"w":71,"h":59}, "sourceSize": {"w":72,"h":72} }, "Game/Bullets/HeatBolt.png": { - "frame": {"x":1543,"y":243,"w":69,"h":51}, + "frame": {"x":218,"y":223,"w":69,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":11,"w":69,"h":51}, @@ -770,15 +746,23 @@ }, "Game/Bullets/HeatBolt_2.png": { - "frame": {"x":1543,"y":243,"w":69,"h":51}, + "frame": {"x":218,"y":223,"w":69,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":11,"w":69,"h":51}, "sourceSize": {"w":72,"h":72} }, +"Game/Bullets/HeelShadowStrikeHit.png": +{ + "frame": {"x":1288,"y":1546,"w":52,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "sourceSize": {"w":72,"h":72} +}, "Game/Bullets/HighBolt.png": { - "frame": {"x":1326,"y":402,"w":70,"h":60}, + "frame": {"x":1833,"y":963,"w":70,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":6,"w":70,"h":60}, @@ -786,7 +770,7 @@ }, "Game/Bullets/IceboltHit.png": { - "frame": {"x":963,"y":1907,"w":72,"h":69}, + "frame": {"x":219,"y":1978,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -794,7 +778,7 @@ }, "Game/Bullets/IceDragonBreath.png": { - "frame": {"x":963,"y":1907,"w":72,"h":69}, + "frame": {"x":219,"y":1978,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -802,7 +786,7 @@ }, "Game/Bullets/IceDragonBreathHit.png": { - "frame": {"x":963,"y":1907,"w":72,"h":69}, + "frame": {"x":219,"y":1978,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -810,7 +794,7 @@ }, "Game/Bullets/IceDragonBreathPrepareHit.png": { - "frame": {"x":963,"y":1907,"w":72,"h":69}, + "frame": {"x":219,"y":1978,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -818,7 +802,7 @@ }, "Game/Bullets/IceDragonBreathTrail.png": { - "frame": {"x":1900,"y":790,"w":63,"h":63}, + "frame": {"x":1853,"y":1649,"w":63,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":1,"w":63,"h":63}, @@ -826,7 +810,7 @@ }, "Game/Bullets/IceDragonBreathTrailHit.png": { - "frame": {"x":963,"y":1907,"w":72,"h":69}, + "frame": {"x":219,"y":1978,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -834,7 +818,7 @@ }, "Game/Bullets/IceexpHit.png": { - "frame": {"x":963,"y":1907,"w":72,"h":69}, + "frame": {"x":219,"y":1978,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -842,7 +826,7 @@ }, "Game/Bullets/IceLance.png": { - "frame": {"x":1169,"y":1466,"w":66,"h":68}, + "frame": {"x":880,"y":1174,"w":66,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":2,"w":66,"h":68}, @@ -850,23 +834,15 @@ }, "Game/Bullets/IceLanceHit.png": { - "frame": {"x":963,"y":1691,"w":72,"h":70}, + "frame": {"x":665,"y":1329,"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":1524,"y":1456,"w":63,"h":68}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":2,"w":63,"h":68}, - "sourceSize": {"w":72,"h":72} -}, "Game/Bullets/IceOrbHit.png": { - "frame": {"x":963,"y":1907,"w":72,"h":69}, + "frame": {"x":219,"y":1978,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -874,7 +850,7 @@ }, "Game/Bullets/IceSlow.png": { - "frame": {"x":963,"y":1907,"w":72,"h":69}, + "frame": {"x":219,"y":1978,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -882,7 +858,7 @@ }, "Game/Bullets/IceSlowHit.png": { - "frame": {"x":963,"y":1907,"w":72,"h":69}, + "frame": {"x":219,"y":1978,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -890,7 +866,7 @@ }, "Game/Bullets/IceSlowPrepareHit.png": { - "frame": {"x":1900,"y":790,"w":63,"h":63}, + "frame": {"x":1853,"y":1649,"w":63,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":1,"w":63,"h":63}, @@ -898,7 +874,7 @@ }, "Game/Bullets/IceSlowTrail.png": { - "frame": {"x":1107,"y":220,"w":72,"h":68}, + "frame": {"x":810,"y":1469,"w":72,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":68}, @@ -906,7 +882,7 @@ }, "Game/Bullets/IceSlowTrailHit.png": { - "frame": {"x":963,"y":1907,"w":72,"h":69}, + "frame": {"x":219,"y":1978,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -914,7 +890,7 @@ }, "Game/Bullets/IcicleHit.png": { - "frame": {"x":963,"y":1907,"w":72,"h":69}, + "frame": {"x":219,"y":1978,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -922,7 +898,7 @@ }, "Game/Bullets/KineticLance.png": { - "frame": {"x":425,"y":1999,"w":66,"h":48}, + "frame": {"x":1204,"y":1626,"w":66,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":73,"y":84,"w":66,"h":48}, @@ -930,7 +906,7 @@ }, "Game/Bullets/LatexGagBolt.png": { - "frame": {"x":1515,"y":880,"w":55,"h":35}, + "frame": {"x":1467,"y":1407,"w":55,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":19,"w":55,"h":35}, @@ -938,15 +914,23 @@ }, "Game/Bullets/LatexSpray.png": { - "frame": {"x":1844,"y":1420,"w":62,"h":42}, + "frame": {"x":1825,"y":1956,"w":62,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":13,"w":62,"h":42}, "sourceSize": {"w":72,"h":72} }, +"Game/Bullets/LatexWallHorizHit.png": +{ + "frame": {"x":1,"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/Bullets/LeatherCuffsBolt.png": { - "frame": {"x":1753,"y":1002,"w":64,"h":66}, + "frame": {"x":1081,"y":1092,"w":64,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":2,"w":64,"h":66}, @@ -954,7 +938,7 @@ }, "Game/Bullets/LightningBoltTrail.png": { - "frame": {"x":1253,"y":1153,"w":69,"h":62}, + "frame": {"x":1618,"y":1003,"w":69,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":6,"w":69,"h":62}, @@ -962,7 +946,7 @@ }, "Game/Bullets/LightningBoltTrailHit.png": { - "frame": {"x":1325,"y":464,"w":70,"h":60}, + "frame": {"x":1618,"y":941,"w":70,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":6,"w":70,"h":60}, @@ -970,7 +954,7 @@ }, "Game/Bullets/LightningRuneStrike.png": { - "frame": {"x":1671,"y":827,"w":64,"h":47}, + "frame": {"x":1586,"y":1706,"w":64,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":13,"w":64,"h":47}, @@ -978,15 +962,23 @@ }, "Game/Bullets/LightningRuneStrikeHit.png": { - "frame": {"x":963,"y":1547,"w":72,"h":70}, + "frame": {"x":593,"y":1548,"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":1088,"y":1928,"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":1103,"y":631,"w":71,"h":70}, + "frame": {"x":1833,"y":593,"w":71,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":71,"h":70}, @@ -994,7 +986,7 @@ }, "Game/Bullets/MagicMissile.png": { - "frame": {"x":1963,"y":720,"w":63,"h":63}, + "frame": {"x":1786,"y":1671,"w":63,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":4,"w":63,"h":63}, @@ -1002,7 +994,7 @@ }, "Game/Bullets/MagicMissile2Hit.png": { - "frame": {"x":1819,"y":1002,"w":63,"h":63}, + "frame": {"x":1719,"y":1705,"w":63,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":4,"w":63,"h":63}, @@ -1010,39 +1002,39 @@ }, "Game/Bullets/MagicMissileHit.png": { - "frame": {"x":1819,"y":1002,"w":63,"h":63}, + "frame": {"x":1719,"y":1705,"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": +"Game/Bullets/ManyChains.png": { - "frame": {"x":1993,"y":338,"w":54,"h":39}, + "frame": {"x":1342,"y":1591,"w":60,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":7,"y":16,"w":54,"h":39}, + "spriteSourceSize": {"x":4,"y":7,"w":60,"h":59}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/ManyChains.png": +"Game/Bullets/ManyOrbs.png": { - "frame": {"x":1907,"y":1464,"w":60,"h":59}, + "frame": {"x":1957,"y":1369,"w":65,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":4,"y":7,"w":60,"h":59}, + "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/ManyOrbs.png": +"Game/Bullets/ManySlimes.png": { - "frame": {"x":1710,"y":1168,"w":65,"h":63}, + "frame": {"x":593,"y":1108,"w":70,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, + "spriteSourceSize": {"x":1,"y":0,"w":70,"h":72}, "sourceSize": {"w":72,"h":72} }, "Game/Bullets/MinerBomb.png": { - "frame": {"x":1387,"y":1867,"w":46,"h":64}, + "frame": {"x":1467,"y":1685,"w":46,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":84,"y":76,"w":46,"h":64}, @@ -1050,7 +1042,7 @@ }, "Game/Bullets/MiniCableHit.png": { - "frame": {"x":1326,"y":205,"w":70,"h":64}, + "frame": {"x":1396,"y":1087,"w":70,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":4,"w":70,"h":64}, @@ -1058,7 +1050,7 @@ }, "Game/Bullets/MithrilBoltHit.png": { - "frame": {"x":1398,"y":285,"w":69,"h":68}, + "frame": {"x":860,"y":1973,"w":69,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":3,"w":69,"h":68}, @@ -1066,7 +1058,7 @@ }, "Game/Bullets/MonolithBeamBeam.png": { - "frame": {"x":1710,"y":1168,"w":65,"h":63}, + "frame": {"x":1957,"y":1369,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -1074,7 +1066,7 @@ }, "Game/Bullets/MonolithBeamBeamHit.png": { - "frame": {"x":1755,"y":937,"w":65,"h":63}, + "frame": {"x":1884,"y":1403,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -1082,7 +1074,7 @@ }, "Game/Bullets/MonolithBeamBeamTrail.png": { - "frame": {"x":1710,"y":1168,"w":65,"h":63}, + "frame": {"x":1957,"y":1369,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -1090,7 +1082,7 @@ }, "Game/Bullets/MonolithBeamBeamTrailHit.png": { - "frame": {"x":1755,"y":937,"w":65,"h":63}, + "frame": {"x":1884,"y":1403,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -1098,7 +1090,7 @@ }, "Game/Bullets/MummyBoltHit.png": { - "frame": {"x":963,"y":1978,"w":72,"h":69}, + "frame": {"x":869,"y":741,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -1106,7 +1098,7 @@ }, "Game/Bullets/NatureMoteBoltHit.png": { - "frame": {"x":963,"y":1978,"w":72,"h":69}, + "frame": {"x":869,"y":741,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -1114,7 +1106,7 @@ }, "Game/Bullets/NurseBola.png": { - "frame": {"x":1110,"y":740,"w":64,"h":71}, + "frame": {"x":508,"y":420,"w":64,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":64,"h":71}, @@ -1122,7 +1114,7 @@ }, "Game/Bullets/NurseBolaHit.png": { - "frame": {"x":1753,"y":1,"w":68,"h":51}, + "frame": {"x":1615,"y":1237,"w":68,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":10,"w":68,"h":51}, @@ -1130,7 +1122,7 @@ }, "Game/Bullets/ObserverBeamBeam.png": { - "frame": {"x":1807,"y":755,"w":65,"h":63}, + "frame": {"x":1815,"y":1439,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -1138,7 +1130,7 @@ }, "Game/Bullets/ObserverBeamBeamHit.png": { - "frame": {"x":1861,"y":597,"w":65,"h":63}, + "frame": {"x":1951,"y":1434,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -1146,7 +1138,7 @@ }, "Game/Bullets/ObserverBeamBeamTrail.png": { - "frame": {"x":1807,"y":755,"w":65,"h":63}, + "frame": {"x":1815,"y":1439,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -1154,7 +1146,7 @@ }, "Game/Bullets/ObserverBeamBeamTrailHit.png": { - "frame": {"x":1861,"y":597,"w":65,"h":63}, + "frame": {"x":1951,"y":1434,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -1162,7 +1154,7 @@ }, "Game/Bullets/ObsidianBolt.png": { - "frame": {"x":1080,"y":2009,"w":61,"h":38}, + "frame": {"x":1828,"y":2000,"w":61,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":23,"w":61,"h":38}, @@ -1170,7 +1162,7 @@ }, "Game/Bullets/ObsidianBoltHit.png": { - "frame": {"x":1398,"y":355,"w":69,"h":68}, + "frame": {"x":877,"y":1903,"w":69,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":3,"w":69,"h":68}, @@ -1178,7 +1170,7 @@ }, "Game/Bullets/OneBarMissileHit.png": { - "frame": {"x":1180,"y":482,"w":71,"h":58}, + "frame": {"x":1907,"y":940,"w":71,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":8,"w":71,"h":58}, @@ -1186,7 +1178,7 @@ }, "Game/Bullets/OrgasmStrikeHit.png": { - "frame": {"x":1534,"y":691,"w":67,"h":62}, + "frame": {"x":1980,"y":886,"w":67,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":67,"h":62}, @@ -1194,7 +1186,7 @@ }, "Game/Bullets/PlayerBolaHit.png": { - "frame": {"x":764,"y":1999,"w":65,"h":44}, + "frame": {"x":1792,"y":1565,"w":65,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":11,"w":65,"h":44}, @@ -1202,7 +1194,7 @@ }, "Game/Bullets/PoisonDragonBlastHit.png": { - "frame": {"x":963,"y":1978,"w":72,"h":69}, + "frame": {"x":869,"y":741,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -1210,7 +1202,7 @@ }, "Game/Bullets/RestrainingBoltHit.png": { - "frame": {"x":1819,"y":1002,"w":63,"h":63}, + "frame": {"x":1719,"y":1705,"w":63,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":4,"w":63,"h":63}, @@ -1218,7 +1210,7 @@ }, "Game/Bullets/RestrainingDeviceHit.png": { - "frame": {"x":1326,"y":271,"w":70,"h":64}, + "frame": {"x":1453,"y":1020,"w":70,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":4,"w":70,"h":64}, @@ -1226,7 +1218,7 @@ }, "Game/Bullets/RopeBoltLaunchMany.png": { - "frame": {"x":1037,"y":1538,"w":64,"h":68}, + "frame": {"x":949,"y":1099,"w":64,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":64,"h":68}, @@ -1234,7 +1226,7 @@ }, "Game/Bullets/RopeBoltLaunchManyHit.png": { - "frame": {"x":1103,"y":1538,"w":64,"h":68}, + "frame": {"x":950,"y":1027,"w":64,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":64,"h":68}, @@ -1242,7 +1234,7 @@ }, "Game/Bullets/RubberBoltHit.png": { - "frame": {"x":1710,"y":1168,"w":65,"h":63}, + "frame": {"x":1957,"y":1369,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -1250,7 +1242,7 @@ }, "Game/Bullets/RubberBullets.png": { - "frame": {"x":697,"y":1999,"w":65,"h":47}, + "frame": {"x":507,"y":371,"w":65,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":12,"w":65,"h":47}, @@ -1258,7 +1250,7 @@ }, "Game/Bullets/RubberMissileHit.png": { - "frame": {"x":1389,"y":1386,"w":66,"h":69}, + "frame": {"x":792,"y":1976,"w":66,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":1,"w":66,"h":69}, @@ -1266,7 +1258,7 @@ }, "Game/Bullets/RubberNukeHit.png": { - "frame": {"x":1389,"y":1386,"w":66,"h":69}, + "frame": {"x":792,"y":1976,"w":66,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":1,"w":66,"h":69}, @@ -1274,7 +1266,7 @@ }, "Game/Bullets/RubberSlimeHit.png": { - "frame": {"x":1863,"y":531,"w":65,"h":63}, + "frame": {"x":1882,"y":1468,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, @@ -1282,7 +1274,7 @@ }, "Game/Bullets/SagittaBoltHit.png": { - "frame": {"x":1780,"y":1484,"w":62,"h":52}, + "frame": {"x":1694,"y":1912,"w":62,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":10,"w":62,"h":52}, @@ -1290,7 +1282,7 @@ }, "Game/Bullets/SealingBolt.png": { - "frame": {"x":1543,"y":64,"w":69,"h":59}, + "frame": {"x":1833,"y":1025,"w":69,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":6,"w":69,"h":59}, @@ -1298,15 +1290,23 @@ }, "Game/Bullets/SealingBoltHit.png": { - "frame": {"x":1107,"y":149,"w":72,"h":69}, + "frame": {"x":811,"y":958,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, "sourceSize": {"w":72,"h":72} }, +"Game/Bullets/ShadowBoltHit.png": +{ + "frame": {"x":1288,"y":1546,"w":52,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "sourceSize": {"w":72,"h":72} +}, "Game/Bullets/ShadowGraspMulti.png": { - "frame": {"x":1257,"y":73,"w":70,"h":70}, + "frame": {"x":739,"y":1030,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1314,31 +1314,71 @@ }, "Game/Bullets/ShadowGraspMultiHit.png": { - "frame": {"x":1324,"y":1019,"w":68,"h":68}, + "frame": {"x":809,"y":1755,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, "sourceSize": {"w":72,"h":72} }, +"Game/Bullets/ShadowOrb.png": +{ + "frame": {"x":1288,"y":1484,"w":52,"h":60}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":7,"w":52,"h":60}, + "sourceSize": {"w":72,"h":72} +}, "Game/Bullets/ShadowShroudGirlHit.png": { - "frame": {"x":1538,"y":1726,"w":44,"h":64}, + "frame": {"x":1464,"y":1854,"w":44,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":4,"w":44,"h":64}, "sourceSize": {"w":72,"h":72} }, +"Game/Bullets/ShadowSlashTrail.png": +{ + "frame": {"x":1288,"y":1546,"w":52,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ShadowStrike.png": +{ + "frame": {"x":1288,"y":1546,"w":52,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "sourceSize": {"w":72,"h":72} +}, "Game/Bullets/Shock.png": { - "frame": {"x":1325,"y":885,"w":69,"h":62}, + "frame": {"x":1689,"y":1012,"w":69,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":7,"w":69,"h":62}, "sourceSize": {"w":72,"h":72} }, +"Game/Bullets/ShockHit.png": +{ + "frame": {"x":1075,"y":813,"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":1075,"y":813,"w":72,"h":66}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":3,"w":72,"h":66}, + "sourceSize": {"w":72,"h":72} +}, "Game/Bullets/SingleRibbon.png": { - "frame": {"x":1828,"y":1837,"w":60,"h":58}, + "frame": {"x":1478,"y":1920,"w":60,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":4,"w":60,"h":58}, @@ -1346,7 +1386,7 @@ }, "Game/Bullets/SlimeBallHit.png": { - "frame": {"x":963,"y":1111,"w":72,"h":71}, + "frame": {"x":293,"y":1976,"w":72,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":71}, @@ -1354,7 +1394,7 @@ }, "Game/Bullets/SlimeHit.png": { - "frame": {"x":1248,"y":815,"w":70,"h":69}, + "frame": {"x":943,"y":741,"w":70,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":69}, @@ -1362,7 +1402,7 @@ }, "Game/Bullets/SlimePuddleHit.png": { - "frame": {"x":1864,"y":382,"w":65,"h":63}, + "frame": {"x":1949,"y":1499,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, @@ -1370,7 +1410,7 @@ }, "Game/Bullets/SlimeSplash.png": { - "frame": {"x":1864,"y":382,"w":65,"h":63}, + "frame": {"x":1949,"y":1499,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, @@ -1378,7 +1418,7 @@ }, "Game/Bullets/Slimethrower.png": { - "frame": {"x":1864,"y":382,"w":65,"h":63}, + "frame": {"x":1949,"y":1499,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, @@ -1386,7 +1426,7 @@ }, "Game/Bullets/Slimethrower2.png": { - "frame": {"x":1929,"y":138,"w":65,"h":63}, + "frame": {"x":1727,"y":1477,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, @@ -1394,7 +1434,7 @@ }, "Game/Bullets/Slimethrower2Hit.png": { - "frame": {"x":1929,"y":138,"w":65,"h":63}, + "frame": {"x":1727,"y":1477,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, @@ -1402,55 +1442,55 @@ }, "Game/Bullets/SlimethrowerHit.png": { - "frame": {"x":1929,"y":138,"w":65,"h":63}, + "frame": {"x":1727,"y":1477,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/SmokePuff.png": +"Game/Bullets/SmokePuffHit.png": { - "frame": {"x":1037,"y":149,"w":68,"h":72}, + "frame": {"x":1020,"y":1802,"w":66,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":0,"w":68,"h":72}, + "spriteSourceSize": {"x":2,"y":0,"w":66,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/SmokePuffHit.png": +"Game/Bullets/SnareHitHit.png": { - "frame": {"x":1823,"y":1,"w":66,"h":67}, + "frame": {"x":1772,"y":741,"w":59,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":0,"w":66,"h":67}, + "spriteSourceSize": {"x":2,"y":6,"w":59,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/Snare.png": +"Game/Bullets/Snowball.png": { - "frame": {"x":1324,"y":1315,"w":63,"h":70}, + "frame": {"x":1467,"y":1217,"w":56,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":4,"y":2,"w":63,"h":70}, + "spriteSourceSize": {"x":8,"y":5,"w":56,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/SnareHitHit.png": +"Game/Bullets/SnowballHit.png": { - "frame": {"x":1635,"y":1726,"w":59,"h":64}, + "frame": {"x":739,"y":1545,"w":72,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":6,"w":59,"h":64}, + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":68}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/Snowball.png": +"Game/Bullets/StaticSphereStrikeHit.png": { - "frame": {"x":1037,"y":1814,"w":56,"h":64}, + "frame": {"x":1075,"y":813,"w":72,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":8,"y":5,"w":56,"h":64}, + "spriteSourceSize": {"x":0,"y":3,"w":72,"h":66}, "sourceSize": {"w":72,"h":72} }, "Game/Bullets/SteamPuff.png": { - "frame": {"x":1775,"y":1295,"w":63,"h":62}, + "frame": {"x":1918,"y":1690,"w":63,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":5,"w":63,"h":62}, @@ -1458,7 +1498,7 @@ }, "Game/Bullets/SteamPuffHit.png": { - "frame": {"x":1794,"y":177,"w":66,"h":67}, + "frame": {"x":1005,"y":1310,"w":66,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":66,"h":67}, @@ -1466,7 +1506,7 @@ }, "Game/Bullets/SteelRainBurst.png": { - "frame": {"x":1109,"y":959,"w":70,"h":70}, + "frame": {"x":737,"y":1107,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1474,7 +1514,7 @@ }, "Game/Bullets/SteelRainBurstHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1482,7 +1522,7 @@ }, "Game/Bullets/StraitjacketBolt.png": { - "frame": {"x":1543,"y":125,"w":69,"h":58}, + "frame": {"x":1760,"y":1066,"w":69,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":10,"w":69,"h":58}, @@ -1490,7 +1530,7 @@ }, "Game/Bullets/Summon.png": { - "frame": {"x":1254,"y":145,"w":70,"h":70}, + "frame": {"x":593,"y":1620,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1498,7 +1538,7 @@ }, "Game/Bullets/SummonArmbinder.png": { - "frame": {"x":1254,"y":217,"w":70,"h":70}, + "frame": {"x":593,"y":1692,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1506,7 +1546,7 @@ }, "Game/Bullets/SummonArmbinderHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1514,7 +1554,7 @@ }, "Game/Bullets/SummonBlindfold.png": { - "frame": {"x":1254,"y":289,"w":70,"h":70}, + "frame": {"x":593,"y":1764,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1522,7 +1562,7 @@ }, "Game/Bullets/SummonBlindfoldHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1530,23 +1570,15 @@ }, "Game/Bullets/SummonCrystals.png": { - "frame": {"x":1602,"y":837,"w":64,"h":37}, + "frame": {"x":1333,"y":1784,"w":64,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":35,"w":64,"h":37}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/SummonCrystalsHit.png": -{ - "frame": {"x":1324,"y":1315,"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":1254,"y":361,"w":70,"h":70}, + "frame": {"x":593,"y":1836,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1554,7 +1586,7 @@ }, "Game/Bullets/SummonCuffsHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1562,7 +1594,7 @@ }, "Game/Bullets/SummonGag.png": { - "frame": {"x":1253,"y":433,"w":70,"h":70}, + "frame": {"x":663,"y":1908,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1570,7 +1602,7 @@ }, "Game/Bullets/SummonGagHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1578,7 +1610,7 @@ }, "Game/Bullets/SummonHarness.png": { - "frame": {"x":1037,"y":814,"w":70,"h":71}, + "frame": {"x":667,"y":886,"w":70,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":70,"h":71}, @@ -1586,7 +1618,7 @@ }, "Game/Bullets/SummonHarnessHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1594,7 +1626,7 @@ }, "Game/Bullets/SummonHit.png": { - "frame": {"x":1254,"y":145,"w":70,"h":70}, + "frame": {"x":593,"y":1620,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1602,7 +1634,7 @@ }, "Game/Bullets/SummonLatexArmbinder.png": { - "frame": {"x":1110,"y":1176,"w":70,"h":70}, + "frame": {"x":739,"y":886,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1610,7 +1642,7 @@ }, "Game/Bullets/SummonLatexArmbinderHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1618,7 +1650,7 @@ }, "Game/Bullets/SummonLatexElemental.png": { - "frame": {"x":1928,"y":275,"w":65,"h":61}, + "frame": {"x":1586,"y":1546,"w":65,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":8,"w":65,"h":61}, @@ -1626,7 +1658,7 @@ }, "Game/Bullets/SummonLatexGag.png": { - "frame": {"x":1181,"y":886,"w":70,"h":70}, + "frame": {"x":739,"y":813,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1634,7 +1666,7 @@ }, "Game/Bullets/SummonLatexGagHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1642,7 +1674,7 @@ }, "Game/Bullets/SummonLatexLegbinder.png": { - "frame": {"x":1250,"y":599,"w":70,"h":70}, + "frame": {"x":797,"y":741,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1650,7 +1682,7 @@ }, "Game/Bullets/SummonLatexLegbinderHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1658,7 +1690,7 @@ }, "Game/Bullets/SummonLeatherCuffs.png": { - "frame": {"x":1253,"y":505,"w":70,"h":70}, + "frame": {"x":665,"y":1620,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1666,7 +1698,7 @@ }, "Game/Bullets/SummonLeatherCuffsHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1674,7 +1706,7 @@ }, "Game/Bullets/SummonLegbinder.png": { - "frame": {"x":1250,"y":671,"w":70,"h":70}, + "frame": {"x":667,"y":1547,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1682,7 +1714,7 @@ }, "Game/Bullets/SummonLegbinderHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1690,7 +1722,7 @@ }, "Game/Bullets/SummonStraitjacket.png": { - "frame": {"x":1248,"y":743,"w":70,"h":70}, + "frame": {"x":738,"y":1473,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1698,7 +1730,7 @@ }, "Game/Bullets/SummonStraitjacketHit.png": { - "frame": {"x":1109,"y":1031,"w":70,"h":70}, + "frame": {"x":737,"y":1179,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -1706,15 +1738,23 @@ }, "Game/Bullets/TickleCloud.png": { - "frame": {"x":1796,"y":531,"w":65,"h":64}, + "frame": {"x":1766,"y":873,"w":65,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":65,"h":64}, "sourceSize": {"w":72,"h":72} }, +"Game/Bullets/TickleCloudHit.png": +{ + "frame": {"x":515,"y":2009,"w":65,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":27,"w":65,"h":38}, + "sourceSize": {"w":72,"h":72} +}, "Game/Bullets/Vineexp.png": { - "frame": {"x":1648,"y":1524,"w":63,"h":67}, + "frame": {"x":1016,"y":1026,"w":63,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":2,"w":63,"h":67}, @@ -1722,7 +1762,7 @@ }, "Game/Bullets/VineexpHit.png": { - "frame": {"x":1375,"y":1527,"w":63,"h":67}, + "frame": {"x":1005,"y":1379,"w":63,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":63,"h":67}, @@ -1730,7 +1770,7 @@ }, "Game/Bullets/VineSlimeBallHit.png": { - "frame": {"x":963,"y":1111,"w":72,"h":71}, + "frame": {"x":293,"y":1976,"w":72,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":71}, @@ -1738,7 +1778,7 @@ }, "Game/Bullets/WaterBallHit.png": { - "frame": {"x":1511,"y":979,"w":67,"h":58}, + "frame": {"x":1827,"y":1185,"w":67,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":6,"w":67,"h":58}, @@ -1746,7 +1786,7 @@ }, "Game/Bullets/WindBlast.png": { - "frame": {"x":1684,"y":71,"w":67,"h":67}, + "frame": {"x":1980,"y":817,"w":67,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":1,"w":67,"h":67}, @@ -1754,7 +1794,7 @@ }, "Game/Bullets/WindBlastHit.png": { - "frame": {"x":1688,"y":937,"w":65,"h":63}, + "frame": {"x":1748,"y":1412,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -1762,7 +1802,7 @@ }, "Game/Bullets/WitchBoulderHit.png": { - "frame": {"x":963,"y":1403,"w":72,"h":70}, + "frame": {"x":649,"y":667,"w":72,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":72,"h":70}, @@ -1770,7 +1810,7 @@ }, "Game/Bullets/WitchElectricOrb.png": { - "frame": {"x":1535,"y":623,"w":67,"h":66}, + "frame": {"x":1209,"y":1370,"w":67,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":1,"w":67,"h":66}, @@ -1778,7 +1818,7 @@ }, "Game/Bullets/WitchElectricOrbHit.png": { - "frame": {"x":1103,"y":1251,"w":68,"h":70}, + "frame": {"x":223,"y":276,"w":68,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":68,"h":70}, @@ -1786,7 +1826,7 @@ }, "Game/Bullets/WitchElectrifyHit.png": { - "frame": {"x":1181,"y":143,"w":71,"h":68}, + "frame": {"x":1907,"y":809,"w":71,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":71,"h":68}, @@ -1794,7 +1834,7 @@ }, "Game/Bullets/WitchIceboltHit.png": { - "frame": {"x":1938,"y":60,"w":65,"h":63}, + "frame": {"x":1658,"y":1499,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":65,"h":63}, @@ -1802,7 +1842,7 @@ }, "Game/Bullets/WitchSlimeBallTrail.png": { - "frame": {"x":1864,"y":382,"w":65,"h":63}, + "frame": {"x":1949,"y":1499,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, @@ -1810,7 +1850,7 @@ }, "Game/Bullets/WitchSlimeHit.png": { - "frame": {"x":1864,"y":382,"w":65,"h":63}, + "frame": {"x":1949,"y":1499,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, @@ -1818,7 +1858,7 @@ }, "Game/Bullets/WitchWaterBallHit.png": { - "frame": {"x":1511,"y":979,"w":67,"h":58}, + "frame": {"x":1827,"y":1185,"w":67,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":6,"w":67,"h":58}, @@ -1826,7 +1866,7 @@ }, "Game/Bullets/WolfCrackleHit.png": { - "frame": {"x":963,"y":1547,"w":72,"h":70}, + "frame": {"x":593,"y":1548,"w":72,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, @@ -1834,7 +1874,7 @@ }, "Game/Bullets/WolfCrackleTrailHit.png": { - "frame": {"x":1394,"y":570,"w":69,"h":61}, + "frame": {"x":1616,"y":1067,"w":69,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":7,"w":69,"h":61}, @@ -1842,63 +1882,55 @@ }, "Game/Bullets/ZombieOrbHit.png": { - "frame": {"x":1671,"y":761,"w":66,"h":64}, + "frame": {"x":1754,"y":1284,"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":1828,"y":1897,"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":1671,"y":761,"w":66,"h":64}, + "frame": {"x":1754,"y":1284,"w":66,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":2,"w":66,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/Class/Fighter.png": +"Game/Conditions/ArmorDebuff.png": { - "frame": {"x":1756,"y":875,"w":49,"h":60}, + "frame": {"x":593,"y":813,"w":72,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":12,"y":0,"w":49,"h":60}, - "sourceSize": {"w":71,"h":60} + "spriteSourceSize": {"x":0,"y":1,"w":72,"h":71}, + "sourceSize": {"w":72,"h":72} }, -"Game/Class/Peasant.png": +"Game/Conditions/Dialogue.png": { - "frame": {"x":1970,"y":1417,"w":59,"h":42}, + "frame": {"x":2024,"y":1415,"w":21,"h":20}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":7,"y":7,"w":59,"h":42}, - "sourceSize": {"w":71,"h":60} + "spriteSourceSize": {"x":3,"y":25,"w":21,"h":20}, + "sourceSize": {"w":72,"h":72} }, -"Game/Conditions/ArmorDebuff.png": +"Game/Conditions/Freeze.png": { - "frame": {"x":963,"y":1184,"w":72,"h":71}, + "frame": {"x":149,"y":132,"w":67,"h":70}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":1,"w":72,"h":71}, + "spriteSourceSize": {"x":4,"y":0,"w":67,"h":70}, "sourceSize": {"w":72,"h":72} }, -"Game/Conditions/Freeze.png": +"Game/Conditions/ShieldDebuff.png": { - "frame": {"x":1037,"y":1324,"w":67,"h":70}, + "frame": {"x":2010,"y":1848,"w":33,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":4,"y":0,"w":67,"h":70}, + "spriteSourceSize": {"x":20,"y":0,"w":33,"h":23}, "sourceSize": {"w":72,"h":72} }, "Game/Conditions/Teleporting.png": { - "frame": {"x":1253,"y":886,"w":70,"h":68}, + "frame": {"x":736,"y":1833,"w":70,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":4,"w":70,"h":68}, @@ -1906,23 +1938,23 @@ }, "Game/Conditions/Vulnerable.png": { - "frame": {"x":1874,"y":811,"w":24,"h":24}, + "frame": {"x":1286,"y":1960,"w":24,"h":24}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":45,"y":9,"w":24,"h":24}, "sourceSize": {"w":72,"h":72} }, -"Game/Cut.png": +"Game/DamageTypes/chain.png": { - "frame": {"x":1777,"y":2021,"w":26,"h":26}, + "frame": {"x":1994,"y":1564,"w":20,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":17,"y":17,"w":26,"h":26}, - "sourceSize": {"w":60,"h":60} + "spriteSourceSize": {"x":1,"y":51,"w":20,"h":21}, + "sourceSize": {"w":72,"h":72} }, "Game/DamageTypes/happygas.png": { - "frame": {"x":1787,"y":1137,"w":25,"h":25}, + "frame": {"x":1449,"y":1949,"w":25,"h":25}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":47,"w":25,"h":25}, @@ -1930,7 +1962,7 @@ }, "Game/EffectTiles/Chill.png": { - "frame": {"x":1793,"y":246,"w":66,"h":66}, + "frame": {"x":1217,"y":1302,"w":66,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":3,"w":66,"h":66}, @@ -1938,7 +1970,7 @@ }, "Game/EffectTiles/Cracked.png": { - "frame": {"x":1540,"y":296,"w":68,"h":70}, + "frame": {"x":371,"y":536,"w":68,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":68,"h":70}, @@ -1946,7 +1978,7 @@ }, "Game/EffectTiles/CrackedFrozen.png": { - "frame": {"x":1540,"y":368,"w":68,"h":70}, + "frame": {"x":371,"y":608,"w":68,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":68,"h":70}, @@ -1954,7 +1986,7 @@ }, "Game/EffectTiles/Ember.png": { - "frame": {"x":1684,"y":195,"w":67,"h":67}, + "frame": {"x":1018,"y":1594,"w":67,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":4,"w":67,"h":67}, @@ -1962,23 +1994,15 @@ }, "Game/EffectTiles/Glue.png": { - "frame": {"x":1398,"y":425,"w":69,"h":68}, + "frame": {"x":931,"y":1973,"w":69,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":3,"w":69,"h":68}, "sourceSize": {"w":72,"h":72} }, -"Game/EffectTiles/Gunpowder.png": -{ - "frame": {"x":1269,"y":2006,"w":59,"h":38}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":11,"y":29,"w":59,"h":38}, - "sourceSize": {"w":72,"h":72} -}, "Game/EffectTiles/Ignition.png": { - "frame": {"x":1684,"y":195,"w":67,"h":67}, + "frame": {"x":1018,"y":1594,"w":67,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":4,"w":67,"h":67}, @@ -1986,7 +2010,7 @@ }, "Game/EffectTiles/Inferno.png": { - "frame": {"x":1322,"y":577,"w":70,"h":68}, + "frame": {"x":805,"y":1903,"w":70,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":4,"w":70,"h":68}, @@ -1994,7 +2018,7 @@ }, "Game/EffectTiles/Inferno_0.png": { - "frame": {"x":1322,"y":577,"w":70,"h":68}, + "frame": {"x":805,"y":1903,"w":70,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":4,"w":70,"h":68}, @@ -2002,7 +2026,7 @@ }, "Game/EffectTiles/Inferno_1.png": { - "frame": {"x":1322,"y":577,"w":70,"h":68}, + "frame": {"x":805,"y":1903,"w":70,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":4,"w":70,"h":68}, @@ -2010,7 +2034,7 @@ }, "Game/EffectTiles/Inferno_2.png": { - "frame": {"x":1322,"y":577,"w":70,"h":68}, + "frame": {"x":805,"y":1903,"w":70,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":4,"w":70,"h":68}, @@ -2018,7 +2042,7 @@ }, "Game/EffectTiles/Inferno_3.png": { - "frame": {"x":1322,"y":577,"w":70,"h":68}, + "frame": {"x":805,"y":1903,"w":70,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":4,"w":70,"h":68}, @@ -2026,7 +2050,7 @@ }, "Game/EffectTiles/LatexThin.png": { - "frame": {"x":898,"y":1999,"w":61,"h":44}, + "frame": {"x":1404,"y":1687,"w":61,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":17,"w":61,"h":44}, @@ -2034,15 +2058,23 @@ }, "Game/EffectTiles/LatexThinBlue.png": { - "frame": {"x":1823,"y":1695,"w":61,"h":44}, + "frame": {"x":1404,"y":1733,"w":61,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":17,"w":61,"h":44}, "sourceSize": {"w":72,"h":72} }, +"Game/EffectTiles/NoTeleportPlate.png": +{ + "frame": {"x":367,"y":371,"w":70,"h":47}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":14,"w":70,"h":47}, + "sourceSize": {"w":72,"h":72} +}, "Game/EffectTiles/Portals/CommercePortal.png": { - "frame": {"x":1309,"y":1456,"w":66,"h":68}, + "frame": {"x":881,"y":1100,"w":66,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":66,"h":68}, @@ -2050,7 +2082,7 @@ }, "Game/EffectTiles/Portals/CommercePortalReturn.png": { - "frame": {"x":1457,"y":1386,"w":66,"h":68}, + "frame": {"x":882,"y":1029,"w":66,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":66,"h":68}, @@ -2058,7 +2090,7 @@ }, "Game/EffectTiles/Portals/DarkPortal.png": { - "frame": {"x":1506,"y":1155,"w":66,"h":68}, + "frame": {"x":885,"y":957,"w":66,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":66,"h":68}, @@ -2066,7 +2098,7 @@ }, "Game/EffectTiles/Portals/Portal.png": { - "frame": {"x":1505,"y":1225,"w":66,"h":68}, + "frame": {"x":951,"y":886,"w":66,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":66,"h":68}, @@ -2074,7 +2106,7 @@ }, "Game/EffectTiles/Rubble.png": { - "frame": {"x":1871,"y":70,"w":65,"h":66}, + "frame": {"x":1149,"y":813,"w":65,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":4,"w":65,"h":66}, @@ -2082,23 +2114,15 @@ }, "Game/EffectTiles/RubbleNoMend.png": { - "frame": {"x":1871,"y":70,"w":65,"h":66}, + "frame": {"x":1149,"y":813,"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":2012,"y":1527,"w":35,"h":33}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":19,"y":35,"w":35,"h":33}, - "sourceSize": {"w":72,"h":72} -}, "Game/EffectTiles/Slime.png": { - "frame": {"x":1176,"y":745,"w":70,"h":65}, + "frame": {"x":75,"y":1982,"w":70,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":5,"w":70,"h":65}, @@ -2106,7 +2130,7 @@ }, "Game/EffectTiles/SlimeBurning.png": { - "frame": {"x":1181,"y":958,"w":70,"h":70}, + "frame": {"x":739,"y":1325,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":70,"h":70}, @@ -2114,7 +2138,7 @@ }, "Game/EffectTiles/SlimeFrozen.png": { - "frame": {"x":1329,"y":71,"w":70,"h":65}, + "frame": {"x":147,"y":1982,"w":70,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":5,"w":70,"h":65}, @@ -2122,7 +2146,7 @@ }, "Game/EffectTiles/Smoke.png": { - "frame": {"x":1037,"y":1608,"w":61,"h":67}, + "frame": {"x":445,"y":462,"w":61,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":4,"w":61,"h":67}, @@ -2130,7 +2154,7 @@ }, "Game/EffectTiles/Sparks.png": { - "frame": {"x":1543,"y":1,"w":69,"h":61}, + "frame": {"x":1905,"y":1000,"w":69,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":7,"w":69,"h":61}, @@ -2138,95 +2162,111 @@ }, "Game/EffectTiles/Steam.png": { - "frame": {"x":1775,"y":1295,"w":63,"h":62}, + "frame": {"x":1918,"y":1690,"w":63,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":5,"w":63,"h":62}, "sourceSize": {"w":72,"h":72} }, -"Game/EffectTiles/WireSparks.png": +"Game/EffectTiles/TeleportPlate.png": { - "frame": {"x":1181,"y":351,"w":71,"h":66}, + "frame": {"x":368,"y":420,"w":68,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":5,"w":71,"h":66}, + "spriteSourceSize": {"x":2,"y":17,"w":68,"h":40}, "sourceSize": {"w":72,"h":72} }, -"Game/EffectTiles/WireSparksAct.png": +"Game/EffectTiles/TeleportPlateMana.png": { - "frame": {"x":1769,"y":1359,"w":63,"h":59}, + "frame": {"x":438,"y":420,"w":68,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":9,"y":12,"w":63,"h":59}, + "spriteSourceSize": {"x":2,"y":17,"w":68,"h":40}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/AcidBarrel.png": +"Game/EffectTiles/Torch.png": { - "frame": {"x":1529,"y":1595,"w":39,"h":59}, + "frame": {"x":1701,"y":1966,"w":28,"h":52}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":17,"y":9,"w":39,"h":59}, + "spriteSourceSize": {"x":23,"y":19,"w":28,"h":52}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Adventurer_Dom_Fighter.png": +"Game/EffectTiles/TorchOrb.png": { - "frame": {"x":1573,"y":1236,"w":66,"h":60}, + "frame": {"x":1822,"y":1911,"w":32,"h":43}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":4,"y":7,"w":66,"h":60}, + "spriteSourceSize": {"x":20,"y":29,"w":32,"h":43}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Adventurer_Sub_Fighter.png": +"Game/EffectTiles/Wire.png": { - "frame": {"x":1939,"y":922,"w":62,"h":60}, + "frame": {"x":1404,"y":1509,"w":61,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":4,"y":7,"w":62,"h":60}, + "spriteSourceSize": {"x":6,"y":6,"w":61,"h":60}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Adventurer_Switch_Fighter.png": +"Game/EffectTiles/WireSparks.png": { - "frame": {"x":1828,"y":1772,"w":53,"h":63}, + "frame": {"x":1147,"y":1234,"w":71,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":12,"y":7,"w":53,"h":63}, + "spriteSourceSize": {"x":1,"y":5,"w":71,"h":66}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/AirMote.png": +"Game/EffectTiles/WireSparksAct.png": { - "frame": {"x":1037,"y":887,"w":70,"h":71}, + "frame": {"x":1916,"y":1754,"w":63,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":0,"w":70,"h":71}, + "spriteSourceSize": {"x":9,"y":12,"w":63,"h":59}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/AlchemistPet.png": +"Game/Enemies/Adventurer_Dom_Fighter.png": { - "frame": {"x":1146,"y":1945,"w":34,"h":64}, + "frame": {"x":1893,"y":1275,"w":66,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":22,"y":6,"w":34,"h":64}, + "spriteSourceSize": {"x":4,"y":7,"w":66,"h":60}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Ally.png": +"Game/Enemies/Adventurer_Sub_Fighter.png": { - "frame": {"x":1290,"y":1675,"w":60,"h":66}, + "frame": {"x":1320,"y":1862,"w":62,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":4,"w":60,"h":66}, + "spriteSourceSize": {"x":4,"y":7,"w":62,"h":60}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Adventurer_Switch_Fighter.png": +{ + "frame": {"x":1994,"y":330,"w":53,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":7,"w":53,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AirMote.png": +{ + "frame": {"x":667,"y":813,"w":70,"h":71}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":0,"w":70,"h":71}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/AllyDoll.png": +"Game/Enemies/Ally.png": { - "frame": {"x":1728,"y":1901,"w":37,"h":63}, + "frame": {"x":1201,"y":886,"w":60,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, + "spriteSourceSize": {"x":5,"y":4,"w":60,"h":66}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/AmpuleBlueHit.png": { - "frame": {"x":1618,"y":942,"w":66,"h":64}, + "frame": {"x":1681,"y":1306,"w":66,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":66,"h":64}, @@ -2234,7 +2274,7 @@ }, "Game/Enemies/AngelHostile.png": { - "frame": {"x":1472,"y":1,"w":69,"h":67}, + "frame": {"x":886,"y":1526,"w":69,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":3,"w":69,"h":67}, @@ -2242,7 +2282,7 @@ }, "Game/Enemies/AnimLegbinder.png": { - "frame": {"x":1543,"y":185,"w":69,"h":56}, + "frame": {"x":1687,"y":1076,"w":69,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":9,"w":69,"h":56}, @@ -2250,7 +2290,7 @@ }, "Game/Enemies/AnimStraitjacket.png": { - "frame": {"x":1543,"y":125,"w":69,"h":58}, + "frame": {"x":1760,"y":1066,"w":69,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":10,"w":69,"h":58}, @@ -2258,7 +2298,7 @@ }, "Game/Enemies/Apprentice2.png": { - "frame": {"x":1471,"y":1596,"w":56,"h":67}, + "frame": {"x":1146,"y":1586,"w":56,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":56,"h":67}, @@ -2266,23 +2306,15 @@ }, "Game/Enemies/ArmorerQuest.png": { - "frame": {"x":1989,"y":575,"w":56,"h":65}, + "frame": {"x":1338,"y":1020,"w":56,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":5,"w":56,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BanditGuard.png": -{ - "frame": {"x":1395,"y":951,"w":41,"h":65}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":18,"y":2,"w":41,"h":65}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/BanditHunter.png": { - "frame": {"x":1796,"y":1836,"w":30,"h":60}, + "frame": {"x":2016,"y":1560,"w":30,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":7,"w":30,"h":60}, @@ -2290,7 +2322,7 @@ }, "Game/Enemies/BarricadeAir.png": { - "frame": {"x":1093,"y":1677,"w":62,"h":66}, + "frame": {"x":1149,"y":1023,"w":62,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":1,"w":62,"h":66}, @@ -2298,15 +2330,23 @@ }, "Game/Enemies/BarricadeConcrete.png": { - "frame": {"x":1884,"y":1065,"w":62,"h":60}, + "frame": {"x":1248,"y":1898,"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":949,"y":1240,"w":55,"h":68}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":3,"w":55,"h":68}, + "sourceSize": {"w":72,"h":72} +}, "Game/Enemies/BarricadeElectric.png": { - "frame": {"x":1659,"y":422,"w":68,"h":53}, + "frame": {"x":1829,"y":1130,"w":68,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":10,"w":68,"h":53}, @@ -2314,7 +2354,7 @@ }, "Game/Enemies/BarricadeFire.png": { - "frame": {"x":1322,"y":703,"w":69,"h":70}, + "frame": {"x":809,"y":1174,"w":69,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":69,"h":70}, @@ -2322,7 +2362,7 @@ }, "Game/Enemies/BarricadeIce.png": { - "frame": {"x":1401,"y":1,"w":69,"h":69}, + "frame": {"x":811,"y":1029,"w":69,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":69,"h":69}, @@ -2330,7 +2370,7 @@ }, "Game/Enemies/BarricadeMagic.png": { - "frame": {"x":1329,"y":1,"w":70,"h":68}, + "frame": {"x":808,"y":1833,"w":70,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":2,"w":70,"h":68}, @@ -2338,95 +2378,55 @@ }, "Game/Enemies/BarricadeShadow.png": { - "frame": {"x":1430,"y":1254,"w":68,"h":59}, + "frame": {"x":1975,"y":1103,"w":68,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":6,"w":68,"h":59}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BarricadeVine.png": +"Game/Enemies/BindableEnemies/AngelHostile.png": { - "frame": {"x":1927,"y":1960,"w":59,"h":60}, + "frame": {"x":886,"y":1526,"w":69,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":7,"y":7,"w":59,"h":60}, + "spriteSourceSize": {"x":1,"y":3,"w":69,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/AlchemistPet.png": +"Game/Enemies/BindableEnemies/Apprentice2.png": { - "frame": {"x":1146,"y":1945,"w":34,"h":64}, + "frame": {"x":1146,"y":1586,"w":56,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":22,"y":6,"w":34,"h":64}, + "spriteSourceSize": {"x":6,"y":0,"w":56,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/AllyDoll.png": +"Game/Enemies/BindableEnemies/BanditHunter.png": { - "frame": {"x":1728,"y":1901,"w":37,"h":63}, + "frame": {"x":2016,"y":1560,"w":30,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, + "spriteSourceSize": {"x":21,"y":7,"w":30,"h":60}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/AngelHostile.png": +"Game/Enemies/BindableEnemies/Cleric.png": { - "frame": {"x":1472,"y":1,"w":69,"h":67}, + "frame": {"x":1338,"y":1087,"w":56,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":3,"w":69,"h":67}, + "spriteSourceSize": {"x":4,"y":2,"w":56,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/Apprentice2.png": +"Game/Enemies/BindableEnemies/Conjurer.png": { - "frame": {"x":1471,"y":1596,"w":56,"h":67}, + "frame": {"x":1019,"y":955,"w":55,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":6,"y":0,"w":56,"h":67}, + "spriteSourceSize": {"x":5,"y":0,"w":55,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/BanditGuard.png": +"Game/Enemies/BindableEnemies/Dragon.png": { - "frame": {"x":1395,"y":951,"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/BanditHunter.png": -{ - "frame": {"x":1796,"y":1836,"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/BlindZombie.png": -{ - "frame": {"x":1390,"y":1241,"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/Cleric.png": -{ - "frame": {"x":1931,"y":380,"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/Deputy.png": -{ - "frame": {"x":2005,"y":60,"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/Dragon.png": -{ - "frame": {"x":1995,"y":509,"w":50,"h":64}, + "frame": {"x":1467,"y":1510,"w":50,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":3,"w":50,"h":64}, @@ -2434,7 +2434,7 @@ }, "Game/Enemies/BindableEnemies/DragonCrystal.png": { - "frame": {"x":1169,"y":1536,"w":64,"h":68}, + "frame": {"x":953,"y":956,"w":64,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":3,"w":64,"h":68}, @@ -2442,7 +2442,7 @@ }, "Game/Enemies/BindableEnemies/DragonheartQuest.png": { - "frame": {"x":1995,"y":509,"w":50,"h":64}, + "frame": {"x":1467,"y":1510,"w":50,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":3,"w":50,"h":64}, @@ -2450,7 +2450,7 @@ }, "Game/Enemies/BindableEnemies/DragonIce.png": { - "frame": {"x":1979,"y":1109,"w":60,"h":64}, + "frame": {"x":1405,"y":1253,"w":60,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":3,"w":60,"h":64}, @@ -2458,7 +2458,7 @@ }, "Game/Enemies/BindableEnemies/DragonLeader.png": { - "frame": {"x":1996,"y":848,"w":50,"h":64}, + "frame": {"x":1288,"y":1595,"w":50,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":3,"w":50,"h":64}, @@ -2466,7 +2466,7 @@ }, "Game/Enemies/BindableEnemies/DragonPoison.png": { - "frame": {"x":1989,"y":380,"w":57,"h":64}, + "frame": {"x":1345,"y":1463,"w":57,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":3,"w":57,"h":64}, @@ -2474,7 +2474,7 @@ }, "Game/Enemies/BindableEnemies/DragonShadow.png": { - "frame": {"x":1701,"y":1722,"w":62,"h":64}, + "frame": {"x":1340,"y":1652,"w":62,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":3,"w":62,"h":64}, @@ -2482,31 +2482,15 @@ }, "Game/Enemies/BindableEnemies/DragonShield.png": { - "frame": {"x":1153,"y":1811,"w":55,"h":64}, + "frame": {"x":1468,"y":1086,"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":1927,"y":1897,"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":1585,"y":1657,"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":1281,"y":1743,"w":62,"h":65}, + "frame": {"x":1286,"y":741,"w":62,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":62,"h":65}, @@ -2514,7 +2498,7 @@ }, "Game/Enemies/BindableEnemies/ElementalEarth.png": { - "frame": {"x":1534,"y":755,"w":67,"h":61}, + "frame": {"x":1980,"y":950,"w":67,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":7,"w":67,"h":61}, @@ -2522,7 +2506,7 @@ }, "Game/Enemies/BindableEnemies/ElementalLatex.png": { - "frame": {"x":1861,"y":315,"w":65,"h":65}, + "frame": {"x":1271,"y":1020,"w":65,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":7,"w":65,"h":65}, @@ -2530,7 +2514,7 @@ }, "Game/Enemies/BindableEnemies/ElementalLeather.png": { - "frame": {"x":1686,"y":1792,"w":56,"h":63}, + "frame": {"x":1346,"y":1361,"w":56,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":5,"w":56,"h":63}, @@ -2538,7 +2522,7 @@ }, "Game/Enemies/BindableEnemies/ElementalRope.png": { - "frame": {"x":1795,"y":107,"w":65,"h":68}, + "frame": {"x":441,"y":607,"w":65,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":4,"w":65,"h":68}, @@ -2546,39 +2530,23 @@ }, "Game/Enemies/BindableEnemies/ElementalWater.png": { - "frame": {"x":1110,"y":1103,"w":69,"h":71}, + "frame": {"x":593,"y":1475,"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/EncasedDoll.png": -{ - "frame": {"x":1767,"y":1901,"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":1741,"y":630,"w":50,"h":63}, + "frame": {"x":1088,"y":1732,"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/Fuuka1.png": -{ - "frame": {"x":1754,"y":140,"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/GuardHeavy.png": { - "frame": {"x":1332,"y":1810,"w":53,"h":64}, + "frame": {"x":1994,"y":132,"w":53,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":53,"h":64}, @@ -2586,127 +2554,79 @@ }, "Game/Enemies/BindableEnemies/HighWizard.png": { - "frame": {"x":1181,"y":213,"w":71,"h":67}, + "frame": {"x":519,"y":748,"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/JungleDryad.png": -{ - "frame": {"x":1585,"y":1724,"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":1765,"y":1773,"w":61,"h":61}, + "frame": {"x":1404,"y":1383,"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": +"Game/Enemies/BindableEnemies/MageZombie.png": { - "frame": {"x":1507,"y":1932,"w":44,"h":62}, + "frame": {"x":1083,"y":741,"w":72,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":15,"y":5,"w":44,"h":62}, + "spriteSourceSize": {"x":0,"y":2,"w":72,"h":66}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/BindableEnemies/MaidforceHead.png": { - "frame": {"x":2003,"y":914,"w":43,"h":64}, + "frame": {"x":1241,"y":1982,"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/MaidforcePara.png": -{ - "frame": {"x":1525,"y":1363,"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/MaidforceStalker.png": -{ - "frame": {"x":1676,"y":1923,"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/MeleeCleric.png": { - "frame": {"x":1887,"y":935,"w":50,"h":65}, + "frame": {"x":1453,"y":886,"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/Miner.png": -{ - "frame": {"x":1314,"y":1942,"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":1635,"y":1923,"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/Necromancer.png": -{ - "frame": {"x":1753,"y":340,"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/Skeleton.png": { - "frame": {"x":1353,"y":1939,"w":31,"h":58}, + "frame": {"x":2016,"y":1500,"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/SlimeEnthusiast.png": +"Game/Enemies/BindableEnemies/TalismanZombie.png": { - "frame": {"x":1104,"y":564,"w":72,"h":65}, + "frame": {"x":1396,"y":1020,"w":55,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":6,"w":72,"h":65}, + "spriteSourceSize": {"x":9,"y":2,"w":55,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/TalismanZombie.png": +"Game/Enemies/BindableEnemies/WitchChain.png": { - "frame": {"x":1939,"y":855,"w":55,"h":65}, + "frame": {"x":1019,"y":1448,"w":63,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":9,"y":2,"w":55,"h":65}, + "spriteSourceSize": {"x":5,"y":0,"w":63,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/WitchChain.png": +"Game/Enemies/BindableEnemies/WitchFlame.png": { - "frame": {"x":1440,"y":1527,"w":63,"h":67}, + "frame": {"x":1076,"y":955,"w":54,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":0,"w":63,"h":67}, + "spriteSourceSize": {"x":6,"y":0,"w":54,"h":67}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/BindableEnemies/WitchMagnet.png": { - "frame": {"x":1472,"y":70,"w":69,"h":67}, + "frame": {"x":948,"y":1456,"w":69,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":69,"h":67}, @@ -2714,7 +2634,7 @@ }, "Game/Enemies/BindableEnemies/WitchMetal.png": { - "frame": {"x":1324,"y":1089,"w":68,"h":68}, + "frame": {"x":874,"y":1685,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":68,"h":68}, @@ -2722,7 +2642,7 @@ }, "Game/Enemies/BindableEnemies/WitchRope.png": { - "frame": {"x":1233,"y":1606,"w":58,"h":67}, + "frame": {"x":589,"y":593,"w":58,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":58,"h":67}, @@ -2730,7 +2650,7 @@ }, "Game/Enemies/BindableEnemies/WitchShock.png": { - "frame": {"x":1353,"y":1596,"w":57,"h":67}, + "frame": {"x":1087,"y":1586,"w":57,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":57,"h":67}, @@ -2738,7 +2658,7 @@ }, "Game/Enemies/BindableEnemies/WitchSlime.png": { - "frame": {"x":1184,"y":1,"w":71,"h":68}, + "frame": {"x":813,"y":1539,"w":71,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":71,"h":68}, @@ -2746,39 +2666,23 @@ }, "Game/Enemies/BindableEnemies/Wolfgirl.png": { - "frame": {"x":1143,"y":1879,"w":43,"h":64}, + "frame": {"x":1312,"y":1982,"w":43,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":6,"w":43,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/WolfgirlPet.png": -{ - "frame": {"x":1233,"y":1938,"w":34,"h":64}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":22,"y":6,"w":34,"h":64}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/BlacksmithQuest.png": { - "frame": {"x":1748,"y":1070,"w":64,"h":65}, + "frame": {"x":1333,"y":886,"w":64,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":5,"w":64,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BlindZombie.png": -{ - "frame": {"x":1390,"y":1241,"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":1743,"y":472,"w":51,"h":36}, + "frame": {"x":508,"y":639,"w":51,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":23,"w":51,"h":36}, @@ -2786,7 +2690,7 @@ }, "Game/Enemies/ChainBeing.png": { - "frame": {"x":1276,"y":1810,"w":54,"h":64}, + "frame": {"x":1467,"y":1444,"w":54,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":5,"w":54,"h":64}, @@ -2794,7 +2698,7 @@ }, "Game/Enemies/ChainWall.png": { - "frame": {"x":1904,"y":1357,"w":61,"h":58}, + "frame": {"x":1225,"y":1506,"w":61,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":6,"w":61,"h":58}, @@ -2802,7 +2706,7 @@ }, "Game/Enemies/ChaoticCrystalActive.png": { - "frame": {"x":1469,"y":277,"w":69,"h":64}, + "frame": {"x":1454,"y":953,"w":69,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":5,"w":69,"h":64}, @@ -2810,7 +2714,7 @@ }, "Game/Enemies/Cleric.png": { - "frame": {"x":1931,"y":380,"w":56,"h":65}, + "frame": {"x":1338,"y":1087,"w":56,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":2,"w":56,"h":65}, @@ -2818,87 +2722,95 @@ }, "Game/Enemies/ClericHigh.png": { - "frame": {"x":1701,"y":1655,"w":56,"h":65}, + "frame": {"x":1385,"y":1154,"w":56,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":2,"w":56,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/CorruptedAdventurer.png": +"Game/Enemies/Conjurer.png": { - "frame": {"x":1438,"y":986,"w":68,"h":66}, + "frame": {"x":1019,"y":955,"w":55,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":1,"w":68,"h":66}, + "spriteSourceSize": {"x":5,"y":0,"w":55,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/CustomSprite/Alisa.png": +"Game/Enemies/ConjurerTickler.png": { - "frame": {"x":1269,"y":1942,"w":43,"h":62}, + "frame": {"x":1019,"y":955,"w":55,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":16,"y":6,"w":43,"h":62}, + "spriteSourceSize": {"x":5,"y":0,"w":55,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/CustomSprite/Melissa.png": +"Game/Enemies/CorruptedAdventurer.png": { - "frame": {"x":2017,"y":1830,"w":29,"h":59}, + "frame": {"x":1147,"y":1302,"w":68,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":23,"y":8,"w":29,"h":59}, + "spriteSourceSize": {"x":2,"y":1,"w":68,"h":66}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/CustomSpriteBound/Alisa.png": +"Game/Enemies/CuffedGirl.png": { - "frame": {"x":1317,"y":1876,"w":34,"h":64}, + "frame": {"x":1483,"y":1980,"w":44,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":25,"y":6,"w":34,"h":64}, + "spriteSourceSize": {"x":14,"y":7,"w":44,"h":63}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/CustomSpriteBound/Melissa.png": +"Game/Enemies/CuffedGirl2.png": { - "frame": {"x":1777,"y":1966,"w":27,"h":53}, + "frame": {"x":1652,"y":1720,"w":63,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":25,"y":8,"w":27,"h":53}, + "spriteSourceSize": {"x":4,"y":7,"w":63,"h":63}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/CustomSpriteBound/Myrtrice.png": +"Game/Enemies/CustomSprite/Melissa.png": { - "frame": {"x":1324,"y":1159,"w":68,"h":55}, + "frame": {"x":1606,"y":1980,"w":29,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":15,"w":68,"h":55}, + "spriteSourceSize": {"x":23,"y":8,"w":29,"h":59}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/CustomSpriteBound/Rook.png": +"Game/Enemies/CustomSprite/Rook.png": { - "frame": {"x":1037,"y":593,"w":64,"h":72}, + "frame": {"x":947,"y":1386,"w":56,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":0,"w":64,"h":72}, + "spriteSourceSize": {"x":13,"y":3,"w":56,"h":68}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/CustomSpriteBound/Selly.png": +"Game/Enemies/CustomSpriteBound/Alisa.png": { - "frame": {"x":629,"y":1999,"w":66,"h":41}, + "frame": {"x":2013,"y":1683,"w":34,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":18,"w":66,"h":41}, + "spriteSourceSize": {"x":25,"y":6,"w":34,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Cyborg.png": +"Game/Enemies/CustomSpriteBound/Myrtrice.png": { - "frame": {"x":1741,"y":562,"w":51,"h":66}, + "frame": {"x":148,"y":75,"w":68,"h":55}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":7,"y":4,"w":51,"h":66}, + "spriteSourceSize": {"x":0,"y":15,"w":68,"h":55}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/CustomSpriteBound/Selly.png": +{ + "frame": {"x":1961,"y":1326,"w":66,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":18,"w":66,"h":41}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/CyborgBerserker.png": { - "frame": {"x":1996,"y":125,"w":50,"h":66}, + "frame": {"x":1270,"y":1159,"w":50,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":4,"w":50,"h":66}, @@ -2906,7 +2818,7 @@ }, "Game/Enemies/CyborgEnforcer.png": { - "frame": {"x":1890,"y":1832,"w":44,"h":63}, + "frame": {"x":1529,"y":1980,"w":44,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":7,"w":44,"h":63}, @@ -2914,7 +2826,7 @@ }, "Game/Enemies/Decoy.png": { - "frame": {"x":1352,"y":1675,"w":60,"h":66}, + "frame": {"x":1216,"y":813,"w":60,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":4,"w":60,"h":66}, @@ -2922,23 +2834,15 @@ }, "Game/Enemies/Demon.png": { - "frame": {"x":1100,"y":1608,"w":60,"h":67}, + "frame": {"x":1084,"y":1448,"w":60,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":3,"w":60,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/DemonEye.png": -{ - "frame": {"x":1037,"y":297,"w":67,"h":72}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":2,"y":0,"w":67,"h":72}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/DemonMoon.png": { - "frame": {"x":1037,"y":1467,"w":65,"h":69}, + "frame": {"x":441,"y":536,"w":65,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":3,"w":65,"h":69}, @@ -2946,31 +2850,23 @@ }, "Game/Enemies/DemonStar.png": { - "frame": {"x":1182,"y":812,"w":64,"h":71}, + "frame": {"x":508,"y":493,"w":64,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":1,"w":64,"h":71}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Deputy.png": +"Game/Enemies/DemonVoid.png": { - "frame": {"x":2005,"y":60,"w":42,"h":63}, + "frame": {"x":593,"y":1182,"w":70,"h":72}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":12,"y":4,"w":42,"h":63}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Enemies/DirtPile.png": -{ - "frame": {"x":1540,"y":440,"w":47,"h":33}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":12,"y":28,"w":47,"h":33}, + "spriteSourceSize": {"x":2,"y":0,"w":70,"h":72}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/Dollmaker.png": { - "frame": {"x":1580,"y":1857,"w":47,"h":64}, + "frame": {"x":1999,"y":66,"w":47,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":1,"w":47,"h":64}, @@ -2978,7 +2874,7 @@ }, "Game/Enemies/DollmakerBoss1.png": { - "frame": {"x":1254,"y":1315,"w":68,"h":68}, + "frame": {"x":877,"y":1609,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":1,"w":68,"h":68}, @@ -2986,7 +2882,7 @@ }, "Game/Enemies/DollmakerBoss2.png": { - "frame": {"x":1469,"y":343,"w":69,"h":64}, + "frame": {"x":1505,"y":886,"w":69,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":69,"h":64}, @@ -2994,7 +2890,7 @@ }, "Game/Enemies/DollmakerBoss3.png": { - "frame": {"x":1409,"y":1801,"w":59,"h":64}, + "frame": {"x":1772,"y":807,"w":59,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":1,"w":59,"h":64}, @@ -3002,39 +2898,23 @@ }, "Game/Enemies/DollmakerMechanic.png": { - "frame": {"x":1584,"y":1791,"w":49,"h":64}, + "frame": {"x":1525,"y":952,"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":1767,"y":1901,"w":37,"h":63}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/Dollsmith.png": { - "frame": {"x":1272,"y":1876,"w":43,"h":64}, + "frame": {"x":1357,"y":1982,"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":1394,"y":1019,"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":1241,"y":1456,"w":66,"h":69}, + "frame": {"x":736,"y":1692,"w":66,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":1,"w":66,"h":69}, @@ -3042,7 +2922,7 @@ }, "Game/Enemies/Dragon.png": { - "frame": {"x":1765,"y":1707,"w":50,"h":64}, + "frame": {"x":1467,"y":1576,"w":50,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":3,"w":50,"h":64}, @@ -3050,7 +2930,7 @@ }, "Game/Enemies/DragonCrystal.png": { - "frame": {"x":1169,"y":1536,"w":64,"h":68}, + "frame": {"x":953,"y":956,"w":64,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":3,"w":64,"h":68}, @@ -3058,7 +2938,7 @@ }, "Game/Enemies/DragonGirlCrystal.png": { - "frame": {"x":1533,"y":818,"w":67,"h":60}, + "frame": {"x":1764,"y":939,"w":67,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":7,"w":67,"h":60}, @@ -3066,7 +2946,7 @@ }, "Game/Enemies/DragonGirlIce.png": { - "frame": {"x":1780,"y":1420,"w":62,"h":62}, + "frame": {"x":1644,"y":1785,"w":62,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":5,"w":62,"h":62}, @@ -3074,23 +2954,15 @@ }, "Game/Enemies/DragonGirlPoison.png": { - "frame": {"x":1472,"y":139,"w":69,"h":67}, + "frame": {"x":947,"y":1595,"w":69,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":69,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/DragonGirlShadow.png": -{ - "frame": {"x":1447,"y":1933,"w":42,"h":62}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":19,"y":5,"w":42,"h":62}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/DragonheartQuest.png": { - "frame": {"x":1995,"y":509,"w":50,"h":64}, + "frame": {"x":1467,"y":1510,"w":50,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":3,"w":50,"h":64}, @@ -3098,7 +2970,7 @@ }, "Game/Enemies/DragonIce.png": { - "frame": {"x":1979,"y":1109,"w":60,"h":64}, + "frame": {"x":1405,"y":1253,"w":60,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":3,"w":60,"h":64}, @@ -3106,7 +2978,7 @@ }, "Game/Enemies/DragonLeader.png": { - "frame": {"x":1996,"y":848,"w":50,"h":64}, + "frame": {"x":1288,"y":1595,"w":50,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":3,"w":50,"h":64}, @@ -3114,7 +2986,7 @@ }, "Game/Enemies/DragonLeaderDuelist.png": { - "frame": {"x":1996,"y":848,"w":50,"h":64}, + "frame": {"x":1288,"y":1595,"w":50,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":3,"w":50,"h":64}, @@ -3122,7 +2994,7 @@ }, "Game/Enemies/DragonPoison.png": { - "frame": {"x":1989,"y":380,"w":57,"h":64}, + "frame": {"x":1345,"y":1463,"w":57,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":3,"w":57,"h":64}, @@ -3130,7 +3002,7 @@ }, "Game/Enemies/DragonShadow.png": { - "frame": {"x":1701,"y":1722,"w":62,"h":64}, + "frame": {"x":1340,"y":1652,"w":62,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":3,"w":62,"h":64}, @@ -3138,39 +3010,15 @@ }, "Game/Enemies/DragonShield.png": { - "frame": {"x":1153,"y":1811,"w":55,"h":64}, + "frame": {"x":1468,"y":1086,"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":1927,"y":1897,"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":1927,"y":1897,"w":47,"h":61}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":8,"y":8,"w":47,"h":61}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Enemies/Dryad.png": -{ - "frame": {"x":1585,"y":1657,"w":48,"h":65}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":12,"y":3,"w":48,"h":65}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/EarthMote.png": { - "frame": {"x":1686,"y":1067,"w":60,"h":37}, + "frame": {"x":1857,"y":1858,"w":60,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":20,"w":60,"h":37}, @@ -3178,7 +3026,7 @@ }, "Game/Enemies/ElementalAir.png": { - "frame": {"x":1281,"y":1743,"w":62,"h":65}, + "frame": {"x":1286,"y":741,"w":62,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":62,"h":65}, @@ -3186,7 +3034,7 @@ }, "Game/Enemies/ElementalEarth.png": { - "frame": {"x":1534,"y":755,"w":67,"h":61}, + "frame": {"x":1980,"y":950,"w":67,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":7,"w":67,"h":61}, @@ -3194,7 +3042,7 @@ }, "Game/Enemies/ElementalLatex.png": { - "frame": {"x":1797,"y":382,"w":65,"h":65}, + "frame": {"x":1331,"y":953,"w":65,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":7,"w":65,"h":65}, @@ -3202,7 +3050,7 @@ }, "Game/Enemies/ElementalLeather.png": { - "frame": {"x":1686,"y":1792,"w":56,"h":63}, + "frame": {"x":1346,"y":1361,"w":56,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":5,"w":56,"h":63}, @@ -3210,7 +3058,7 @@ }, "Game/Enemies/ElementalRope.png": { - "frame": {"x":1457,"y":1456,"w":65,"h":68}, + "frame": {"x":881,"y":1316,"w":65,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":4,"w":65,"h":68}, @@ -3218,7 +3066,7 @@ }, "Game/Enemies/ElementalRubber.png": { - "frame": {"x":1435,"y":1188,"w":68,"h":64}, + "frame": {"x":1548,"y":813,"w":68,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":4,"w":68,"h":64}, @@ -3226,55 +3074,15 @@ }, "Game/Enemies/ElementalWater.png": { - "frame": {"x":1110,"y":1103,"w":69,"h":71}, + "frame": {"x":593,"y":1475,"w":69,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":69,"h":71}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/EncasedDoll.png": -{ - "frame": {"x":1767,"y":1901,"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":1988,"y":1960,"w":47,"h":62}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":21,"y":7,"w":47,"h":62}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Enemies/EncasedFactoryDoll.png": -{ - "frame": {"x":1977,"y":1830,"w":38,"h":63}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":21,"y":7,"w":38,"h":63}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Enemies/EncasedFactoryDollMetal.png": -{ - "frame": {"x":2011,"y":1563,"w":35,"h":62}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":21,"y":7,"w":35,"h":62}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Enemies/FireElemental.png": -{ - "frame": {"x":1716,"y":1966,"w":59,"h":57}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":7,"y":5,"w":59,"h":57}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/ForceField.png": { - "frame": {"x":1688,"y":876,"w":66,"h":59}, + "frame": {"x":1525,"y":1358,"w":66,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":9,"w":66,"h":59}, @@ -3282,23 +3090,15 @@ }, "Game/Enemies/Fungal.png": { - "frame": {"x":1744,"y":1836,"w":50,"h":63}, + "frame": {"x":1088,"y":1797,"w":50,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":7,"w":50,"h":63}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Fuuka1.png": -{ - "frame": {"x":1753,"y":207,"w":38,"h":65}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":20,"y":2,"w":38,"h":65}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/Fuuka2.png": { - "frame": {"x":1577,"y":1039,"w":66,"h":65}, + "frame": {"x":1263,"y":953,"w":66,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":66,"h":65}, @@ -3306,7 +3106,7 @@ }, "Game/Enemies/FuukaPillar.png": { - "frame": {"x":2016,"y":1461,"w":30,"h":59}, + "frame": {"x":2016,"y":1622,"w":30,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":7,"w":30,"h":59}, @@ -3314,23 +3114,15 @@ }, "Game/Enemies/GagGeist.png": { - "frame": {"x":1570,"y":1593,"w":64,"h":62}, + "frame": {"x":1136,"y":1864,"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":2007,"y":1769,"w":39,"h":59}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":17,"y":9,"w":39,"h":59}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/Golem.png": { - "frame": {"x":1445,"y":847,"w":68,"h":68}, + "frame": {"x":879,"y":1755,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":3,"w":68,"h":68}, @@ -3338,7 +3130,7 @@ }, "Game/Enemies/GreedyGhast.png": { - "frame": {"x":1679,"y":1858,"w":47,"h":63}, + "frame": {"x":1525,"y":1228,"w":47,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":5,"w":47,"h":63}, @@ -3346,7 +3138,7 @@ }, "Game/Enemies/GuardHeavy.png": { - "frame": {"x":1332,"y":1810,"w":53,"h":64}, + "frame": {"x":1994,"y":132,"w":53,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":53,"h":64}, @@ -3354,7 +3146,7 @@ }, "Game/Enemies/HeavySkeleton.png": { - "frame": {"x":2002,"y":984,"w":44,"h":64}, + "frame": {"x":1202,"y":1864,"w":44,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":2,"w":44,"h":64}, @@ -3362,7 +3154,7 @@ }, "Game/Enemies/HighWizard.png": { - "frame": {"x":1181,"y":213,"w":71,"h":67}, + "frame": {"x":519,"y":748,"w":71,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":71,"h":67}, @@ -3370,7 +3162,7 @@ }, "Game/Enemies/HolyConstruct.png": { - "frame": {"x":1235,"y":1536,"w":64,"h":68}, + "frame": {"x":881,"y":1386,"w":64,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":64,"h":68}, @@ -3378,7 +3170,7 @@ }, "Game/Enemies/HugHorror.png": { - "frame": {"x":1570,"y":1526,"w":64,"h":62}, + "frame": {"x":1928,"y":1564,"w":64,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":6,"w":64,"h":62}, @@ -3386,23 +3178,15 @@ }, "Game/Enemies/IceWall.png": { - "frame": {"x":1401,"y":72,"w":69,"h":69}, + "frame": {"x":665,"y":1692,"w":69,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":69,"h":69}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/JungleDryad.png": -{ - "frame": {"x":1585,"y":1724,"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":1414,"y":1733,"w":58,"h":66}, + "frame": {"x":1154,"y":1160,"w":58,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":2,"w":58,"h":66}, @@ -3410,87 +3194,47 @@ }, "Game/Enemies/KeeperFire.png": { - "frame": {"x":1969,"y":1462,"w":45,"h":63}, + "frame": {"x":1467,"y":1751,"w":45,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":5,"w":45,"h":63}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/LatexSprayer.png": -{ - "frame": {"x":1949,"y":1676,"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":1675,"y":1987,"w":39,"h":59}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":17,"y":9,"w":39,"h":59}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/Librarian.png": { - "frame": {"x":1765,"y":1773,"w":61,"h":61}, + "frame": {"x":1404,"y":1383,"w":61,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":8,"w":61,"h":61}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Magician_Sparkle.png": +"Game/Enemies/MageZombie.png": { - "frame": {"x":1967,"y":1294,"w":47,"h":63}, + "frame": {"x":1083,"y":741,"w":72,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":10,"y":5,"w":47,"h":63}, + "spriteSourceSize": {"x":0,"y":2,"w":72,"h":66}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Maidforce.png": +"Game/Enemies/Magician_Sparkle.png": { - "frame": {"x":1507,"y":1932,"w":44,"h":62}, + "frame": {"x":1525,"y":1293,"w":47,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":15,"y":5,"w":44,"h":62}, + "spriteSourceSize": {"x":10,"y":5,"w":47,"h":63}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/MaidforceHead.png": { - "frame": {"x":2003,"y":914,"w":43,"h":64}, + "frame": {"x":1241,"y":1982,"w":43,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":3,"w":43,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/MaidforcePara.png": -{ - "frame": {"x":1525,"y":1363,"w":41,"h":64}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":16,"y":3,"w":41,"h":64}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Enemies/MaidforceStalker.png": -{ - "frame": {"x":1676,"y":1923,"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":1676,"y":1923,"w":38,"h":62}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":21,"y":5,"w":38,"h":62}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/MeleeCleric.png": { - "frame": {"x":1887,"y":935,"w":50,"h":65}, + "frame": {"x":1453,"y":886,"w":50,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":2,"w":50,"h":65}, @@ -3498,47 +3242,23 @@ }, "Game/Enemies/MimicLatex.png": { - "frame": {"x":1180,"y":542,"w":71,"h":55}, + "frame": {"x":75,"y":75,"w":71,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":16,"w":71,"h":55}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Miner.png": -{ - "frame": {"x":1314,"y":1942,"w":37,"h":62}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":18,"y":5,"w":37,"h":62}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Enemies/Mummy.png": -{ - "frame": {"x":1635,"y":1923,"w":39,"h":62}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":21,"y":5,"w":39,"h":62}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/MushyHappy.png": { - "frame": {"x":1796,"y":472,"w":66,"h":57}, + "frame": {"x":1592,"y":1422,"w":66,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":8,"w":66,"h":57}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Necromancer.png": -{ - "frame": {"x":1753,"y":340,"w":37,"h":60}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":17,"y":7,"w":37,"h":60}, - "sourceSize": {"w":72,"h":72} -}, "Game/Enemies/Poltergeist.png": { - "frame": {"x":1635,"y":1662,"w":64,"h":62}, + "frame": {"x":1859,"y":1585,"w":64,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":6,"w":64,"h":62}, @@ -3546,7 +3266,7 @@ }, "Game/Enemies/RopeElemental.png": { - "frame": {"x":1795,"y":107,"w":65,"h":68}, + "frame": {"x":441,"y":607,"w":65,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":4,"w":65,"h":68}, @@ -3554,7 +3274,7 @@ }, "Game/Enemies/RopeKraken.png": { - "frame": {"x":1794,"y":597,"w":65,"h":64}, + "frame": {"x":1890,"y":1337,"w":65,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":4,"w":65,"h":64}, @@ -3562,7 +3282,7 @@ }, "Game/Enemies/SarcoKraken.png": { - "frame": {"x":1535,"y":563,"w":68,"h":58}, + "frame": {"x":1902,"y":1108,"w":68,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":14,"w":68,"h":58}, @@ -3570,7 +3290,7 @@ }, "Game/Enemies/SarcoMinion.png": { - "frame": {"x":1793,"y":663,"w":37,"h":29}, + "frame": {"x":1576,"y":1186,"w":37,"h":29}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":19,"w":37,"h":29}, @@ -3578,7 +3298,7 @@ }, "Game/Enemies/ShadowGhast.png": { - "frame": {"x":1819,"y":1067,"w":63,"h":63}, + "frame": {"x":1579,"y":1755,"w":63,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":5,"w":63,"h":63}, @@ -3586,87 +3306,87 @@ }, "Game/Enemies/ShadowWarrior.png": { - "frame": {"x":1861,"y":246,"w":65,"h":67}, + "frame": {"x":1006,"y":1240,"w":65,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":4,"w":65,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/ShopkeeperRescue.png": +"Game/Enemies/ShrineMaiden.png": { - "frame": {"x":1711,"y":1106,"w":35,"h":60}, + "frame": {"x":1083,"y":741,"w":72,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":21,"y":9,"w":35,"h":60}, + "spriteSourceSize": {"x":0,"y":2,"w":72,"h":66}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Skeleton.png": +"Game/Enemies/ShrineMaiden_2.png": { - "frame": {"x":1353,"y":1939,"w":31,"h":58}, + "frame": {"x":1083,"y":741,"w":72,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":23,"y":8,"w":31,"h":58}, + "spriteSourceSize": {"x":0,"y":2,"w":72,"h":66}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Sleuth.png": +"Game/Enemies/Skeleton.png": { - "frame": {"x":1458,"y":1315,"w":40,"h":64}, + "frame": {"x":2016,"y":1500,"w":31,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":16,"y":2,"w":40,"h":64}, + "spriteSourceSize": {"x":23,"y":8,"w":31,"h":58}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Slime.png": +"Game/Enemies/SkeletonArcher.png": { - "frame": {"x":1574,"y":1923,"w":59,"h":58}, + "frame": {"x":1637,"y":1980,"w":32,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":8,"y":7,"w":59,"h":58}, + "spriteSourceSize": {"x":22,"y":8,"w":32,"h":58}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/SlimeAdv.png": +"Game/Enemies/Sleuth.png": { - "frame": {"x":1525,"y":1866,"w":47,"h":64}, + "frame": {"x":1576,"y":879,"w":40,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":21,"y":7,"w":47,"h":64}, + "spriteSourceSize": {"x":16,"y":2,"w":40,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/SlimeEnthusiast.png": +"Game/Enemies/SlimeAdv.png": { - "frame": {"x":1104,"y":564,"w":72,"h":65}, + "frame": {"x":1355,"y":1288,"w":47,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":6,"w":72,"h":65}, + "spriteSourceSize": {"x":21,"y":7,"w":47,"h":64}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/SlimeKraken.png": { - "frame": {"x":1740,"y":755,"w":65,"h":64}, + "frame": {"x":1817,"y":1373,"w":65,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":6,"w":65,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/SlimeMoldLeaper.png": +"Game/Enemies/SlimeMoldSpawner.png": { - "frame": {"x":1104,"y":1467,"w":63,"h":69}, + "frame": {"x":719,"y":1980,"w":71,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":6,"y":1,"w":63,"h":69}, + "spriteSourceSize": {"x":0,"y":0,"w":71,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/SlimeMoldSpawner.png": +"Game/Enemies/SmallSlime.png": { - "frame": {"x":1181,"y":282,"w":71,"h":67}, + "frame": {"x":1288,"y":1438,"w":55,"h":44}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":0,"w":71,"h":67}, + "spriteSourceSize": {"x":9,"y":16,"w":55,"h":44}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/SoulCrystalActive.png": { - "frame": {"x":1469,"y":409,"w":69,"h":64}, + "frame": {"x":1406,"y":813,"w":69,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":2,"w":69,"h":64}, @@ -3674,7 +3394,7 @@ }, "Game/Enemies/StaticSphere.png": { - "frame": {"x":1684,"y":140,"w":68,"h":53}, + "frame": {"x":1757,"y":1169,"w":68,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":10,"w":68,"h":53}, @@ -3682,23 +3402,15 @@ }, "Game/Enemies/StormCrystal.png": { - "frame": {"x":1401,"y":143,"w":69,"h":69}, + "frame": {"x":665,"y":1763,"w":69,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":2,"w":69,"h":69}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/SummonedCaptureDrone.png": -{ - "frame": {"x":1491,"y":1996,"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":1353,"y":1939,"w":31,"h":58}, + "frame": {"x":2016,"y":1500,"w":31,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":8,"w":31,"h":58}, @@ -3706,31 +3418,23 @@ }, "Game/Enemies/TalismanZombie.png": { - "frame": {"x":1939,"y":855,"w":55,"h":65}, + "frame": {"x":1396,"y":1020,"w":55,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":2,"w":55,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/TheWarden1.png": +"Game/Enemies/TapeBot.png": { - "frame": {"x":1977,"y":1895,"w":38,"h":63}, + "frame": {"x":582,"y":2009,"w":65,"h":38}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":21,"y":4,"w":38,"h":63}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Enemies/TheWarden2.png": -{ - "frame": {"x":1645,"y":1039,"w":39,"h":63}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":17,"y":4,"w":39,"h":63}, + "spriteSourceSize": {"x":5,"y":21,"w":65,"h":38}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/TickleTerror.png": { - "frame": {"x":1506,"y":1099,"w":67,"h":54}, + "frame": {"x":1685,"y":1250,"w":67,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":7,"w":67,"h":54}, @@ -3738,7 +3442,7 @@ }, "Game/Enemies/UnforseenRope.png": { - "frame": {"x":1459,"y":521,"w":65,"h":41}, + "frame": {"x":1519,"y":1665,"w":65,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":13,"w":65,"h":41}, @@ -3746,7 +3450,7 @@ }, "Game/Enemies/VineSpitter.png": { - "frame": {"x":1842,"y":1196,"w":62,"h":59}, + "frame": {"x":1177,"y":1930,"w":62,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":6,"w":62,"h":59}, @@ -3754,7 +3458,7 @@ }, "Game/Enemies/Wall.png": { - "frame": {"x":1110,"y":1,"w":72,"h":69}, + "frame": {"x":877,"y":886,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":72,"h":69}, @@ -3762,7 +3466,7 @@ }, "Game/Enemies/WallDoor.png": { - "frame": {"x":1241,"y":1456,"w":66,"h":69}, + "frame": {"x":736,"y":1692,"w":66,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":1,"w":66,"h":69}, @@ -3770,7 +3474,7 @@ }, "Game/Enemies/WardenFighter.png": { - "frame": {"x":1568,"y":1298,"w":66,"h":60}, + "frame": {"x":1822,"y":1311,"w":66,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":7,"w":66,"h":60}, @@ -3778,7 +3482,7 @@ }, "Game/Enemies/Water.png": { - "frame": {"x":1934,"y":1249,"w":61,"h":43}, + "frame": {"x":1404,"y":1779,"w":61,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":16,"w":61,"h":43}, @@ -3786,7 +3490,7 @@ }, "Game/Enemies/WitchAqua.png": { - "frame": {"x":1684,"y":264,"w":67,"h":67}, + "frame": {"x":1019,"y":1733,"w":67,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":67,"h":67}, @@ -3794,7 +3498,7 @@ }, "Game/Enemies/WitchChain.png": { - "frame": {"x":1505,"y":1526,"w":63,"h":67}, + "frame": {"x":1070,"y":1379,"w":63,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":0,"w":63,"h":67}, @@ -3802,7 +3506,7 @@ }, "Game/Enemies/WitchFlame.png": { - "frame": {"x":1529,"y":1657,"w":54,"h":67}, + "frame": {"x":1077,"y":886,"w":54,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":0,"w":54,"h":67}, @@ -3810,7 +3514,7 @@ }, "Game/Enemies/WitchMagnet.png": { - "frame": {"x":1472,"y":208,"w":69,"h":67}, + "frame": {"x":957,"y":1525,"w":69,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":69,"h":67}, @@ -3818,7 +3522,7 @@ }, "Game/Enemies/WitchMetal.png": { - "frame": {"x":1465,"y":564,"w":68,"h":68}, + "frame": {"x":944,"y":1679,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":68,"h":68}, @@ -3826,7 +3530,7 @@ }, "Game/Enemies/WitchRope.png": { - "frame": {"x":1293,"y":1606,"w":58,"h":67}, + "frame": {"x":589,"y":662,"w":58,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":0,"w":58,"h":67}, @@ -3834,7 +3538,7 @@ }, "Game/Enemies/WitchShock.png": { - "frame": {"x":1412,"y":1596,"w":57,"h":67}, + "frame": {"x":1092,"y":1517,"w":57,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":57,"h":67}, @@ -3842,7 +3546,7 @@ }, "Game/Enemies/WitchSlime.png": { - "frame": {"x":1184,"y":71,"w":71,"h":68}, + "frame": {"x":736,"y":1763,"w":71,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":71,"h":68}, @@ -3850,7 +3554,7 @@ }, "Game/Enemies/WolfApprentice.png": { - "frame": {"x":1095,"y":1813,"w":56,"h":64}, + "frame": {"x":1467,"y":1283,"w":56,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":6,"w":56,"h":64}, @@ -3858,7 +3562,7 @@ }, "Game/Enemies/WolfExecutive.png": { - "frame": {"x":1435,"y":1867,"w":34,"h":64}, + "frame": {"x":2013,"y":1749,"w":34,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":6,"w":34,"h":64}, @@ -3866,7 +3570,7 @@ }, "Game/Enemies/Wolfgirl.png": { - "frame": {"x":1188,"y":1938,"w":43,"h":64}, + "frame": {"x":1402,"y":1980,"w":43,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":6,"w":43,"h":64}, @@ -3874,7 +3578,7 @@ }, "Game/Enemies/WolfgirlPet.png": { - "frame": {"x":1471,"y":1867,"w":34,"h":64}, + "frame": {"x":1447,"y":1980,"w":34,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":6,"w":34,"h":64}, @@ -3882,47 +3586,15 @@ }, "Game/Enemies/WolfGuard.png": { - "frame": {"x":1253,"y":1088,"w":69,"h":63}, + "frame": {"x":1762,"y":1001,"w":69,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":7,"w":69,"h":63}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/WolfInstructor.png": -{ - "frame": {"x":1581,"y":914,"w":35,"h":64}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":22,"y":6,"w":35,"h":64}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Enemies/WolfOperative.png": -{ - "frame": {"x":1753,"y":274,"w":38,"h":64}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":18,"y":6,"w":38,"h":64}, - "sourceSize": {"w":72,"h":72} -}, -"Game/EnemiesBound/AllyDoll.png": -{ - "frame": {"x":1888,"y":1897,"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":1580,"y":980,"w":36,"h":56}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":24,"y":10,"w":36,"h":56}, - "sourceSize": {"w":72,"h":72} -}, "Game/EnemiesBound/Apprentice2.png": { - "frame": {"x":72,"y":1999,"w":69,"h":42}, + "frame": {"x":1831,"y":1086,"w":69,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":20,"w":69,"h":42}, @@ -3930,7 +3602,7 @@ }, "Game/EnemiesBound/ApprenticeSlime.png": { - "frame": {"x":1779,"y":1538,"w":62,"h":43}, + "frame": {"x":1761,"y":1963,"w":62,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":27,"w":62,"h":43}, @@ -3938,31 +3610,31 @@ }, "Game/EnemiesBound/ChainBeing.png": { - "frame": {"x":1916,"y":1191,"w":62,"h":56}, + "frame": {"x":1177,"y":1991,"w":62,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":5,"w":62,"h":56}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/Conjurer.png": +"Game/EnemiesBound/ConjurerTickler.png": { - "frame": {"x":1394,"y":1153,"w":39,"h":65}, + "frame": {"x":1269,"y":1726,"w":65,"h":41}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":18,"y":0,"w":39,"h":65}, + "spriteSourceSize": {"x":1,"y":18,"w":65,"h":41}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/ConjurerTickler.png": +"Game/EnemiesBound/CuffedGirl2.png": { - "frame": {"x":1484,"y":475,"w":65,"h":41}, + "frame": {"x":1468,"y":1152,"w":55,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":18,"w":65,"h":41}, + "spriteSourceSize": {"x":8,"y":7,"w":55,"h":63}, "sourceSize": {"w":72,"h":72} }, "Game/EnemiesBound/CyborgEnforcer.png": { - "frame": {"x":1320,"y":775,"w":69,"h":64}, + "frame": {"x":1414,"y":741,"w":69,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":7,"w":69,"h":64}, @@ -3970,7 +3642,7 @@ }, "Game/EnemiesBound/DragonCrystal.png": { - "frame": {"x":1648,"y":1455,"w":64,"h":67}, + "frame": {"x":1014,"y":1169,"w":64,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":64,"h":67}, @@ -3978,63 +3650,71 @@ }, "Game/EnemiesBound/DragonLeader.png": { - "frame": {"x":1470,"y":1801,"w":53,"h":64}, + "frame": {"x":1994,"y":198,"w":53,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":5,"w":53,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/ElementalEarth.png": +"Game/EnemiesBound/DragonShield.png": { - "frame": {"x":1511,"y":917,"w":68,"h":60}, + "frame": {"x":1525,"y":1187,"w":49,"h":39}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":7,"w":68,"h":60}, + "spriteSourceSize": {"x":15,"y":28,"w":49,"h":39}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/ElementalLeather.png": +"Game/EnemiesBound/Dressmaker.png": { - "frame": {"x":1103,"y":703,"w":63,"h":35}, + "frame": {"x":2018,"y":1437,"w":29,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":4,"y":32,"w":63,"h":35}, + "spriteSourceSize": {"x":22,"y":7,"w":29,"h":61}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/ElementalWater.png": +"Game/EnemiesBound/ElementalEarth.png": { - "frame": {"x":1217,"y":1810,"w":57,"h":64}, + "frame": {"x":1616,"y":1175,"w":68,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":7,"y":7,"w":57,"h":64}, + "spriteSourceSize": {"x":2,"y":7,"w":68,"h":60}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/EncasedFactoryDollMetal.png": +"Game/EnemiesBound/ElementalLeather.png": { - "frame": {"x":2011,"y":1668,"w":35,"h":62}, + "frame": {"x":382,"y":1938,"w":63,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":21,"y":7,"w":35,"h":62}, + "spriteSourceSize": {"x":4,"y":32,"w":63,"h":35}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/FactoryDoll.png": +"Game/EnemiesBound/ElementalWater.png": { - "frame": {"x":1767,"y":1901,"w":37,"h":63}, + "frame": {"x":1142,"y":1732,"w":57,"h":64}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, + "spriteSourceSize": {"x":7,"y":7,"w":57,"h":64}, "sourceSize": {"w":72,"h":72} }, "Game/EnemiesBound/Fuuka.png": { - "frame": {"x":2017,"y":1891,"w":30,"h":57}, + "frame": {"x":1981,"y":1756,"w":30,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":2,"w":30,"h":57}, "sourceSize": {"w":72,"h":72} }, +"Game/EnemiesBound/Guard.png": +{ + "frame": {"x":1983,"y":1697,"w":28,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":25,"y":3,"w":28,"h":57}, + "sourceSize": {"w":72,"h":72} +}, "Game/EnemiesBound/Head/Alchemist.png": { - "frame": {"x":1568,"y":1422,"w":41,"h":32}, + "frame": {"x":297,"y":1942,"w":41,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":7,"w":41,"h":32}, @@ -4042,7 +3722,7 @@ }, "Game/EnemiesBound/Head/Alkahestor.png": { - "frame": {"x":1936,"y":1737,"w":41,"h":33}, + "frame": {"x":1707,"y":1876,"w":41,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":7,"w":41,"h":33}, @@ -4050,7 +3730,7 @@ }, "Game/EnemiesBound/Head/AllyDoll.png": { - "frame": {"x":1636,"y":1428,"w":37,"h":25}, + "frame": {"x":1574,"y":1248,"w":37,"h":25}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":7,"w":37,"h":25}, @@ -4058,7 +3738,7 @@ }, "Game/EnemiesBound/Head/Apprentice2.png": { - "frame": {"x":1969,"y":1527,"w":41,"h":34}, + "frame": {"x":1510,"y":1884,"w":41,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":2,"w":41,"h":34}, @@ -4066,7 +3746,7 @@ }, "Game/EnemiesBound/Head/ApprenticeSlime.png": { - "frame": {"x":1889,"y":1257,"w":43,"h":35}, + "frame": {"x":1922,"y":1994,"w":43,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":1,"w":43,"h":35}, @@ -4074,23 +3754,55 @@ }, "Game/EnemiesBound/Head/Bandit.png": { - "frame": {"x":1329,"y":1216,"w":38,"h":25}, + "frame": {"x":1576,"y":1132,"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":1733,"y":2019,"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":1525,"y":1429,"w":38,"h":25}, + "frame": {"x":1576,"y":1159,"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/Cleric.png": +{ + "frame": {"x":1576,"y":1069,"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":1967,"y":1867,"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/Dressmaker.png": +{ + "frame": {"x":1891,"y":1994,"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/ElementalFire.png": { - "frame": {"x":1923,"y":2022,"w":36,"h":25}, + "frame": {"x":1153,"y":1705,"w":36,"h":25}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":7,"w":36,"h":25}, @@ -4098,47 +3810,55 @@ }, "Game/EnemiesBound/Head/ElementalLatex.png": { - "frame": {"x":1675,"y":1428,"w":26,"h":25}, + "frame": {"x":561,"y":639,"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/ElfRanger.png": +"Game/EnemiesBound/Head/ElementalLeather.png": { - "frame": {"x":1551,"y":475,"w":36,"h":41}, + "frame": {"x":1376,"y":1951,"w":35,"h":27}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":22,"y":7,"w":36,"h":41}, + "spriteSourceSize": {"x":22,"y":5,"w":35,"h":27}, "sourceSize": {"w":72,"h":72} }, "Game/EnemiesBound/Head/EncasedDoll.png": { - "frame": {"x":1748,"y":1137,"w":37,"h":25}, + "frame": {"x":1574,"y":1275,"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/GuardHeavy.png": +"Game/EnemiesBound/Head/Maid.png": { - "frame": {"x":1832,"y":663,"w":27,"h":28}, + "frame": {"x":1413,"y":1951,"w":34,"h":27}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":24,"y":5,"w":27,"h":28}, + "spriteSourceSize": {"x":25,"y":5,"w":34,"h":27}, "sourceSize": {"w":72,"h":72} }, "Game/EnemiesBound/Head/MaidforceMafia.png": { - "frame": {"x":1861,"y":723,"w":37,"h":29}, + "frame": {"x":1576,"y":1217,"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/MeleeCleric.png": +{ + "frame": {"x":1576,"y":1036,"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":1618,"y":1008,"w":38,"h":29}, + "frame": {"x":1576,"y":1101,"w":38,"h":29}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":5,"w":38,"h":29}, @@ -4146,7 +3866,7 @@ }, "Game/EnemiesBound/Head/SlimeEnthusiast.png": { - "frame": {"x":1979,"y":1734,"w":41,"h":33}, + "frame": {"x":1750,"y":1876,"w":41,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":7,"w":41,"h":33}, @@ -4154,7 +3874,7 @@ }, "Game/EnemiesBound/HighWizard.png": { - "frame": {"x":1887,"y":1635,"w":61,"h":39}, + "frame": {"x":1765,"y":2008,"w":61,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":20,"w":61,"h":39}, @@ -4162,79 +3882,79 @@ }, "Game/EnemiesBound/Librarian.png": { - "frame": {"x":2016,"y":1294,"w":29,"h":60}, + "frame": {"x":1575,"y":1980,"w":29,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":7,"w":29,"h":60}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/MaidforceMafia.png": +"Game/EnemiesBound/Necromancer.png": { - "frame": {"x":1996,"y":446,"w":51,"h":61}, + "frame": {"x":1398,"y":953,"w":54,"h":65}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":8,"y":3,"w":51,"h":61}, + "spriteSourceSize": {"x":8,"y":3,"w":54,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/Necromancer.png": +"Game/EnemiesBound/WardenFighter.png": { - "frame": {"x":1993,"y":642,"w":54,"h":65}, + "frame": {"x":1540,"y":1920,"w":60,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":8,"y":3,"w":54,"h":65}, + "spriteSourceSize": {"x":5,"y":7,"w":60,"h":58}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/WardenFighter.png": +"Game/FloorGeneric/BondageMachine/ChastityHoriz.png": { - "frame": {"x":1883,"y":1772,"w":60,"h":58}, + "frame": {"x":1073,"y":1238,"w":72,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":7,"w":60,"h":58}, + "spriteSourceSize": {"x":0,"y":6,"w":72,"h":66}, "sourceSize": {"w":72,"h":72} }, "Game/FloorGeneric/BondageMachine/DollHoriz.png": { - "frame": {"x":1110,"y":72,"w":72,"h":69}, + "frame": {"x":877,"y":813,"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/PlugHoriz.png": +"Game/FloorGeneric/BondageMachine/LatexHoriz.png": { - "frame": {"x":1106,"y":360,"w":72,"h":66}, + "frame": {"x":1080,"y":1166,"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": +"Game/FloorGeneric/BondageMachine/MetalHoriz.png": { - "frame": {"x":1106,"y":428,"w":72,"h":66}, + "frame": {"x":1073,"y":1306,"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": +"Game/FloorGeneric/BondageMachine/PlugHoriz.png": { - "frame": {"x":1936,"y":1832,"w":39,"h":63}, + "frame": {"x":1135,"y":1374,"w":72,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":17,"y":6,"w":39,"h":63}, + "spriteSourceSize": {"x":0,"y":6,"w":72,"h":66}, "sourceSize": {"w":72,"h":72} }, -"Game/FloorGeneric/Chests/KittyOpen.png": +"Game/FloorGeneric/BondageMachine/TapeHoriz.png": { - "frame": {"x":1866,"y":1962,"w":55,"h":62}, + "frame": {"x":1146,"y":1442,"w":72,"h":66}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":9,"y":0,"w":55,"h":62}, + "spriteSourceSize": {"x":0,"y":6,"w":72,"h":66}, "sourceSize": {"w":72,"h":72} }, "Game/FloorGeneric/Chests/RobotOpen.png": { - "frame": {"x":1714,"y":1492,"w":63,"h":53}, + "frame": {"x":1849,"y":1776,"w":63,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":9,"w":63,"h":53}, @@ -4242,7 +3962,7 @@ }, "Game/FloorGeneric/ClamBed.png": { - "frame": {"x":1037,"y":1251,"w":64,"h":71}, + "frame": {"x":508,"y":566,"w":64,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":64,"h":71}, @@ -4250,7 +3970,7 @@ }, "Game/FloorGeneric/CommercePortal.png": { - "frame": {"x":1241,"y":1385,"w":67,"h":69}, + "frame": {"x":1980,"y":462,"w":67,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":3,"w":67,"h":69}, @@ -4258,31 +3978,127 @@ }, "Game/FloorGeneric/CommercePortalReturn.png": { - "frame": {"x":1037,"y":1396,"w":67,"h":69}, + "frame": {"x":1980,"y":533,"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/LeftOn.png": +"Game/FloorGeneric/Conveyor/DownOff.png": +{ + "frame": {"x":1994,"y":1587,"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/DownOn.png": +{ + "frame": {"x":1701,"y":2020,"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/Left.png": +{ + "frame": {"x":1624,"y":741,"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":1698,"y":741,"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/LeftOff.png": +{ + "frame": {"x":1994,"y":1587,"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/LeftRightDown.png": { - "frame": {"x":1987,"y":2024,"w":27,"h":22}, + "frame": {"x":1624,"y":791,"w":72,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":21,"y":37,"w":27,"h":22}, + "spriteSourceSize": {"x":0,"y":24,"w":72,"h":48}, "sourceSize": {"w":72,"h":72} }, -"Game/FloorGeneric/Conveyor/RightOn.png": +"Game/FloorGeneric/Conveyor/Right.png": { - "frame": {"x":2016,"y":2024,"w":27,"h":22}, + "frame": {"x":1698,"y":791,"w":72,"h":48}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":24,"y":37,"w":27,"h":22}, + "spriteSourceSize": {"x":0,"y":24,"w":72,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/FloorGeneric/Conveyor/RightDown.png": +{ + "frame": {"x":1833,"y":813,"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/RightOff.png": +{ + "frame": {"x":1994,"y":1587,"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/SafetyLeft.png": +{ + "frame": {"x":1833,"y":863,"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/SafetyRight.png": +{ + "frame": {"x":1618,"y":841,"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":1692,"y":841,"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/UpOff.png": +{ + "frame": {"x":1994,"y":1587,"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/UpRight.png": +{ + "frame": {"x":1833,"y":913,"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":1095,"y":1879,"w":46,"h":64}, + "frame": {"x":1142,"y":1798,"w":46,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":7,"w":46,"h":64}, @@ -4290,7 +4106,7 @@ }, "Game/FloorGeneric/DisplayEgyptian.png": { - "frame": {"x":1662,"y":510,"w":65,"h":51}, + "frame": {"x":1586,"y":1609,"w":65,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":21,"w":65,"h":51}, @@ -4298,7 +4114,7 @@ }, "Game/FloorGeneric/DollDropoff.png": { - "frame": {"x":1436,"y":1054,"w":68,"h":65}, + "frame": {"x":1285,"y":1294,"w":68,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":1,"w":68,"h":65}, @@ -4306,7 +4122,7 @@ }, "Game/FloorGeneric/DollDropoffD.png": { - "frame": {"x":1589,"y":440,"w":68,"h":68}, + "frame": {"x":880,"y":1825,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":3,"w":68,"h":68}, @@ -4314,7 +4130,7 @@ }, "Game/FloorGeneric/DollDropoffL.png": { - "frame": {"x":1568,"y":1360,"w":66,"h":60}, + "frame": {"x":1749,"y":1350,"w":66,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":6,"w":66,"h":60}, @@ -4322,7 +4138,7 @@ }, "Game/FloorGeneric/DollDropoffR.png": { - "frame": {"x":1643,"y":1106,"w":66,"h":60}, + "frame": {"x":1680,"y":1372,"w":66,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":6,"w":66,"h":60}, @@ -4330,7 +4146,7 @@ }, "Game/FloorGeneric/DollTerminal.png": { - "frame": {"x":1037,"y":960,"w":70,"h":71}, + "frame": {"x":667,"y":959,"w":70,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":71}, @@ -4338,7 +4154,7 @@ }, "Game/FloorGeneric/Doors/CyberDoor.png": { - "frame": {"x":1175,"y":1319,"w":64,"h":70}, + "frame": {"x":811,"y":886,"w":64,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":2,"w":64,"h":70}, @@ -4346,7 +4162,7 @@ }, "Game/FloorGeneric/Doors/CyberDoorOpen.png": { - "frame": {"x":1324,"y":1243,"w":64,"h":70}, + "frame": {"x":811,"y":813,"w":64,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":2,"w":64,"h":70}, @@ -4354,7 +4170,7 @@ }, "Game/FloorGeneric/Elevator.png": { - "frame": {"x":1037,"y":1033,"w":70,"h":71}, + "frame": {"x":665,"y":1107,"w":70,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":71}, @@ -4362,7 +4178,7 @@ }, "Game/FloorGeneric/ElevatorDisabled.png": { - "frame": {"x":1178,"y":599,"w":70,"h":71}, + "frame": {"x":665,"y":1180,"w":70,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":71}, @@ -4370,7 +4186,7 @@ }, "Game/FloorGeneric/HappyGas.png": { - "frame": {"x":1106,"y":1395,"w":67,"h":69}, + "frame": {"x":1980,"y":604,"w":67,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":67,"h":69}, @@ -4378,7 +4194,7 @@ }, "Game/FloorGeneric/LightRays.png": { - "frame": {"x":1181,"y":1030,"w":70,"h":70}, + "frame": {"x":741,"y":1251,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -4386,127 +4202,95 @@ }, "Game/FloorGeneric/LightRaysDoll.png": { - "frame": {"x":1760,"y":1589,"w":62,"h":64}, + "frame": {"x":1782,"y":1793,"w":62,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":1,"w":62,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/FloorGeneric/Portal.png": +"Game/FloorGeneric/Orb.png": { - "frame": {"x":1389,"y":1315,"w":67,"h":69}, + "frame": {"x":2024,"y":1369,"w":21,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":3,"w":67,"h":69}, + "spriteSourceSize": {"x":26,"y":9,"w":21,"h":21}, "sourceSize": {"w":72,"h":72} }, -"Game/FloorGeneric/Table.png": -{ - "frame": {"x":561,"y":1999,"w":66,"h":43}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":3,"y":28,"w":66,"h":43}, - "sourceSize": {"w":72,"h":72} -}, -"Game/FloorGeneric/TablePlate.png": +"Game/FloorGeneric/Pizza.png": { - "frame": {"x":1,"y":1999,"w":69,"h":43}, + "frame": {"x":1616,"y":1130,"w":69,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":28,"w":69,"h":43}, "sourceSize": {"w":72,"h":72} }, -"Game/FloorGeneric/TabletDetermination_2.png": +"Game/FloorGeneric/Portal.png": { - "frame": {"x":1525,"y":1800,"w":53,"h":64}, + "frame": {"x":1980,"y":675,"w":67,"h":69}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":10,"y":0,"w":53,"h":64}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Floors/Floor_cat/DoorVertCont.png": -{ - "frame": {"x":1,"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/DoorVertOpen.png": -{ - "frame": {"x":1,"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/DoorVertOpenCont.png": -{ - "frame": {"x":1,"y":149,"w":72,"h":72}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "spriteSourceSize": {"x":2,"y":3,"w":67,"h":69}, "sourceSize": {"w":72,"h":72} }, -"Game/Floors/Floor_cat/Floor.png": +"Game/FloorGeneric/Signal/AutoLock.png": { - "frame": {"x":1,"y":223,"w":72,"h":72}, + "frame": {"x":1994,"y":1609,"w":20,"h":20}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "trimmed": true, + "spriteSourceSize": {"x":26,"y":29,"w":20,"h":20}, "sourceSize": {"w":72,"h":72} }, -"Game/Floors/Floor_cat/Grate.png": +"Game/FloorGeneric/Table.png": { - "frame": {"x":1,"y":297,"w":72,"h":72}, + "frame": {"x":1961,"y":1281,"w":66,"h":43}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":28,"w":66,"h":43}, "sourceSize": {"w":72,"h":72} }, -"Game/Floors/Floor_cat/GrateHoriz.png": +"Game/FloorGeneric/TableCookies.png": { - "frame": {"x":1,"y":371,"w":72,"h":72}, + "frame": {"x":1976,"y":1013,"w":69,"h":43}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":28,"w":69,"h":43}, "sourceSize": {"w":72,"h":72} }, -"Game/Floors/Floor_cat/GrateVert.png": +"Game/FloorGeneric/TablePizza.png": { - "frame": {"x":1,"y":445,"w":72,"h":72}, + "frame": {"x":1976,"y":1058,"w":69,"h":43}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":28,"w":69,"h":43}, "sourceSize": {"w":72,"h":72} }, -"Game/Floors/Floor_cat/MimicBlock.png": +"Game/FloorGeneric/TablePlate.png": { - "frame": {"x":1,"y":519,"w":72,"h":72}, + "frame": {"x":1904,"y":1063,"w":69,"h":43}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":28,"w":69,"h":43}, "sourceSize": {"w":72,"h":72} }, -"Game/Floors/Floor_cat/OrbEmpty.png": +"Game/FloorGeneric/TabletDetermination_2.png": { - "frame": {"x":1,"y":593,"w":72,"h":72}, + "frame": {"x":1994,"y":264,"w":53,"h":64}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":0,"w":53,"h":64}, "sourceSize": {"w":72,"h":72} }, -"Game/Floors/Floor_cat/RubbleLooted.png": +"Game/FloorGeneric/Torch.png": { - "frame": {"x":1,"y":667,"w":72,"h":72}, + "frame": {"x":1731,"y":1966,"w":28,"h":51}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":19,"w":28,"h":51}, "sourceSize": {"w":72,"h":72} }, "Game/Floors/Floor_cat/Shrine.png": { - "frame": {"x":1,"y":741,"w":72,"h":72}, + "frame": {"x":1,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4514,7 +4298,7 @@ }, "Game/Floors/Floor_cat/ShrineBroken.png": { - "frame": {"x":1,"y":815,"w":72,"h":72}, + "frame": {"x":1,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4522,7 +4306,7 @@ }, "Game/Floors/Floor_cat/ShrineC.png": { - "frame": {"x":1,"y":889,"w":72,"h":72}, + "frame": {"x":1,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4530,7 +4314,7 @@ }, "Game/Floors/Floor_cat/ShrineEmpty.png": { - "frame": {"x":1,"y":963,"w":72,"h":72}, + "frame": {"x":1,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4538,7 +4322,7 @@ }, "Game/Floors/Floor_cat/StairsDown.png": { - "frame": {"x":1,"y":1037,"w":72,"h":72}, + "frame": {"x":1,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4546,7 +4330,7 @@ }, "Game/Floors/Floor_cat/StairsUp.png": { - "frame": {"x":1,"y":1111,"w":72,"h":72}, + "frame": {"x":1,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4554,7 +4338,7 @@ }, "Game/Floors/Floor_cat/Trap.png": { - "frame": {"x":1,"y":1185,"w":72,"h":72}, + "frame": {"x":1,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4562,7 +4346,7 @@ }, "Game/Floors/Floor_cat/Wall.png": { - "frame": {"x":1,"y":1259,"w":72,"h":72}, + "frame": {"x":1,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4570,7 +4354,7 @@ }, "Game/Floors/Floor_cat/WallVert.png": { - "frame": {"x":1,"y":1333,"w":72,"h":72}, + "frame": {"x":1,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4578,7 +4362,7 @@ }, "Game/Floors/Floor_cry/Barrel.png": { - "frame": {"x":1,"y":1407,"w":72,"h":72}, + "frame": {"x":1,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4586,7 +4370,7 @@ }, "Game/Floors/Floor_cry/Bars.png": { - "frame": {"x":1,"y":1481,"w":72,"h":72}, + "frame": {"x":1,"y":741,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4594,7 +4378,7 @@ }, "Game/Floors/Floor_cry/BarsOld.png": { - "frame": {"x":1,"y":1555,"w":72,"h":72}, + "frame": {"x":1,"y":815,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4602,7 +4386,7 @@ }, "Game/Floors/Floor_cry/BarsVert.png": { - "frame": {"x":1,"y":1629,"w":72,"h":72}, + "frame": {"x":1,"y":889,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4610,7 +4394,7 @@ }, "Game/Floors/Floor_cry/BarsVertCont.png": { - "frame": {"x":1,"y":1703,"w":72,"h":72}, + "frame": {"x":1,"y":963,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4618,7 +4402,7 @@ }, "Game/Floors/Floor_cry/Brickwork.png": { - "frame": {"x":1,"y":1777,"w":72,"h":72}, + "frame": {"x":1,"y":1037,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4626,7 +4410,7 @@ }, "Game/Floors/Floor_cry/Doodad.png": { - "frame": {"x":1,"y":1851,"w":72,"h":72}, + "frame": {"x":1,"y":1111,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4634,7 +4418,7 @@ }, "Game/Floors/Floor_cry/Door.png": { - "frame": {"x":1,"y":1925,"w":72,"h":72}, + "frame": {"x":1,"y":1185,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4642,7 +4426,7 @@ }, "Game/Floors/Floor_cry/DoorOpen.png": { - "frame": {"x":75,"y":1,"w":72,"h":72}, + "frame": {"x":1,"y":1259,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4650,7 +4434,7 @@ }, "Game/Floors/Floor_cry/DoorVert.png": { - "frame": {"x":75,"y":75,"w":72,"h":72}, + "frame": {"x":1,"y":1333,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4658,7 +4442,7 @@ }, "Game/Floors/Floor_cry/DoorVertCont.png": { - "frame": {"x":75,"y":149,"w":72,"h":72}, + "frame": {"x":1,"y":1407,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4666,7 +4450,7 @@ }, "Game/Floors/Floor_cry/DoorVertOpen.png": { - "frame": {"x":75,"y":223,"w":72,"h":72}, + "frame": {"x":1,"y":1481,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4674,7 +4458,7 @@ }, "Game/Floors/Floor_cry/DoorVertOpenCont.png": { - "frame": {"x":75,"y":297,"w":72,"h":72}, + "frame": {"x":1,"y":1555,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4682,7 +4466,7 @@ }, "Game/Floors/Floor_cry/Floor.png": { - "frame": {"x":75,"y":371,"w":72,"h":72}, + "frame": {"x":1,"y":1629,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4690,7 +4474,7 @@ }, "Game/Floors/Floor_cry/Grate.png": { - "frame": {"x":75,"y":445,"w":72,"h":72}, + "frame": {"x":1,"y":1703,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4698,7 +4482,7 @@ }, "Game/Floors/Floor_cry/GrateHoriz.png": { - "frame": {"x":75,"y":519,"w":72,"h":72}, + "frame": {"x":1,"y":1777,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4706,7 +4490,7 @@ }, "Game/Floors/Floor_cry/GrateVert.png": { - "frame": {"x":75,"y":593,"w":72,"h":72}, + "frame": {"x":1,"y":1851,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4714,7 +4498,7 @@ }, "Game/Floors/Floor_cry/MimicBlock.png": { - "frame": {"x":75,"y":667,"w":72,"h":72}, + "frame": {"x":1,"y":1925,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4722,7 +4506,7 @@ }, "Game/Floors/Floor_cry/OrbEmpty.png": { - "frame": {"x":75,"y":741,"w":72,"h":72}, + "frame": {"x":75,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4730,7 +4514,7 @@ }, "Game/Floors/Floor_cry/RubbleLooted.png": { - "frame": {"x":75,"y":815,"w":72,"h":72}, + "frame": {"x":149,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4738,7 +4522,7 @@ }, "Game/Floors/Floor_cry/Shrine.png": { - "frame": {"x":75,"y":889,"w":72,"h":72}, + "frame": {"x":223,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4746,7 +4530,7 @@ }, "Game/Floors/Floor_cry/ShrineBroken.png": { - "frame": {"x":75,"y":963,"w":72,"h":72}, + "frame": {"x":297,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4754,7 +4538,7 @@ }, "Game/Floors/Floor_cry/ShrineC.png": { - "frame": {"x":75,"y":1037,"w":72,"h":72}, + "frame": {"x":371,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4762,7 +4546,7 @@ }, "Game/Floors/Floor_cry/ShrineEmpty.png": { - "frame": {"x":75,"y":1111,"w":72,"h":72}, + "frame": {"x":445,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4770,7 +4554,7 @@ }, "Game/Floors/Floor_cry/StairsDown.png": { - "frame": {"x":75,"y":1185,"w":72,"h":72}, + "frame": {"x":519,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4778,7 +4562,7 @@ }, "Game/Floors/Floor_cry/StairsUp.png": { - "frame": {"x":75,"y":1259,"w":72,"h":72}, + "frame": {"x":593,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4786,7 +4570,7 @@ }, "Game/Floors/Floor_cry/Trap.png": { - "frame": {"x":75,"y":1333,"w":72,"h":72}, + "frame": {"x":667,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4794,7 +4578,23 @@ }, "Game/Floors/Floor_cry/Wall.png": { - "frame": {"x":75,"y":1407,"w":72,"h":72}, + "frame": {"x":741,"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/WallR.png": +{ + "frame": {"x":815,"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/WallRVert.png": +{ + "frame": {"x":889,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4802,7 +4602,7 @@ }, "Game/Floors/Floor_cry/WallVert.png": { - "frame": {"x":75,"y":1481,"w":72,"h":72}, + "frame": {"x":963,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4810,7 +4610,7 @@ }, "Game/Floors/Floor_cst/Barrel.png": { - "frame": {"x":75,"y":1555,"w":72,"h":72}, + "frame": {"x":1037,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4818,7 +4618,7 @@ }, "Game/Floors/Floor_cst/Bars.png": { - "frame": {"x":75,"y":1629,"w":72,"h":72}, + "frame": {"x":1111,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4826,7 +4626,7 @@ }, "Game/Floors/Floor_cst/BarsVert.png": { - "frame": {"x":75,"y":1629,"w":72,"h":72}, + "frame": {"x":1111,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4834,7 +4634,7 @@ }, "Game/Floors/Floor_cst/BarsVertCont.png": { - "frame": {"x":75,"y":1629,"w":72,"h":72}, + "frame": {"x":1111,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4842,7 +4642,7 @@ }, "Game/Floors/Floor_cst/Brickwork.png": { - "frame": {"x":75,"y":1703,"w":72,"h":72}, + "frame": {"x":1185,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4850,7 +4650,7 @@ }, "Game/Floors/Floor_cst/Doodad.png": { - "frame": {"x":75,"y":1777,"w":72,"h":72}, + "frame": {"x":1259,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4858,7 +4658,7 @@ }, "Game/Floors/Floor_cst/Door.png": { - "frame": {"x":75,"y":1851,"w":72,"h":72}, + "frame": {"x":1333,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4866,7 +4666,7 @@ }, "Game/Floors/Floor_cst/DoorOpen.png": { - "frame": {"x":75,"y":1925,"w":72,"h":72}, + "frame": {"x":1407,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4874,7 +4674,7 @@ }, "Game/Floors/Floor_cst/DoorVert.png": { - "frame": {"x":149,"y":1,"w":72,"h":72}, + "frame": {"x":1481,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4882,7 +4682,7 @@ }, "Game/Floors/Floor_cst/DoorVertCont.png": { - "frame": {"x":149,"y":75,"w":72,"h":72}, + "frame": {"x":1555,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4890,7 +4690,7 @@ }, "Game/Floors/Floor_cst/DoorVertOpen.png": { - "frame": {"x":149,"y":149,"w":72,"h":72}, + "frame": {"x":1629,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4898,7 +4698,7 @@ }, "Game/Floors/Floor_cst/DoorVertOpenCont.png": { - "frame": {"x":149,"y":223,"w":72,"h":72}, + "frame": {"x":1703,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4906,7 +4706,7 @@ }, "Game/Floors/Floor_cst/Floor.png": { - "frame": {"x":75,"y":1703,"w":72,"h":72}, + "frame": {"x":1185,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4914,7 +4714,23 @@ }, "Game/Floors/Floor_cst/Grate.png": { - "frame": {"x":149,"y":297,"w":72,"h":72}, + "frame": {"x":1777,"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/GrateHoriz.png": +{ + "frame": {"x":1851,"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/GrateVert.png": +{ + "frame": {"x":1925,"y":1,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4922,7 +4738,7 @@ }, "Game/Floors/Floor_cst/MimicBlock.png": { - "frame": {"x":149,"y":371,"w":72,"h":72}, + "frame": {"x":75,"y":132,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4930,7 +4746,7 @@ }, "Game/Floors/Floor_cst/OrbEmpty.png": { - "frame": {"x":149,"y":445,"w":72,"h":72}, + "frame": {"x":218,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4938,7 +4754,7 @@ }, "Game/Floors/Floor_cst/RubbleLooted.png": { - "frame": {"x":149,"y":519,"w":72,"h":72}, + "frame": {"x":292,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4946,7 +4762,7 @@ }, "Game/Floors/Floor_cst/Shrine.png": { - "frame": {"x":149,"y":593,"w":72,"h":72}, + "frame": {"x":366,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4954,7 +4770,7 @@ }, "Game/Floors/Floor_cst/ShrineBroken.png": { - "frame": {"x":149,"y":667,"w":72,"h":72}, + "frame": {"x":440,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4962,7 +4778,7 @@ }, "Game/Floors/Floor_cst/ShrineC.png": { - "frame": {"x":149,"y":741,"w":72,"h":72}, + "frame": {"x":514,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4970,7 +4786,7 @@ }, "Game/Floors/Floor_cst/ShrineEmpty.png": { - "frame": {"x":149,"y":815,"w":72,"h":72}, + "frame": {"x":588,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4978,7 +4794,7 @@ }, "Game/Floors/Floor_cst/Trap.png": { - "frame": {"x":149,"y":889,"w":72,"h":72}, + "frame": {"x":662,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4986,7 +4802,23 @@ }, "Game/Floors/Floor_cst/Wall.png": { - "frame": {"x":149,"y":963,"w":72,"h":72}, + "frame": {"x":736,"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/WallR.png": +{ + "frame": {"x":810,"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/WallRVert.png": +{ + "frame": {"x":884,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -4994,7 +4826,7 @@ }, "Game/Floors/Floor_cst/WallVert.png": { - "frame": {"x":149,"y":1037,"w":72,"h":72}, + "frame": {"x":958,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5002,7 +4834,7 @@ }, "Game/Floors/Floor_DemonTransition/Barrel.png": { - "frame": {"x":149,"y":1111,"w":72,"h":72}, + "frame": {"x":1032,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5010,7 +4842,7 @@ }, "Game/Floors/Floor_DemonTransition/Bars.png": { - "frame": {"x":149,"y":1185,"w":72,"h":72}, + "frame": {"x":1106,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5018,7 +4850,7 @@ }, "Game/Floors/Floor_DemonTransition/BarsVert.png": { - "frame": {"x":149,"y":1259,"w":72,"h":72}, + "frame": {"x":1180,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5026,7 +4858,7 @@ }, "Game/Floors/Floor_DemonTransition/BarsVertCont.png": { - "frame": {"x":149,"y":1333,"w":72,"h":72}, + "frame": {"x":1254,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5034,7 +4866,7 @@ }, "Game/Floors/Floor_DemonTransition/Brickwork.png": { - "frame": {"x":149,"y":1407,"w":72,"h":72}, + "frame": {"x":1328,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5042,7 +4874,7 @@ }, "Game/Floors/Floor_DemonTransition/Doodad.png": { - "frame": {"x":149,"y":1481,"w":72,"h":72}, + "frame": {"x":1402,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5050,7 +4882,7 @@ }, "Game/Floors/Floor_DemonTransition/Door.png": { - "frame": {"x":149,"y":1555,"w":72,"h":72}, + "frame": {"x":1476,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5058,7 +4890,7 @@ }, "Game/Floors/Floor_DemonTransition/DoorOpen.png": { - "frame": {"x":149,"y":1629,"w":72,"h":72}, + "frame": {"x":1550,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5066,7 +4898,7 @@ }, "Game/Floors/Floor_DemonTransition/DoorVert.png": { - "frame": {"x":149,"y":1703,"w":72,"h":72}, + "frame": {"x":1624,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5074,7 +4906,7 @@ }, "Game/Floors/Floor_DemonTransition/DoorVertCont.png": { - "frame": {"x":149,"y":1777,"w":72,"h":72}, + "frame": {"x":1698,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5082,7 +4914,7 @@ }, "Game/Floors/Floor_DemonTransition/DoorVertOpen.png": { - "frame": {"x":149,"y":1851,"w":72,"h":72}, + "frame": {"x":1772,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5090,7 +4922,7 @@ }, "Game/Floors/Floor_DemonTransition/DoorVertOpenCont.png": { - "frame": {"x":149,"y":1925,"w":72,"h":72}, + "frame": {"x":1846,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5098,7 +4930,7 @@ }, "Game/Floors/Floor_DemonTransition/Floor.png": { - "frame": {"x":223,"y":1,"w":72,"h":72}, + "frame": {"x":1920,"y":75,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5106,7 +4938,7 @@ }, "Game/Floors/Floor_DemonTransition/Grate.png": { - "frame": {"x":223,"y":75,"w":72,"h":72}, + "frame": {"x":218,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5114,7 +4946,7 @@ }, "Game/Floors/Floor_DemonTransition/GrateHoriz.png": { - "frame": {"x":223,"y":149,"w":72,"h":72}, + "frame": {"x":75,"y":206,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5122,7 +4954,7 @@ }, "Game/Floors/Floor_DemonTransition/GrateVert.png": { - "frame": {"x":223,"y":223,"w":72,"h":72}, + "frame": {"x":292,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5130,7 +4962,7 @@ }, "Game/Floors/Floor_DemonTransition/MimicBlock.png": { - "frame": {"x":223,"y":297,"w":72,"h":72}, + "frame": {"x":366,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5138,7 +4970,7 @@ }, "Game/Floors/Floor_DemonTransition/OrbEmpty.png": { - "frame": {"x":223,"y":371,"w":72,"h":72}, + "frame": {"x":440,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5146,7 +4978,7 @@ }, "Game/Floors/Floor_DemonTransition/RubbleLooted.png": { - "frame": {"x":223,"y":445,"w":72,"h":72}, + "frame": {"x":514,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5154,7 +4986,7 @@ }, "Game/Floors/Floor_DemonTransition/Shrine.png": { - "frame": {"x":223,"y":519,"w":72,"h":72}, + "frame": {"x":588,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5162,7 +4994,7 @@ }, "Game/Floors/Floor_DemonTransition/ShrineBroken.png": { - "frame": {"x":223,"y":593,"w":72,"h":72}, + "frame": {"x":662,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5170,7 +5002,7 @@ }, "Game/Floors/Floor_DemonTransition/ShrineC.png": { - "frame": {"x":223,"y":667,"w":72,"h":72}, + "frame": {"x":736,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5178,7 +5010,7 @@ }, "Game/Floors/Floor_DemonTransition/ShrineEmpty.png": { - "frame": {"x":223,"y":741,"w":72,"h":72}, + "frame": {"x":810,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5186,7 +5018,7 @@ }, "Game/Floors/Floor_DemonTransition/Trap.png": { - "frame": {"x":223,"y":815,"w":72,"h":72}, + "frame": {"x":884,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5194,7 +5026,23 @@ }, "Game/Floors/Floor_DemonTransition/Wall.png": { - "frame": {"x":223,"y":889,"w":72,"h":72}, + "frame": {"x":958,"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/WallR.png": +{ + "frame": {"x":1032,"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/WallRVert.png": +{ + "frame": {"x":1106,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5202,7 +5050,7 @@ }, "Game/Floors/Floor_DemonTransition/WallVert.png": { - "frame": {"x":223,"y":963,"w":72,"h":72}, + "frame": {"x":1180,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5210,7 +5058,7 @@ }, "Game/Floors/Floor_grv/Barrel.png": { - "frame": {"x":223,"y":1037,"w":72,"h":72}, + "frame": {"x":1254,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5218,7 +5066,7 @@ }, "Game/Floors/Floor_grv/Bars.png": { - "frame": {"x":223,"y":1111,"w":72,"h":72}, + "frame": {"x":1328,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5226,7 +5074,7 @@ }, "Game/Floors/Floor_grv/BarsVert.png": { - "frame": {"x":223,"y":1185,"w":72,"h":72}, + "frame": {"x":1402,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5234,7 +5082,7 @@ }, "Game/Floors/Floor_grv/BarsVertCont.png": { - "frame": {"x":223,"y":1259,"w":72,"h":72}, + "frame": {"x":1476,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5242,7 +5090,7 @@ }, "Game/Floors/Floor_grv/Brickwork.png": { - "frame": {"x":223,"y":1333,"w":72,"h":72}, + "frame": {"x":1550,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5250,7 +5098,7 @@ }, "Game/Floors/Floor_grv/Doodad.png": { - "frame": {"x":223,"y":1407,"w":72,"h":72}, + "frame": {"x":1624,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5258,7 +5106,7 @@ }, "Game/Floors/Floor_grv/Door.png": { - "frame": {"x":223,"y":1481,"w":72,"h":72}, + "frame": {"x":1698,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5266,7 +5114,7 @@ }, "Game/Floors/Floor_grv/DoorOpen.png": { - "frame": {"x":223,"y":1555,"w":72,"h":72}, + "frame": {"x":1772,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5274,7 +5122,7 @@ }, "Game/Floors/Floor_grv/DoorVert.png": { - "frame": {"x":223,"y":1629,"w":72,"h":72}, + "frame": {"x":1846,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5282,7 +5130,7 @@ }, "Game/Floors/Floor_grv/DoorVertCont.png": { - "frame": {"x":223,"y":1703,"w":72,"h":72}, + "frame": {"x":1920,"y":149,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5290,7 +5138,7 @@ }, "Game/Floors/Floor_grv/DoorVertOpen.png": { - "frame": {"x":223,"y":1777,"w":72,"h":72}, + "frame": {"x":75,"y":280,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5298,7 +5146,7 @@ }, "Game/Floors/Floor_grv/DoorVertOpenCont.png": { - "frame": {"x":223,"y":1851,"w":72,"h":72}, + "frame": {"x":75,"y":354,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5306,7 +5154,7 @@ }, "Game/Floors/Floor_grv/Floor.png": { - "frame": {"x":223,"y":1925,"w":72,"h":72}, + "frame": {"x":75,"y":428,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5314,7 +5162,7 @@ }, "Game/Floors/Floor_grv/Grate.png": { - "frame": {"x":297,"y":1,"w":72,"h":72}, + "frame": {"x":75,"y":502,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5322,7 +5170,7 @@ }, "Game/Floors/Floor_grv/GrateHoriz.png": { - "frame": {"x":297,"y":75,"w":72,"h":72}, + "frame": {"x":75,"y":576,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5330,15 +5178,7 @@ }, "Game/Floors/Floor_grv/GrateVert.png": { - "frame": {"x":297,"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/MimicBlock.png": -{ - "frame": {"x":1,"y":519,"w":72,"h":72}, + "frame": {"x":75,"y":650,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5346,7 +5186,7 @@ }, "Game/Floors/Floor_grv/OrbEmpty.png": { - "frame": {"x":297,"y":223,"w":72,"h":72}, + "frame": {"x":75,"y":724,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5354,7 +5194,7 @@ }, "Game/Floors/Floor_grv/RubbleLooted.png": { - "frame": {"x":223,"y":1925,"w":72,"h":72}, + "frame": {"x":75,"y":428,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5362,7 +5202,7 @@ }, "Game/Floors/Floor_grv/Shrine.png": { - "frame": {"x":297,"y":297,"w":72,"h":72}, + "frame": {"x":75,"y":798,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5370,7 +5210,7 @@ }, "Game/Floors/Floor_grv/ShrineBroken.png": { - "frame": {"x":297,"y":371,"w":72,"h":72}, + "frame": {"x":75,"y":872,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5378,7 +5218,7 @@ }, "Game/Floors/Floor_grv/ShrineC.png": { - "frame": {"x":297,"y":445,"w":72,"h":72}, + "frame": {"x":75,"y":946,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5386,7 +5226,7 @@ }, "Game/Floors/Floor_grv/ShrineEmpty.png": { - "frame": {"x":297,"y":519,"w":72,"h":72}, + "frame": {"x":75,"y":1020,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5394,7 +5234,7 @@ }, "Game/Floors/Floor_grv/StairsDown.png": { - "frame": {"x":297,"y":593,"w":72,"h":72}, + "frame": {"x":75,"y":1094,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5402,7 +5242,7 @@ }, "Game/Floors/Floor_grv/StairsUp.png": { - "frame": {"x":297,"y":667,"w":72,"h":72}, + "frame": {"x":75,"y":1168,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5410,7 +5250,7 @@ }, "Game/Floors/Floor_grv/Trap.png": { - "frame": {"x":297,"y":741,"w":72,"h":72}, + "frame": {"x":75,"y":1242,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5418,7 +5258,23 @@ }, "Game/Floors/Floor_grv/Wall.png": { - "frame": {"x":297,"y":815,"w":72,"h":72}, + "frame": {"x":75,"y":1316,"w":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":75,"y":1390,"w":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":75,"y":1464,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5426,7 +5282,7 @@ }, "Game/Floors/Floor_grv/WallVert.png": { - "frame": {"x":297,"y":889,"w":72,"h":72}, + "frame": {"x":75,"y":1538,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5434,7 +5290,7 @@ }, "Game/Floors/Floor_jng/Barrel.png": { - "frame": {"x":297,"y":963,"w":72,"h":72}, + "frame": {"x":75,"y":1612,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5442,7 +5298,7 @@ }, "Game/Floors/Floor_jng/Bars.png": { - "frame": {"x":297,"y":1037,"w":72,"h":72}, + "frame": {"x":75,"y":1686,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5450,7 +5306,7 @@ }, "Game/Floors/Floor_jng/BarsVert.png": { - "frame": {"x":297,"y":1111,"w":72,"h":72}, + "frame": {"x":75,"y":1760,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5458,7 +5314,7 @@ }, "Game/Floors/Floor_jng/BarsVertCont.png": { - "frame": {"x":297,"y":1185,"w":72,"h":72}, + "frame": {"x":75,"y":1834,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5466,7 +5322,7 @@ }, "Game/Floors/Floor_jng/Brickwork.png": { - "frame": {"x":297,"y":1259,"w":72,"h":72}, + "frame": {"x":75,"y":1908,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5474,7 +5330,7 @@ }, "Game/Floors/Floor_jng/Doodad.png": { - "frame": {"x":297,"y":1333,"w":72,"h":72}, + "frame": {"x":149,"y":276,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5482,7 +5338,7 @@ }, "Game/Floors/Floor_jng/Door.png": { - "frame": {"x":297,"y":1407,"w":72,"h":72}, + "frame": {"x":149,"y":350,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5490,7 +5346,7 @@ }, "Game/Floors/Floor_jng/DoorOpen.png": { - "frame": {"x":297,"y":1481,"w":72,"h":72}, + "frame": {"x":149,"y":424,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5498,7 +5354,7 @@ }, "Game/Floors/Floor_jng/DoorVert.png": { - "frame": {"x":297,"y":1555,"w":72,"h":72}, + "frame": {"x":149,"y":498,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5506,7 +5362,7 @@ }, "Game/Floors/Floor_jng/DoorVertCont.png": { - "frame": {"x":297,"y":1629,"w":72,"h":72}, + "frame": {"x":149,"y":572,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5514,7 +5370,7 @@ }, "Game/Floors/Floor_jng/DoorVertOpen.png": { - "frame": {"x":297,"y":1703,"w":72,"h":72}, + "frame": {"x":149,"y":646,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5522,7 +5378,7 @@ }, "Game/Floors/Floor_jng/DoorVertOpenCont.png": { - "frame": {"x":297,"y":1777,"w":72,"h":72}, + "frame": {"x":149,"y":720,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5530,7 +5386,7 @@ }, "Game/Floors/Floor_jng/Floor.png": { - "frame": {"x":297,"y":1851,"w":72,"h":72}, + "frame": {"x":149,"y":794,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5538,7 +5394,7 @@ }, "Game/Floors/Floor_jng/Grate.png": { - "frame": {"x":297,"y":1925,"w":72,"h":72}, + "frame": {"x":149,"y":868,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5546,7 +5402,7 @@ }, "Game/Floors/Floor_jng/GrateHoriz.png": { - "frame": {"x":371,"y":1,"w":72,"h":72}, + "frame": {"x":149,"y":942,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5554,7 +5410,7 @@ }, "Game/Floors/Floor_jng/GrateVert.png": { - "frame": {"x":371,"y":75,"w":72,"h":72}, + "frame": {"x":149,"y":1016,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5562,7 +5418,7 @@ }, "Game/Floors/Floor_jng/MimicBlock.png": { - "frame": {"x":297,"y":1851,"w":72,"h":72}, + "frame": {"x":149,"y":794,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5570,7 +5426,7 @@ }, "Game/Floors/Floor_jng/OrbEmpty.png": { - "frame": {"x":371,"y":149,"w":72,"h":72}, + "frame": {"x":149,"y":1090,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5578,7 +5434,7 @@ }, "Game/Floors/Floor_jng/RubbleLooted.png": { - "frame": {"x":371,"y":223,"w":72,"h":72}, + "frame": {"x":149,"y":1164,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5586,7 +5442,7 @@ }, "Game/Floors/Floor_jng/Shrine.png": { - "frame": {"x":371,"y":297,"w":72,"h":72}, + "frame": {"x":149,"y":1238,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5594,7 +5450,7 @@ }, "Game/Floors/Floor_jng/ShrineBroken.png": { - "frame": {"x":371,"y":371,"w":72,"h":72}, + "frame": {"x":149,"y":1312,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5602,7 +5458,7 @@ }, "Game/Floors/Floor_jng/ShrineC.png": { - "frame": {"x":371,"y":445,"w":72,"h":72}, + "frame": {"x":149,"y":1386,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5610,7 +5466,7 @@ }, "Game/Floors/Floor_jng/ShrineEmpty.png": { - "frame": {"x":371,"y":519,"w":72,"h":72}, + "frame": {"x":149,"y":1460,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5618,7 +5474,7 @@ }, "Game/Floors/Floor_jng/Trap.png": { - "frame": {"x":371,"y":593,"w":72,"h":72}, + "frame": {"x":149,"y":1534,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5626,7 +5482,23 @@ }, "Game/Floors/Floor_jng/Wall.png": { - "frame": {"x":371,"y":667,"w":72,"h":72}, + "frame": {"x":149,"y":1608,"w":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":149,"y":1682,"w":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":149,"y":1756,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5634,7 +5506,7 @@ }, "Game/Floors/Floor_jng/WallVert.png": { - "frame": {"x":371,"y":741,"w":72,"h":72}, + "frame": {"x":149,"y":1830,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5642,7 +5514,7 @@ }, "Game/Floors/Floor_jngWild/Barrel.png": { - "frame": {"x":371,"y":815,"w":72,"h":72}, + "frame": {"x":149,"y":1904,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5650,7 +5522,7 @@ }, "Game/Floors/Floor_jngWild/Bars.png": { - "frame": {"x":371,"y":889,"w":72,"h":72}, + "frame": {"x":293,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5658,7 +5530,7 @@ }, "Game/Floors/Floor_jngWild/BarsVert.png": { - "frame": {"x":371,"y":889,"w":72,"h":72}, + "frame": {"x":293,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5666,7 +5538,7 @@ }, "Game/Floors/Floor_jngWild/BarsVertCont.png": { - "frame": {"x":371,"y":889,"w":72,"h":72}, + "frame": {"x":293,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5674,7 +5546,7 @@ }, "Game/Floors/Floor_jngWild/Brickwork.png": { - "frame": {"x":371,"y":963,"w":72,"h":72}, + "frame": {"x":367,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5682,7 +5554,7 @@ }, "Game/Floors/Floor_jngWild/Doodad.png": { - "frame": {"x":371,"y":1037,"w":72,"h":72}, + "frame": {"x":441,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5690,7 +5562,7 @@ }, "Game/Floors/Floor_jngWild/Door.png": { - "frame": {"x":297,"y":1407,"w":72,"h":72}, + "frame": {"x":149,"y":350,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5698,7 +5570,7 @@ }, "Game/Floors/Floor_jngWild/DoorOpen.png": { - "frame": {"x":371,"y":1111,"w":72,"h":72}, + "frame": {"x":515,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5706,7 +5578,7 @@ }, "Game/Floors/Floor_jngWild/DoorVert.png": { - "frame": {"x":371,"y":1185,"w":72,"h":72}, + "frame": {"x":589,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5714,7 +5586,7 @@ }, "Game/Floors/Floor_jngWild/DoorVertCont.png": { - "frame": {"x":371,"y":1259,"w":72,"h":72}, + "frame": {"x":663,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5722,7 +5594,7 @@ }, "Game/Floors/Floor_jngWild/DoorVertOpen.png": { - "frame": {"x":371,"y":1333,"w":72,"h":72}, + "frame": {"x":737,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5730,7 +5602,7 @@ }, "Game/Floors/Floor_jngWild/DoorVertOpenCont.png": { - "frame": {"x":371,"y":1407,"w":72,"h":72}, + "frame": {"x":811,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5738,7 +5610,7 @@ }, "Game/Floors/Floor_jngWild/Floor.png": { - "frame": {"x":371,"y":1481,"w":72,"h":72}, + "frame": {"x":885,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5746,7 +5618,7 @@ }, "Game/Floors/Floor_jngWild/Grate.png": { - "frame": {"x":297,"y":1925,"w":72,"h":72}, + "frame": {"x":149,"y":868,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5754,7 +5626,7 @@ }, "Game/Floors/Floor_jngWild/GrateHoriz.png": { - "frame": {"x":371,"y":1,"w":72,"h":72}, + "frame": {"x":149,"y":942,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5762,7 +5634,7 @@ }, "Game/Floors/Floor_jngWild/GrateVert.png": { - "frame": {"x":371,"y":75,"w":72,"h":72}, + "frame": {"x":149,"y":1016,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5770,7 +5642,7 @@ }, "Game/Floors/Floor_jngWild/MimicBlock.png": { - "frame": {"x":371,"y":1555,"w":72,"h":72}, + "frame": {"x":959,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5778,7 +5650,7 @@ }, "Game/Floors/Floor_jngWild/OrbEmpty.png": { - "frame": {"x":371,"y":1629,"w":72,"h":72}, + "frame": {"x":1033,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5786,7 +5658,7 @@ }, "Game/Floors/Floor_jngWild/RubbleLooted.png": { - "frame": {"x":371,"y":1555,"w":72,"h":72}, + "frame": {"x":959,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5794,7 +5666,7 @@ }, "Game/Floors/Floor_jngWild/Shrine.png": { - "frame": {"x":371,"y":1703,"w":72,"h":72}, + "frame": {"x":1107,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5802,7 +5674,7 @@ }, "Game/Floors/Floor_jngWild/ShrineBroken.png": { - "frame": {"x":371,"y":1777,"w":72,"h":72}, + "frame": {"x":1181,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5810,7 +5682,7 @@ }, "Game/Floors/Floor_jngWild/ShrineC.png": { - "frame": {"x":371,"y":1851,"w":72,"h":72}, + "frame": {"x":1255,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5818,7 +5690,7 @@ }, "Game/Floors/Floor_jngWild/ShrineEmpty.png": { - "frame": {"x":371,"y":1925,"w":72,"h":72}, + "frame": {"x":1329,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5826,7 +5698,7 @@ }, "Game/Floors/Floor_jngWild/StairsDown.png": { - "frame": {"x":445,"y":1,"w":72,"h":72}, + "frame": {"x":1403,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5834,7 +5706,7 @@ }, "Game/Floors/Floor_jngWild/StairsUp.png": { - "frame": {"x":445,"y":75,"w":72,"h":72}, + "frame": {"x":1477,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5842,7 +5714,7 @@ }, "Game/Floors/Floor_jngWild/Trap.png": { - "frame": {"x":445,"y":149,"w":72,"h":72}, + "frame": {"x":1551,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5850,7 +5722,23 @@ }, "Game/Floors/Floor_jngWild/Wall.png": { - "frame": {"x":445,"y":223,"w":72,"h":72}, + "frame": {"x":1625,"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/WallR.png": +{ + "frame": {"x":1699,"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/WallRVert.png": +{ + "frame": {"x":1773,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5858,7 +5746,7 @@ }, "Game/Floors/Floor_jngWild/WallVert.png": { - "frame": {"x":445,"y":297,"w":72,"h":72}, + "frame": {"x":1847,"y":223,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5866,7 +5754,7 @@ }, "Game/Floors/Floor_lib/Barrel.png": { - "frame": {"x":445,"y":371,"w":72,"h":72}, + "frame": {"x":223,"y":348,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5874,7 +5762,7 @@ }, "Game/Floors/Floor_lib/Bars.png": { - "frame": {"x":445,"y":445,"w":72,"h":72}, + "frame": {"x":223,"y":422,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5882,7 +5770,7 @@ }, "Game/Floors/Floor_lib/BarsVert.png": { - "frame": {"x":445,"y":445,"w":72,"h":72}, + "frame": {"x":223,"y":422,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5890,7 +5778,7 @@ }, "Game/Floors/Floor_lib/BarsVertCont.png": { - "frame": {"x":445,"y":445,"w":72,"h":72}, + "frame": {"x":223,"y":422,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5898,7 +5786,7 @@ }, "Game/Floors/Floor_lib/Brickwork.png": { - "frame": {"x":445,"y":519,"w":72,"h":72}, + "frame": {"x":223,"y":496,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5906,7 +5794,7 @@ }, "Game/Floors/Floor_lib/Doodad.png": { - "frame": {"x":445,"y":593,"w":72,"h":72}, + "frame": {"x":223,"y":570,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5914,7 +5802,7 @@ }, "Game/Floors/Floor_lib/Door.png": { - "frame": {"x":445,"y":667,"w":72,"h":72}, + "frame": {"x":223,"y":644,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5922,7 +5810,7 @@ }, "Game/Floors/Floor_lib/DoorOpen.png": { - "frame": {"x":445,"y":741,"w":72,"h":72}, + "frame": {"x":223,"y":718,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5930,7 +5818,7 @@ }, "Game/Floors/Floor_lib/DoorVert.png": { - "frame": {"x":445,"y":667,"w":72,"h":72}, + "frame": {"x":223,"y":644,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5938,7 +5826,7 @@ }, "Game/Floors/Floor_lib/DoorVertCont.png": { - "frame": {"x":445,"y":667,"w":72,"h":72}, + "frame": {"x":223,"y":644,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5946,7 +5834,7 @@ }, "Game/Floors/Floor_lib/DoorVertOpen.png": { - "frame": {"x":445,"y":741,"w":72,"h":72}, + "frame": {"x":223,"y":718,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5954,7 +5842,7 @@ }, "Game/Floors/Floor_lib/DoorVertOpenCont.png": { - "frame": {"x":445,"y":741,"w":72,"h":72}, + "frame": {"x":223,"y":718,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5962,7 +5850,7 @@ }, "Game/Floors/Floor_lib/Floor.png": { - "frame": {"x":445,"y":815,"w":72,"h":72}, + "frame": {"x":223,"y":792,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5970,7 +5858,7 @@ }, "Game/Floors/Floor_lib/Grate.png": { - "frame": {"x":445,"y":889,"w":72,"h":72}, + "frame": {"x":223,"y":866,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5978,7 +5866,7 @@ }, "Game/Floors/Floor_lib/GrateHoriz.png": { - "frame": {"x":445,"y":889,"w":72,"h":72}, + "frame": {"x":223,"y":866,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5986,7 +5874,7 @@ }, "Game/Floors/Floor_lib/GrateVert.png": { - "frame": {"x":445,"y":889,"w":72,"h":72}, + "frame": {"x":223,"y":866,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -5994,7 +5882,7 @@ }, "Game/Floors/Floor_lib/MimicBlock.png": { - "frame": {"x":445,"y":963,"w":72,"h":72}, + "frame": {"x":223,"y":940,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6002,7 +5890,7 @@ }, "Game/Floors/Floor_lib/OrbEmpty.png": { - "frame": {"x":445,"y":1037,"w":72,"h":72}, + "frame": {"x":223,"y":1014,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6010,7 +5898,7 @@ }, "Game/Floors/Floor_lib/RubbleLooted.png": { - "frame": {"x":445,"y":1111,"w":72,"h":72}, + "frame": {"x":223,"y":1088,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6018,7 +5906,7 @@ }, "Game/Floors/Floor_lib/Shrine.png": { - "frame": {"x":445,"y":1185,"w":72,"h":72}, + "frame": {"x":223,"y":1162,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6026,7 +5914,7 @@ }, "Game/Floors/Floor_lib/ShrineBroken.png": { - "frame": {"x":445,"y":1259,"w":72,"h":72}, + "frame": {"x":223,"y":1236,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6034,7 +5922,7 @@ }, "Game/Floors/Floor_lib/ShrineC.png": { - "frame": {"x":445,"y":1333,"w":72,"h":72}, + "frame": {"x":223,"y":1310,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6042,7 +5930,7 @@ }, "Game/Floors/Floor_lib/ShrineEmpty.png": { - "frame": {"x":445,"y":1407,"w":72,"h":72}, + "frame": {"x":223,"y":1384,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6050,7 +5938,7 @@ }, "Game/Floors/Floor_lib/StairsDown.png": { - "frame": {"x":445,"y":1481,"w":72,"h":72}, + "frame": {"x":223,"y":1458,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6058,7 +5946,7 @@ }, "Game/Floors/Floor_lib/StairsUp.png": { - "frame": {"x":445,"y":1555,"w":72,"h":72}, + "frame": {"x":223,"y":1532,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6066,7 +5954,7 @@ }, "Game/Floors/Floor_lib/Tile.png": { - "frame": {"x":445,"y":1629,"w":72,"h":72}, + "frame": {"x":223,"y":1606,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6074,7 +5962,7 @@ }, "Game/Floors/Floor_lib/Trap.png": { - "frame": {"x":445,"y":1703,"w":72,"h":72}, + "frame": {"x":223,"y":1680,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6082,7 +5970,23 @@ }, "Game/Floors/Floor_lib/Wall.png": { - "frame": {"x":445,"y":1777,"w":72,"h":72}, + "frame": {"x":223,"y":1754,"w":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":223,"y":1828,"w":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":223,"y":1902,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6090,7 +5994,7 @@ }, "Game/Floors/Floor_lib/WallVert.png": { - "frame": {"x":445,"y":1851,"w":72,"h":72}, + "frame": {"x":367,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6098,7 +6002,7 @@ }, "Game/Floors/Floor_ore/Barrel.png": { - "frame": {"x":445,"y":1925,"w":72,"h":72}, + "frame": {"x":441,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6106,7 +6010,7 @@ }, "Game/Floors/Floor_ore/Bars.png": { - "frame": {"x":519,"y":1,"w":72,"h":72}, + "frame": {"x":515,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6114,7 +6018,7 @@ }, "Game/Floors/Floor_ore/BarsOld.png": { - "frame": {"x":519,"y":75,"w":72,"h":72}, + "frame": {"x":589,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6122,7 +6026,7 @@ }, "Game/Floors/Floor_ore/BarsVert.png": { - "frame": {"x":519,"y":149,"w":72,"h":72}, + "frame": {"x":663,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6130,7 +6034,7 @@ }, "Game/Floors/Floor_ore/BarsVertCont.png": { - "frame": {"x":519,"y":223,"w":72,"h":72}, + "frame": {"x":737,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6138,7 +6042,7 @@ }, "Game/Floors/Floor_ore/Brickwork.png": { - "frame": {"x":519,"y":297,"w":72,"h":72}, + "frame": {"x":811,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6146,7 +6050,7 @@ }, "Game/Floors/Floor_ore/Doodad.png": { - "frame": {"x":519,"y":371,"w":72,"h":72}, + "frame": {"x":885,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6154,7 +6058,7 @@ }, "Game/Floors/Floor_ore/Door.png": { - "frame": {"x":519,"y":445,"w":72,"h":72}, + "frame": {"x":959,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6162,7 +6066,7 @@ }, "Game/Floors/Floor_ore/DoorOpen.png": { - "frame": {"x":519,"y":519,"w":72,"h":72}, + "frame": {"x":1033,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6170,7 +6074,7 @@ }, "Game/Floors/Floor_ore/DoorVert.png": { - "frame": {"x":519,"y":593,"w":72,"h":72}, + "frame": {"x":1107,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6178,7 +6082,7 @@ }, "Game/Floors/Floor_ore/DoorVertCont.png": { - "frame": {"x":519,"y":667,"w":72,"h":72}, + "frame": {"x":1181,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6186,7 +6090,7 @@ }, "Game/Floors/Floor_ore/DoorVertOpen.png": { - "frame": {"x":519,"y":741,"w":72,"h":72}, + "frame": {"x":1255,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6194,7 +6098,7 @@ }, "Game/Floors/Floor_ore/DoorVertOpenCont.png": { - "frame": {"x":519,"y":815,"w":72,"h":72}, + "frame": {"x":1329,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6202,7 +6106,7 @@ }, "Game/Floors/Floor_ore/Floor.png": { - "frame": {"x":519,"y":889,"w":72,"h":72}, + "frame": {"x":1403,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6210,7 +6114,7 @@ }, "Game/Floors/Floor_ore/Grate.png": { - "frame": {"x":519,"y":963,"w":72,"h":72}, + "frame": {"x":1477,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6218,7 +6122,7 @@ }, "Game/Floors/Floor_ore/GrateHoriz.png": { - "frame": {"x":519,"y":1037,"w":72,"h":72}, + "frame": {"x":1551,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6226,7 +6130,7 @@ }, "Game/Floors/Floor_ore/GrateVert.png": { - "frame": {"x":519,"y":1111,"w":72,"h":72}, + "frame": {"x":1625,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6234,7 +6138,7 @@ }, "Game/Floors/Floor_ore/MimicBlock.png": { - "frame": {"x":519,"y":1185,"w":72,"h":72}, + "frame": {"x":1699,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6242,7 +6146,7 @@ }, "Game/Floors/Floor_ore/OrbEmpty.png": { - "frame": {"x":519,"y":1259,"w":72,"h":72}, + "frame": {"x":1773,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6250,7 +6154,7 @@ }, "Game/Floors/Floor_ore/RubbleLooted.png": { - "frame": {"x":519,"y":1333,"w":72,"h":72}, + "frame": {"x":1847,"y":297,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6258,7 +6162,7 @@ }, "Game/Floors/Floor_ore/Shrine.png": { - "frame": {"x":519,"y":1407,"w":72,"h":72}, + "frame": {"x":297,"y":462,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6266,7 +6170,7 @@ }, "Game/Floors/Floor_ore/ShrineBroken.png": { - "frame": {"x":519,"y":1481,"w":72,"h":72}, + "frame": {"x":297,"y":536,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6274,7 +6178,7 @@ }, "Game/Floors/Floor_ore/ShrineC.png": { - "frame": {"x":519,"y":1555,"w":72,"h":72}, + "frame": {"x":297,"y":610,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6282,7 +6186,7 @@ }, "Game/Floors/Floor_ore/ShrineEmpty.png": { - "frame": {"x":519,"y":1629,"w":72,"h":72}, + "frame": {"x":297,"y":684,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6290,7 +6194,7 @@ }, "Game/Floors/Floor_ore/Trap.png": { - "frame": {"x":519,"y":1703,"w":72,"h":72}, + "frame": {"x":297,"y":758,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6298,7 +6202,7 @@ }, "Game/Floors/Floor_ore/Wall.png": { - "frame": {"x":519,"y":1777,"w":72,"h":72}, + "frame": {"x":297,"y":832,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6306,7 +6210,7 @@ }, "Game/Floors/Floor_ore/WallVert.png": { - "frame": {"x":519,"y":1851,"w":72,"h":72}, + "frame": {"x":297,"y":906,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6314,7 +6218,7 @@ }, "Game/Floors/Floor_shoppe/Bars.png": { - "frame": {"x":519,"y":1925,"w":72,"h":72}, + "frame": {"x":297,"y":980,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6322,7 +6226,7 @@ }, "Game/Floors/Floor_shoppe/BarsVert.png": { - "frame": {"x":593,"y":1,"w":72,"h":72}, + "frame": {"x":297,"y":1054,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6330,7 +6234,7 @@ }, "Game/Floors/Floor_shoppe/BarsVertCont.png": { - "frame": {"x":593,"y":75,"w":72,"h":72}, + "frame": {"x":297,"y":1128,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6338,7 +6242,7 @@ }, "Game/Floors/Floor_shoppe/Brickwork.png": { - "frame": {"x":445,"y":519,"w":72,"h":72}, + "frame": {"x":223,"y":496,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6346,7 +6250,7 @@ }, "Game/Floors/Floor_shoppe/Doodad.png": { - "frame": {"x":593,"y":149,"w":72,"h":72}, + "frame": {"x":297,"y":1202,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6354,7 +6258,7 @@ }, "Game/Floors/Floor_shoppe/Door.png": { - "frame": {"x":593,"y":223,"w":72,"h":72}, + "frame": {"x":297,"y":1276,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6362,7 +6266,7 @@ }, "Game/Floors/Floor_shoppe/DoorOpen.png": { - "frame": {"x":593,"y":297,"w":72,"h":72}, + "frame": {"x":297,"y":1350,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6370,7 +6274,7 @@ }, "Game/Floors/Floor_shoppe/DoorVert.png": { - "frame": {"x":593,"y":371,"w":72,"h":72}, + "frame": {"x":297,"y":1424,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6378,7 +6282,7 @@ }, "Game/Floors/Floor_shoppe/DoorVertCont.png": { - "frame": {"x":593,"y":445,"w":72,"h":72}, + "frame": {"x":297,"y":1498,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6386,7 +6290,7 @@ }, "Game/Floors/Floor_shoppe/DoorVertOpen.png": { - "frame": {"x":593,"y":519,"w":72,"h":72}, + "frame": {"x":297,"y":1572,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6394,7 +6298,7 @@ }, "Game/Floors/Floor_shoppe/DoorVertOpenCont.png": { - "frame": {"x":593,"y":593,"w":72,"h":72}, + "frame": {"x":297,"y":1646,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6402,7 +6306,7 @@ }, "Game/Floors/Floor_shoppe/Floor.png": { - "frame": {"x":445,"y":815,"w":72,"h":72}, + "frame": {"x":223,"y":792,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6410,7 +6314,7 @@ }, "Game/Floors/Floor_shoppe/Grate.png": { - "frame": {"x":593,"y":667,"w":72,"h":72}, + "frame": {"x":297,"y":1720,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6418,7 +6322,7 @@ }, "Game/Floors/Floor_shoppe/GrateHoriz.png": { - "frame": {"x":593,"y":741,"w":72,"h":72}, + "frame": {"x":297,"y":1794,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6426,7 +6330,7 @@ }, "Game/Floors/Floor_shoppe/GrateVert.png": { - "frame": {"x":593,"y":815,"w":72,"h":72}, + "frame": {"x":297,"y":1868,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6434,7 +6338,7 @@ }, "Game/Floors/Floor_shoppe/MimicBlock.png": { - "frame": {"x":445,"y":963,"w":72,"h":72}, + "frame": {"x":223,"y":940,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6442,7 +6346,7 @@ }, "Game/Floors/Floor_shoppe/OrbEmpty.png": { - "frame": {"x":445,"y":1037,"w":72,"h":72}, + "frame": {"x":223,"y":1014,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6450,7 +6354,7 @@ }, "Game/Floors/Floor_shoppe/RubbleLooted.png": { - "frame": {"x":445,"y":815,"w":72,"h":72}, + "frame": {"x":223,"y":792,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6458,7 +6362,7 @@ }, "Game/Floors/Floor_shoppe/Shrine.png": { - "frame": {"x":445,"y":1185,"w":72,"h":72}, + "frame": {"x":223,"y":1162,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6466,7 +6370,7 @@ }, "Game/Floors/Floor_shoppe/ShrineBroken.png": { - "frame": {"x":445,"y":1259,"w":72,"h":72}, + "frame": {"x":223,"y":1236,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6474,7 +6378,7 @@ }, "Game/Floors/Floor_shoppe/ShrineC.png": { - "frame": {"x":445,"y":1333,"w":72,"h":72}, + "frame": {"x":223,"y":1310,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6482,7 +6386,7 @@ }, "Game/Floors/Floor_shoppe/ShrineEmpty.png": { - "frame": {"x":445,"y":1407,"w":72,"h":72}, + "frame": {"x":223,"y":1384,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6490,7 +6394,7 @@ }, "Game/Floors/Floor_shoppe/Tile.png": { - "frame": {"x":445,"y":1629,"w":72,"h":72}, + "frame": {"x":223,"y":1606,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6498,7 +6402,7 @@ }, "Game/Floors/Floor_shoppe/Trap.png": { - "frame": {"x":445,"y":1703,"w":72,"h":72}, + "frame": {"x":223,"y":1680,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6506,15 +6410,23 @@ }, "Game/Floors/Floor_shoppe/Wall.png": { - "frame": {"x":593,"y":889,"w":72,"h":72}, + "frame": {"x":367,"y":1975,"w":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":371,"y":462,"w":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/WallOld.png": +"Game/Floors/Floor_shoppe/WallRVert.png": { - "frame": {"x":593,"y":963,"w":72,"h":72}, + "frame": {"x":574,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6522,7 +6434,7 @@ }, "Game/Floors/Floor_shoppe/WallVert.png": { - "frame": {"x":593,"y":1037,"w":72,"h":72}, + "frame": {"x":648,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6530,7 +6442,7 @@ }, "Game/Floors/Floor_shrine/Barrel.png": { - "frame": {"x":593,"y":1111,"w":72,"h":72}, + "frame": {"x":722,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6538,7 +6450,7 @@ }, "Game/Floors/Floor_shrine/Bars.png": { - "frame": {"x":593,"y":1185,"w":72,"h":72}, + "frame": {"x":796,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6546,7 +6458,7 @@ }, "Game/Floors/Floor_shrine/BarsOld.png": { - "frame": {"x":593,"y":1259,"w":72,"h":72}, + "frame": {"x":870,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6554,7 +6466,7 @@ }, "Game/Floors/Floor_shrine/BarsVert.png": { - "frame": {"x":593,"y":1333,"w":72,"h":72}, + "frame": {"x":944,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6562,7 +6474,7 @@ }, "Game/Floors/Floor_shrine/BarsVertCont.png": { - "frame": {"x":593,"y":1407,"w":72,"h":72}, + "frame": {"x":1018,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6570,7 +6482,7 @@ }, "Game/Floors/Floor_shrine/Brickwork.png": { - "frame": {"x":593,"y":1481,"w":72,"h":72}, + "frame": {"x":1092,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6578,7 +6490,7 @@ }, "Game/Floors/Floor_shrine/Doodad.png": { - "frame": {"x":593,"y":1555,"w":72,"h":72}, + "frame": {"x":1166,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6586,7 +6498,7 @@ }, "Game/Floors/Floor_shrine/Door.png": { - "frame": {"x":593,"y":1629,"w":72,"h":72}, + "frame": {"x":1240,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6594,7 +6506,7 @@ }, "Game/Floors/Floor_shrine/DoorOpen.png": { - "frame": {"x":593,"y":1703,"w":72,"h":72}, + "frame": {"x":1314,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6602,7 +6514,7 @@ }, "Game/Floors/Floor_shrine/DoorVert.png": { - "frame": {"x":593,"y":1777,"w":72,"h":72}, + "frame": {"x":1388,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6610,7 +6522,7 @@ }, "Game/Floors/Floor_shrine/DoorVertCont.png": { - "frame": {"x":593,"y":1851,"w":72,"h":72}, + "frame": {"x":1462,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6618,7 +6530,7 @@ }, "Game/Floors/Floor_shrine/DoorVertOpen.png": { - "frame": {"x":593,"y":1925,"w":72,"h":72}, + "frame": {"x":1536,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6626,7 +6538,7 @@ }, "Game/Floors/Floor_shrine/DoorVertOpenCont.png": { - "frame": {"x":667,"y":1,"w":72,"h":72}, + "frame": {"x":1610,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6634,7 +6546,7 @@ }, "Game/Floors/Floor_shrine/Floor.png": { - "frame": {"x":667,"y":75,"w":72,"h":72}, + "frame": {"x":1684,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6642,7 +6554,7 @@ }, "Game/Floors/Floor_shrine/Grate.png": { - "frame": {"x":297,"y":1925,"w":72,"h":72}, + "frame": {"x":149,"y":868,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6650,7 +6562,7 @@ }, "Game/Floors/Floor_shrine/GrateHoriz.png": { - "frame": {"x":371,"y":1,"w":72,"h":72}, + "frame": {"x":149,"y":942,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6658,7 +6570,7 @@ }, "Game/Floors/Floor_shrine/GrateVert.png": { - "frame": {"x":371,"y":75,"w":72,"h":72}, + "frame": {"x":149,"y":1016,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6666,7 +6578,7 @@ }, "Game/Floors/Floor_shrine/MimicBlock.png": { - "frame": {"x":667,"y":75,"w":72,"h":72}, + "frame": {"x":1684,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6674,7 +6586,7 @@ }, "Game/Floors/Floor_shrine/OrbEmpty.png": { - "frame": {"x":667,"y":149,"w":72,"h":72}, + "frame": {"x":1758,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6682,7 +6594,7 @@ }, "Game/Floors/Floor_shrine/RubbleLooted.png": { - "frame": {"x":667,"y":223,"w":72,"h":72}, + "frame": {"x":1832,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6690,7 +6602,7 @@ }, "Game/Floors/Floor_shrine/Shrine.png": { - "frame": {"x":667,"y":297,"w":72,"h":72}, + "frame": {"x":1906,"y":443,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6698,7 +6610,7 @@ }, "Game/Floors/Floor_shrine/ShrineBroken.png": { - "frame": {"x":667,"y":371,"w":72,"h":72}, + "frame": {"x":574,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6706,7 +6618,7 @@ }, "Game/Floors/Floor_shrine/ShrineC.png": { - "frame": {"x":667,"y":445,"w":72,"h":72}, + "frame": {"x":648,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6714,7 +6626,7 @@ }, "Game/Floors/Floor_shrine/ShrineEmpty.png": { - "frame": {"x":667,"y":519,"w":72,"h":72}, + "frame": {"x":722,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6722,7 +6634,7 @@ }, "Game/Floors/Floor_shrine/Trap.png": { - "frame": {"x":667,"y":593,"w":72,"h":72}, + "frame": {"x":796,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6730,7 +6642,23 @@ }, "Game/Floors/Floor_shrine/Wall.png": { - "frame": {"x":667,"y":667,"w":72,"h":72}, + "frame": {"x":870,"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/WallR.png": +{ + "frame": {"x":944,"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":1018,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6738,7 +6666,7 @@ }, "Game/Floors/Floor_shrine/WallVert.png": { - "frame": {"x":667,"y":741,"w":72,"h":72}, + "frame": {"x":1092,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6746,7 +6674,7 @@ }, "Game/Floors/Floor_tmb/Barrel.png": { - "frame": {"x":667,"y":815,"w":72,"h":72}, + "frame": {"x":1166,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6754,7 +6682,7 @@ }, "Game/Floors/Floor_tmb/Bars.png": { - "frame": {"x":667,"y":889,"w":72,"h":72}, + "frame": {"x":1240,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6762,7 +6690,7 @@ }, "Game/Floors/Floor_tmb/BarsOld.png": { - "frame": {"x":667,"y":963,"w":72,"h":72}, + "frame": {"x":1314,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6770,7 +6698,7 @@ }, "Game/Floors/Floor_tmb/BarsVert.png": { - "frame": {"x":667,"y":1037,"w":72,"h":72}, + "frame": {"x":1388,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6778,7 +6706,7 @@ }, "Game/Floors/Floor_tmb/BarsVertCont.png": { - "frame": {"x":667,"y":1111,"w":72,"h":72}, + "frame": {"x":1462,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6786,7 +6714,7 @@ }, "Game/Floors/Floor_tmb/Brickwork.png": { - "frame": {"x":667,"y":1185,"w":72,"h":72}, + "frame": {"x":1536,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6794,7 +6722,7 @@ }, "Game/Floors/Floor_tmb/Doodad.png": { - "frame": {"x":667,"y":1259,"w":72,"h":72}, + "frame": {"x":1610,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6802,7 +6730,7 @@ }, "Game/Floors/Floor_tmb/Door.png": { - "frame": {"x":667,"y":1333,"w":72,"h":72}, + "frame": {"x":1684,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6810,7 +6738,7 @@ }, "Game/Floors/Floor_tmb/DoorOpen.png": { - "frame": {"x":667,"y":1407,"w":72,"h":72}, + "frame": {"x":1758,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6818,7 +6746,7 @@ }, "Game/Floors/Floor_tmb/DoorVert.png": { - "frame": {"x":667,"y":1481,"w":72,"h":72}, + "frame": {"x":1832,"y":445,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6826,7 +6754,7 @@ }, "Game/Floors/Floor_tmb/DoorVertCont.png": { - "frame": {"x":667,"y":1555,"w":72,"h":72}, + "frame": {"x":1906,"y":517,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6834,7 +6762,7 @@ }, "Game/Floors/Floor_tmb/DoorVertOpen.png": { - "frame": {"x":667,"y":1629,"w":72,"h":72}, + "frame": {"x":574,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6842,7 +6770,7 @@ }, "Game/Floors/Floor_tmb/DoorVertOpenCont.png": { - "frame": {"x":667,"y":1703,"w":72,"h":72}, + "frame": {"x":648,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6850,7 +6778,7 @@ }, "Game/Floors/Floor_tmb/Empty.png": { - "frame": {"x":667,"y":1777,"w":72,"h":72}, + "frame": {"x":722,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6858,7 +6786,7 @@ }, "Game/Floors/Floor_tmb/Floor.png": { - "frame": {"x":667,"y":1851,"w":72,"h":72}, + "frame": {"x":796,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6866,7 +6794,7 @@ }, "Game/Floors/Floor_tmb/Grate.png": { - "frame": {"x":667,"y":1925,"w":72,"h":72}, + "frame": {"x":870,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6874,7 +6802,7 @@ }, "Game/Floors/Floor_tmb/GrateHoriz.png": { - "frame": {"x":741,"y":1,"w":72,"h":72}, + "frame": {"x":944,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6882,7 +6810,7 @@ }, "Game/Floors/Floor_tmb/GrateVert.png": { - "frame": {"x":741,"y":75,"w":72,"h":72}, + "frame": {"x":1018,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6890,7 +6818,7 @@ }, "Game/Floors/Floor_tmb/MimicBlock.png": { - "frame": {"x":741,"y":149,"w":72,"h":72}, + "frame": {"x":1092,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6898,7 +6826,7 @@ }, "Game/Floors/Floor_tmb/OrbEmpty.png": { - "frame": {"x":741,"y":223,"w":72,"h":72}, + "frame": {"x":1166,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6906,7 +6834,7 @@ }, "Game/Floors/Floor_tmb/RubbleLooted.png": { - "frame": {"x":741,"y":297,"w":72,"h":72}, + "frame": {"x":1240,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6914,7 +6842,7 @@ }, "Game/Floors/Floor_tmb/Shrine.png": { - "frame": {"x":741,"y":371,"w":72,"h":72}, + "frame": {"x":1314,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6922,7 +6850,7 @@ }, "Game/Floors/Floor_tmb/ShrineBroken.png": { - "frame": {"x":741,"y":445,"w":72,"h":72}, + "frame": {"x":1388,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6930,7 +6858,7 @@ }, "Game/Floors/Floor_tmb/ShrineC.png": { - "frame": {"x":741,"y":519,"w":72,"h":72}, + "frame": {"x":1462,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6938,7 +6866,7 @@ }, "Game/Floors/Floor_tmb/ShrineEmpty.png": { - "frame": {"x":667,"y":1777,"w":72,"h":72}, + "frame": {"x":722,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6946,7 +6874,7 @@ }, "Game/Floors/Floor_tmb/StairsDown.png": { - "frame": {"x":741,"y":593,"w":72,"h":72}, + "frame": {"x":1536,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6954,7 +6882,7 @@ }, "Game/Floors/Floor_tmb/StairsUp.png": { - "frame": {"x":741,"y":667,"w":72,"h":72}, + "frame": {"x":1610,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6962,7 +6890,7 @@ }, "Game/Floors/Floor_tmb/Trap.png": { - "frame": {"x":741,"y":741,"w":72,"h":72}, + "frame": {"x":1684,"y":519,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6970,7 +6898,23 @@ }, "Game/Floors/Floor_tmb/Wall.png": { - "frame": {"x":741,"y":815,"w":72,"h":72}, + "frame": {"x":1758,"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/WallR.png": +{ + "frame": {"x":1832,"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/WallRVert.png": +{ + "frame": {"x":1906,"y":591,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6978,7 +6922,7 @@ }, "Game/Floors/Floor_tmb/WallVert.png": { - "frame": {"x":741,"y":889,"w":72,"h":72}, + "frame": {"x":371,"y":680,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6986,7 +6930,7 @@ }, "Game/Floors/Floor_tmp/Barrel.png": { - "frame": {"x":741,"y":963,"w":72,"h":72}, + "frame": {"x":371,"y":754,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -6994,7 +6938,7 @@ }, "Game/Floors/Floor_tmp/Bars.png": { - "frame": {"x":593,"y":1185,"w":72,"h":72}, + "frame": {"x":796,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7002,7 +6946,7 @@ }, "Game/Floors/Floor_tmp/BarsOld.png": { - "frame": {"x":593,"y":1259,"w":72,"h":72}, + "frame": {"x":870,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7010,7 +6954,7 @@ }, "Game/Floors/Floor_tmp/BarsVert.png": { - "frame": {"x":741,"y":1037,"w":72,"h":72}, + "frame": {"x":371,"y":828,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7018,7 +6962,7 @@ }, "Game/Floors/Floor_tmp/BarsVertCont.png": { - "frame": {"x":741,"y":1111,"w":72,"h":72}, + "frame": {"x":371,"y":902,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7026,7 +6970,7 @@ }, "Game/Floors/Floor_tmp/Brickwork.png": { - "frame": {"x":741,"y":1185,"w":72,"h":72}, + "frame": {"x":371,"y":976,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7034,7 +6978,7 @@ }, "Game/Floors/Floor_tmp/Doodad.png": { - "frame": {"x":741,"y":1259,"w":72,"h":72}, + "frame": {"x":371,"y":1050,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7042,7 +6986,7 @@ }, "Game/Floors/Floor_tmp/Door.png": { - "frame": {"x":593,"y":1629,"w":72,"h":72}, + "frame": {"x":1240,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7050,7 +6994,7 @@ }, "Game/Floors/Floor_tmp/DoorOpen.png": { - "frame": {"x":593,"y":1703,"w":72,"h":72}, + "frame": {"x":1314,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7058,7 +7002,7 @@ }, "Game/Floors/Floor_tmp/DoorVert.png": { - "frame": {"x":593,"y":1777,"w":72,"h":72}, + "frame": {"x":1388,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7066,7 +7010,7 @@ }, "Game/Floors/Floor_tmp/DoorVertCont.png": { - "frame": {"x":593,"y":1851,"w":72,"h":72}, + "frame": {"x":1462,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7074,7 +7018,7 @@ }, "Game/Floors/Floor_tmp/DoorVertOpen.png": { - "frame": {"x":593,"y":1925,"w":72,"h":72}, + "frame": {"x":1536,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7082,7 +7026,7 @@ }, "Game/Floors/Floor_tmp/DoorVertOpenCont.png": { - "frame": {"x":667,"y":1,"w":72,"h":72}, + "frame": {"x":1610,"y":371,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7090,7 +7034,7 @@ }, "Game/Floors/Floor_tmp/Floor.png": { - "frame": {"x":741,"y":1333,"w":72,"h":72}, + "frame": {"x":371,"y":1124,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7098,7 +7042,7 @@ }, "Game/Floors/Floor_tmp/Grate.png": { - "frame": {"x":741,"y":1407,"w":72,"h":72}, + "frame": {"x":371,"y":1198,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7106,7 +7050,7 @@ }, "Game/Floors/Floor_tmp/GrateHoriz.png": { - "frame": {"x":741,"y":1481,"w":72,"h":72}, + "frame": {"x":371,"y":1272,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7114,7 +7058,7 @@ }, "Game/Floors/Floor_tmp/GrateVert.png": { - "frame": {"x":741,"y":1555,"w":72,"h":72}, + "frame": {"x":371,"y":1346,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7122,7 +7066,7 @@ }, "Game/Floors/Floor_tmp/MimicBlock.png": { - "frame": {"x":741,"y":1629,"w":72,"h":72}, + "frame": {"x":371,"y":1420,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7130,7 +7074,7 @@ }, "Game/Floors/Floor_tmp/OrbEmpty.png": { - "frame": {"x":741,"y":1703,"w":72,"h":72}, + "frame": {"x":371,"y":1494,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7138,7 +7082,7 @@ }, "Game/Floors/Floor_tmp/RubbleLooted.png": { - "frame": {"x":741,"y":1629,"w":72,"h":72}, + "frame": {"x":371,"y":1420,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7146,7 +7090,7 @@ }, "Game/Floors/Floor_tmp/Shrine.png": { - "frame": {"x":741,"y":1777,"w":72,"h":72}, + "frame": {"x":371,"y":1568,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7154,7 +7098,7 @@ }, "Game/Floors/Floor_tmp/ShrineBroken.png": { - "frame": {"x":741,"y":1851,"w":72,"h":72}, + "frame": {"x":371,"y":1642,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7162,7 +7106,7 @@ }, "Game/Floors/Floor_tmp/ShrineC.png": { - "frame": {"x":741,"y":1925,"w":72,"h":72}, + "frame": {"x":371,"y":1716,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7170,7 +7114,7 @@ }, "Game/Floors/Floor_tmp/ShrineEmpty.png": { - "frame": {"x":815,"y":1,"w":72,"h":72}, + "frame": {"x":371,"y":1790,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7178,7 +7122,7 @@ }, "Game/Floors/Floor_tmp/StairsDown.png": { - "frame": {"x":815,"y":75,"w":72,"h":72}, + "frame": {"x":371,"y":1864,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7186,7 +7130,7 @@ }, "Game/Floors/Floor_tmp/StairsUp.png": { - "frame": {"x":815,"y":149,"w":72,"h":72}, + "frame": {"x":441,"y":1975,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7194,7 +7138,7 @@ }, "Game/Floors/Floor_tmp/Trap.png": { - "frame": {"x":815,"y":223,"w":72,"h":72}, + "frame": {"x":445,"y":677,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7202,7 +7146,23 @@ }, "Game/Floors/Floor_tmp/Wall.png": { - "frame": {"x":815,"y":297,"w":72,"h":72}, + "frame": {"x":445,"y":751,"w":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":445,"y":825,"w":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":445,"y":899,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7210,7 +7170,7 @@ }, "Game/Floors/Floor_tmp/WallVert.png": { - "frame": {"x":815,"y":371,"w":72,"h":72}, + "frame": {"x":445,"y":973,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7218,7 +7178,7 @@ }, "Game/Floors/Floor_vault/Barrel.png": { - "frame": {"x":815,"y":445,"w":72,"h":72}, + "frame": {"x":445,"y":1047,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7226,7 +7186,7 @@ }, "Game/Floors/Floor_vault/Bars.png": { - "frame": {"x":815,"y":519,"w":72,"h":72}, + "frame": {"x":445,"y":1121,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7234,7 +7194,7 @@ }, "Game/Floors/Floor_vault/BarsVert.png": { - "frame": {"x":815,"y":593,"w":72,"h":72}, + "frame": {"x":445,"y":1195,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7242,7 +7202,7 @@ }, "Game/Floors/Floor_vault/BarsVertCont.png": { - "frame": {"x":815,"y":667,"w":72,"h":72}, + "frame": {"x":445,"y":1269,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7250,7 +7210,7 @@ }, "Game/Floors/Floor_vault/Brickwork.png": { - "frame": {"x":815,"y":741,"w":72,"h":72}, + "frame": {"x":445,"y":1343,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7258,7 +7218,7 @@ }, "Game/Floors/Floor_vault/DollDropoff.png": { - "frame": {"x":815,"y":815,"w":72,"h":72}, + "frame": {"x":445,"y":1417,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7266,7 +7226,7 @@ }, "Game/Floors/Floor_vault/Doodad.png": { - "frame": {"x":815,"y":889,"w":72,"h":72}, + "frame": {"x":445,"y":1491,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7274,7 +7234,7 @@ }, "Game/Floors/Floor_vault/Door.png": { - "frame": {"x":815,"y":963,"w":72,"h":72}, + "frame": {"x":445,"y":1565,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7282,7 +7242,7 @@ }, "Game/Floors/Floor_vault/DoorOpen.png": { - "frame": {"x":815,"y":1037,"w":72,"h":72}, + "frame": {"x":445,"y":1639,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7290,7 +7250,7 @@ }, "Game/Floors/Floor_vault/DoorVert.png": { - "frame": {"x":815,"y":1111,"w":72,"h":72}, + "frame": {"x":445,"y":1713,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7298,7 +7258,7 @@ }, "Game/Floors/Floor_vault/DoorVertCont.png": { - "frame": {"x":815,"y":1185,"w":72,"h":72}, + "frame": {"x":445,"y":1787,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7306,7 +7266,7 @@ }, "Game/Floors/Floor_vault/DoorVertOpen.png": { - "frame": {"x":815,"y":1259,"w":72,"h":72}, + "frame": {"x":445,"y":1861,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7314,7 +7274,7 @@ }, "Game/Floors/Floor_vault/DoorVertOpenCont.png": { - "frame": {"x":815,"y":1333,"w":72,"h":72}, + "frame": {"x":515,"y":1935,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7322,7 +7282,7 @@ }, "Game/Floors/Floor_vault/Floor.png": { - "frame": {"x":815,"y":815,"w":72,"h":72}, + "frame": {"x":445,"y":1417,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7330,7 +7290,7 @@ }, "Game/Floors/Floor_vault/Grate.png": { - "frame": {"x":815,"y":1407,"w":72,"h":72}, + "frame": {"x":649,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7338,7 +7298,7 @@ }, "Game/Floors/Floor_vault/GrateHoriz.png": { - "frame": {"x":815,"y":1481,"w":72,"h":72}, + "frame": {"x":723,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7346,7 +7306,7 @@ }, "Game/Floors/Floor_vault/GrateVert.png": { - "frame": {"x":815,"y":1555,"w":72,"h":72}, + "frame": {"x":797,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7354,7 +7314,7 @@ }, "Game/Floors/Floor_vault/MimicBlock.png": { - "frame": {"x":815,"y":1629,"w":72,"h":72}, + "frame": {"x":871,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7362,7 +7322,7 @@ }, "Game/Floors/Floor_vault/OrbEmpty.png": { - "frame": {"x":815,"y":1703,"w":72,"h":72}, + "frame": {"x":945,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7370,7 +7330,7 @@ }, "Game/Floors/Floor_vault/RubbleLooted.png": { - "frame": {"x":815,"y":1777,"w":72,"h":72}, + "frame": {"x":1019,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7378,7 +7338,7 @@ }, "Game/Floors/Floor_vault/Shrine.png": { - "frame": {"x":815,"y":1851,"w":72,"h":72}, + "frame": {"x":1093,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7386,7 +7346,7 @@ }, "Game/Floors/Floor_vault/ShrineBroken.png": { - "frame": {"x":815,"y":1925,"w":72,"h":72}, + "frame": {"x":1167,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7394,7 +7354,7 @@ }, "Game/Floors/Floor_vault/ShrineC.png": { - "frame": {"x":889,"y":1,"w":72,"h":72}, + "frame": {"x":1241,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7402,7 +7362,7 @@ }, "Game/Floors/Floor_vault/ShrineEmpty.png": { - "frame": {"x":889,"y":75,"w":72,"h":72}, + "frame": {"x":1315,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7410,7 +7370,7 @@ }, "Game/Floors/Floor_vault/Trap.png": { - "frame": {"x":889,"y":149,"w":72,"h":72}, + "frame": {"x":1389,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7418,7 +7378,23 @@ }, "Game/Floors/Floor_vault/Wall.png": { - "frame": {"x":889,"y":223,"w":72,"h":72}, + "frame": {"x":1463,"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/WallR.png": +{ + "frame": {"x":1537,"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/WallRVert.png": +{ + "frame": {"x":1611,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7426,7 +7402,7 @@ }, "Game/Floors/Floor_vault/WallVert.png": { - "frame": {"x":889,"y":297,"w":72,"h":72}, + "frame": {"x":1685,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7434,7 +7410,7 @@ }, "Game/HideMost.png": { - "frame": {"x":1814,"y":1132,"w":36,"h":30}, + "frame": {"x":1405,"y":1221,"w":36,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":8,"w":36,"h":30}, @@ -7442,23 +7418,15 @@ }, "Game/InventoryAction/Attach.png": { - "frame": {"x":1345,"y":1743,"w":62,"h":65}, + "frame": {"x":1342,"y":813,"w":62,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":3,"w":62,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/InventoryAction/Cut.png": -{ - "frame": {"x":1777,"y":2021,"w":26,"h":26}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":23,"y":23,"w":26,"h":26}, - "sourceSize": {"w":72,"h":72} -}, "Game/InventoryAction/Disassemble.png": { - "frame": {"x":1393,"y":705,"w":68,"h":69}, + "frame": {"x":519,"y":677,"w":68,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":68,"h":69}, @@ -7466,7 +7434,7 @@ }, "Game/InventoryAction/Drop.png": { - "frame": {"x":1817,"y":1741,"w":36,"h":29}, + "frame": {"x":1574,"y":1327,"w":36,"h":29}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":21,"w":36,"h":29}, @@ -7474,7 +7442,7 @@ }, "Game/InventoryAction/Hotbar.png": { - "frame": {"x":1753,"y":54,"w":68,"h":51}, + "frame": {"x":1972,"y":1164,"w":68,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":15,"w":68,"h":51}, @@ -7482,7 +7450,7 @@ }, "Game/InventoryAction/Lock.png": { - "frame": {"x":1948,"y":1051,"w":62,"h":56}, + "frame": {"x":1312,"y":1924,"w":62,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":8,"w":62,"h":56}, @@ -7490,7 +7458,7 @@ }, "Game/InventoryAction/Recycle.png": { - "frame": {"x":1793,"y":314,"w":66,"h":66}, + "frame": {"x":1220,"y":1438,"w":66,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":66,"h":66}, @@ -7498,7 +7466,7 @@ }, "Game/InventoryAction/RecycleBulk.png": { - "frame": {"x":1393,"y":705,"w":68,"h":69}, + "frame": {"x":519,"y":677,"w":68,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":68,"h":69}, @@ -7506,7 +7474,7 @@ }, "Game/InventoryAction/RecycleExcess.png": { - "frame": {"x":1391,"y":776,"w":68,"h":69}, + "frame": {"x":735,"y":1905,"w":68,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":68,"h":69}, @@ -7514,7 +7482,7 @@ }, "Game/InventoryAction/SellBulk.png": { - "frame": {"x":1862,"y":206,"w":64,"h":37}, + "frame": {"x":1333,"y":1823,"w":64,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":21,"w":64,"h":37}, @@ -7522,7 +7490,7 @@ }, "Game/InventoryAction/SellExcess.png": { - "frame": {"x":1526,"y":518,"w":64,"h":43}, + "frame": {"x":1515,"y":1708,"w":64,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":15,"w":64,"h":43}, @@ -7530,7 +7498,7 @@ }, "Game/InvItemDrop.png": { - "frame": {"x":1817,"y":1741,"w":36,"h":29}, + "frame": {"x":1574,"y":1327,"w":36,"h":29}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":40,"y":0,"w":36,"h":29}, @@ -7538,7 +7506,7 @@ }, "Game/Items/ArcaneCrystal.png": { - "frame": {"x":1740,"y":695,"w":66,"h":58}, + "frame": {"x":1524,"y":1419,"w":66,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":6,"w":66,"h":58}, @@ -7546,7 +7514,7 @@ }, "Game/Items/BlueKey.png": { - "frame": {"x":889,"y":371,"w":72,"h":72}, + "frame": {"x":1759,"y":593,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7554,15 +7522,23 @@ }, "Game/Items/BowRecurve.png": { - "frame": {"x":1997,"y":1239,"w":49,"h":53}, + "frame": {"x":1525,"y":1084,"w":49,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":9,"w":49,"h":53}, "sourceSize": {"w":72,"h":72} }, +"Game/Items/Crossbow.png": +{ + "frame": {"x":1856,"y":1911,"w":61,"h":41}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":15,"w":61,"h":41}, + "sourceSize": {"w":72,"h":72} +}, "Game/Items/CrossbowHeavy.png": { - "frame": {"x":143,"y":1999,"w":69,"h":41}, + "frame": {"x":1758,"y":1126,"w":69,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":15,"w":69,"h":41}, @@ -7570,7 +7546,7 @@ }, "Game/Items/DarkKatana.png": { - "frame": {"x":355,"y":1999,"w":68,"h":39}, + "frame": {"x":1899,"y":1168,"w":68,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":6,"w":68,"h":39}, @@ -7578,7 +7554,7 @@ }, "Game/Items/DollID.png": { - "frame": {"x":1759,"y":1655,"w":62,"h":50}, + "frame": {"x":1758,"y":1911,"w":62,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":13,"w":62,"h":50}, @@ -7586,7 +7562,7 @@ }, "Game/Items/Ectoplasm.png": { - "frame": {"x":889,"y":445,"w":72,"h":72}, + "frame": {"x":1833,"y":665,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7594,31 +7570,23 @@ }, "Game/Items/EnchKnife.png": { - "frame": {"x":889,"y":519,"w":72,"h":72}, + "frame": {"x":519,"y":817,"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":1855,"y":1741,"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/ItemDevices.png": +"Game/Items/Group/ItemBoots.png": { - "frame": {"x":1874,"y":783,"w":24,"h":26}, + "frame": {"x":1846,"y":1831,"w":32,"h":25}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":42,"y":41,"w":24,"h":26}, + "spriteSourceSize": {"x":38,"y":43,"w":32,"h":25}, "sourceSize": {"w":72,"h":72} }, "Game/Items/IceBreaker.png": { - "frame": {"x":1907,"y":1525,"w":60,"h":38}, + "frame": {"x":1889,"y":1954,"w":60,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":11,"w":60,"h":38}, @@ -7626,7 +7594,7 @@ }, "Game/Items/KeyCard.png": { - "frame": {"x":1824,"y":1583,"w":62,"h":50}, + "frame": {"x":1793,"y":1859,"w":62,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":13,"w":62,"h":50}, @@ -7634,7 +7602,7 @@ }, "Game/Items/Keyring.png": { - "frame": {"x":889,"y":593,"w":72,"h":72}, + "frame": {"x":592,"y":739,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7642,7 +7610,7 @@ }, "Game/Items/Longbow.png": { - "frame": {"x":1635,"y":1792,"w":49,"h":64}, + "frame": {"x":1525,"y":1018,"w":49,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":4,"w":49,"h":64}, @@ -7650,23 +7618,15 @@ }, "Game/Items/MagicAxe.png": { - "frame": {"x":493,"y":1999,"w":66,"h":47}, + "frame": {"x":439,"y":371,"w":66,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":7,"w":66,"h":47}, "sourceSize": {"w":72,"h":72} }, -"Game/Items/MagicRope.png": -{ - "frame": {"x":2012,"y":1050,"w":35,"h":57}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":19,"y":7,"w":35,"h":57}, - "sourceSize": {"w":72,"h":72} -}, "Game/Items/MessengerOfLove.png": { - "frame": {"x":1777,"y":1164,"w":63,"h":64}, + "frame": {"x":1339,"y":1718,"w":63,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":3,"w":63,"h":64}, @@ -7674,7 +7634,7 @@ }, "Game/Items/PotionFrigid.png": { - "frame": {"x":1095,"y":1745,"w":54,"h":66}, + "frame": {"x":1214,"y":1159,"w":54,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":4,"w":54,"h":66}, @@ -7682,7 +7642,7 @@ }, "Game/Items/PotionInvisibility.png": { - "frame": {"x":1995,"y":271,"w":52,"h":65}, + "frame": {"x":1994,"y":395,"w":52,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":4,"w":52,"h":65}, @@ -7690,23 +7650,23 @@ }, "Game/Items/PotionMana.png": { - "frame": {"x":1948,"y":984,"w":52,"h":65}, + "frame": {"x":1399,"y":886,"w":52,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":4,"w":52,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/Items/PotionStamina.png": +"Game/Items/Restraint.png": { - "frame": {"x":1394,"y":1086,"w":40,"h":65}, + "frame": {"x":1553,"y":1884,"w":27,"h":34}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":16,"y":4,"w":40,"h":65}, + "spriteSourceSize": {"x":23,"y":36,"w":27,"h":34}, "sourceSize": {"w":72,"h":72} }, "Game/Items/Restraint/Ancient.png": { - "frame": {"x":2012,"y":1627,"w":33,"h":38}, + "frame": {"x":1142,"y":1959,"w":33,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":17,"w":33,"h":38}, @@ -7714,7 +7674,7 @@ }, "Game/Items/Restraint/Cuffs.png": { - "frame": {"x":1326,"y":337,"w":70,"h":63}, + "frame": {"x":1692,"y":891,"w":70,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":5,"w":70,"h":63}, @@ -7722,7 +7682,7 @@ }, "Game/Items/Restraint/Cyber.png": { - "frame": {"x":1807,"y":878,"w":64,"h":56}, + "frame": {"x":1720,"y":1647,"w":64,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":18,"w":64,"h":56}, @@ -7730,7 +7690,7 @@ }, "Game/Items/Restraint/LeatherCuffs.png": { - "frame": {"x":1575,"y":1106,"w":66,"h":64}, + "frame": {"x":1612,"y":1356,"w":66,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":66,"h":64}, @@ -7738,7 +7698,7 @@ }, "Game/Items/Restraint/Legbinders.png": { - "frame": {"x":1543,"y":185,"w":69,"h":56}, + "frame": {"x":1687,"y":1076,"w":69,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":9,"w":69,"h":56}, @@ -7746,7 +7706,7 @@ }, "Game/Items/Restraint/liquidMetal.png": { - "frame": {"x":1753,"y":107,"w":40,"h":31}, + "frame": {"x":340,"y":1942,"w":40,"h":31}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":20,"w":40,"h":31}, @@ -7754,15 +7714,31 @@ }, "Game/Items/Restraint/Metal.png": { - "frame": {"x":1844,"y":1464,"w":61,"h":58}, + "frame": {"x":1225,"y":1566,"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/MysticDuctTape.png": +{ + "frame": {"x":1910,"y":1831,"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/NippleClamps2.png": +{ + "frame": {"x":1664,"y":1912,"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/ShadowLatex.png": { - "frame": {"x":1659,"y":477,"w":40,"h":31}, + "frame": {"x":1576,"y":945,"w":40,"h":31}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":20,"w":40,"h":31}, @@ -7770,7 +7746,7 @@ }, "Game/Items/Restraint/Slime.png": { - "frame": {"x":1701,"y":477,"w":40,"h":31}, + "frame": {"x":1576,"y":978,"w":40,"h":31}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":20,"w":40,"h":31}, @@ -7778,31 +7754,31 @@ }, "Game/Items/Restraint/Straitjackets.png": { - "frame": {"x":1543,"y":125,"w":69,"h":58}, + "frame": {"x":1760,"y":1066,"w":69,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":10,"w":69,"h":58}, "sourceSize": {"w":72,"h":72} }, -"Game/Items/Restraint/StrongMagicRopes.png": +"Game/Items/Restraint/Tape.png": { - "frame": {"x":2012,"y":1050,"w":35,"h":57}, + "frame": {"x":1967,"y":1815,"w":41,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":19,"y":7,"w":35,"h":57}, + "spriteSourceSize": {"x":18,"y":24,"w":41,"h":24}, "sourceSize": {"w":72,"h":72} }, -"Game/Items/Restraint/Tape.png": +"Game/Items/Restraint/Vibes.png": { - "frame": {"x":1441,"y":495,"w":41,"h":24}, + "frame": {"x":1574,"y":1302,"w":37,"h":23}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":18,"y":24,"w":41,"h":24}, + "spriteSourceSize": {"x":23,"y":23,"w":37,"h":23}, "sourceSize": {"w":72,"h":72} }, "Game/Items/Restraint/VinylTape.png": { - "frame": {"x":1251,"y":1217,"w":41,"h":24}, + "frame": {"x":1967,"y":1841,"w":41,"h":24}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":24,"w":41,"h":24}, @@ -7810,7 +7786,7 @@ }, "Game/Items/Scrolls.png": { - "frame": {"x":1928,"y":596,"w":59,"h":65}, + "frame": {"x":1344,"y":1221,"w":59,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":59,"h":65}, @@ -7818,7 +7794,7 @@ }, "Game/Items/SmokeBomb.png": { - "frame": {"x":963,"y":1257,"w":72,"h":71}, + "frame": {"x":593,"y":1256,"w":72,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":71}, @@ -7826,39 +7802,63 @@ }, "Game/Items/Snuffer.png": { - "frame": {"x":1842,"y":1257,"w":45,"h":36}, + "frame": {"x":1467,"y":1816,"w":45,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":23,"w":45,"h":36}, "sourceSize": {"w":72,"h":72} }, -"Game/Items/StaffElectric.png": +"Game/Items/Torch.png": { - "frame": {"x":1353,"y":1876,"w":31,"h":61}, + "frame": {"x":1731,"y":1966,"w":28,"h":51}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":21,"y":2,"w":31,"h":61}, + "spriteSourceSize": {"x":23,"y":8,"w":28,"h":51}, "sourceSize": {"w":72,"h":72} }, -"Game/LockJam.png": +"Game/Locks/Divine.png": { - "frame": {"x":1386,"y":1933,"w":59,"h":58}, + "frame": {"x":1671,"y":1971,"w":28,"h":53}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":1,"w":59,"h":58}, - "sourceSize": {"w":60,"h":60} + "spriteSourceSize": {"x":14,"y":1,"w":28,"h":53}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Locks/Divine2.png": +{ + "frame": {"x":1671,"y":1971,"w":28,"h":53}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":14,"y":1,"w":28,"h":53}, + "sourceSize": {"w":56,"h":56} +}, +"Game/Particles/HeartPink.png": +{ + "frame": {"x":1991,"y":1631,"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":1991,"y":1653,"w":20,"h":20}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":20,"h":20}, + "sourceSize": {"w":20,"h":20} }, -"Game/Ranged.png": +"Game/Poses/KneelClosed.png": { - "frame": {"x":1396,"y":884,"w":43,"h":65}, + "frame": {"x":2024,"y":1392,"w":21,"h":21}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":11,"w":43,"h":65}, - "sourceSize": {"w":50,"h":86} + "spriteSourceSize": {"x":15,"y":10,"w":21,"h":21}, + "sourceSize": {"w":46,"h":45} }, "Game/ShopBasic/3Bola.png": { - "frame": {"x":1322,"y":647,"w":70,"h":54}, + "frame": {"x":1690,"y":956,"w":70,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":9,"w":70,"h":54}, @@ -7866,7 +7866,7 @@ }, "Game/ShopBasic/3Bomb.png": { - "frame": {"x":1916,"y":1127,"w":61,"h":62}, + "frame": {"x":1404,"y":1319,"w":61,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":7,"w":61,"h":62}, @@ -7874,7 +7874,7 @@ }, "Game/ShopBasic/3Flash.png": { - "frame": {"x":1604,"y":633,"w":66,"h":66}, + "frame": {"x":1278,"y":1370,"w":66,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":4,"w":66,"h":66}, @@ -7882,7 +7882,7 @@ }, "Game/ShopBasic/3Smoke.png": { - "frame": {"x":1684,"y":333,"w":67,"h":67}, + "frame": {"x":1084,"y":1663,"w":67,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":67,"h":67}, @@ -7890,7 +7890,7 @@ }, "Game/ShopBasic/BlueKey.png": { - "frame": {"x":889,"y":667,"w":72,"h":72}, + "frame": {"x":519,"y":891,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7898,7 +7898,7 @@ }, "Game/SpellRange.png": { - "frame": {"x":889,"y":741,"w":72,"h":72}, + "frame": {"x":519,"y":965,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -7906,7 +7906,7 @@ }, "Game/SpellReady.png": { - "frame": {"x":1181,"y":1102,"w":70,"h":70}, + "frame": {"x":739,"y":1397,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -7914,7 +7914,7 @@ }, "Game/Spells/AirMote.png": { - "frame": {"x":1176,"y":672,"w":70,"h":71}, + "frame": {"x":593,"y":1329,"w":70,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":70,"h":71}, @@ -7922,7 +7922,7 @@ }, "Game/Spells/AkashicConflux.png": { - "frame": {"x":1310,"y":1387,"w":68,"h":61}, + "frame": {"x":1687,"y":1134,"w":68,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":68,"h":61}, @@ -7930,7 +7930,7 @@ }, "Game/Spells/Ally.png": { - "frame": {"x":1414,"y":1665,"w":60,"h":66}, + "frame": {"x":1224,"y":741,"w":60,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":4,"w":60,"h":66}, @@ -7938,7 +7938,7 @@ }, "Game/Spells/AllyAttention.png": { - "frame": {"x":1474,"y":1733,"w":62,"h":65}, + "frame": {"x":1350,"y":741,"w":62,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":7,"w":62,"h":65}, @@ -7946,7 +7946,7 @@ }, "Game/Spells/AllyCancelHold.png": { - "frame": {"x":1392,"y":526,"w":65,"h":42}, + "frame": {"x":1653,"y":1622,"w":65,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":15,"w":65,"h":42}, @@ -7954,7 +7954,7 @@ }, "Game/Spells/AllyDeselect.png": { - "frame": {"x":1840,"y":1295,"w":62,"h":62}, + "frame": {"x":1579,"y":1820,"w":62,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":7,"w":62,"h":62}, @@ -7962,7 +7962,7 @@ }, "Game/Spells/AllyDeselectAll.png": { - "frame": {"x":1182,"y":1247,"w":70,"h":70}, + "frame": {"x":809,"y":1102,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -7970,7 +7970,7 @@ }, "Game/Spells/AllyDisperse.png": { - "frame": {"x":1703,"y":1300,"w":64,"h":64}, + "frame": {"x":1201,"y":1741,"w":64,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":4,"w":64,"h":64}, @@ -7978,7 +7978,7 @@ }, "Game/Spells/AllyHold.png": { - "frame": {"x":1320,"y":841,"w":65,"h":42}, + "frame": {"x":1586,"y":1662,"w":65,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":15,"w":65,"h":42}, @@ -7986,47 +7986,23 @@ }, "Game/Spells/AllyOnMe.png": { - "frame": {"x":1904,"y":1294,"w":61,"h":61}, + "frame": {"x":1404,"y":1446,"w":61,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":5,"w":61,"h":61}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/AnimateLarge.png": -{ - "frame": {"x":1574,"y":1923,"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":1728,"y":1901,"w":37,"h":63}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, - "sourceSize": {"w":72,"h":72} -}, "Game/Spells/ArcaneBarrier.png": { - "frame": {"x":889,"y":815,"w":72,"h":72}, + "frame": {"x":519,"y":1039,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/ArcaneBlast.png": -{ - "frame": {"x":1967,"y":1359,"w":60,"h":56}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":2,"y":9,"w":60,"h":56}, - "sourceSize": {"w":72,"h":72} -}, "Game/Spells/BanishPortal.png": { - "frame": {"x":1325,"y":526,"w":65,"h":49}, + "frame": {"x":293,"y":297,"w":65,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":65,"h":49}, @@ -8034,31 +8010,15 @@ }, "Game/Spells/BattleTrance.png": { - "frame": {"x":1822,"y":936,"w":63,"h":64}, + "frame": {"x":1514,"y":1753,"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":1980,"y":1175,"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":1908,"y":1417,"w":60,"h":43}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":6,"y":15,"w":60,"h":43}, - "sourceSize": {"w":72,"h":72} -}, "Game/Spells/Bomb.png": { - "frame": {"x":1387,"y":1867,"w":46,"h":64}, + "frame": {"x":1467,"y":1685,"w":46,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":2,"w":46,"h":64}, @@ -8066,7 +8026,7 @@ }, "Game/Spells/BreakFree.png": { - "frame": {"x":1864,"y":447,"w":65,"h":60}, + "frame": {"x":1519,"y":1603,"w":65,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":4,"w":65,"h":60}, @@ -8074,7 +8034,7 @@ }, "Game/Spells/Coalesce.png": { - "frame": {"x":963,"y":1111,"w":72,"h":71}, + "frame": {"x":293,"y":1976,"w":72,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":71}, @@ -8082,7 +8042,7 @@ }, "Game/Spells/CommandBind.png": { - "frame": {"x":1037,"y":1746,"w":56,"h":66}, + "frame": {"x":1213,"y":1022,"w":56,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":2,"w":56,"h":66}, @@ -8090,7 +8050,7 @@ }, "Game/Spells/CommandDisenchant.png": { - "frame": {"x":1614,"y":72,"w":68,"h":68}, + "frame": {"x":949,"y":1749,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":68,"h":68}, @@ -8098,23 +8058,15 @@ }, "Game/Spells/CommandOrgasm.png": { - "frame": {"x":889,"y":889,"w":72,"h":72}, + "frame": {"x":519,"y":1113,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/CommandVibrate.png": -{ - "frame": {"x":1353,"y":1999,"w":30,"h":48}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":21,"y":12,"w":30,"h":48}, - "sourceSize": {"w":72,"h":72} -}, "Game/Spells/Crackle.png": { - "frame": {"x":963,"y":1475,"w":72,"h":70}, + "frame": {"x":723,"y":741,"w":72,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":70}, @@ -8122,7 +8074,7 @@ }, "Game/Spells/Decoy.png": { - "frame": {"x":1352,"y":1675,"w":60,"h":66}, + "frame": {"x":1216,"y":813,"w":60,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":4,"w":60,"h":66}, @@ -8130,15 +8082,23 @@ }, "Game/Spells/DesperateStruggle.png": { - "frame": {"x":1714,"y":1432,"w":64,"h":58}, + "frame": {"x":1787,"y":1611,"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":1467,"y":1349,"w":56,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":56,"h":56}, + "sourceSize": {"w":72,"h":72} +}, "Game/Spells/DistractionShield.png": { - "frame": {"x":889,"y":963,"w":72,"h":72}, + "frame": {"x":519,"y":1187,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8146,7 +8106,7 @@ }, "Game/Spells/Earthform.png": { - "frame": {"x":889,"y":1037,"w":72,"h":72}, + "frame": {"x":519,"y":1261,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8154,7 +8114,7 @@ }, "Game/Spells/EarthformLine.png": { - "frame": {"x":889,"y":1111,"w":72,"h":72}, + "frame": {"x":519,"y":1335,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8162,7 +8122,7 @@ }, "Game/Spells/EarthformMound.png": { - "frame": {"x":889,"y":1037,"w":72,"h":72}, + "frame": {"x":519,"y":1261,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8170,23 +8130,15 @@ }, "Game/Spells/EarthformRing.png": { - "frame": {"x":889,"y":1185,"w":72,"h":72}, + "frame": {"x":519,"y":1409,"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":1950,"y":1629,"w":60,"h":37}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":8,"y":20,"w":60,"h":37}, - "sourceSize": {"w":72,"h":72} -}, "Game/Spells/Earthquake.png": { - "frame": {"x":1614,"y":1,"w":67,"h":69}, + "frame": {"x":1980,"y":746,"w":67,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":67,"h":69}, @@ -8194,7 +8146,7 @@ }, "Game/Spells/ElasticGrip.png": { - "frame": {"x":1873,"y":878,"w":64,"h":55}, + "frame": {"x":1190,"y":1807,"w":64,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":13,"w":64,"h":55}, @@ -8202,39 +8154,23 @@ }, "Game/Spells/Electrify.png": { - "frame": {"x":1394,"y":570,"w":69,"h":61}, + "frame": {"x":1616,"y":1067,"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":1928,"y":338,"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":1713,"y":1547,"w":63,"h":40}, + "frame": {"x":1717,"y":1770,"w":63,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":17,"w":63,"h":40}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/EnchantRope.png": -{ - "frame": {"x":1085,"y":1945,"w":59,"h":62}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":7,"y":5,"w":59,"h":62}, - "sourceSize": {"w":72,"h":72} -}, "Game/Spells/Engulf.png": { - "frame": {"x":1931,"y":447,"w":63,"h":60}, + "frame": {"x":1851,"y":1714,"w":63,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":1,"w":63,"h":60}, @@ -8242,7 +8178,7 @@ }, "Game/Spells/Enrage.png": { - "frame": {"x":1227,"y":1675,"w":61,"h":66}, + "frame": {"x":1200,"y":954,"w":61,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":1,"w":61,"h":66}, @@ -8250,23 +8186,15 @@ }, "Game/Spells/Evasion.png": { - "frame": {"x":1636,"y":1593,"w":56,"h":67}, + "frame": {"x":1019,"y":886,"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":1037,"y":223,"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":889,"y":1259,"w":72,"h":72}, + "frame": {"x":519,"y":1483,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8274,39 +8202,31 @@ }, "Game/Spells/Fireblast.png": { - "frame": {"x":1777,"y":1230,"w":63,"h":63}, + "frame": {"x":1514,"y":1819,"w":63,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":63,"h":63}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/FireElemental.png": -{ - "frame": {"x":1614,"y":1987,"w":59,"h":57}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":6,"y":5,"w":59,"h":57}, - "sourceSize": {"w":72,"h":72} -}, "Game/Spells/FlameBlade.png": { - "frame": {"x":889,"y":1333,"w":72,"h":72}, + "frame": {"x":519,"y":1557,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/FlameRune.png": +"Game/Spells/FlashFreeze.png": { - "frame": {"x":1180,"y":419,"w":71,"h":61}, + "frame": {"x":1921,"y":297,"w":71,"h":71}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":0,"w":71,"h":61}, + "spriteSourceSize": {"x":1,"y":1,"w":71,"h":71}, "sourceSize": {"w":72,"h":72} }, "Game/Spells/FocusedFlash.png": { - "frame": {"x":889,"y":1407,"w":72,"h":72}, + "frame": {"x":519,"y":1631,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8314,23 +8234,15 @@ }, "Game/Spells/Freeze.png": { - "frame": {"x":1106,"y":1323,"w":67,"h":70}, + "frame": {"x":149,"y":204,"w":67,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":67,"h":70}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/FreezeRune.png": -{ - "frame": {"x":1394,"y":633,"w":68,"h":70}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":2,"y":2,"w":68,"h":70}, - "sourceSize": {"w":72,"h":72} -}, "Game/Spells/Golem.png": { - "frame": {"x":1683,"y":1,"w":68,"h":68}, + "frame": {"x":948,"y":1895,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":68,"h":68}, @@ -8338,7 +8250,7 @@ }, "Game/Spells/GreaterFlash.png": { - "frame": {"x":963,"y":1763,"w":72,"h":70}, + "frame": {"x":665,"y":1401,"w":72,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":70}, @@ -8346,47 +8258,39 @@ }, "Game/Spells/GreaterInvisibility.png": { - "frame": {"x":889,"y":1481,"w":72,"h":72}, + "frame": {"x":519,"y":1705,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/Hailstorm.png": +"Game/Spells/GreaterShield.png": { - "frame": {"x":1900,"y":790,"w":63,"h":63}, + "frame": {"x":666,"y":739,"w":55,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":1,"w":63,"h":63}, + "spriteSourceSize": {"x":8,"y":3,"w":55,"h":68}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/Heal.png": +"Game/Spells/Hailstorm.png": { - "frame": {"x":1950,"y":1565,"w":59,"h":62}, + "frame": {"x":1853,"y":1649,"w":63,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":8,"y":5,"w":59,"h":62}, + "spriteSourceSize": {"x":2,"y":1,"w":63,"h":63}, "sourceSize": {"w":72,"h":72} }, "Game/Spells/IceLance.png": { - "frame": {"x":1169,"y":1466,"w":66,"h":68}, + "frame": {"x":880,"y":1174,"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":1524,"y":1456,"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":1037,"y":1106,"w":71,"h":70}, + "frame": {"x":1907,"y":665,"w":71,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":71,"h":70}, @@ -8394,7 +8298,7 @@ }, "Game/Spells/Incinerate.png": { - "frame": {"x":1109,"y":886,"w":70,"h":71}, + "frame": {"x":593,"y":1402,"w":70,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":70,"h":71}, @@ -8402,7 +8306,7 @@ }, "Game/Spells/Invisibility.png": { - "frame": {"x":889,"y":1555,"w":72,"h":72}, + "frame": {"x":519,"y":1779,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8410,15 +8314,31 @@ }, "Game/Spells/KineticLance.png": { - "frame": {"x":425,"y":1999,"w":66,"h":48}, + "frame": {"x":1204,"y":1626,"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":1618,"y":891,"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":1618,"y":891,"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":889,"y":1629,"w":72,"h":72}, + "frame": {"x":519,"y":1853,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8426,7 +8346,7 @@ }, "Game/Spells/Leap3.png": { - "frame": {"x":889,"y":1703,"w":72,"h":72}, + "frame": {"x":589,"y":1927,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8434,55 +8354,31 @@ }, "Game/Spells/LeatherBurst.png": { - "frame": {"x":1441,"y":917,"w":68,"h":67}, + "frame": {"x":1014,"y":1664,"w":68,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":4,"w":68,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/LeatherWhip.png": -{ - "frame": {"x":1806,"y":1961,"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":1162,"y":1675,"w":63,"h":66}, + "frame": {"x":1147,"y":1092,"w":63,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":63,"h":66}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/LightningBolt.png": -{ - "frame": {"x":1037,"y":1946,"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":1671,"y":827,"w":64,"h":47}, + "frame": {"x":1586,"y":1706,"w":64,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":13,"w":64,"h":47}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/LimitSurge.png": -{ - "frame": {"x":1945,"y":1772,"w":60,"h":56}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":6,"y":5,"w":60,"h":56}, - "sourceSize": {"w":72,"h":72} -}, "Game/Spells/LiquidMetalBurst.png": { - "frame": {"x":963,"y":1835,"w":72,"h":70}, + "frame": {"x":667,"y":1253,"w":72,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":70}, @@ -8490,7 +8386,7 @@ }, "Game/Spells/Lockdown.png": { - "frame": {"x":1241,"y":1456,"w":66,"h":69}, + "frame": {"x":736,"y":1692,"w":66,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":1,"w":66,"h":69}, @@ -8498,15 +8394,23 @@ }, "Game/Spells/ManaRecharge.png": { - "frame": {"x":1891,"y":1,"w":66,"h":57}, + "frame": {"x":1523,"y":1479,"w":66,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":4,"w":66,"h":57}, "sourceSize": {"w":72,"h":72} }, +"Game/Spells/Quickness.png": +{ + "frame": {"x":1576,"y":1011,"w":39,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":18,"y":24,"w":39,"h":23}, + "sourceSize": {"w":72,"h":72} +}, "Game/Spells/Rainstorm.png": { - "frame": {"x":889,"y":1777,"w":72,"h":72}, + "frame": {"x":723,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8514,7 +8418,7 @@ }, "Game/Spells/RaiseDefenses.png": { - "frame": {"x":1605,"y":563,"w":66,"h":68}, + "frame": {"x":951,"y":813,"w":66,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":4,"w":66,"h":68}, @@ -8522,7 +8426,7 @@ }, "Game/Spells/RecoverObject2.png": { - "frame": {"x":1169,"y":1606,"w":62,"h":67}, + "frame": {"x":1028,"y":1517,"w":62,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":4,"w":62,"h":67}, @@ -8530,7 +8434,7 @@ }, "Game/Spells/Ring.png": { - "frame": {"x":889,"y":1851,"w":72,"h":72}, + "frame": {"x":797,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8538,7 +8442,7 @@ }, "Game/Spells/RingOfSlime.png": { - "frame": {"x":889,"y":1925,"w":72,"h":72}, + "frame": {"x":871,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8546,7 +8450,7 @@ }, "Game/Spells/RopeBoltLaunchMany.png": { - "frame": {"x":285,"y":1999,"w":68,"h":46}, + "frame": {"x":649,"y":2001,"w":68,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":13,"w":68,"h":46}, @@ -8554,7 +8458,7 @@ }, "Game/Spells/Ropework.png": { - "frame": {"x":1844,"y":1524,"w":61,"h":54}, + "frame": {"x":1404,"y":1631,"w":61,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":13,"w":61,"h":54}, @@ -8562,15 +8466,23 @@ }, "Game/Spells/Sagitta.png": { - "frame": {"x":1780,"y":1484,"w":62,"h":52}, + "frame": {"x":1694,"y":1912,"w":62,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":10,"w":62,"h":52}, "sourceSize": {"w":72,"h":72} }, +"Game/Spells/ShadowBlade.png": +{ + "frame": {"x":447,"y":1935,"w":66,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":13,"w":66,"h":38}, + "sourceSize": {"w":72,"h":72} +}, "Game/Spells/ShadowWarrior.png": { - "frame": {"x":1861,"y":246,"w":65,"h":67}, + "frame": {"x":1006,"y":1240,"w":65,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":4,"w":65,"h":67}, @@ -8578,7 +8490,7 @@ }, "Game/Spells/Shatter.png": { - "frame": {"x":963,"y":1907,"w":72,"h":69}, + "frame": {"x":219,"y":1978,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":69}, @@ -8586,7 +8498,7 @@ }, "Game/Spells/Shield.png": { - "frame": {"x":1574,"y":1172,"w":66,"h":62}, + "frame": {"x":1964,"y":1217,"w":66,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":7,"w":66,"h":62}, @@ -8594,7 +8506,7 @@ }, "Game/Spells/Shock.png": { - "frame": {"x":1106,"y":496,"w":72,"h":66}, + "frame": {"x":1151,"y":1510,"w":72,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":72,"h":66}, @@ -8602,7 +8514,7 @@ }, "Game/Spells/Shroud.png": { - "frame": {"x":963,"y":1330,"w":72,"h":71}, + "frame": {"x":665,"y":1034,"w":72,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":71}, @@ -8610,7 +8522,7 @@ }, "Game/Spells/Sleet.png": { - "frame": {"x":1928,"y":206,"w":64,"h":67}, + "frame": {"x":1015,"y":1097,"w":64,"h":67}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":3,"w":64,"h":67}, @@ -8618,7 +8530,7 @@ }, "Game/Spells/Slime.png": { - "frame": {"x":1864,"y":382,"w":65,"h":63}, + "frame": {"x":1949,"y":1499,"w":65,"h":63}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":65,"h":63}, @@ -8626,7 +8538,7 @@ }, "Game/Spells/SlimeEruption.png": { - "frame": {"x":1037,"y":75,"w":71,"h":72}, + "frame": {"x":1921,"y":223,"w":71,"h":72}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":71,"h":72}, @@ -8634,7 +8546,7 @@ }, "Game/Spells/SlimeSplash.png": { - "frame": {"x":1329,"y":138,"w":70,"h":65}, + "frame": {"x":1272,"y":1227,"w":70,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":5,"w":70,"h":65}, @@ -8642,7 +8554,7 @@ }, "Game/Spells/Snowball.png": { - "frame": {"x":1107,"y":290,"w":72,"h":68}, + "frame": {"x":803,"y":1615,"w":72,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":72,"h":68}, @@ -8650,7 +8562,7 @@ }, "Game/Spells/Sonar.png": { - "frame": {"x":1852,"y":1132,"w":62,"h":62}, + "frame": {"x":1708,"y":1812,"w":62,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":5,"w":62,"h":62}, @@ -8658,7 +8570,7 @@ }, "Game/Spells/SpellChoiceUp3.png": { - "frame": {"x":1884,"y":1002,"w":62,"h":61}, + "frame": {"x":1643,"y":1849,"w":62,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":4,"w":62,"h":61}, @@ -8666,7 +8578,7 @@ }, "Game/Spells/SpellFail.png": { - "frame": {"x":1603,"y":701,"w":66,"h":66}, + "frame": {"x":1081,"y":1024,"w":66,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":66,"h":66}, @@ -8674,7 +8586,7 @@ }, "Game/Spells/SpellFailPartial.png": { - "frame": {"x":1603,"y":769,"w":66,"h":66}, + "frame": {"x":1132,"y":955,"w":66,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":66,"h":66}, @@ -8682,7 +8594,7 @@ }, "Game/Spells/Spread.png": { - "frame": {"x":1807,"y":820,"w":65,"h":56}, + "frame": {"x":1653,"y":1564,"w":65,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":10,"w":65,"h":56}, @@ -8690,23 +8602,15 @@ }, "Game/Spells/StaticSphere.png": { - "frame": {"x":1684,"y":140,"w":68,"h":53}, + "frame": {"x":1757,"y":1169,"w":68,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":10,"w":68,"h":53}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/SteelRainBurst.png": -{ - "frame": {"x":1037,"y":519,"w":65,"h":72}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":1,"y":0,"w":65,"h":72}, - "sourceSize": {"w":72,"h":72} -}, "Game/Spells/StoneSkin.png": { - "frame": {"x":1157,"y":1743,"w":58,"h":66}, + "frame": {"x":1212,"y":1091,"w":58,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":4,"w":58,"h":66}, @@ -8714,7 +8618,7 @@ }, "Game/Spells/StormCrystal.png": { - "frame": {"x":1401,"y":143,"w":69,"h":69}, + "frame": {"x":665,"y":1763,"w":69,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":2,"w":69,"h":69}, @@ -8722,7 +8626,7 @@ }, "Game/Spells/SummonLatexArmbinder.png": { - "frame": {"x":1110,"y":1176,"w":70,"h":70}, + "frame": {"x":739,"y":886,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -8730,7 +8634,7 @@ }, "Game/Spells/SummonLatexGag.png": { - "frame": {"x":1181,"y":886,"w":70,"h":70}, + "frame": {"x":739,"y":813,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -8738,7 +8642,7 @@ }, "Game/Spells/SummonLatexLegbinder.png": { - "frame": {"x":1250,"y":599,"w":70,"h":70}, + "frame": {"x":797,"y":741,"w":70,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":70,"h":70}, @@ -8746,7 +8650,7 @@ }, "Game/Spells/SummonLeatherCuffs.png": { - "frame": {"x":1575,"y":1106,"w":66,"h":64}, + "frame": {"x":1612,"y":1356,"w":66,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":66,"h":64}, @@ -8754,7 +8658,7 @@ }, "Game/Spells/SummonLegbinder.png": { - "frame": {"x":1543,"y":185,"w":69,"h":56}, + "frame": {"x":1687,"y":1076,"w":69,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":9,"w":69,"h":56}, @@ -8762,39 +8666,15 @@ }, "Game/Spells/SummonStraitjacket.png": { - "frame": {"x":1543,"y":125,"w":69,"h":58}, + "frame": {"x":1760,"y":1066,"w":69,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":10,"w":69,"h":58}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/SummonUp2.png": -{ - "frame": {"x":1589,"y":1456,"w":57,"h":68}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":8,"y":3,"w":57,"h":68}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Spells/Swap.png": -{ - "frame": {"x":1888,"y":1580,"w":60,"h":44}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":6,"y":14,"w":60,"h":44}, - "sourceSize": {"w":72,"h":72} -}, -"Game/Spells/Thunderstorm.png": -{ - "frame": {"x":1476,"y":1665,"w":48,"h":66}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":10,"y":4,"w":48,"h":66}, - "sourceSize": {"w":72,"h":72} -}, "Game/Spells/TickleCloud.png": { - "frame": {"x":1796,"y":531,"w":65,"h":64}, + "frame": {"x":1766,"y":873,"w":65,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":65,"h":64}, @@ -8802,7 +8682,7 @@ }, "Game/Spells/TidalBall.png": { - "frame": {"x":1508,"y":1039,"w":67,"h":58}, + "frame": {"x":1756,"y":1224,"w":67,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":8,"w":67,"h":58}, @@ -8810,7 +8690,7 @@ }, "Game/Spells/ToolsOfTheTrade.png": { - "frame": {"x":1862,"y":138,"w":65,"h":66}, + "frame": {"x":1157,"y":741,"w":65,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":4,"w":65,"h":66}, @@ -8818,7 +8698,7 @@ }, "Game/Spells/TransportationPortal.png": { - "frame": {"x":1729,"y":510,"w":65,"h":50}, + "frame": {"x":1861,"y":1533,"w":65,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":1,"w":65,"h":50}, @@ -8826,7 +8706,7 @@ }, "Game/Spells/Tremor.png": { - "frame": {"x":1694,"y":1593,"w":64,"h":60}, + "frame": {"x":1925,"y":1628,"w":64,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":64,"h":60}, @@ -8834,7 +8714,7 @@ }, "Game/Spells/TrueSight.png": { - "frame": {"x":1387,"y":847,"w":56,"h":35}, + "frame": {"x":1346,"y":1426,"w":56,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":17,"w":56,"h":35}, @@ -8842,7 +8722,7 @@ }, "Game/Spells/UnconventionalWarfare.png": { - "frame": {"x":1345,"y":1743,"w":62,"h":65}, + "frame": {"x":1342,"y":813,"w":62,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":3,"w":62,"h":65}, @@ -8850,7 +8730,7 @@ }, "Game/Spells/Volcanism.png": { - "frame": {"x":1861,"y":662,"w":65,"h":59}, + "frame": {"x":1794,"y":1504,"w":65,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":8,"w":65,"h":59}, @@ -8858,31 +8738,31 @@ }, "Game/Spells/Wall.png": { - "frame": {"x":1110,"y":1,"w":72,"h":69}, + "frame": {"x":877,"y":886,"w":72,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":2,"w":72,"h":69}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/WindBlast.png": +"Game/Spells/ZoneOfExcitement.png": { - "frame": {"x":1037,"y":371,"w":67,"h":72}, + "frame": {"x":1019,"y":813,"w":54,"h":67}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":0,"w":67,"h":72}, + "spriteSourceSize": {"x":9,"y":5,"w":54,"h":67}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/ZoneOfExcitement.png": +"Game/Spells/ZoneOfPurity.png": { - "frame": {"x":1037,"y":1677,"w":54,"h":67}, + "frame": {"x":884,"y":1456,"w":62,"h":68}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":9,"y":5,"w":54,"h":67}, + "spriteSourceSize": {"x":6,"y":2,"w":62,"h":68}, "sourceSize": {"w":72,"h":72} }, "Game/Target.png": { - "frame": {"x":1930,"y":509,"w":63,"h":64}, + "frame": {"x":1399,"y":1824,"w":63,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":4,"w":63,"h":64}, @@ -8890,7 +8770,7 @@ }, "Game/TargetAction.png": { - "frame": {"x":963,"y":1,"w":72,"h":72}, + "frame": {"x":945,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8898,7 +8778,7 @@ }, "Game/TargetAttack.png": { - "frame": {"x":963,"y":75,"w":72,"h":72}, + "frame": {"x":1019,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8906,7 +8786,7 @@ }, "Game/TargetMove.png": { - "frame": {"x":963,"y":149,"w":72,"h":72}, + "frame": {"x":1093,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8914,7 +8794,7 @@ }, "Game/TargetPass.png": { - "frame": {"x":963,"y":223,"w":72,"h":72}, + "frame": {"x":1167,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8922,7 +8802,7 @@ }, "Game/TargetSpell.png": { - "frame": {"x":963,"y":297,"w":72,"h":72}, + "frame": {"x":1241,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8930,7 +8810,7 @@ }, "Game/TargetSub.png": { - "frame": {"x":963,"y":371,"w":72,"h":72}, + "frame": {"x":1315,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -8938,15 +8818,23 @@ }, "Game/TargetTalk.png": { - "frame": {"x":963,"y":445,"w":72,"h":72}, + "frame": {"x":1389,"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/UI/accuracy.png": +{ + "frame": {"x":2010,"y":1815,"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":1614,"y":142,"w":68,"h":68}, + "frame": {"x":950,"y":1819,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, @@ -8954,7 +8842,7 @@ }, "Game/UI/AutoBindPaste.png": { - "frame": {"x":1614,"y":212,"w":68,"h":68}, + "frame": {"x":1002,"y":1965,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, @@ -8962,7 +8850,7 @@ }, "Game/UI/AutoBindPasteAll.png": { - "frame": {"x":1614,"y":282,"w":68,"h":68}, + "frame": {"x":1018,"y":1889,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, @@ -8970,7 +8858,7 @@ }, "Game/UI/AutoBindPasteAllOver.png": { - "frame": {"x":1109,"y":814,"w":71,"h":70}, + "frame": {"x":1907,"y":737,"w":71,"h":70}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":71,"h":70}, @@ -8978,15 +8866,23 @@ }, "Game/UI/BoxSmall.png": { - "frame": {"x":1805,"y":2025,"w":22,"h":22}, + "frame": {"x":1443,"y":1229,"w":22,"h":22}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":22,"h":22}, "sourceSize": {"w":24,"h":24} }, +"Game/UI/button_game.png": +{ + "frame": {"x":1448,"y":1920,"w":28,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":10,"y":14,"w":28,"h":27}, + "sourceSize": {"w":42,"h":56} +}, "Game/UI/Buttons/MarkAll.png": { - "frame": {"x":1253,"y":956,"w":69,"h":64}, + "frame": {"x":1477,"y":813,"w":69,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":8,"w":69,"h":64}, @@ -8994,7 +8890,7 @@ }, "Game/UI/Buttons/UnmarkAll.png": { - "frame": {"x":1253,"y":1022,"w":69,"h":64}, + "frame": {"x":1485,"y":741,"w":69,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":8,"w":69,"h":64}, @@ -9002,7 +8898,7 @@ }, "Game/UI/CollectionFilter/Bound.png": { - "frame": {"x":1824,"y":1635,"w":61,"h":58}, + "frame": {"x":1404,"y":1571,"w":61,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":8,"w":61,"h":58}, @@ -9010,7 +8906,7 @@ }, "Game/UI/CollectionFilter/Escaped.png": { - "frame": {"x":1037,"y":1880,"w":46,"h":64}, + "frame": {"x":1088,"y":1862,"w":46,"h":64}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":5,"w":46,"h":64}, @@ -9018,55 +8914,23 @@ }, "Game/UI/CollectionFilter/Free.png": { - "frame": {"x":1965,"y":785,"w":62,"h":61}, + "frame": {"x":1256,"y":1835,"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/Rank0.png": -{ - "frame": {"x":1572,"y":880,"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/Rank5.png": { - "frame": {"x":1834,"y":1359,"w":62,"h":59}, + "frame": {"x":1384,"y":1890,"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/Unavailable.png": -{ - "frame": {"x":1553,"y":1983,"w":59,"h":58}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":6,"y":6,"w":59,"h":58}, - "sourceSize": {"w":72,"h":72} -}, -"Game/UI/CrouchOn.png": -{ - "frame": {"x":1446,"y":1997,"w":41,"h":48}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":12,"y":12,"w":41,"h":48}, - "sourceSize": {"w":60,"h":60} -}, -"Game/UI/Demote.png": -{ - "frame": {"x":1823,"y":70,"w":46,"h":32}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":15,"y":24,"w":46,"h":32}, - "sourceSize": {"w":76,"h":76} -}, "Game/UI/Dress.png": { - "frame": {"x":1398,"y":214,"w":69,"h":69}, + "frame": {"x":665,"y":1834,"w":69,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":69,"h":69}, @@ -9074,7 +8938,7 @@ }, "Game/UI/Edged.png": { - "frame": {"x":1887,"y":1676,"w":60,"h":59}, + "frame": {"x":1602,"y":1919,"w":60,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":60,"h":59}, @@ -9082,7 +8946,7 @@ }, "Game/UI/Facility/AlchemyLab.png": { - "frame": {"x":1175,"y":1391,"w":64,"h":69}, + "frame": {"x":737,"y":1619,"w":64,"h":69}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":64,"h":69}, @@ -9090,7 +8954,7 @@ }, "Game/UI/Facility/CuddleLounge.png": { - "frame": {"x":1436,"y":1121,"w":68,"h":65}, + "frame": {"x":1263,"y":886,"w":68,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":4,"w":68,"h":65}, @@ -9098,7 +8962,7 @@ }, "Game/UI/Facility/Gear.png": { - "frame": {"x":1793,"y":314,"w":66,"h":66}, + "frame": {"x":1220,"y":1438,"w":66,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":66,"h":66}, @@ -9106,47 +8970,23 @@ }, "Game/UI/Facility/RescueTeam.png": { - "frame": {"x":1900,"y":723,"w":61,"h":65}, + "frame": {"x":1322,"y":1154,"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/TrainingDojo.png": -{ - "frame": {"x":1037,"y":445,"w":67,"h":72}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":3,"y":0,"w":67,"h":72}, - "sourceSize": {"w":72,"h":72} -}, -"Game/UI/Facility_Servants.png": -{ - "frame": {"x":1874,"y":754,"w":24,"h":27}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":47,"y":4,"w":24,"h":27}, - "sourceSize": {"w":76,"h":76} -}, "Game/UI/greyColor.png": { - "frame": {"x":1703,"y":1366,"w":64,"h":64}, + "frame": {"x":1267,"y":1769,"w":64,"h":64}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64}, "sourceSize": {"w":64,"h":64} }, -"Game/UI/Inspect.png": -{ - "frame": {"x":1553,"y":1983,"w":59,"h":58}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":0,"y":1,"w":59,"h":58}, - "sourceSize": {"w":60,"h":60} -}, "Game/UI/ItemAura.png": { - "frame": {"x":963,"y":519,"w":72,"h":72}, + "frame": {"x":1463,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -9154,15 +8994,23 @@ }, "Game/UI/ItemAuraBG.png": { - "frame": {"x":1037,"y":741,"w":71,"h":71}, + "frame": {"x":1921,"y":370,"w":71,"h":71}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":71,"h":71}, "sourceSize": {"w":72,"h":72} }, +"Game/UI/jail.png": +{ + "frame": {"x":1448,"y":1920,"w":28,"h":27}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":5,"y":4,"w":28,"h":27}, + "sourceSize": {"w":36,"h":36} +}, "Game/UI/LetGo.png": { - "frame": {"x":1210,"y":1876,"w":60,"h":60}, + "frame": {"x":1342,"y":1529,"w":60,"h":60}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":60,"h":60}, @@ -9170,7 +9018,7 @@ }, "Game/UI/MiniMap/Bars.png": { - "frame": {"x":1874,"y":837,"w":24,"h":24}, + "frame": {"x":1286,"y":1986,"w":24,"h":24}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, @@ -9178,55 +9026,47 @@ }, "Game/UI/MiniMap/Bed.png": { - "frame": {"x":2022,"y":1732,"w":24,"h":24}, + "frame": {"x":1286,"y":2012,"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/Chest.png": -{ - "frame": {"x":1500,"y":1363,"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/DoorClosed.png": { - "frame": {"x":1961,"y":2022,"w":24,"h":24}, + "frame": {"x":1919,"y":1857,"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": +"Game/UI/MiniMap/Orb.png": { - "frame": {"x":1243,"y":2004,"w":24,"h":24}, + "frame": {"x":1443,"y":1153,"w":23,"h":23}, "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":1,"w":23,"h":23}, "sourceSize": {"w":24,"h":24} }, "Game/UI/MiniMap/Stairs.png": { - "frame": {"x":1369,"y":1216,"w":23,"h":23}, + "frame": {"x":1443,"y":1178,"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": +"Game/UI/MiniMap/Tablet.png": { - "frame": {"x":1611,"y":1422,"w":23,"h":23}, + "frame": {"x":1443,"y":1203,"w":22,"h":24}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":1,"y":0,"w":23,"h":23}, + "spriteSourceSize": {"x":1,"y":0,"w":22,"h":24}, "sourceSize": {"w":24,"h":24} }, "Game/UI/NavMap/basic.png": { - "frame": {"x":1610,"y":352,"w":68,"h":68}, + "frame": {"x":1072,"y":1959,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, @@ -9234,7 +9074,7 @@ }, "Game/UI/NavMap/boss.png": { - "frame": {"x":1464,"y":634,"w":68,"h":68}, + "frame": {"x":811,"y":1323,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, @@ -9242,39 +9082,31 @@ }, "Game/UI/NavMap/shop.png": { - "frame": {"x":1464,"y":704,"w":68,"h":68}, + "frame": {"x":811,"y":1393,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":68,"h":68}, "sourceSize": {"w":72,"h":72} }, -"Game/UI/Rank/Rank0.png": +"Game/UI/PlayerFacing.png": { - "frame": {"x":1572,"y":880,"w":46,"h":32}, + "frame": {"x":1467,"y":1642,"w":50,"h":41}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":14,"y":20,"w":46,"h":32}, + "spriteSourceSize": {"x":14,"y":15,"w":50,"h":41}, "sourceSize": {"w":72,"h":72} }, "Game/UI/Rank/Rank4.png": { - "frame": {"x":1709,"y":1233,"w":64,"h":65}, + "frame": {"x":1272,"y":1087,"w":64,"h":65}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":1,"w":64,"h":65}, "sourceSize": {"w":72,"h":72} }, -"Game/UI/Rank/Rank5.png": -{ - "frame": {"x":1037,"y":667,"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/Cyber.png": { - "frame": {"x":1807,"y":878,"w":64,"h":56}, + "frame": {"x":1720,"y":1647,"w":64,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":18,"w":64,"h":56}, @@ -9282,7 +9114,7 @@ }, "Game/UI/Recycler/Metal.png": { - "frame": {"x":1844,"y":1464,"w":61,"h":58}, + "frame": {"x":1225,"y":1566,"w":61,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":5,"w":61,"h":58}, @@ -9290,7 +9122,7 @@ }, "Game/UI/Recycler/Metal2.png": { - "frame": {"x":1844,"y":1464,"w":61,"h":58}, + "frame": {"x":1225,"y":1566,"w":61,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":5,"w":61,"h":58}, @@ -9298,7 +9130,7 @@ }, "Game/UI/Recycler/Tape.png": { - "frame": {"x":1441,"y":495,"w":41,"h":24}, + "frame": {"x":1967,"y":1815,"w":41,"h":24}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":24,"w":41,"h":24}, @@ -9306,7 +9138,7 @@ }, "Game/UI/Resource/Leather.png": { - "frame": {"x":1928,"y":663,"w":63,"h":55}, + "frame": {"x":1784,"y":1736,"w":63,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":63,"h":55}, @@ -9314,7 +9146,7 @@ }, "Game/UI/Restrain.png": { - "frame": {"x":1844,"y":1464,"w":61,"h":58}, + "frame": {"x":1225,"y":1566,"w":61,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":10,"w":61,"h":58}, @@ -9322,7 +9154,7 @@ }, "Game/UI/RestrainBack.png": { - "frame": {"x":1824,"y":1635,"w":61,"h":58}, + "frame": {"x":1404,"y":1571,"w":61,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":10,"w":61,"h":58}, @@ -9330,55 +9162,39 @@ }, "Game/UI/RestrainFree.png": { - "frame": {"x":1965,"y":785,"w":62,"h":61}, + "frame": {"x":1256,"y":1835,"w":62,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":10,"w":62,"h":61}, "sourceSize": {"w":76,"h":76} }, -"Game/UI/Sleep.png": +"Game/UI/restraint_nokey.png": { - "frame": {"x":1970,"y":1417,"w":59,"h":42}, + "frame": {"x":1880,"y":1831,"w":28,"h":25}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":7,"y":7,"w":59,"h":42}, - "sourceSize": {"w":71,"h":60} + "spriteSourceSize": {"x":4,"y":5,"w":28,"h":25}, + "sourceSize": {"w":36,"h":36} }, "Game/UI/SleepVibe.png": { - "frame": {"x":1739,"y":821,"w":64,"h":52}, + "frame": {"x":1653,"y":1666,"w":64,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":6,"w":64,"h":52}, "sourceSize": {"w":71,"h":60} }, -"Game/UI/Tighten.png": -{ - "frame": {"x":1182,"y":1174,"w":67,"h":71}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":6,"y":2,"w":67,"h":71}, - "sourceSize": {"w":76,"h":76} -}, -"Game/UI/WaitJail.png": +"Game/UI/UsePotionUnavailable.png": { - "frame": {"x":1182,"y":2004,"w":59,"h":40}, + "frame": {"x":1991,"y":1675,"w":20,"h":20}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":0,"y":10,"w":59,"h":40}, - "sourceSize": {"w":60,"h":60} -}, -"Game/UI/ZoomIn.png": -{ - "frame": {"x":1143,"y":2011,"w":37,"h":36}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":37,"h":36}, - "sourceSize": {"w":37,"h":36} + "spriteSourceSize": {"x":3,"y":4,"w":20,"h":20}, + "sourceSize": {"w":44,"h":26} }, "Game/WarningAlly.png": { - "frame": {"x":1500,"y":1295,"w":66,"h":66}, + "frame": {"x":1133,"y":886,"w":66,"h":66}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":66,"h":66}, @@ -9386,7 +9202,7 @@ }, "Game/WarningBacking.png": { - "frame": {"x":963,"y":593,"w":72,"h":72}, + "frame": {"x":1537,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -9394,7 +9210,7 @@ }, "Game/WarningBackingHighlight.png": { - "frame": {"x":963,"y":667,"w":72,"h":72}, + "frame": {"x":1611,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -9402,7 +9218,7 @@ }, "Game/WarningColor.png": { - "frame": {"x":963,"y":741,"w":72,"h":72}, + "frame": {"x":1685,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -9410,7 +9226,7 @@ }, "Game/WarningColorBasic.png": { - "frame": {"x":963,"y":815,"w":72,"h":72}, + "frame": {"x":1759,"y":667,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -9418,7 +9234,7 @@ }, "Game/WarningColorSpecial.png": { - "frame": {"x":963,"y":889,"w":72,"h":72}, + "frame": {"x":1833,"y":739,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -9426,7 +9242,7 @@ }, "Game/WarningColorSpecialBasic.png": { - "frame": {"x":963,"y":963,"w":72,"h":72}, + "frame": {"x":593,"y":886,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -9434,7 +9250,7 @@ }, "Game/WarningColorSpell.png": { - "frame": {"x":963,"y":1037,"w":72,"h":72}, + "frame": {"x":593,"y":960,"w":72,"h":72}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":72,"h":72}, @@ -9442,7 +9258,7 @@ }, "Game/WarningHighlightAlly.png": { - "frame": {"x":1463,"y":774,"w":68,"h":68}, + "frame": {"x":813,"y":1246,"w":68,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":1,"w":68,"h":68}, @@ -9450,7 +9266,7 @@ }, "Game/WeakBinding.png": { - "frame": {"x":1729,"y":402,"w":66,"h":68}, + "frame": {"x":1015,"y":741,"w":66,"h":68}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":1,"w":66,"h":68}, @@ -9464,6 +9280,6 @@ "size": {"w":2048,"h":2048}, "scale": "1", "related_multi_packs": [ "game0.json", "game1.json", "game2.json", "game3.json", "game5.json" ], - "smartupdate": "$TexturePacker:SmartUpdate:76d784dd5df773dd2e2ebbec4425c54f:c9bd94d932662e62f0f3a8268b0ee477:54a7432a0665349a58c0c74f51e75c65$" + "smartupdate": "$TexturePacker:SmartUpdate:cd45dd3b98fe2739696c2386a6ef9b3c:9b1095aa07d6e300e2f0b7c24c8c3454:54a7432a0665349a58c0c74f51e75c65$" } } diff --git a/TextureAtlas/game4.png b/TextureAtlas/game4.png index 65e0d793a..7e36db277 100644 Binary files a/TextureAtlas/game4.png and b/TextureAtlas/game4.png differ diff --git a/TextureAtlas/game5.json b/TextureAtlas/game5.json index cb3732a51..275cf85cd 100644 --- a/TextureAtlas/game5.json +++ b/TextureAtlas/game5.json @@ -1,16 +1,8 @@ {"frames": { -"Game/Backpack.png": -{ - "frame": {"x":187,"y":1019,"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":385,"y":492,"w":45,"h":46}, + "frame": {"x":289,"y":923,"w":45,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":5,"w":45,"h":46}, @@ -18,7 +10,7 @@ }, "Game/Buffs/armor.png": { - "frame": {"x":750,"y":354,"w":46,"h":46}, + "frame": {"x":1,"y":386,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -26,7 +18,7 @@ }, "Game/Buffs/BlankBuff.png": { - "frame": {"x":798,"y":355,"w":46,"h":46}, + "frame": {"x":49,"y":386,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -34,7 +26,7 @@ }, "Game/Buffs/boost.png": { - "frame": {"x":846,"y":355,"w":46,"h":46}, + "frame": {"x":139,"y":390,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -42,7 +34,7 @@ }, "Game/Buffs/boostmixed.png": { - "frame": {"x":970,"y":363,"w":46,"h":46}, + "frame": {"x":187,"y":391,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -50,7 +42,7 @@ }, "Game/Buffs/boundArms.png": { - "frame": {"x":1,"y":387,"w":46,"h":46}, + "frame": {"x":235,"y":391,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -58,7 +50,7 @@ }, "Game/Buffs/boundBlind.png": { - "frame": {"x":49,"y":388,"w":46,"h":46}, + "frame": {"x":283,"y":392,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -66,7 +58,7 @@ }, "Game/Buffs/boundGag.png": { - "frame": {"x":97,"y":389,"w":46,"h":46}, + "frame": {"x":366,"y":395,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -74,7 +66,7 @@ }, "Game/Buffs/boundGagFull.png": { - "frame": {"x":145,"y":390,"w":46,"h":46}, + "frame": {"x":452,"y":397,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -82,7 +74,7 @@ }, "Game/Buffs/boundHands.png": { - "frame": {"x":193,"y":391,"w":46,"h":46}, + "frame": {"x":500,"y":398,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -90,7 +82,7 @@ }, "Game/Buffs/boundHandsPartial.png": { - "frame": {"x":241,"y":394,"w":46,"h":46}, + "frame": {"x":548,"y":400,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -98,7 +90,7 @@ }, "Game/Buffs/boundImmobile.png": { - "frame": {"x":289,"y":395,"w":46,"h":46}, + "frame": {"x":596,"y":400,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -106,7 +98,7 @@ }, "Game/Buffs/boundSlow1.png": { - "frame": {"x":337,"y":395,"w":46,"h":46}, + "frame": {"x":644,"y":401,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -114,7 +106,7 @@ }, "Game/Buffs/boundSlow2.png": { - "frame": {"x":427,"y":396,"w":46,"h":46}, + "frame": {"x":692,"y":402,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -122,7 +114,7 @@ }, "Game/Buffs/boundSlow3.png": { - "frame": {"x":475,"y":397,"w":46,"h":46}, + "frame": {"x":740,"y":402,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -130,7 +122,7 @@ }, "Game/Buffs/boundSlow4.png": { - "frame": {"x":523,"y":398,"w":46,"h":46}, + "frame": {"x":788,"y":403,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -138,7 +130,7 @@ }, "Game/Buffs/boundStun.png": { - "frame": {"x":571,"y":400,"w":46,"h":46}, + "frame": {"x":836,"y":404,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -146,7 +138,7 @@ }, "Game/Buffs/buff/buff.png": { - "frame": {"x":619,"y":401,"w":46,"h":46}, + "frame": {"x":884,"y":405,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -154,7 +146,7 @@ }, "Game/Buffs/buff/buffAkashicConflux.png": { - "frame": {"x":667,"y":402,"w":46,"h":46}, + "frame": {"x":932,"y":405,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -162,7 +154,7 @@ }, "Game/Buffs/buff/buffAnalyze.png": { - "frame": {"x":715,"y":402,"w":46,"h":46}, + "frame": {"x":1,"y":434,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -170,7 +162,7 @@ }, "Game/Buffs/buff/buffArcaneEnergy.png": { - "frame": {"x":763,"y":403,"w":46,"h":46}, + "frame": {"x":49,"y":434,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -178,7 +170,7 @@ }, "Game/Buffs/buff/buffAvatarAir.png": { - "frame": {"x":811,"y":403,"w":46,"h":46}, + "frame": {"x":135,"y":438,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -186,7 +178,7 @@ }, "Game/Buffs/buff/buffAvatarEarth.png": { - "frame": {"x":859,"y":404,"w":46,"h":46}, + "frame": {"x":183,"y":439,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -194,7 +186,7 @@ }, "Game/Buffs/buff/buffAvatarFire.png": { - "frame": {"x":907,"y":407,"w":46,"h":46}, + "frame": {"x":231,"y":439,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -202,7 +194,7 @@ }, "Game/Buffs/buff/buffAvatarWater.png": { - "frame": {"x":955,"y":411,"w":46,"h":46}, + "frame": {"x":279,"y":440,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -210,7 +202,7 @@ }, "Game/Buffs/buff/buffBattleRhythm.png": { - "frame": {"x":1,"y":435,"w":46,"h":46}, + "frame": {"x":327,"y":443,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -218,7 +210,7 @@ }, "Game/Buffs/buff/buffBattleTrance.png": { - "frame": {"x":49,"y":436,"w":46,"h":46}, + "frame": {"x":375,"y":444,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -226,7 +218,7 @@ }, "Game/Buffs/buff/buffBoundByFate.png": { - "frame": {"x":97,"y":437,"w":46,"h":46}, + "frame": {"x":423,"y":445,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -234,7 +226,7 @@ }, "Game/Buffs/buff/buffBurning.png": { - "frame": {"x":145,"y":438,"w":46,"h":46}, + "frame": {"x":471,"y":446,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -242,7 +234,7 @@ }, "Game/Buffs/buff/buffCamo.png": { - "frame": {"x":193,"y":439,"w":46,"h":46}, + "frame": {"x":519,"y":448,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -250,7 +242,7 @@ }, "Game/Buffs/buff/buffChaoticOverflow.png": { - "frame": {"x":241,"y":442,"w":46,"h":46}, + "frame": {"x":567,"y":448,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -258,7 +250,7 @@ }, "Game/Buffs/buff/buffChilled.png": { - "frame": {"x":289,"y":443,"w":46,"h":46}, + "frame": {"x":615,"y":449,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -266,7 +258,7 @@ }, "Game/Buffs/buff/buffChillWalk.png": { - "frame": {"x":337,"y":443,"w":46,"h":46}, + "frame": {"x":663,"y":450,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -274,7 +266,7 @@ }, "Game/Buffs/buff/buffConduction.png": { - "frame": {"x":385,"y":444,"w":46,"h":46}, + "frame": {"x":711,"y":450,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -282,7 +274,7 @@ }, "Game/Buffs/buff/buffCorrupted.png": { - "frame": {"x":433,"y":445,"w":46,"h":46}, + "frame": {"x":759,"y":451,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -290,7 +282,7 @@ }, "Game/Buffs/buff/buffCorruptionStat.png": { - "frame": {"x":481,"y":446,"w":46,"h":46}, + "frame": {"x":807,"y":452,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -298,7 +290,7 @@ }, "Game/Buffs/buff/buffCursed.png": { - "frame": {"x":529,"y":448,"w":46,"h":46}, + "frame": {"x":855,"y":453,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -306,7 +298,7 @@ }, "Game/Buffs/buff/buffCursedDistract.png": { - "frame": {"x":577,"y":449,"w":46,"h":46}, + "frame": {"x":903,"y":453,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -314,7 +306,7 @@ }, "Game/Buffs/buff/buffCursingCircle.png": { - "frame": {"x":625,"y":450,"w":46,"h":46}, + "frame": {"x":951,"y":458,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -322,7 +314,7 @@ }, "Game/Buffs/buff/buffCutting.png": { - "frame": {"x":673,"y":450,"w":46,"h":46}, + "frame": {"x":1,"y":482,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -330,7 +322,7 @@ }, "Game/Buffs/buff/buffd_OrgasmResist.png": { - "frame": {"x":721,"y":451,"w":46,"h":46}, + "frame": {"x":49,"y":482,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -338,7 +330,7 @@ }, "Game/Buffs/buff/buffd_SlimeMimic.png": { - "frame": {"x":769,"y":451,"w":46,"h":46}, + "frame": {"x":135,"y":486,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -346,7 +338,7 @@ }, "Game/Buffs/buff/buffDildoBatBuff.png": { - "frame": {"x":817,"y":452,"w":46,"h":46}, + "frame": {"x":183,"y":487,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -354,7 +346,7 @@ }, "Game/Buffs/buff/buffDisenchantSelf.png": { - "frame": {"x":903,"y":455,"w":46,"h":46}, + "frame": {"x":231,"y":487,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -362,7 +354,7 @@ }, "Game/Buffs/buff/buffDistractionCast.png": { - "frame": {"x":951,"y":459,"w":46,"h":46}, + "frame": {"x":279,"y":488,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -370,7 +362,7 @@ }, "Game/Buffs/buff/buffDistractionShield.png": { - "frame": {"x":1,"y":483,"w":46,"h":46}, + "frame": {"x":327,"y":491,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -378,7 +370,7 @@ }, "Game/Buffs/buff/buffDrenched.png": { - "frame": {"x":49,"y":484,"w":46,"h":46}, + "frame": {"x":375,"y":492,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -386,7 +378,7 @@ }, "Game/Buffs/buff/buffe_OrgasmResist.png": { - "frame": {"x":97,"y":485,"w":46,"h":46}, + "frame": {"x":423,"y":493,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -394,7 +386,7 @@ }, "Game/Buffs/buff/buffEmpower.png": { - "frame": {"x":145,"y":486,"w":46,"h":46}, + "frame": {"x":471,"y":494,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -402,7 +394,7 @@ }, "Game/Buffs/buff/buffForcedSubmission.png": { - "frame": {"x":193,"y":487,"w":46,"h":46}, + "frame": {"x":519,"y":496,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -410,7 +402,7 @@ }, "Game/Buffs/buff/buffFuukaOrb.png": { - "frame": {"x":241,"y":490,"w":46,"h":46}, + "frame": {"x":567,"y":496,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -418,7 +410,7 @@ }, "Game/Buffs/buff/buffGreaterInvisibility.png": { - "frame": {"x":289,"y":491,"w":46,"h":46}, + "frame": {"x":615,"y":497,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -426,7 +418,7 @@ }, "Game/Buffs/buff/buffHaunted.png": { - "frame": {"x":337,"y":491,"w":46,"h":46}, + "frame": {"x":663,"y":498,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -434,7 +426,7 @@ }, "Game/Buffs/buff/buffHighValueFound.png": { - "frame": {"x":432,"y":493,"w":46,"h":46}, + "frame": {"x":711,"y":498,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -442,7 +434,7 @@ }, "Game/Buffs/buff/buffIgnite.png": { - "frame": {"x":480,"y":494,"w":46,"h":46}, + "frame": {"x":759,"y":499,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -450,7 +442,7 @@ }, "Game/Buffs/buff/buffInnerPowerArcaneStore.png": { - "frame": {"x":528,"y":496,"w":46,"h":46}, + "frame": {"x":807,"y":500,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -458,7 +450,7 @@ }, "Game/Buffs/buff/buffInvisibility.png": { - "frame": {"x":576,"y":497,"w":46,"h":46}, + "frame": {"x":855,"y":501,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -466,7 +458,7 @@ }, "Game/Buffs/buff/buffLatexBubble.png": { - "frame": {"x":624,"y":498,"w":46,"h":46}, + "frame": {"x":903,"y":501,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -474,7 +466,7 @@ }, "Game/Buffs/buff/buffLatexIntegrationStat.png": { - "frame": {"x":672,"y":498,"w":46,"h":46}, + "frame": {"x":951,"y":506,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -482,7 +474,7 @@ }, "Game/Buffs/buff/buffLeatherBurst.png": { - "frame": {"x":720,"y":499,"w":46,"h":46}, + "frame": {"x":1,"y":530,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -490,7 +482,7 @@ }, "Game/Buffs/buff/buffLightningRod.png": { - "frame": {"x":768,"y":499,"w":46,"h":46}, + "frame": {"x":49,"y":530,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -498,7 +490,7 @@ }, "Game/Buffs/buff/buffManaRegenSuspend.png": { - "frame": {"x":816,"y":500,"w":46,"h":46}, + "frame": {"x":97,"y":534,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -506,7 +498,7 @@ }, "Game/Buffs/buff/buffNovicePet.png": { - "frame": {"x":864,"y":503,"w":46,"h":46}, + "frame": {"x":145,"y":535,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -514,7 +506,7 @@ }, "Game/Buffs/buff/buffNovicePetBad.png": { - "frame": {"x":949,"y":507,"w":46,"h":46}, + "frame": {"x":193,"y":535,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -522,7 +514,7 @@ }, "Game/Buffs/buff/buffNovicePetVeryBad.png": { - "frame": {"x":1,"y":531,"w":46,"h":46}, + "frame": {"x":241,"y":536,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -530,7 +522,7 @@ }, "Game/Buffs/buff/buffNoWP.png": { - "frame": {"x":49,"y":532,"w":46,"h":46}, + "frame": {"x":326,"y":539,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -538,7 +530,7 @@ }, "Game/Buffs/buff/buffPoisonDagger.png": { - "frame": {"x":97,"y":533,"w":46,"h":46}, + "frame": {"x":374,"y":540,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -546,7 +538,7 @@ }, "Game/Buffs/buff/buffRaiseDefenses.png": { - "frame": {"x":145,"y":534,"w":46,"h":46}, + "frame": {"x":422,"y":541,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -554,7 +546,7 @@ }, "Game/Buffs/buff/buffRogueEscape.png": { - "frame": {"x":193,"y":535,"w":46,"h":46}, + "frame": {"x":470,"y":542,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -562,7 +554,7 @@ }, "Game/Buffs/buff/buffSagittaAssault.png": { - "frame": {"x":241,"y":538,"w":46,"h":46}, + "frame": {"x":518,"y":544,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -570,7 +562,7 @@ }, "Game/Buffs/buff/buffScrollArms.png": { - "frame": {"x":289,"y":539,"w":46,"h":46}, + "frame": {"x":566,"y":544,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -578,7 +570,7 @@ }, "Game/Buffs/buff/buffScrollLegs.png": { - "frame": {"x":337,"y":539,"w":46,"h":46}, + "frame": {"x":614,"y":545,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -586,7 +578,7 @@ }, "Game/Buffs/buff/buffScrollVerbal.png": { - "frame": {"x":432,"y":541,"w":46,"h":46}, + "frame": {"x":662,"y":546,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -594,7 +586,7 @@ }, "Game/Buffs/buff/buffShadowSeal.png": { - "frame": {"x":480,"y":542,"w":46,"h":46}, + "frame": {"x":710,"y":546,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -602,7 +594,7 @@ }, "Game/Buffs/buff/buffSlimed.png": { - "frame": {"x":528,"y":544,"w":46,"h":46}, + "frame": {"x":758,"y":547,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -610,7 +602,7 @@ }, "Game/Buffs/buff/buffSlimeMimic.png": { - "frame": {"x":576,"y":545,"w":46,"h":46}, + "frame": {"x":806,"y":548,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -618,7 +610,7 @@ }, "Game/Buffs/buff/buffSlippery.png": { - "frame": {"x":624,"y":546,"w":46,"h":46}, + "frame": {"x":854,"y":549,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -626,7 +618,7 @@ }, "Game/Buffs/buff/buffSpellDamageResist.png": { - "frame": {"x":672,"y":546,"w":46,"h":46}, + "frame": {"x":902,"y":549,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -634,7 +626,7 @@ }, "Game/Buffs/buff/buffSpellDamageUp.png": { - "frame": {"x":720,"y":547,"w":46,"h":46}, + "frame": {"x":950,"y":554,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -642,7 +634,7 @@ }, "Game/Buffs/buff/buffStoneSkin.png": { - "frame": {"x":768,"y":547,"w":46,"h":46}, + "frame": {"x":1,"y":578,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -650,7 +642,7 @@ }, "Game/Buffs/buff/buffTablet.png": { - "frame": {"x":816,"y":548,"w":46,"h":46}, + "frame": {"x":49,"y":578,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -658,7 +650,7 @@ }, "Game/Buffs/buff/buffTabletConjure.png": { - "frame": {"x":864,"y":551,"w":46,"h":46}, + "frame": {"x":97,"y":582,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -666,7 +658,7 @@ }, "Game/Buffs/buff/buffTabletElements.png": { - "frame": {"x":907,"y":407,"w":46,"h":46}, + "frame": {"x":231,"y":439,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -674,7 +666,7 @@ }, "Game/Buffs/buff/buffTabletIllusion.png": { - "frame": {"x":947,"y":555,"w":46,"h":46}, + "frame": {"x":145,"y":583,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -682,7 +674,7 @@ }, "Game/Buffs/buff/buffTabletLatex.png": { - "frame": {"x":1,"y":579,"w":46,"h":46}, + "frame": {"x":193,"y":583,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -690,7 +682,7 @@ }, "Game/Buffs/buff/buffTabletLeather.png": { - "frame": {"x":49,"y":580,"w":46,"h":46}, + "frame": {"x":241,"y":584,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -698,7 +690,7 @@ }, "Game/Buffs/buff/buffTabletMetal.png": { - "frame": {"x":97,"y":581,"w":46,"h":46}, + "frame": {"x":289,"y":587,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -706,7 +698,7 @@ }, "Game/Buffs/buff/buffTabletRope.png": { - "frame": {"x":145,"y":582,"w":46,"h":46}, + "frame": {"x":337,"y":588,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -714,7 +706,7 @@ }, "Game/Buffs/buff/buffTabletWill.png": { - "frame": {"x":193,"y":583,"w":46,"h":46}, + "frame": {"x":385,"y":589,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -722,7 +714,7 @@ }, "Game/Buffs/buff/buffTaunted.png": { - "frame": {"x":241,"y":586,"w":46,"h":46}, + "frame": {"x":433,"y":590,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -730,7 +722,7 @@ }, "Game/Buffs/buff/buffUnsteady.png": { - "frame": {"x":289,"y":587,"w":46,"h":46}, + "frame": {"x":516,"y":592,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -738,7 +730,7 @@ }, "Game/Buffs/buff/buffWaterBubble.png": { - "frame": {"x":337,"y":587,"w":46,"h":46}, + "frame": {"x":564,"y":592,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -746,15 +738,23 @@ }, "Game/Buffs/BuffDots.png": { - "frame": {"x":516,"y":1,"w":28,"h":26}, + "frame": {"x":299,"y":1,"w":28,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":8,"w":28,"h":26}, "sourceSize": {"w":46,"h":46} }, +"Game/Buffs/BuffDotsSide.png": +{ + "frame": {"x":877,"y":1,"w":26,"h":28}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":9,"w":26,"h":28}, + "sourceSize": {"w":46,"h":46} +}, "Game/Buffs/curse/Blind.png": { - "frame": {"x":432,"y":589,"w":46,"h":46}, + "frame": {"x":612,"y":593,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -762,7 +762,7 @@ }, "Game/Buffs/curse/Blocked.png": { - "frame": {"x":719,"y":1247,"w":54,"h":54}, + "frame": {"x":909,"y":1263,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":54,"h":54}, @@ -770,7 +770,7 @@ }, "Game/Buffs/curse/Blue.png": { - "frame": {"x":480,"y":590,"w":46,"h":46}, + "frame": {"x":706,"y":594,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -778,7 +778,7 @@ }, "Game/Buffs/curse/Curse.png": { - "frame": {"x":528,"y":592,"w":46,"h":46}, + "frame": {"x":754,"y":595,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -786,7 +786,7 @@ }, "Game/Buffs/curse/Disc.png": { - "frame": {"x":576,"y":593,"w":46,"h":46}, + "frame": {"x":802,"y":596,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -794,7 +794,7 @@ }, "Game/Buffs/curse/Divine.png": { - "frame": {"x":624,"y":594,"w":46,"h":46}, + "frame": {"x":850,"y":597,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -802,7 +802,7 @@ }, "Game/Buffs/curse/Dollmaker.png": { - "frame": {"x":672,"y":594,"w":46,"h":46}, + "frame": {"x":898,"y":597,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -810,7 +810,7 @@ }, "Game/Buffs/curse/Fuuka.png": { - "frame": {"x":720,"y":595,"w":46,"h":46}, + "frame": {"x":946,"y":602,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -818,7 +818,7 @@ }, "Game/Buffs/curse/Gold.png": { - "frame": {"x":768,"y":595,"w":46,"h":46}, + "frame": {"x":1,"y":626,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -826,7 +826,7 @@ }, "Game/Buffs/curse/HiSec.png": { - "frame": {"x":816,"y":596,"w":46,"h":46}, + "frame": {"x":49,"y":626,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -834,7 +834,7 @@ }, "Game/Buffs/curse/Purple.png": { - "frame": {"x":864,"y":599,"w":46,"h":46}, + "frame": {"x":97,"y":630,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -842,7 +842,7 @@ }, "Game/Buffs/curse/Red.png": { - "frame": {"x":912,"y":603,"w":46,"h":46}, + "frame": {"x":145,"y":631,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -850,7 +850,7 @@ }, "Game/Buffs/curse/Red_Hi.png": { - "frame": {"x":1,"y":627,"w":46,"h":46}, + "frame": {"x":193,"y":631,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -858,7 +858,7 @@ }, "Game/Buffs/curse/Red_Med.png": { - "frame": {"x":49,"y":628,"w":46,"h":46}, + "frame": {"x":241,"y":632,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -866,7 +866,7 @@ }, "Game/Buffs/curse/Rubber.png": { - "frame": {"x":97,"y":629,"w":46,"h":46}, + "frame": {"x":289,"y":635,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -874,7 +874,7 @@ }, "Game/Buffs/curse/StarCurse.png": { - "frame": {"x":145,"y":630,"w":46,"h":46}, + "frame": {"x":337,"y":636,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -882,7 +882,7 @@ }, "Game/Buffs/curse/White.png": { - "frame": {"x":193,"y":631,"w":46,"h":46}, + "frame": {"x":385,"y":637,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -890,7 +890,7 @@ }, "Game/Buffs/damageresist.png": { - "frame": {"x":241,"y":634,"w":46,"h":46}, + "frame": {"x":433,"y":638,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -898,7 +898,7 @@ }, "Game/Buffs/debuff.png": { - "frame": {"x":289,"y":635,"w":46,"h":46}, + "frame": {"x":481,"y":640,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -906,7 +906,7 @@ }, "Game/Buffs/Denied.png": { - "frame": {"x":337,"y":635,"w":46,"h":46}, + "frame": {"x":529,"y":640,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -914,7 +914,7 @@ }, "Game/Buffs/dmg.png": { - "frame": {"x":431,"y":637,"w":46,"h":46}, + "frame": {"x":577,"y":641,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -922,7 +922,7 @@ }, "Game/Buffs/dmgacid.png": { - "frame": {"x":479,"y":638,"w":46,"h":46}, + "frame": {"x":625,"y":642,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -930,7 +930,7 @@ }, "Game/Buffs/dmgarcane.png": { - "frame": {"x":527,"y":640,"w":46,"h":46}, + "frame": {"x":673,"y":642,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -938,7 +938,7 @@ }, "Game/Buffs/dmgchain.png": { - "frame": {"x":575,"y":641,"w":46,"h":46}, + "frame": {"x":721,"y":643,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -946,7 +946,7 @@ }, "Game/Buffs/dmgcharm.png": { - "frame": {"x":623,"y":642,"w":46,"h":46}, + "frame": {"x":769,"y":644,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -954,7 +954,7 @@ }, "Game/Buffs/dmgcold.png": { - "frame": {"x":671,"y":642,"w":46,"h":46}, + "frame": {"x":817,"y":645,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -962,7 +962,7 @@ }, "Game/Buffs/dmgcrush.png": { - "frame": {"x":719,"y":643,"w":46,"h":46}, + "frame": {"x":865,"y":645,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -970,7 +970,7 @@ }, "Game/Buffs/dmgelectric.png": { - "frame": {"x":767,"y":643,"w":46,"h":46}, + "frame": {"x":945,"y":650,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -978,7 +978,7 @@ }, "Game/Buffs/dmgfire.png": { - "frame": {"x":815,"y":644,"w":46,"h":46}, + "frame": {"x":1,"y":674,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -986,7 +986,7 @@ }, "Game/Buffs/dmgglue.png": { - "frame": {"x":863,"y":647,"w":46,"h":46}, + "frame": {"x":49,"y":674,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -994,7 +994,7 @@ }, "Game/Buffs/dmggrope.png": { - "frame": {"x":911,"y":651,"w":46,"h":46}, + "frame": {"x":97,"y":678,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1002,7 +1002,7 @@ }, "Game/Buffs/dmghappygas.png": { - "frame": {"x":1,"y":675,"w":46,"h":46}, + "frame": {"x":145,"y":679,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1010,7 +1010,7 @@ }, "Game/Buffs/dmgholy.png": { - "frame": {"x":49,"y":676,"w":46,"h":46}, + "frame": {"x":193,"y":679,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1018,7 +1018,7 @@ }, "Game/Buffs/dmgice.png": { - "frame": {"x":97,"y":677,"w":46,"h":46}, + "frame": {"x":241,"y":680,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1026,7 +1026,7 @@ }, "Game/Buffs/dmgmagic.png": { - "frame": {"x":145,"y":678,"w":46,"h":46}, + "frame": {"x":289,"y":683,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1034,7 +1034,7 @@ }, "Game/Buffs/dmgmelee.png": { - "frame": {"x":193,"y":679,"w":46,"h":46}, + "frame": {"x":337,"y":684,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1042,7 +1042,7 @@ }, "Game/Buffs/dmgpain.png": { - "frame": {"x":241,"y":682,"w":46,"h":46}, + "frame": {"x":385,"y":685,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1050,7 +1050,7 @@ }, "Game/Buffs/dmgpierce.png": { - "frame": {"x":289,"y":683,"w":46,"h":46}, + "frame": {"x":433,"y":686,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1058,7 +1058,7 @@ }, "Game/Buffs/dmgPlus/dmg.png": { - "frame": {"x":337,"y":683,"w":46,"h":46}, + "frame": {"x":481,"y":688,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1066,7 +1066,7 @@ }, "Game/Buffs/dmgPlus/dmgacid.png": { - "frame": {"x":385,"y":685,"w":46,"h":46}, + "frame": {"x":529,"y":688,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1074,7 +1074,7 @@ }, "Game/Buffs/dmgPlus/dmgarcane.png": { - "frame": {"x":433,"y":686,"w":46,"h":46}, + "frame": {"x":577,"y":689,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1082,7 +1082,7 @@ }, "Game/Buffs/dmgPlus/dmgbind.png": { - "frame": {"x":527,"y":688,"w":46,"h":46}, + "frame": {"x":625,"y":690,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1090,7 +1090,7 @@ }, "Game/Buffs/dmgPlus/dmgchain.png": { - "frame": {"x":575,"y":689,"w":46,"h":46}, + "frame": {"x":673,"y":690,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1098,7 +1098,7 @@ }, "Game/Buffs/dmgPlus/dmgcharm.png": { - "frame": {"x":623,"y":690,"w":46,"h":46}, + "frame": {"x":721,"y":691,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1106,7 +1106,7 @@ }, "Game/Buffs/dmgPlus/dmgcold.png": { - "frame": {"x":671,"y":690,"w":46,"h":46}, + "frame": {"x":769,"y":692,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1114,7 +1114,7 @@ }, "Game/Buffs/dmgPlus/dmgcrush.png": { - "frame": {"x":719,"y":691,"w":46,"h":46}, + "frame": {"x":817,"y":693,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1122,7 +1122,7 @@ }, "Game/Buffs/dmgPlus/dmgelectric.png": { - "frame": {"x":767,"y":691,"w":46,"h":46}, + "frame": {"x":865,"y":693,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1130,7 +1130,7 @@ }, "Game/Buffs/dmgPlus/dmgfire.png": { - "frame": {"x":815,"y":692,"w":46,"h":46}, + "frame": {"x":943,"y":698,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1138,7 +1138,7 @@ }, "Game/Buffs/dmgPlus/dmgglue.png": { - "frame": {"x":863,"y":695,"w":46,"h":46}, + "frame": {"x":1,"y":722,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1146,7 +1146,7 @@ }, "Game/Buffs/dmgPlus/dmggrope.png": { - "frame": {"x":911,"y":699,"w":46,"h":46}, + "frame": {"x":49,"y":722,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1154,7 +1154,7 @@ }, "Game/Buffs/dmgPlus/dmghappygas.png": { - "frame": {"x":1,"y":723,"w":46,"h":46}, + "frame": {"x":97,"y":726,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1162,7 +1162,7 @@ }, "Game/Buffs/dmgPlus/dmgice.png": { - "frame": {"x":49,"y":724,"w":46,"h":46}, + "frame": {"x":145,"y":727,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1170,7 +1170,7 @@ }, "Game/Buffs/dmgPlus/dmgmagic.png": { - "frame": {"x":97,"y":725,"w":46,"h":46}, + "frame": {"x":193,"y":727,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1178,7 +1178,7 @@ }, "Game/Buffs/dmgPlus/dmgmelee.png": { - "frame": {"x":145,"y":726,"w":46,"h":46}, + "frame": {"x":241,"y":728,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1186,7 +1186,7 @@ }, "Game/Buffs/dmgPlus/dmgpain.png": { - "frame": {"x":193,"y":727,"w":46,"h":46}, + "frame": {"x":289,"y":731,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1194,7 +1194,7 @@ }, "Game/Buffs/dmgPlus/dmgpierce.png": { - "frame": {"x":241,"y":730,"w":46,"h":46}, + "frame": {"x":337,"y":732,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1202,7 +1202,7 @@ }, "Game/Buffs/dmgPlus/dmgplush.png": { - "frame": {"x":289,"y":731,"w":46,"h":46}, + "frame": {"x":385,"y":733,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1210,7 +1210,7 @@ }, "Game/Buffs/dmgPlus/dmgpoison.png": { - "frame": {"x":337,"y":731,"w":46,"h":46}, + "frame": {"x":433,"y":734,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1218,7 +1218,7 @@ }, "Game/Buffs/dmgPlus/dmgslash.png": { - "frame": {"x":385,"y":733,"w":46,"h":46}, + "frame": {"x":481,"y":736,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1226,7 +1226,7 @@ }, "Game/Buffs/dmgPlus/dmgsoul.png": { - "frame": {"x":433,"y":734,"w":46,"h":46}, + "frame": {"x":529,"y":736,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1234,7 +1234,7 @@ }, "Game/Buffs/dmgPlus/dmgspell.png": { - "frame": {"x":720,"y":547,"w":46,"h":46}, + "frame": {"x":950,"y":554,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1242,7 +1242,7 @@ }, "Game/Buffs/dmgPlus/dmgstun.png": { - "frame": {"x":481,"y":736,"w":46,"h":46}, + "frame": {"x":577,"y":737,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1250,7 +1250,7 @@ }, "Game/Buffs/dmgPlus/dmgtickle.png": { - "frame": {"x":529,"y":737,"w":46,"h":46}, + "frame": {"x":625,"y":738,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1258,7 +1258,7 @@ }, "Game/Buffs/dmgPlus/dmgunarmed.png": { - "frame": {"x":577,"y":738,"w":46,"h":46}, + "frame": {"x":673,"y":738,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1266,7 +1266,7 @@ }, "Game/Buffs/dmgplush.png": { - "frame": {"x":625,"y":738,"w":46,"h":46}, + "frame": {"x":721,"y":739,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1274,7 +1274,7 @@ }, "Game/Buffs/dmgpoison.png": { - "frame": {"x":673,"y":739,"w":46,"h":46}, + "frame": {"x":769,"y":740,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1282,7 +1282,7 @@ }, "Game/Buffs/dmgslash.png": { - "frame": {"x":721,"y":739,"w":46,"h":46}, + "frame": {"x":817,"y":741,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1290,7 +1290,7 @@ }, "Game/Buffs/dmgsoap.png": { - "frame": {"x":769,"y":740,"w":46,"h":46}, + "frame": {"x":865,"y":741,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1298,7 +1298,7 @@ }, "Game/Buffs/dmgsoul.png": { - "frame": {"x":852,"y":743,"w":46,"h":46}, + "frame": {"x":913,"y":746,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1306,7 +1306,7 @@ }, "Game/Buffs/dmgstun.png": { - "frame": {"x":900,"y":747,"w":46,"h":46}, + "frame": {"x":1,"y":770,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1314,7 +1314,7 @@ }, "Game/Buffs/dmgtickle.png": { - "frame": {"x":1,"y":771,"w":46,"h":46}, + "frame": {"x":49,"y":770,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1322,7 +1322,7 @@ }, "Game/Buffs/dmgunarmed.png": { - "frame": {"x":49,"y":772,"w":46,"h":46}, + "frame": {"x":97,"y":774,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1330,7 +1330,7 @@ }, "Game/Buffs/Edged.png": { - "frame": {"x":97,"y":773,"w":46,"h":46}, + "frame": {"x":145,"y":775,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1338,7 +1338,7 @@ }, "Game/Buffs/Help.png": { - "frame": {"x":145,"y":774,"w":46,"h":46}, + "frame": {"x":193,"y":775,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1346,7 +1346,7 @@ }, "Game/Buffs/HelpCorner.png": { - "frame": {"x":193,"y":775,"w":46,"h":46}, + "frame": {"x":241,"y":776,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1354,7 +1354,7 @@ }, "Game/Buffs/HelpCrack.png": { - "frame": {"x":241,"y":778,"w":46,"h":46}, + "frame": {"x":289,"y":779,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1362,7 +1362,7 @@ }, "Game/Buffs/HelpHook.png": { - "frame": {"x":289,"y":779,"w":46,"h":46}, + "frame": {"x":337,"y":780,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1370,7 +1370,7 @@ }, "Game/Buffs/HelpSharp.png": { - "frame": {"x":337,"y":779,"w":46,"h":46}, + "frame": {"x":385,"y":781,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1378,7 +1378,7 @@ }, "Game/Buffs/HelpSticky.png": { - "frame": {"x":385,"y":781,"w":46,"h":46}, + "frame": {"x":433,"y":782,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1386,7 +1386,7 @@ }, "Game/Buffs/info.png": { - "frame": {"x":433,"y":782,"w":46,"h":46}, + "frame": {"x":481,"y":784,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1394,7 +1394,7 @@ }, "Game/Buffs/infoAccuracy.png": { - "frame": {"x":481,"y":784,"w":46,"h":46}, + "frame": {"x":529,"y":784,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1402,7 +1402,7 @@ }, "Game/Buffs/infoAccuracyBuff.png": { - "frame": {"x":529,"y":785,"w":46,"h":46}, + "frame": {"x":577,"y":785,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1410,7 +1410,7 @@ }, "Game/Buffs/infoAccuracyDebuff.png": { - "frame": {"x":577,"y":786,"w":46,"h":46}, + "frame": {"x":625,"y":786,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1418,7 +1418,7 @@ }, "Game/Buffs/infoBlock.png": { - "frame": {"x":625,"y":786,"w":46,"h":46}, + "frame": {"x":673,"y":786,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1426,7 +1426,7 @@ }, "Game/Buffs/infoDamageMelee.png": { - "frame": {"x":673,"y":787,"w":46,"h":46}, + "frame": {"x":721,"y":787,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1434,7 +1434,7 @@ }, "Game/Buffs/infoEvasion.png": { - "frame": {"x":721,"y":787,"w":46,"h":46}, + "frame": {"x":769,"y":788,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1442,7 +1442,7 @@ }, "Game/Buffs/infoJailFree.png": { - "frame": {"x":769,"y":788,"w":46,"h":46}, + "frame": {"x":817,"y":789,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1450,7 +1450,7 @@ }, "Game/Buffs/infoJailPrisoner.png": { - "frame": {"x":817,"y":791,"w":46,"h":46}, + "frame": {"x":865,"y":789,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1458,7 +1458,7 @@ }, "Game/Buffs/infoJailSubmissive.png": { - "frame": {"x":900,"y":795,"w":46,"h":46}, + "frame": {"x":913,"y":794,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1466,7 +1466,7 @@ }, "Game/Buffs/infoKey.png": { - "frame": {"x":1,"y":819,"w":46,"h":46}, + "frame": {"x":1,"y":818,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1474,7 +1474,7 @@ }, "Game/Buffs/infoMiscast.png": { - "frame": {"x":49,"y":820,"w":46,"h":46}, + "frame": {"x":49,"y":818,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1482,7 +1482,7 @@ }, "Game/Buffs/infoMiscastDebuff.png": { - "frame": {"x":97,"y":821,"w":46,"h":46}, + "frame": {"x":97,"y":822,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1490,7 +1490,7 @@ }, "Game/Buffs/infoNoKey.png": { - "frame": {"x":145,"y":822,"w":46,"h":46}, + "frame": {"x":145,"y":823,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1498,7 +1498,7 @@ }, "Game/Buffs/invisible.png": { - "frame": {"x":576,"y":497,"w":46,"h":46}, + "frame": {"x":855,"y":501,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1514,7 +1514,7 @@ }, "Game/Buffs/perk/perk.png": { - "frame": {"x":241,"y":826,"w":46,"h":46}, + "frame": {"x":241,"y":824,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1530,7 +1530,7 @@ }, "Game/Buffs/perk/perkBoundPower.png": { - "frame": {"x":337,"y":827,"w":46,"h":46}, + "frame": {"x":337,"y":828,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1562,7 +1562,7 @@ }, "Game/Buffs/perk/perkImmovableObject.png": { - "frame": {"x":529,"y":833,"w":46,"h":46}, + "frame": {"x":529,"y":832,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1570,7 +1570,7 @@ }, "Game/Buffs/perk/perkLeastResistance.png": { - "frame": {"x":577,"y":834,"w":46,"h":46}, + "frame": {"x":577,"y":833,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1586,7 +1586,7 @@ }, "Game/Buffs/perk/perkPacifist.png": { - "frame": {"x":673,"y":835,"w":46,"h":46}, + "frame": {"x":673,"y":834,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1610,7 +1610,7 @@ }, "Game/Buffs/Plugged.png": { - "frame": {"x":817,"y":839,"w":46,"h":46}, + "frame": {"x":817,"y":837,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1618,7 +1618,7 @@ }, "Game/Buffs/PluggedFull.png": { - "frame": {"x":865,"y":843,"w":46,"h":46}, + "frame": {"x":865,"y":837,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1626,7 +1626,7 @@ }, "Game/Buffs/quickness.png": { - "frame": {"x":976,"y":857,"w":46,"h":46}, + "frame": {"x":913,"y":842,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1634,7 +1634,7 @@ }, "Game/Buffs/restraintblock.png": { - "frame": {"x":1,"y":867,"w":46,"h":46}, + "frame": {"x":961,"y":854,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1642,7 +1642,7 @@ }, "Game/Buffs/restriction.png": { - "frame": {"x":49,"y":868,"w":46,"h":46}, + "frame": {"x":1,"y":866,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1650,7 +1650,7 @@ }, "Game/Buffs/Satisfied.png": { - "frame": {"x":97,"y":869,"w":46,"h":46}, + "frame": {"x":49,"y":866,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1658,7 +1658,7 @@ }, "Game/Buffs/shadow.png": { - "frame": {"x":145,"y":870,"w":46,"h":46}, + "frame": {"x":97,"y":870,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1666,7 +1666,7 @@ }, "Game/Buffs/shield.png": { - "frame": {"x":193,"y":871,"w":46,"h":46}, + "frame": {"x":145,"y":871,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1674,7 +1674,7 @@ }, "Game/Buffs/spellarmor.png": { - "frame": {"x":241,"y":874,"w":46,"h":46}, + "frame": {"x":193,"y":871,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1682,7 +1682,7 @@ }, "Game/Buffs/status/freeArms.png": { - "frame": {"x":289,"y":875,"w":46,"h":46}, + "frame": {"x":241,"y":872,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1690,7 +1690,7 @@ }, "Game/Buffs/status/freeEyes.png": { - "frame": {"x":337,"y":875,"w":46,"h":46}, + "frame": {"x":289,"y":875,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1698,7 +1698,7 @@ }, "Game/Buffs/status/freeHands.png": { - "frame": {"x":385,"y":877,"w":46,"h":46}, + "frame": {"x":337,"y":876,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1706,7 +1706,7 @@ }, "Game/Buffs/status/freeLegs.png": { - "frame": {"x":433,"y":878,"w":46,"h":46}, + "frame": {"x":385,"y":877,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1714,7 +1714,7 @@ }, "Game/Buffs/status/freeMouth.png": { - "frame": {"x":481,"y":880,"w":46,"h":46}, + "frame": {"x":433,"y":878,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1722,7 +1722,7 @@ }, "Game/Buffs/training/Heels.png": { - "frame": {"x":529,"y":881,"w":46,"h":46}, + "frame": {"x":481,"y":880,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1730,7 +1730,7 @@ }, "Game/Buffs/Vibe0.png": { - "frame": {"x":577,"y":882,"w":46,"h":46}, + "frame": {"x":529,"y":880,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1738,7 +1738,7 @@ }, "Game/Buffs/Vibe1.png": { - "frame": {"x":625,"y":882,"w":46,"h":46}, + "frame": {"x":577,"y":881,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1746,7 +1746,7 @@ }, "Game/Buffs/Vibe2.png": { - "frame": {"x":673,"y":883,"w":46,"h":46}, + "frame": {"x":625,"y":882,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1754,7 +1754,7 @@ }, "Game/Buffs/Vibe3.png": { - "frame": {"x":721,"y":883,"w":46,"h":46}, + "frame": {"x":673,"y":882,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1762,7 +1762,7 @@ }, "Game/Buffs/Vibe4.png": { - "frame": {"x":769,"y":884,"w":46,"h":46}, + "frame": {"x":721,"y":883,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1770,7 +1770,7 @@ }, "Game/Buffs/Vibe5.png": { - "frame": {"x":817,"y":887,"w":46,"h":46}, + "frame": {"x":769,"y":884,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1778,7 +1778,7 @@ }, "Game/Buffs/visibility.png": { - "frame": {"x":865,"y":891,"w":46,"h":46}, + "frame": {"x":817,"y":885,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1786,7 +1786,7 @@ }, "Game/Buffs/weaponTag/bow.png": { - "frame": {"x":943,"y":905,"w":46,"h":46}, + "frame": {"x":865,"y":885,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1794,7 +1794,7 @@ }, "Game/Buffs/weaponTag/clumsy.png": { - "frame": {"x":1,"y":915,"w":46,"h":46}, + "frame": {"x":913,"y":890,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1802,7 +1802,7 @@ }, "Game/Buffs/weaponTag/heavy.png": { - "frame": {"x":49,"y":916,"w":46,"h":46}, + "frame": {"x":961,"y":902,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1810,7 +1810,7 @@ }, "Game/Buffs/weaponTag/illum.png": { - "frame": {"x":97,"y":917,"w":46,"h":46}, + "frame": {"x":1,"y":914,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1818,7 +1818,7 @@ }, "Game/Buffs/weaponTag/light.png": { - "frame": {"x":145,"y":918,"w":46,"h":46}, + "frame": {"x":49,"y":914,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1826,7 +1826,7 @@ }, "Game/Buffs/weaponTag/magic.png": { - "frame": {"x":193,"y":919,"w":46,"h":46}, + "frame": {"x":97,"y":918,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1834,7 +1834,7 @@ }, "Game/Buffs/weaponTag/massive.png": { - "frame": {"x":241,"y":922,"w":46,"h":46}, + "frame": {"x":145,"y":919,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1842,7 +1842,7 @@ }, "Game/Buffs/weaponTag/noHands.png": { - "frame": {"x":289,"y":923,"w":46,"h":46}, + "frame": {"x":193,"y":919,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1850,7 +1850,7 @@ }, "Game/Buffs/weaponTag/offhand.png": { - "frame": {"x":337,"y":923,"w":46,"h":46}, + "frame": {"x":241,"y":920,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, @@ -1858,23 +1858,15 @@ }, "Game/Buffs/weaponTag/shield.png": { - "frame": {"x":750,"y":354,"w":46,"h":46}, + "frame": {"x":1,"y":386,"w":46,"h":46}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":46,"h":46}, "sourceSize": {"w":46,"h":46} }, -"Game/Bullets/AllyShadowStrike.png": -{ - "frame": {"x":750,"y":932,"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":652,"y":1535,"w":58,"h":58}, + "frame": {"x":624,"y":1589,"w":58,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":7,"w":58,"h":58}, @@ -1882,7 +1874,7 @@ }, "Game/Bullets/AmpuleBlue.png": { - "frame": {"x":497,"y":1133,"w":55,"h":52}, + "frame": {"x":293,"y":1177,"w":55,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":11,"w":55,"h":52}, @@ -1890,7 +1882,7 @@ }, "Game/Bullets/AmpuleGreen.png": { - "frame": {"x":378,"y":348,"w":48,"h":45}, + "frame": {"x":609,"y":353,"w":48,"h":45}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":11,"w":48,"h":45}, @@ -1898,23 +1890,31 @@ }, "Game/Bullets/AmpuleRed.png": { - "frame": {"x":611,"y":1082,"w":54,"h":51}, + "frame": {"x":719,"y":1083,"w":54,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":11,"w":54,"h":51}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/AmpuleYellow.png": +"Game/Bullets/ArcaneBlast.png": +{ + "frame": {"x":938,"y":1376,"w":60,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":2,"y":9,"w":60,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/ArmbinderBolt.png": { - "frame": {"x":558,"y":350,"w":49,"h":46}, + "frame": {"x":628,"y":64,"w":40,"h":35}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":17,"y":11,"w":49,"h":46}, + "spriteSourceSize": {"x":16,"y":19,"w":40,"h":35}, "sourceSize": {"w":72,"h":72} }, "Game/Bullets/ArmbinderBoltHit.png": { - "frame": {"x":264,"y":256,"w":43,"h":42}, + "frame": {"x":35,"y":296,"w":43,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, @@ -1922,7 +1922,7 @@ }, "Game/Bullets/ArrowBoltPistolHit.png": { - "frame": {"x":264,"y":256,"w":43,"h":42}, + "frame": {"x":35,"y":296,"w":43,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, @@ -1930,7 +1930,7 @@ }, "Game/Bullets/ArrowNormalHit.png": { - "frame": {"x":264,"y":256,"w":43,"h":42}, + "frame": {"x":35,"y":296,"w":43,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, @@ -1938,7 +1938,7 @@ }, "Game/Bullets/ArrowVineHit.png": { - "frame": {"x":378,"y":1406,"w":44,"h":56}, + "frame": {"x":245,"y":1457,"w":44,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, @@ -1946,7 +1946,7 @@ }, "Game/Bullets/BanditBola.png": { - "frame": {"x":616,"y":980,"w":48,"h":48}, + "frame": {"x":641,"y":979,"w":48,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":12,"w":48,"h":48}, @@ -1954,15 +1954,23 @@ }, "Game/Bullets/BearTrap.png": { - "frame": {"x":365,"y":258,"w":52,"h":42}, + "frame": {"x":419,"y":260,"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":446,"y":1642,"w":51,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, + "sourceSize": {"w":72,"h":72} +}, "Game/Bullets/BindChainHit.png": { - "frame": {"x":467,"y":1471,"w":56,"h":57}, + "frame": {"x":522,"y":1526,"w":56,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":7,"w":56,"h":57}, @@ -1970,7 +1978,7 @@ }, "Game/Bullets/BindVineHit.png": { - "frame": {"x":378,"y":1406,"w":44,"h":56}, + "frame": {"x":245,"y":1457,"w":44,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, @@ -1978,7 +1986,7 @@ }, "Game/Bullets/BlindfoldBoltHit.png": { - "frame": {"x":264,"y":256,"w":43,"h":42}, + "frame": {"x":35,"y":296,"w":43,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, @@ -1986,7 +1994,7 @@ }, "Game/Bullets/Boulder.png": { - "frame": {"x":938,"y":1687,"w":58,"h":60}, + "frame": {"x":926,"y":1731,"w":58,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":6,"w":58,"h":60}, @@ -1994,23 +2002,39 @@ }, "Game/Bullets/BoulderKicked.png": { - "frame": {"x":32,"y":129,"w":59,"h":37}, + "frame": {"x":63,"y":131,"w":59,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":17,"w":59,"h":37}, "sourceSize": {"w":72,"h":72} }, +"Game/Bullets/BoulderKickedHit.png": +{ + "frame": {"x":446,"y":1642,"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":938,"y":1687,"w":58,"h":60}, + "frame": {"x":926,"y":1731,"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":446,"y":1642,"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":609,"y":306,"w":44,"h":44}, + "frame": {"x":1,"y":340,"w":44,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":14,"w":44,"h":44}, @@ -2018,7 +2042,7 @@ }, "Game/Bullets/C4Item.png": { - "frame": {"x":793,"y":1086,"w":47,"h":51}, + "frame": {"x":352,"y":1126,"w":47,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":85,"y":78,"w":47,"h":51}, @@ -2026,7 +2050,7 @@ }, "Game/Bullets/CelestialBolt.png": { - "frame": {"x":342,"y":1023,"w":53,"h":49}, + "frame": {"x":281,"y":1020,"w":53,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":12,"w":53,"h":49}, @@ -2034,7 +2058,7 @@ }, "Game/Bullets/CrackleTrail.png": { - "frame": {"x":948,"y":1448,"w":58,"h":57}, + "frame": {"x":39,"y":1508,"w":58,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":9,"w":58,"h":57}, @@ -2042,7 +2066,7 @@ }, "Game/Bullets/CrystalShock.png": { - "frame": {"x":166,"y":255,"w":40,"h":41}, + "frame": {"x":130,"y":253,"w":40,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":15,"w":40,"h":41}, @@ -2050,47 +2074,63 @@ }, "Game/Bullets/CuffsBoltHit.png": { - "frame": {"x":264,"y":256,"w":43,"h":42}, + "frame": {"x":35,"y":296,"w":43,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/DaggerHit.png": +"Game/Bullets/DragonSlash.png": { - "frame": {"x":750,"y":932,"w":52,"h":47}, + "frame": {"x":522,"y":1028,"w":52,"h":49}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "spriteSourceSize": {"x":12,"y":13,"w":52,"h":49}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/DistractionBurstBullet.png": +"Game/Bullets/DynamiteItem.png": { - "frame": {"x":631,"y":1357,"w":56,"h":56}, + "frame": {"x":978,"y":1102,"w":30,"h":51}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":8,"y":8,"w":56,"h":56}, + "spriteSourceSize": {"x":93,"y":79,"w":30,"h":51}, + "sourceSize": {"w":216,"h":216} +}, +"Game/Bullets/EarthformLine.png": +{ + "frame": {"x":446,"y":1642,"w":51,"h":59}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/DragonSlash.png": +"Game/Bullets/EarthformLineHit.png": { - "frame": {"x":397,"y":1025,"w":52,"h":49}, + "frame": {"x":446,"y":1642,"w":51,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":12,"y":13,"w":52,"h":49}, + "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/DynamiteItem.png": +"Game/Bullets/EarthformLineTrail.png": { - "frame": {"x":895,"y":1102,"w":30,"h":51}, + "frame": {"x":446,"y":1642,"w":51,"h":59}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":93,"y":79,"w":30,"h":51}, - "sourceSize": {"w":216,"h":216} + "spriteSourceSize": {"x":11,"y":9,"w":51,"h":59}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Bullets/EarthformLineTrailHit.png": +{ + "frame": {"x":446,"y":1642,"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":775,"y":1248,"w":54,"h":54}, + "frame": {"x":965,"y":1264,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -2098,7 +2138,7 @@ }, "Game/Bullets/ElectricEffect.png": { - "frame": {"x":948,"y":1448,"w":58,"h":57}, + "frame": {"x":39,"y":1508,"w":58,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":9,"w":58,"h":57}, @@ -2106,7 +2146,7 @@ }, "Game/Bullets/EnemyLatexArmbinderBolt.png": { - "frame": {"x":235,"y":213,"w":35,"h":40}, + "frame": {"x":364,"y":215,"w":35,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":17,"w":35,"h":40}, @@ -2114,7 +2154,7 @@ }, "Game/Bullets/EnemyLatexArmbinderBoltHit.png": { - "frame": {"x":303,"y":971,"w":49,"h":47}, + "frame": {"x":430,"y":926,"w":49,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, @@ -2122,7 +2162,7 @@ }, "Game/Bullets/EnemyLatexGagBoltHit.png": { - "frame": {"x":303,"y":971,"w":49,"h":47}, + "frame": {"x":430,"y":926,"w":49,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, @@ -2130,7 +2170,7 @@ }, "Game/Bullets/EnemyLatexLegbinderBoltHit.png": { - "frame": {"x":303,"y":971,"w":49,"h":47}, + "frame": {"x":430,"y":926,"w":49,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, @@ -2138,7 +2178,7 @@ }, "Game/Bullets/EnemyLatexRestraintBolt.png": { - "frame": {"x":663,"y":263,"w":47,"h":42}, + "frame": {"x":629,"y":263,"w":47,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":16,"w":47,"h":42}, @@ -2146,7 +2186,7 @@ }, "Game/Bullets/EnemyLatexRestraintBoltHit.png": { - "frame": {"x":303,"y":971,"w":49,"h":47}, + "frame": {"x":430,"y":926,"w":49,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, @@ -2154,15 +2194,23 @@ }, "Game/Bullets/Fireexp.png": { - "frame": {"x":558,"y":1081,"w":51,"h":51}, + "frame": {"x":91,"y":1118,"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":981,"y":267,"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":947,"y":1566,"w":58,"h":58}, + "frame": {"x":684,"y":1590,"w":58,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":78,"y":79,"w":58,"h":58}, @@ -2170,15 +2218,23 @@ }, "Game/Bullets/FlashBomb.png": { - "frame": {"x":546,"y":1,"w":28,"h":26}, + "frame": {"x":329,"y":1,"w":28,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":88,"y":96,"w":28,"h":26}, "sourceSize": {"w":216,"h":216} }, +"Game/Bullets/FreezeRuneStrike.png": +{ + "frame": {"x":104,"y":1392,"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":575,"y":175,"w":37,"h":39}, + "frame": {"x":704,"y":179,"w":37,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":17,"w":37,"h":39}, @@ -2186,7 +2242,7 @@ }, "Game/Bullets/GagBoltHit.png": { - "frame": {"x":264,"y":256,"w":43,"h":42}, + "frame": {"x":35,"y":296,"w":43,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, @@ -2194,7 +2250,7 @@ }, "Game/Bullets/HairpinHit.png": { - "frame": {"x":804,"y":935,"w":52,"h":47}, + "frame": {"x":654,"y":930,"w":52,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, @@ -2202,7 +2258,7 @@ }, "Game/Bullets/HarnessBoltHit.png": { - "frame": {"x":264,"y":256,"w":43,"h":42}, + "frame": {"x":35,"y":296,"w":43,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, @@ -2210,31 +2266,31 @@ }, "Game/Bullets/Heal2Hit.png": { - "frame": {"x":46,"y":1451,"w":58,"h":57}, + "frame": {"x":291,"y":1518,"w":58,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":7,"w":58,"h":57}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/HeelShadowStrike.png": +"Game/Bullets/HeartArrowHit.png": { - "frame": {"x":652,"y":1535,"w":58,"h":58}, + "frame": {"x":701,"y":1244,"w":58,"h":54}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":6,"y":7,"w":58,"h":58}, + "spriteSourceSize": {"x":6,"y":10,"w":58,"h":54}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/HeelShadowStrikeHit.png": +"Game/Bullets/HeelShadowStrike.png": { - "frame": {"x":750,"y":932,"w":52,"h":47}, + "frame": {"x":624,"y":1589,"w":58,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, + "spriteSourceSize": {"x":6,"y":7,"w":58,"h":58}, "sourceSize": {"w":72,"h":72} }, "Game/Bullets/HighBoltHit.png": { - "frame": {"x":237,"y":1070,"w":46,"h":51}, + "frame": {"x":401,"y":1128,"w":46,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":9,"w":46,"h":51}, @@ -2242,7 +2298,7 @@ }, "Game/Bullets/IceBreathHit.png": { - "frame": {"x":44,"y":1817,"w":38,"h":61}, + "frame": {"x":460,"y":1892,"w":38,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":4,"w":38,"h":61}, @@ -2250,7 +2306,7 @@ }, "Game/Bullets/IceDragonBreathPrepare.png": { - "frame": {"x":554,"y":1134,"w":55,"h":52}, + "frame": {"x":530,"y":1186,"w":55,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":12,"w":55,"h":52}, @@ -2258,7 +2314,7 @@ }, "Game/Bullets/Iceexp.png": { - "frame": {"x":554,"y":1134,"w":55,"h":52}, + "frame": {"x":530,"y":1186,"w":55,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":12,"w":55,"h":52}, @@ -2266,7 +2322,7 @@ }, "Game/Bullets/IceruneHit.png": { - "frame": {"x":44,"y":1817,"w":38,"h":61}, + "frame": {"x":460,"y":1892,"w":38,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":4,"w":38,"h":61}, @@ -2274,7 +2330,7 @@ }, "Game/Bullets/IceSlowPrepare.png": { - "frame": {"x":554,"y":1134,"w":55,"h":52}, + "frame": {"x":530,"y":1186,"w":55,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":12,"w":55,"h":52}, @@ -2282,7 +2338,7 @@ }, "Game/Bullets/Icicles.png": { - "frame": {"x":554,"y":1134,"w":55,"h":52}, + "frame": {"x":530,"y":1186,"w":55,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":12,"w":55,"h":52}, @@ -2290,7 +2346,7 @@ }, "Game/Bullets/IciclesHit.png": { - "frame": {"x":554,"y":1134,"w":55,"h":52}, + "frame": {"x":530,"y":1186,"w":55,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":12,"w":55,"h":52}, @@ -2298,7 +2354,7 @@ }, "Game/Bullets/LatexArmbinderBolt.png": { - "frame": {"x":235,"y":213,"w":35,"h":40}, + "frame": {"x":364,"y":215,"w":35,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":17,"w":35,"h":40}, @@ -2306,7 +2362,7 @@ }, "Game/Bullets/LatexArmbinderBoltHit.png": { - "frame": {"x":303,"y":971,"w":49,"h":47}, + "frame": {"x":430,"y":926,"w":49,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, @@ -2314,7 +2370,7 @@ }, "Game/Bullets/LatexBubble.png": { - "frame": {"x":208,"y":255,"w":54,"h":42}, + "frame": {"x":307,"y":256,"w":54,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":16,"w":54,"h":42}, @@ -2322,7 +2378,7 @@ }, "Game/Bullets/LatexBubbleexp.png": { - "frame": {"x":609,"y":306,"w":44,"h":44}, + "frame": {"x":1,"y":340,"w":44,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":14,"w":44,"h":44}, @@ -2330,7 +2386,7 @@ }, "Game/Bullets/LatexBubbleHit.png": { - "frame": {"x":303,"y":971,"w":49,"h":47}, + "frame": {"x":430,"y":926,"w":49,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, @@ -2338,7 +2394,7 @@ }, "Game/Bullets/LatexBubbleTrail.png": { - "frame": {"x":663,"y":263,"w":47,"h":42}, + "frame": {"x":629,"y":263,"w":47,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":16,"w":47,"h":42}, @@ -2346,7 +2402,7 @@ }, "Game/Bullets/LatexGagBoltHit.png": { - "frame": {"x":303,"y":971,"w":49,"h":47}, + "frame": {"x":430,"y":926,"w":49,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, @@ -2354,7 +2410,7 @@ }, "Game/Bullets/LatexLegbinderBoltHit.png": { - "frame": {"x":303,"y":971,"w":49,"h":47}, + "frame": {"x":430,"y":926,"w":49,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":11,"w":49,"h":47}, @@ -2362,7 +2418,7 @@ }, "Game/Bullets/LatexSprayHit.png": { - "frame": {"x":818,"y":139,"w":38,"h":38}, + "frame": {"x":751,"y":140,"w":38,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":18,"w":38,"h":38}, @@ -2370,7 +2426,7 @@ }, "Game/Bullets/LeatherCuffsBoltHit.png": { - "frame": {"x":264,"y":256,"w":43,"h":42}, + "frame": {"x":35,"y":296,"w":43,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, @@ -2378,7 +2434,7 @@ }, "Game/Bullets/LegbinderBoltHit.png": { - "frame": {"x":264,"y":256,"w":43,"h":42}, + "frame": {"x":35,"y":296,"w":43,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, @@ -2386,15 +2442,23 @@ }, "Game/Bullets/MagicMissile2.png": { - "frame": {"x":236,"y":1020,"w":47,"h":48}, + "frame": {"x":136,"y":1016,"w":47,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":12,"w":47,"h":48}, "sourceSize": {"w":72,"h":72} }, +"Game/Bullets/MagicRopeHit.png": +{ + "frame": {"x":178,"y":173,"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":112,"y":94,"w":36,"h":36}, + "frame": {"x":40,"y":93,"w":36,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":18,"w":36,"h":36}, @@ -2402,7 +2466,7 @@ }, "Game/Bullets/ManyCablesHit.png": { - "frame": {"x":150,"y":94,"w":36,"h":36}, + "frame": {"x":78,"y":93,"w":36,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":18,"w":36,"h":36}, @@ -2410,7 +2474,7 @@ }, "Game/Bullets/ManyChainsHit.png": { - "frame": {"x":893,"y":1561,"w":52,"h":58}, + "frame": {"x":800,"y":1592,"w":52,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":6,"w":52,"h":58}, @@ -2418,7 +2482,7 @@ }, "Game/Bullets/MinigunHit.png": { - "frame": {"x":144,"y":967,"w":51,"h":47}, + "frame": {"x":762,"y":932,"w":51,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":10,"w":51,"h":47}, @@ -2426,7 +2490,7 @@ }, "Game/Bullets/NurseSyringeHit.png": { - "frame": {"x":1,"y":1390,"w":52,"h":56}, + "frame": {"x":700,"y":1414,"w":52,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":9,"w":52,"h":56}, @@ -2434,7 +2498,7 @@ }, "Game/Bullets/OneBarMissile.png": { - "frame": {"x":561,"y":1029,"w":50,"h":50}, + "frame": {"x":739,"y":1031,"w":50,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":11,"w":50,"h":50}, @@ -2442,7 +2506,7 @@ }, "Game/Bullets/PlayerBola.png": { - "frame": {"x":616,"y":980,"w":48,"h":48}, + "frame": {"x":641,"y":979,"w":48,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":12,"w":48,"h":48}, @@ -2450,7 +2514,7 @@ }, "Game/Bullets/RecoverObjectHit.png": { - "frame": {"x":237,"y":1070,"w":46,"h":51}, + "frame": {"x":401,"y":1128,"w":46,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":9,"w":46,"h":51}, @@ -2458,7 +2522,7 @@ }, "Game/Bullets/RedSlimeHit.png": { - "frame": {"x":878,"y":1268,"w":54,"h":54}, + "frame": {"x":53,"y":1280,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -2466,7 +2530,7 @@ }, "Game/Bullets/RestrainingDevice.png": { - "frame": {"x":1,"y":1278,"w":54,"h":54}, + "frame": {"x":109,"y":1280,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":9,"w":54,"h":54}, @@ -2474,7 +2538,7 @@ }, "Game/Bullets/RobotBoltHit.png": { - "frame": {"x":57,"y":1280,"w":54,"h":54}, + "frame": {"x":165,"y":1282,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -2482,7 +2546,7 @@ }, "Game/Bullets/RopeBoltHit.png": { - "frame": {"x":92,"y":171,"w":54,"h":39}, + "frame": {"x":234,"y":173,"w":54,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":16,"w":54,"h":39}, @@ -2490,7 +2554,7 @@ }, "Game/Bullets/RopeBoltLaunch.png": { - "frame": {"x":683,"y":1417,"w":44,"h":56}, + "frame": {"x":291,"y":1459,"w":44,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, @@ -2498,7 +2562,7 @@ }, "Game/Bullets/RopeBoltLaunchHit.png": { - "frame": {"x":683,"y":1417,"w":44,"h":56}, + "frame": {"x":291,"y":1459,"w":44,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, @@ -2506,7 +2570,7 @@ }, "Game/Bullets/RopeBoltLaunchSingle.png": { - "frame": {"x":683,"y":1417,"w":44,"h":56}, + "frame": {"x":291,"y":1459,"w":44,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, @@ -2514,7 +2578,7 @@ }, "Game/Bullets/RopeBoltLaunchSingleHit.png": { - "frame": {"x":683,"y":1417,"w":44,"h":56}, + "frame": {"x":291,"y":1459,"w":44,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, @@ -2522,7 +2586,7 @@ }, "Game/Bullets/RopeRuneStrike.png": { - "frame": {"x":186,"y":1287,"w":54,"h":54}, + "frame": {"x":490,"y":1295,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, @@ -2530,7 +2594,7 @@ }, "Game/Bullets/RubberBolt.png": { - "frame": {"x":686,"y":137,"w":44,"h":38}, + "frame": {"x":619,"y":139,"w":44,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":18,"w":44,"h":38}, @@ -2538,7 +2602,7 @@ }, "Game/Bullets/RubberBulletsHit.png": { - "frame": {"x":144,"y":967,"w":51,"h":47}, + "frame": {"x":762,"y":932,"w":51,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":10,"w":51,"h":47}, @@ -2546,7 +2610,7 @@ }, "Game/Bullets/RuneTrap_Belt.png": { - "frame": {"x":278,"y":1291,"w":54,"h":54}, + "frame": {"x":689,"y":1300,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, @@ -2554,7 +2618,7 @@ }, "Game/Bullets/RuneTrap_Bubble.png": { - "frame": {"x":278,"y":1291,"w":54,"h":54}, + "frame": {"x":689,"y":1300,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, @@ -2562,7 +2626,7 @@ }, "Game/Bullets/RuneTrap_Chain.png": { - "frame": {"x":278,"y":1291,"w":54,"h":54}, + "frame": {"x":689,"y":1300,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, @@ -2570,7 +2634,7 @@ }, "Game/Bullets/RuneTrap_Latex.png": { - "frame": {"x":278,"y":1291,"w":54,"h":54}, + "frame": {"x":689,"y":1300,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, @@ -2578,7 +2642,7 @@ }, "Game/Bullets/RuneTrap_LatexBall.png": { - "frame": {"x":278,"y":1291,"w":54,"h":54}, + "frame": {"x":689,"y":1300,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, @@ -2586,7 +2650,7 @@ }, "Game/Bullets/RuneTrap_LatexSphere.png": { - "frame": {"x":278,"y":1291,"w":54,"h":54}, + "frame": {"x":689,"y":1300,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, @@ -2594,7 +2658,7 @@ }, "Game/Bullets/RuneTrap_Leather.png": { - "frame": {"x":278,"y":1291,"w":54,"h":54}, + "frame": {"x":689,"y":1300,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, @@ -2602,7 +2666,7 @@ }, "Game/Bullets/RuneTrap_Ribbon.png": { - "frame": {"x":278,"y":1291,"w":54,"h":54}, + "frame": {"x":689,"y":1300,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, @@ -2610,7 +2674,7 @@ }, "Game/Bullets/RuneTrap_Rope.png": { - "frame": {"x":278,"y":1291,"w":54,"h":54}, + "frame": {"x":689,"y":1300,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, @@ -2618,7 +2682,7 @@ }, "Game/Bullets/RuneTrap_Rubber.png": { - "frame": {"x":278,"y":1291,"w":54,"h":54}, + "frame": {"x":689,"y":1300,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, @@ -2626,7 +2690,7 @@ }, "Game/Bullets/RuneTrap_Slime.png": { - "frame": {"x":278,"y":1291,"w":54,"h":54}, + "frame": {"x":689,"y":1300,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, @@ -2634,7 +2698,7 @@ }, "Game/Bullets/RuneTrap_SlimeBubble.png": { - "frame": {"x":278,"y":1291,"w":54,"h":54}, + "frame": {"x":689,"y":1300,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, @@ -2642,23 +2706,15 @@ }, "Game/Bullets/RuneTrap_Vine.png": { - "frame": {"x":278,"y":1291,"w":54,"h":54}, + "frame": {"x":689,"y":1300,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":81,"y":81,"w":54,"h":54}, "sourceSize": {"w":216,"h":216} }, -"Game/Bullets/ShadowBoltHit.png": -{ - "frame": {"x":750,"y":932,"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":385,"y":540,"w":45,"h":46}, + "frame": {"x":336,"y":924,"w":45,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":12,"w":45,"h":46}, @@ -2666,7 +2722,7 @@ }, "Game/Bullets/ShadowBubbleHit.png": { - "frame": {"x":842,"y":1090,"w":51,"h":51}, + "frame": {"x":144,"y":1118,"w":51,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":11,"w":51,"h":51}, @@ -2674,55 +2730,31 @@ }, "Game/Bullets/ShadowDanceHit.png": { - "frame": {"x":1,"y":1569,"w":58,"h":58}, + "frame": {"x":890,"y":1610,"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":838,"y":1680,"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":652,"y":1535,"w":58,"h":58}, + "frame": {"x":624,"y":1589,"w":58,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":7,"w":58,"h":58}, "sourceSize": {"w":72,"h":72} }, -"Game/Bullets/ShadowSlashTrail.png": -{ - "frame": {"x":750,"y":932,"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":652,"y":1535,"w":58,"h":58}, + "frame": {"x":624,"y":1589,"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":750,"y":932,"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":652,"y":1535,"w":58,"h":58}, + "frame": {"x":624,"y":1589,"w":58,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":7,"w":58,"h":58}, @@ -2730,7 +2762,7 @@ }, "Game/Bullets/SingleBeltHit.png": { - "frame": {"x":683,"y":1417,"w":44,"h":56}, + "frame": {"x":291,"y":1459,"w":44,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, @@ -2738,7 +2770,7 @@ }, "Game/Bullets/SingleRibbonHit.png": { - "frame": {"x":729,"y":1418,"w":44,"h":56}, + "frame": {"x":337,"y":1460,"w":44,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, @@ -2746,7 +2778,7 @@ }, "Game/Bullets/SleepDartHit.png": { - "frame": {"x":1,"y":1390,"w":52,"h":56}, + "frame": {"x":700,"y":1414,"w":52,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":9,"w":52,"h":56}, @@ -2754,7 +2786,7 @@ }, "Game/Bullets/SlimeSplashHit.png": { - "frame": {"x":775,"y":1248,"w":54,"h":54}, + "frame": {"x":965,"y":1264,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -2762,7 +2794,7 @@ }, "Game/Bullets/StraitjacketBoltHit.png": { - "frame": {"x":264,"y":256,"w":43,"h":42}, + "frame": {"x":35,"y":296,"w":43,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":20,"w":43,"h":42}, @@ -2770,7 +2802,7 @@ }, "Game/Bullets/SummonRedSlime.png": { - "frame": {"x":878,"y":1268,"w":54,"h":54}, + "frame": {"x":53,"y":1280,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -2778,7 +2810,7 @@ }, "Game/Bullets/SummonSingleRedSlime.png": { - "frame": {"x":878,"y":1268,"w":54,"h":54}, + "frame": {"x":53,"y":1280,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -2786,7 +2818,7 @@ }, "Game/Bullets/TrapSleepDartHit.png": { - "frame": {"x":1,"y":1390,"w":52,"h":56}, + "frame": {"x":700,"y":1414,"w":52,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":9,"w":52,"h":56}, @@ -2794,7 +2826,7 @@ }, "Game/Bullets/TrueSteelHit.png": { - "frame": {"x":858,"y":939,"w":52,"h":47}, + "frame": {"x":708,"y":931,"w":52,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, @@ -2802,7 +2834,7 @@ }, "Game/Bullets/WaterBall.png": { - "frame": {"x":712,"y":264,"w":47,"h":42}, + "frame": {"x":712,"y":265,"w":47,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":16,"w":47,"h":42}, @@ -2810,7 +2842,7 @@ }, "Game/Bullets/WitchBoulder.png": { - "frame": {"x":938,"y":1687,"w":58,"h":60}, + "frame": {"x":926,"y":1731,"w":58,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":6,"w":58,"h":60}, @@ -2818,7 +2850,7 @@ }, "Game/Bullets/WitchRopeHit.png": { - "frame": {"x":92,"y":171,"w":54,"h":39}, + "frame": {"x":234,"y":173,"w":54,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":16,"w":54,"h":39}, @@ -2826,7 +2858,7 @@ }, "Game/Bullets/WitchWaterBall.png": { - "frame": {"x":712,"y":264,"w":47,"h":42}, + "frame": {"x":712,"y":265,"w":47,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":16,"w":47,"h":42}, @@ -2834,7 +2866,7 @@ }, "Game/Bullets/WolfCrackle.png": { - "frame": {"x":948,"y":1448,"w":58,"h":57}, + "frame": {"x":39,"y":1508,"w":58,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":9,"w":58,"h":57}, @@ -2842,39 +2874,55 @@ }, "Game/Bullets/WolfCrackleTrail.png": { - "frame": {"x":948,"y":1448,"w":58,"h":57}, + "frame": {"x":39,"y":1508,"w":58,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":9,"w":58,"h":57}, "sourceSize": {"w":72,"h":72} }, +"Game/Bullets/ZombieOrbIceHit.png": +{ + "frame": {"x":1,"y":1937,"w":58,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":6,"w":58,"h":62}, + "sourceSize": {"w":72,"h":72} +}, "Game/Bullets/ZombieOrbMini.png": { - "frame": {"x":33,"y":27,"w":28,"h":28}, + "frame": {"x":905,"y":1,"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": +"Game/Class/Fighter.png": { - "frame": {"x":596,"y":61,"w":36,"h":34}, + "frame": {"x":783,"y":1780,"w":49,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":2,"w":36,"h":34}, - "sourceSize": {"w":38,"h":38} + "spriteSourceSize": {"x":12,"y":0,"w":49,"h":60}, + "sourceSize": {"w":71,"h":60} }, "Game/Class/Mage.png": { - "frame": {"x":537,"y":1713,"w":51,"h":60}, + "frame": {"x":582,"y":1771,"w":51,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":0,"w":51,"h":60}, "sourceSize": {"w":71,"h":60} }, +"Game/Class/Peasant.png": +{ + "frame": {"x":246,"y":256,"w":59,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":59,"h":42}, + "sourceSize": {"w":71,"h":60} +}, "Game/Class/Rogue.png": { - "frame": {"x":87,"y":1759,"w":54,"h":60}, + "frame": {"x":341,"y":1762,"w":54,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":0,"w":54,"h":60}, @@ -2882,7 +2930,7 @@ }, "Game/Conditions/Buff.png": { - "frame": {"x":522,"y":61,"w":31,"h":33}, + "frame": {"x":362,"y":61,"w":31,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":31,"h":33}, @@ -2890,23 +2938,39 @@ }, "Game/Conditions/Debuff.png": { - "frame": {"x":35,"y":57,"w":30,"h":32}, + "frame": {"x":865,"y":31,"w":30,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":40,"w":30,"h":32}, "sourceSize": {"w":72,"h":72} }, +"Game/Conditions/Heart.png": +{ + "frame": {"x":497,"y":29,"w":32,"h":31}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":20,"y":6,"w":32,"h":31}, + "sourceSize": {"w":72,"h":72} +}, "Game/Conditions/Peace.png": { - "frame": {"x":885,"y":30,"w":32,"h":32}, + "frame": {"x":695,"y":30,"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":290,"y":96,"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":295,"y":96,"w":31,"h":36}, + "frame": {"x":323,"y":96,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -2914,7 +2978,7 @@ }, "Game/Conditions/Thought/Aware.png": { - "frame": {"x":328,"y":96,"w":31,"h":36}, + "frame": {"x":356,"y":96,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -2922,7 +2986,7 @@ }, "Game/Conditions/Thought/Blind.png": { - "frame": {"x":361,"y":96,"w":31,"h":36}, + "frame": {"x":389,"y":96,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -2930,7 +2994,7 @@ }, "Game/Conditions/Thought/Confused.png": { - "frame": {"x":394,"y":96,"w":31,"h":36}, + "frame": {"x":422,"y":97,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -2938,7 +3002,7 @@ }, "Game/Conditions/Thought/Embarrassed.png": { - "frame": {"x":427,"y":96,"w":31,"h":36}, + "frame": {"x":455,"y":97,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -2946,7 +3010,7 @@ }, "Game/Conditions/Thought/Fire.png": { - "frame": {"x":460,"y":96,"w":31,"h":36}, + "frame": {"x":488,"y":98,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -2954,7 +3018,7 @@ }, "Game/Conditions/Thought/Freeze.png": { - "frame": {"x":493,"y":96,"w":31,"h":36}, + "frame": {"x":521,"y":98,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -2962,7 +3026,7 @@ }, "Game/Conditions/Thought/GiveUp.png": { - "frame": {"x":526,"y":97,"w":31,"h":36}, + "frame": {"x":554,"y":98,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -2970,7 +3034,7 @@ }, "Game/Conditions/Thought/Happy.png": { - "frame": {"x":559,"y":97,"w":31,"h":36}, + "frame": {"x":587,"y":100,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -2978,7 +3042,7 @@ }, "Game/Conditions/Thought/Idle.png": { - "frame": {"x":592,"y":97,"w":31,"h":36}, + "frame": {"x":620,"y":101,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -2986,7 +3050,7 @@ }, "Game/Conditions/Thought/Jail.png": { - "frame": {"x":625,"y":99,"w":31,"h":36}, + "frame": {"x":653,"y":101,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -2994,7 +3058,7 @@ }, "Game/Conditions/Thought/Laugh.png": { - "frame": {"x":658,"y":99,"w":31,"h":36}, + "frame": {"x":686,"y":101,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -3002,7 +3066,7 @@ }, "Game/Conditions/Thought/Lose.png": { - "frame": {"x":691,"y":99,"w":31,"h":36}, + "frame": {"x":719,"y":101,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -3010,7 +3074,7 @@ }, "Game/Conditions/Thought/Play.png": { - "frame": {"x":724,"y":99,"w":31,"h":36}, + "frame": {"x":752,"y":102,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -3018,7 +3082,7 @@ }, "Game/Conditions/Thought/PlayDone.png": { - "frame": {"x":757,"y":100,"w":31,"h":36}, + "frame": {"x":785,"y":102,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -3026,7 +3090,7 @@ }, "Game/Conditions/Thought/Search.png": { - "frame": {"x":790,"y":101,"w":31,"h":36}, + "frame": {"x":818,"y":102,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -3034,7 +3098,7 @@ }, "Game/Conditions/Thought/Sense.png": { - "frame": {"x":823,"y":101,"w":31,"h":36}, + "frame": {"x":851,"y":102,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -3042,7 +3106,7 @@ }, "Game/Conditions/Thought/Shoot.png": { - "frame": {"x":856,"y":101,"w":31,"h":36}, + "frame": {"x":884,"y":103,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -3050,7 +3114,7 @@ }, "Game/Conditions/Thought/Status.png": { - "frame": {"x":889,"y":101,"w":31,"h":36}, + "frame": {"x":917,"y":104,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -3058,7 +3122,7 @@ }, "Game/Conditions/Thought/Struggle.png": { - "frame": {"x":922,"y":102,"w":31,"h":36}, + "frame": {"x":950,"y":104,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -3066,7 +3130,7 @@ }, "Game/Conditions/Thought/Thought.png": { - "frame": {"x":955,"y":102,"w":31,"h":36}, + "frame": {"x":983,"y":104,"w":31,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":19,"w":31,"h":36}, @@ -3074,7 +3138,7 @@ }, "Game/CurseInfo.png": { - "frame": {"x":766,"y":981,"w":35,"h":50}, + "frame": {"x":318,"y":1072,"w":35,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":3,"w":35,"h":50}, @@ -3082,7 +3146,7 @@ }, "Game/CurseUnlock.png": { - "frame": {"x":520,"y":1242,"w":35,"h":54}, + "frame": {"x":453,"y":1293,"w":35,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":1,"w":35,"h":54}, @@ -3090,15 +3154,23 @@ }, "Game/Cursor.png": { - "frame": {"x":142,"y":1172,"w":31,"h":53}, + "frame": {"x":644,"y":1187,"w":31,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":31,"h":53}, "sourceSize": {"w":72,"h":72} }, +"Game/Cut.png": +{ + "frame": {"x":208,"y":1,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":17,"w":26,"h":26}, + "sourceSize": {"w":60,"h":60} +}, "Game/EffectTiles/Acid.png": { - "frame": {"x":706,"y":1031,"w":50,"h":50}, + "frame": {"x":839,"y":1033,"w":50,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":8,"w":50,"h":50}, @@ -3106,7 +3178,7 @@ }, "Game/EffectTiles/Belts.png": { - "frame": {"x":668,"y":1190,"w":55,"h":53}, + "frame": {"x":54,"y":1225,"w":55,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":9,"w":55,"h":53}, @@ -3114,7 +3186,7 @@ }, "Game/EffectTiles/Bubble.png": { - "frame": {"x":793,"y":1034,"w":50,"h":50}, + "frame": {"x":58,"y":1065,"w":50,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":11,"w":50,"h":50}, @@ -3122,7 +3194,7 @@ }, "Game/EffectTiles/Chains.png": { - "frame": {"x":894,"y":1502,"w":51,"h":57}, + "frame": {"x":803,"y":1474,"w":51,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":9,"w":51,"h":57}, @@ -3130,7 +3202,7 @@ }, "Game/EffectTiles/EdgeOrb.png": { - "frame": {"x":253,"y":1,"w":26,"h":26}, + "frame": {"x":359,"y":1,"w":26,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":35,"w":26,"h":26}, @@ -3138,7 +3210,7 @@ }, "Game/EffectTiles/EdgeOrbDead.png": { - "frame": {"x":281,"y":1,"w":26,"h":26}, + "frame": {"x":387,"y":1,"w":26,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":35,"w":26,"h":26}, @@ -3146,7 +3218,7 @@ }, "Game/EffectTiles/Fabric.png": { - "frame": {"x":837,"y":1197,"w":47,"h":53}, + "frame": {"x":975,"y":1209,"w":47,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":13,"w":47,"h":53}, @@ -3154,7 +3226,7 @@ }, "Game/EffectTiles/FabricGreen.png": { - "frame": {"x":752,"y":1539,"w":56,"h":58}, + "frame": {"x":60,"y":1626,"w":56,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":8,"w":56,"h":58}, @@ -3162,15 +3234,23 @@ }, "Game/EffectTiles/Fireflies.png": { - "frame": {"x":843,"y":265,"w":45,"h":42}, + "frame": {"x":887,"y":267,"w":45,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":16,"w":45,"h":42}, "sourceSize": {"w":72,"h":72} }, +"Game/EffectTiles/Gunpowder.png": +{ + "frame": {"x":464,"y":136,"w":59,"h":38}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":29,"w":59,"h":38}, + "sourceSize": {"w":72,"h":72} +}, "Game/EffectTiles/IllusOrb.png": { - "frame": {"x":309,"y":214,"w":58,"h":41}, + "frame": {"x":438,"y":217,"w":58,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":29,"w":58,"h":41}, @@ -3178,7 +3258,7 @@ }, "Game/EffectTiles/Lantern.png": { - "frame": {"x":945,"y":854,"w":29,"h":49}, + "frame": {"x":611,"y":1029,"w":29,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":19,"w":29,"h":49}, @@ -3186,7 +3266,7 @@ }, "Game/EffectTiles/LanternUnlit.png": { - "frame": {"x":995,"y":555,"w":28,"h":48}, + "frame": {"x":994,"y":602,"w":28,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":20,"w":28,"h":48}, @@ -3194,7 +3274,7 @@ }, "Game/EffectTiles/Magicflies.png": { - "frame": {"x":890,"y":265,"w":45,"h":42}, + "frame": {"x":934,"y":267,"w":45,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":16,"w":45,"h":42}, @@ -3202,7 +3282,7 @@ }, "Game/EffectTiles/ManaEmpty.png": { - "frame": {"x":463,"y":259,"w":50,"h":42}, + "frame": {"x":473,"y":260,"w":50,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":15,"w":50,"h":42}, @@ -3210,7 +3290,7 @@ }, "Game/EffectTiles/ManaFull.png": { - "frame": {"x":515,"y":259,"w":50,"h":42}, + "frame": {"x":525,"y":263,"w":50,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":15,"w":50,"h":42}, @@ -3218,15 +3298,23 @@ }, "Game/EffectTiles/ManaPartial.png": { - "frame": {"x":611,"y":262,"w":50,"h":42}, + "frame": {"x":577,"y":263,"w":50,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":15,"w":50,"h":42}, "sourceSize": {"w":72,"h":72} }, +"Game/EffectTiles/MotionLamp.png": +{ + "frame": {"x":885,"y":65,"w":50,"h":36}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":18,"w":50,"h":36}, + "sourceSize": {"w":72,"h":72} +}, "Game/EffectTiles/OrbLantern.png": { - "frame": {"x":492,"y":134,"w":32,"h":38}, + "frame": {"x":991,"y":142,"w":32,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":30,"w":32,"h":38}, @@ -3234,31 +3322,31 @@ }, "Game/EffectTiles/Ropes.png": { - "frame": {"x":373,"y":1293,"w":54,"h":54}, + "frame": {"x":745,"y":1301,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":8,"w":54,"h":54}, "sourceSize": {"w":72,"h":72} }, -"Game/EffectTiles/StarryTrail.png": +"Game/EffectTiles/Sack.png": { - "frame": {"x":428,"y":349,"w":37,"h":45}, + "frame": {"x":77,"y":58,"w":35,"h":33}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":19,"y":10,"w":37,"h":45}, + "spriteSourceSize": {"x":19,"y":35,"w":35,"h":33}, "sourceSize": {"w":72,"h":72} }, -"Game/EffectTiles/TorchOrb.png": +"Game/EffectTiles/StarryTrail.png": { - "frame": {"x":809,"y":264,"w":32,"h":43}, + "frame": {"x":754,"y":355,"w":37,"h":45}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":20,"y":29,"w":32,"h":43}, + "spriteSourceSize": {"x":19,"y":10,"w":37,"h":45}, "sourceSize": {"w":72,"h":72} }, "Game/EffectTiles/TorchOrbNoPanel.png": { - "frame": {"x":937,"y":265,"w":32,"h":43}, + "frame": {"x":678,"y":263,"w":32,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":29,"w":32,"h":43}, @@ -3266,15 +3354,31 @@ }, "Game/EffectTiles/Vines.png": { - "frame": {"x":141,"y":1517,"w":54,"h":57}, + "frame": {"x":580,"y":1527,"w":54,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":6,"w":54,"h":57}, "sourceSize": {"w":72,"h":72} }, +"Game/EffectTiles/WireEnd.png": +{ + "frame": {"x":691,"y":980,"w":48,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":12,"w":48,"h":48}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/AcidBarrel.png": +{ + "frame": {"x":231,"y":1695,"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":88,"y":1697,"w":58,"h":60}, + "frame": {"x":1,"y":1747,"w":58,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":7,"w":58,"h":60}, @@ -3282,15 +3386,23 @@ }, "Game/Enemies/Alchemist.png": { - "frame": {"x":448,"y":1773,"w":49,"h":61}, + "frame": {"x":487,"y":1829,"w":49,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":7,"w":49,"h":61}, "sourceSize": {"w":72,"h":72} }, +"Game/Enemies/AllyDoll.png": +{ + "frame": {"x":663,"y":1962,"w":37,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, + "sourceSize": {"w":72,"h":72} +}, "Game/Enemies/AnimArmbinder.png": { - "frame": {"x":272,"y":214,"w":35,"h":40}, + "frame": {"x":401,"y":215,"w":35,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":17,"w":35,"h":40}, @@ -3298,7 +3410,7 @@ }, "Game/Enemies/AnimatedArmor.png": { - "frame": {"x":987,"y":1626,"w":36,"h":59}, + "frame": {"x":1,"y":1564,"w":36,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":3,"w":36,"h":59}, @@ -3306,7 +3418,7 @@ }, "Game/Enemies/AnimChastity.png": { - "frame": {"x":800,"y":1600,"w":45,"h":59}, + "frame": {"x":680,"y":1650,"w":45,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, @@ -3314,7 +3426,7 @@ }, "Game/Enemies/AntiqueQuest.png": { - "frame": {"x":245,"y":1765,"w":58,"h":61}, + "frame": {"x":120,"y":1815,"w":58,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":5,"w":58,"h":61}, @@ -3322,7 +3434,7 @@ }, "Game/Enemies/AquaSlime.png": { - "frame": {"x":845,"y":1038,"w":50,"h":50}, + "frame": {"x":110,"y":1066,"w":50,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":11,"w":50,"h":50}, @@ -3330,7 +3442,7 @@ }, "Game/Enemies/Bandit.png": { - "frame": {"x":795,"y":1661,"w":41,"h":60}, + "frame": {"x":740,"y":1774,"w":41,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":7,"w":41,"h":60}, @@ -3338,7 +3450,7 @@ }, "Game/Enemies/BanditChief.png": { - "frame": {"x":713,"y":1657,"w":36,"h":60}, + "frame": {"x":967,"y":1793,"w":36,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":7,"w":36,"h":60}, @@ -3346,7 +3458,7 @@ }, "Game/Enemies/BanditGrappler.png": { - "frame": {"x":838,"y":1742,"w":51,"h":60}, + "frame": {"x":635,"y":1772,"w":51,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":7,"w":51,"h":60}, @@ -3354,7 +3466,7 @@ }, "Game/Enemies/BanditPet.png": { - "frame": {"x":857,"y":1557,"w":34,"h":60}, + "frame": {"x":410,"y":1701,"w":34,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":7,"w":34,"h":60}, @@ -3362,7 +3474,7 @@ }, "Game/Enemies/BanditQuest.png": { - "frame": {"x":713,"y":1657,"w":36,"h":60}, + "frame": {"x":967,"y":1793,"w":36,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":7,"w":36,"h":60}, @@ -3370,7 +3482,7 @@ }, "Game/Enemies/BarricadeHighSecurityDoor.png": { - "frame": {"x":397,"y":1076,"w":50,"h":51}, + "frame": {"x":250,"y":1123,"w":50,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":13,"w":50,"h":51}, @@ -3378,7 +3490,7 @@ }, "Game/Enemies/BarricadeLight.png": { - "frame": {"x":397,"y":1076,"w":50,"h":51}, + "frame": {"x":250,"y":1123,"w":50,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":13,"w":50,"h":51}, @@ -3386,15 +3498,23 @@ }, "Game/Enemies/BarricadeSecurityDoor.png": { - "frame": {"x":397,"y":1076,"w":50,"h":51}, + "frame": {"x":250,"y":1123,"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":865,"y":1731,"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":336,"y":1583,"w":57,"h":59}, + "frame": {"x":216,"y":1634,"w":57,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":11,"w":57,"h":59}, @@ -3402,15 +3522,23 @@ }, "Game/Enemies/BindableEnemies/Alchemist.png": { - "frame": {"x":448,"y":1773,"w":49,"h":61}, + "frame": {"x":487,"y":1829,"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/AllyDoll.png": +{ + "frame": {"x":663,"y":1962,"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":795,"y":1661,"w":41,"h":60}, + "frame": {"x":740,"y":1774,"w":41,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":7,"w":41,"h":60}, @@ -3418,7 +3546,7 @@ }, "Game/Enemies/BindableEnemies/BanditChief.png": { - "frame": {"x":713,"y":1657,"w":36,"h":60}, + "frame": {"x":967,"y":1793,"w":36,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":7,"w":36,"h":60}, @@ -3426,7 +3554,7 @@ }, "Game/Enemies/BindableEnemies/BanditGrappler.png": { - "frame": {"x":838,"y":1742,"w":51,"h":60}, + "frame": {"x":635,"y":1772,"w":51,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":7,"w":51,"h":60}, @@ -3434,7 +3562,7 @@ }, "Game/Enemies/BindableEnemies/BanditPet.png": { - "frame": {"x":857,"y":1557,"w":34,"h":60}, + "frame": {"x":410,"y":1701,"w":34,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":7,"w":34,"h":60}, @@ -3442,63 +3570,135 @@ }, "Game/Enemies/BindableEnemies/BanditQuest.png": { - "frame": {"x":713,"y":1657,"w":36,"h":60}, + "frame": {"x":967,"y":1793,"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/ElementalFire.png": +"Game/Enemies/BindableEnemies/Deputy.png": { - "frame": {"x":795,"y":1723,"w":41,"h":61}, + "frame": {"x":499,"y":1956,"w":42,"h":63}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":18,"y":7,"w":41,"h":61}, + "spriteSourceSize": {"x":12,"y":4,"w":42,"h":63}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/Elf.png": +"Game/Enemies/BindableEnemies/Dressmaker.png": { - "frame": {"x":891,"y":1744,"w":41,"h":61}, + "frame": {"x":684,"y":1835,"w":47,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":17,"y":7,"w":41,"h":61}, + "spriteSourceSize": {"x":8,"y":8,"w":47,"h":61}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/ElfRanger.png": +"Game/Enemies/BindableEnemies/ElementalFire.png": { - "frame": {"x":407,"y":1771,"w":39,"h":61}, + "frame": {"x":39,"y":1811,"w":41,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":19,"y":7,"w":39,"h":61}, + "spriteSourceSize": {"x":18,"y":7,"w":41,"h":61}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/Nawashi.png": +"Game/Enemies/BindableEnemies/ElementalIce.png": { - "frame": {"x":505,"y":1590,"w":42,"h":59}, + "frame": {"x":239,"y":1820,"w":56,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":18,"y":7,"w":42,"h":59}, + "spriteSourceSize": {"x":9,"y":7,"w":56,"h":61}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/Ninja.png": +"Game/Enemies/BindableEnemies/Elf.png": { - "frame": {"x":750,"y":1722,"w":43,"h":61}, + "frame": {"x":297,"y":1823,"w":41,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":16,"y":6,"w":43,"h":61}, + "spriteSourceSize": {"x":17,"y":7,"w":41,"h":61}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/BindableEnemies/NinjaStalker.png": +"Game/Enemies/BindableEnemies/ElfRanger.png": { - "frame": {"x":410,"y":1708,"w":36,"h":61}, + "frame": {"x":419,"y":1889,"w":39,"h":61}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":23,"y":6,"w":36,"h":61}, + "spriteSourceSize": {"x":19,"y":7,"w":39,"h":61}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/Book.png": +"Game/Enemies/BindableEnemies/EncasedDoll.png": { - "frame": {"x":847,"y":1619,"w":44,"h":59}, + "frame": {"x":702,"y":1963,"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/Maidforce.png": +{ + "frame": {"x":679,"y":1898,"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":259,"y":1949,"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":339,"y":1951,"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":577,"y":1896,"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":499,"y":1645,"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":928,"y":1793,"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":868,"y":1855,"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":82,"y":1811,"w":36,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":6,"w":36,"h":61}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Book.png": +{ + "frame": {"x":865,"y":1670,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, @@ -3506,7 +3706,7 @@ }, "Game/Enemies/BookArcane.png": { - "frame": {"x":1,"y":1629,"w":44,"h":59}, + "frame": {"x":911,"y":1670,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, @@ -3514,7 +3714,7 @@ }, "Game/Enemies/BookBelt.png": { - "frame": {"x":47,"y":1631,"w":44,"h":59}, + "frame": {"x":957,"y":1670,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, @@ -3522,7 +3722,7 @@ }, "Game/Enemies/BookBondage.png": { - "frame": {"x":453,"y":1589,"w":50,"h":59}, + "frame": {"x":543,"y":1646,"w":50,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":6,"w":50,"h":59}, @@ -3530,7 +3730,7 @@ }, "Game/Enemies/BookCelestial.png": { - "frame": {"x":93,"y":1636,"w":44,"h":59}, + "frame": {"x":1,"y":1686,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, @@ -3538,7 +3738,7 @@ }, "Game/Enemies/BookChain.png": { - "frame": {"x":178,"y":1638,"w":44,"h":59}, + "frame": {"x":47,"y":1686,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, @@ -3546,7 +3746,7 @@ }, "Game/Enemies/BookElectric.png": { - "frame": {"x":224,"y":1640,"w":44,"h":59}, + "frame": {"x":93,"y":1688,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, @@ -3554,7 +3754,7 @@ }, "Game/Enemies/BookForbidden.png": { - "frame": {"x":270,"y":1642,"w":44,"h":59}, + "frame": {"x":139,"y":1692,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, @@ -3562,7 +3762,7 @@ }, "Game/Enemies/BookIce.png": { - "frame": {"x":316,"y":1644,"w":44,"h":59}, + "frame": {"x":185,"y":1695,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, @@ -3570,7 +3770,7 @@ }, "Game/Enemies/BookNature.png": { - "frame": {"x":362,"y":1647,"w":44,"h":59}, + "frame": {"x":272,"y":1697,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, @@ -3578,7 +3778,7 @@ }, "Game/Enemies/BookRope.png": { - "frame": {"x":453,"y":1650,"w":44,"h":59}, + "frame": {"x":318,"y":1700,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, @@ -3586,7 +3786,7 @@ }, "Game/Enemies/BookSlime.png": { - "frame": {"x":499,"y":1651,"w":44,"h":59}, + "frame": {"x":364,"y":1701,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, @@ -3594,7 +3794,7 @@ }, "Game/Enemies/BookTickle.png": { - "frame": {"x":545,"y":1652,"w":44,"h":59}, + "frame": {"x":446,"y":1703,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, @@ -3602,7 +3802,7 @@ }, "Game/Enemies/BotMissile.png": { - "frame": {"x":309,"y":257,"w":54,"h":42}, + "frame": {"x":363,"y":257,"w":54,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":17,"w":54,"h":42}, @@ -3610,7 +3810,7 @@ }, "Game/Enemies/Bramble.png": { - "frame": {"x":285,"y":1071,"w":55,"h":51}, + "frame": {"x":627,"y":1081,"w":55,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":6,"w":55,"h":51}, @@ -3618,15 +3818,23 @@ }, "Game/Enemies/ChaoticCrystal.png": { - "frame": {"x":385,"y":636,"w":44,"h":46}, + "frame": {"x":660,"y":594,"w":44,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":12,"w":44,"h":46}, "sourceSize": {"w":72,"h":72} }, +"Game/Enemies/CustomSprite/Alisa.png": +{ + "frame": {"x":110,"y":1941,"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/Parov.png": { - "frame": {"x":458,"y":303,"w":54,"h":44}, + "frame": {"x":823,"y":310,"w":54,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":12,"w":54,"h":44}, @@ -3634,23 +3842,63 @@ }, "Game/Enemies/CustomSpriteBound/Nara.png": { - "frame": {"x":150,"y":1066,"w":33,"h":51}, + "frame": {"x":684,"y":1082,"w":33,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":11,"w":33,"h":51}, "sourceSize": {"w":72,"h":72} }, +"Game/Enemies/Deputy.png": +{ + "frame": {"x":499,"y":1956,"w":42,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":12,"y":4,"w":42,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/DollmakerTarget.png": +{ + "frame": {"x":702,"y":1963,"w":37,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, + "sourceSize": {"w":72,"h":72} +}, "Game/Enemies/DragonFlower.png": { - "frame": {"x":702,"y":1083,"w":54,"h":51}, + "frame": {"x":775,"y":1084,"w":54,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":10,"w":54,"h":51}, "sourceSize": {"w":72,"h":72} }, +"Game/Enemies/DragonGirlShadow.png": +{ + "frame": {"x":155,"y":1944,"w":42,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":19,"y":5,"w":42,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/Dressmaker.png": +{ + "frame": {"x":684,"y":1835,"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":684,"y":1835,"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":168,"y":59,"w":33,"h":33}, + "frame": {"x":222,"y":61,"w":33,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":8,"w":33,"h":33}, @@ -3658,7 +3906,7 @@ }, "Game/Enemies/DroneGuardian.png": { - "frame": {"x":912,"y":553,"w":33,"h":48}, + "frame": {"x":331,"y":392,"w":33,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":8,"w":33,"h":48}, @@ -3666,7 +3914,7 @@ }, "Game/Enemies/EarthenMonolith.png": { - "frame": {"x":139,"y":1636,"w":37,"h":59}, + "frame": {"x":750,"y":1713,"w":37,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":8,"w":37,"h":59}, @@ -3674,15 +3922,23 @@ }, "Game/Enemies/ElementalFire.png": { - "frame": {"x":795,"y":1723,"w":41,"h":61}, + "frame": {"x":39,"y":1811,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":7,"w":41,"h":61}, "sourceSize": {"w":72,"h":72} }, +"Game/Enemies/ElementalIce.png": +{ + "frame": {"x":239,"y":1820,"w":56,"h":61}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":7,"w":56,"h":61}, + "sourceSize": {"w":72,"h":72} +}, "Game/Enemies/Elf.png": { - "frame": {"x":891,"y":1744,"w":41,"h":61}, + "frame": {"x":297,"y":1823,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":7,"w":41,"h":61}, @@ -3690,15 +3946,47 @@ }, "Game/Enemies/ElfRanger.png": { - "frame": {"x":407,"y":1771,"w":39,"h":61}, + "frame": {"x":419,"y":1889,"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":702,"y":1963,"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":61,"y":1937,"w":47,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":47,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/EncasedFactoryDoll.png": +{ + "frame": {"x":543,"y":1960,"w":38,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":7,"w":38,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/EncasedFactoryDollMetal.png": +{ + "frame": {"x":500,"y":1892,"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":449,"y":1078,"w":48,"h":51}, + "frame": {"x":302,"y":1124,"w":48,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":8,"w":48,"h":51}, @@ -3706,7 +3994,7 @@ }, "Game/Enemies/EnforcerBotGuardian.png": { - "frame": {"x":499,"y":1080,"w":57,"h":51}, + "frame": {"x":568,"y":1080,"w":57,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":8,"w":57,"h":51}, @@ -3714,7 +4002,7 @@ }, "Game/Enemies/ExplosiveBarrel.png": { - "frame": {"x":917,"y":1386,"w":39,"h":56}, + "frame": {"x":1,"y":1388,"w":39,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":9,"w":39,"h":56}, @@ -3722,7 +4010,7 @@ }, "Game/Enemies/FastSlime.png": { - "frame": {"x":259,"y":1124,"w":58,"h":52}, + "frame": {"x":55,"y":1171,"w":58,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":58,"h":52}, @@ -3730,31 +4018,39 @@ }, "Game/Enemies/Feathers.png": { - "frame": {"x":611,"y":1135,"w":55,"h":52}, + "frame": {"x":587,"y":1187,"w":55,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":6,"w":55,"h":52}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/ForcefieldBot.png": +"Game/Enemies/FireElemental.png": { - "frame": {"x":526,"y":135,"w":54,"h":38}, + "frame": {"x":636,"y":1471,"w":59,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":9,"y":21,"w":54,"h":38}, + "spriteSourceSize": {"x":7,"y":5,"w":59,"h":57}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/Frog.png": { - "frame": {"x":553,"y":304,"w":54,"h":44}, + "frame": {"x":879,"y":311,"w":54,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":12,"w":54,"h":44}, "sourceSize": {"w":72,"h":72} }, +"Game/Enemies/GasBarrel.png": +{ + "frame": {"x":628,"y":1710,"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":707,"y":1596,"w":42,"h":59}, + "frame": {"x":821,"y":1658,"w":42,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":6,"w":42,"h":59}, @@ -3762,7 +4058,7 @@ }, "Game/Enemies/GhostDark.png": { - "frame": {"x":751,"y":1599,"w":47,"h":59}, + "frame": {"x":595,"y":1649,"w":47,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":6,"w":47,"h":59}, @@ -3770,7 +4066,7 @@ }, "Game/Enemies/GiantMushroom.png": { - "frame": {"x":356,"y":1524,"w":48,"h":57}, + "frame": {"x":146,"y":1510,"w":48,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":8,"w":48,"h":57}, @@ -3778,7 +4074,7 @@ }, "Game/Enemies/GlueTechnician.png": { - "frame": {"x":1,"y":1752,"w":41,"h":61}, + "frame": {"x":538,"y":1830,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":7,"w":41,"h":61}, @@ -3786,7 +4082,7 @@ }, "Game/Enemies/HolyOrb.png": { - "frame": {"x":277,"y":1347,"w":55,"h":55}, + "frame": {"x":655,"y":1356,"w":55,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":5,"w":55,"h":55}, @@ -3794,7 +4090,7 @@ }, "Game/Enemies/LabAssistant.png": { - "frame": {"x":628,"y":1717,"w":35,"h":61}, + "frame": {"x":1,"y":1871,"w":35,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":7,"w":35,"h":61}, @@ -3802,7 +4098,7 @@ }, "Game/Enemies/LatexCubeMetal.png": { - "frame": {"x":373,"y":173,"w":39,"h":39}, + "frame": {"x":464,"y":176,"w":39,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":13,"w":39,"h":39}, @@ -3810,15 +4106,31 @@ }, "Game/Enemies/LatexCubeSmall.png": { - "frame": {"x":414,"y":174,"w":39,"h":39}, + "frame": {"x":505,"y":176,"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":42,"y":1392,"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":669,"y":1711,"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":138,"y":212,"w":38,"h":40}, + "frame": {"x":286,"y":214,"w":38,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":12,"w":38,"h":40}, @@ -3826,7 +4138,7 @@ }, "Game/Enemies/Lock.png": { - "frame": {"x":236,"y":1580,"w":52,"h":58}, + "frame": {"x":118,"y":1628,"w":52,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":5,"w":52,"h":58}, @@ -3834,39 +4146,79 @@ }, "Game/Enemies/LockMaster.png": { - "frame": {"x":404,"y":975,"w":53,"h":48}, + "frame": {"x":480,"y":977,"w":53,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":10,"w":53,"h":48}, "sourceSize": {"w":72,"h":72} }, +"Game/Enemies/Maidforce.png": +{ + "frame": {"x":679,"y":1898,"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":499,"y":1775,"w":54,"h":61}, + "frame": {"x":378,"y":1825,"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":259,"y":1949,"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":259,"y":1949,"w":38,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":38,"h":62}, + "sourceSize": {"w":72,"h":72} +}, "Game/Enemies/Mimic.png": { - "frame": {"x":710,"y":178,"w":55,"h":40}, + "frame": {"x":904,"y":182,"w":55,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":16,"w":55,"h":40}, "sourceSize": {"w":72,"h":72} }, +"Game/Enemies/Miner.png": +{ + "frame": {"x":339,"y":1951,"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":481,"y":686,"w":44,"h":48}, + "frame": {"x":383,"y":973,"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":577,"y":1896,"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":499,"y":1712,"w":36,"h":61}, + "frame": {"x":340,"y":1824,"w":36,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":0,"w":36,"h":61}, @@ -3874,7 +4226,7 @@ }, "Game/Enemies/MummyElevator.png": { - "frame": {"x":499,"y":1712,"w":36,"h":61}, + "frame": {"x":340,"y":1824,"w":36,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":0,"w":36,"h":61}, @@ -3882,7 +4234,7 @@ }, "Game/Enemies/Mushy.png": { - "frame": {"x":406,"y":1527,"w":48,"h":57}, + "frame": {"x":96,"y":1567,"w":48,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":8,"w":48,"h":57}, @@ -3890,7 +4242,7 @@ }, "Game/Enemies/MushySick.png": { - "frame": {"x":456,"y":1530,"w":48,"h":57}, + "frame": {"x":146,"y":1569,"w":48,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":8,"w":48,"h":57}, @@ -3898,7 +4250,7 @@ }, "Game/Enemies/NatureSpirit.png": { - "frame": {"x":252,"y":1521,"w":51,"h":57}, + "frame": {"x":410,"y":1522,"w":51,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":5,"w":51,"h":57}, @@ -3906,15 +4258,23 @@ }, "Game/Enemies/Nawashi.png": { - "frame": {"x":505,"y":1590,"w":42,"h":59}, + "frame": {"x":499,"y":1645,"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":928,"y":1793,"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":750,"y":1722,"w":43,"h":61}, + "frame": {"x":868,"y":1855,"w":43,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":6,"w":43,"h":61}, @@ -3922,7 +4282,7 @@ }, "Game/Enemies/NinjaStalker.png": { - "frame": {"x":410,"y":1708,"w":36,"h":61}, + "frame": {"x":82,"y":1811,"w":36,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":6,"w":36,"h":61}, @@ -3930,7 +4290,7 @@ }, "Game/Enemies/Observer.png": { - "frame": {"x":284,"y":301,"w":58,"h":44}, + "frame": {"x":706,"y":309,"w":58,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":7,"w":58,"h":44}, @@ -3938,7 +4298,7 @@ }, "Game/Enemies/OldDrone.png": { - "frame": {"x":319,"y":348,"w":57,"h":45}, + "frame": {"x":695,"y":355,"w":57,"h":45}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":11,"w":57,"h":45}, @@ -3946,7 +4306,7 @@ }, "Game/Enemies/OldTapeDrone.png": { - "frame": {"x":121,"y":1576,"w":57,"h":58}, + "frame": {"x":1,"y":1626,"w":57,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":7,"w":57,"h":58}, @@ -3954,7 +4314,7 @@ }, "Game/Enemies/OneBar.png": { - "frame": {"x":810,"y":1481,"w":46,"h":57}, + "frame": {"x":196,"y":1513,"w":46,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":3,"w":46,"h":57}, @@ -3962,15 +4322,23 @@ }, "Game/Enemies/OrbGuardian.png": { - "frame": {"x":348,"y":1770,"w":57,"h":61}, + "frame": {"x":180,"y":1818,"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":70,"y":170,"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":334,"y":1291,"w":37,"h":55}, + "frame": {"x":318,"y":1344,"w":37,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":5,"w":37,"h":55}, @@ -3978,7 +4346,7 @@ }, "Game/Enemies/PinkAlchemist.png": { - "frame": {"x":607,"y":1780,"w":49,"h":61}, + "frame": {"x":633,"y":1834,"w":49,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":7,"w":49,"h":61}, @@ -3986,7 +4354,7 @@ }, "Game/Enemies/PinkGlueTechnician.png": { - "frame": {"x":44,"y":1754,"w":41,"h":61}, + "frame": {"x":913,"y":1855,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":7,"w":41,"h":61}, @@ -3994,7 +4362,7 @@ }, "Game/Enemies/PinkLabAssistant.png": { - "frame": {"x":713,"y":1719,"w":35,"h":61}, + "frame": {"x":81,"y":1874,"w":35,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":7,"w":35,"h":61}, @@ -4002,7 +4370,7 @@ }, "Game/Enemies/RedSlime.png": { - "frame": {"x":858,"y":139,"w":38,"h":38}, + "frame": {"x":791,"y":140,"w":38,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":18,"w":38,"h":38}, @@ -4010,7 +4378,7 @@ }, "Game/Enemies/Ribbons.png": { - "frame": {"x":429,"y":1185,"w":51,"h":52}, + "frame": {"x":829,"y":1192,"w":51,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":12,"w":51,"h":52}, @@ -4018,7 +4386,7 @@ }, "Game/Enemies/RopeMinion.png": { - "frame": {"x":604,"y":1593,"w":43,"h":59}, + "frame": {"x":538,"y":1707,"w":43,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":5,"w":43,"h":59}, @@ -4026,7 +4394,7 @@ }, "Game/Enemies/RopeSnake.png": { - "frame": {"x":991,"y":905,"w":29,"h":51}, + "frame": {"x":616,"y":1134,"w":29,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":9,"w":29,"h":51}, @@ -4034,7 +4402,7 @@ }, "Game/Enemies/RubberBarrel.png": { - "frame": {"x":145,"y":1397,"w":39,"h":56}, + "frame": {"x":1,"y":1446,"w":39,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":9,"w":39,"h":56}, @@ -4042,7 +4410,7 @@ }, "Game/Enemies/RubberSilo.png": { - "frame": {"x":655,"y":307,"w":54,"h":44}, + "frame": {"x":935,"y":311,"w":54,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":17,"w":54,"h":44}, @@ -4050,7 +4418,7 @@ }, "Game/Enemies/RubberTurret.png": { - "frame": {"x":694,"y":931,"w":54,"h":47}, + "frame": {"x":598,"y":930,"w":54,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":14,"w":54,"h":47}, @@ -4058,7 +4426,7 @@ }, "Game/Enemies/Scarves.png": { - "frame": {"x":598,"y":1415,"w":46,"h":56}, + "frame": {"x":808,"y":1416,"w":46,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":7,"w":46,"h":56}, @@ -4066,7 +4434,7 @@ }, "Game/Enemies/ShadowHand.png": { - "frame": {"x":319,"y":1127,"w":58,"h":52}, + "frame": {"x":115,"y":1171,"w":58,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":13,"w":58,"h":52}, @@ -4074,39 +4442,39 @@ }, "Game/Enemies/ShadyQuest.png": { - "frame": {"x":410,"y":1708,"w":36,"h":61}, + "frame": {"x":82,"y":1811,"w":36,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":6,"w":36,"h":61}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/SkeletonArcher.png": +"Game/Enemies/ShopkeeperRescue.png": { - "frame": {"x":141,"y":1455,"w":32,"h":58}, + "frame": {"x":986,"y":1731,"w":35,"h":60}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":22,"y":8,"w":32,"h":58}, + "spriteSourceSize": {"x":21,"y":9,"w":35,"h":60}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/SlimeMold.png": +"Game/Enemies/ShopkeeperStart.png": { - "frame": {"x":259,"y":347,"w":58,"h":45}, + "frame": {"x":618,"y":1897,"w":59,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":6,"y":13,"w":58,"h":45}, + "spriteSourceSize": {"x":5,"y":9,"w":59,"h":62}, "sourceSize": {"w":72,"h":72} }, -"Game/Enemies/SmallSlime.png": +"Game/Enemies/SlimeMold.png": { - "frame": {"x":344,"y":302,"w":55,"h":44}, + "frame": {"x":549,"y":353,"w":58,"h":45}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":9,"y":16,"w":55,"h":44}, + "spriteSourceSize": {"x":6,"y":13,"w":58,"h":45}, "sourceSize": {"w":72,"h":72} }, "Game/Enemies/SmallSlimeLeaper.png": { - "frame": {"x":385,"y":395,"w":40,"h":46}, + "frame": {"x":97,"y":386,"w":40,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":10,"w":40,"h":46}, @@ -4114,7 +4482,7 @@ }, "Game/Enemies/SoulCrystal.png": { - "frame": {"x":782,"y":1193,"w":53,"h":53}, + "frame": {"x":168,"y":1227,"w":53,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":8,"w":53,"h":53}, @@ -4122,7 +4490,7 @@ }, "Game/Enemies/Statue.png": { - "frame": {"x":322,"y":1235,"w":50,"h":54}, + "frame": {"x":1,"y":1275,"w":50,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":9,"w":50,"h":54}, @@ -4130,7 +4498,7 @@ }, "Game/Enemies/StatueDart.png": { - "frame": {"x":322,"y":1235,"w":50,"h":54}, + "frame": {"x":1,"y":1275,"w":50,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":7,"w":50,"h":54}, @@ -4138,15 +4506,39 @@ }, "Game/Enemies/StatueGag.png": { - "frame": {"x":429,"y":1239,"w":50,"h":54}, + "frame": {"x":857,"y":1307,"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":220,"y":1017,"w":59,"h":49}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":9,"w":59,"h":49}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/TheWarden1.png": +{ + "frame": {"x":583,"y":1961,"w":38,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":4,"w":38,"h":63}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Enemies/TheWarden2.png": +{ + "frame": {"x":417,"y":1952,"w":39,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":4,"w":39,"h":63}, + "sourceSize": {"w":72,"h":72} +}, "Game/Enemies/TickleHand.png": { - "frame": {"x":379,"y":1129,"w":58,"h":52}, + "frame": {"x":175,"y":1173,"w":58,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":13,"w":58,"h":52}, @@ -4154,7 +4546,7 @@ }, "Game/Enemies/TickleHandSlave.png": { - "frame": {"x":379,"y":1129,"w":58,"h":52}, + "frame": {"x":175,"y":1173,"w":58,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":13,"w":58,"h":52}, @@ -4162,7 +4554,7 @@ }, "Game/Enemies/TimeGhost.png": { - "frame": {"x":858,"y":1496,"w":34,"h":59}, + "frame": {"x":854,"y":1597,"w":34,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":8,"w":34,"h":59}, @@ -4170,7 +4562,7 @@ }, "Game/Enemies/Toad.png": { - "frame": {"x":668,"y":1136,"w":55,"h":52}, + "frame": {"x":715,"y":1190,"w":55,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":4,"w":55,"h":52}, @@ -4178,7 +4570,7 @@ }, "Game/Enemies/VinePlant.png": { - "frame": {"x":285,"y":1020,"w":55,"h":49}, + "frame": {"x":465,"y":1027,"w":55,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":14,"w":55,"h":49}, @@ -4186,7 +4578,7 @@ }, "Game/Enemies/WardenArcher.png": { - "frame": {"x":751,"y":1660,"w":42,"h":60}, + "frame": {"x":297,"y":1761,"w":42,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":7,"w":42,"h":60}, @@ -4194,7 +4586,7 @@ }, "Game/Enemies/WardenMage.png": { - "frame": {"x":934,"y":1749,"w":55,"h":60}, + "frame": {"x":240,"y":1758,"w":55,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":7,"w":55,"h":60}, @@ -4202,7 +4594,7 @@ }, "Game/Enemies/WaterMote.png": { - "frame": {"x":186,"y":1400,"w":51,"h":56}, + "frame": {"x":528,"y":1408,"w":51,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":14,"w":51,"h":56}, @@ -4210,7 +4602,7 @@ }, "Game/Enemies/WolfTapeDrones.png": { - "frame": {"x":197,"y":970,"w":51,"h":47}, + "frame": {"x":815,"y":933,"w":51,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":12,"w":51,"h":47}, @@ -4218,7 +4610,7 @@ }, "Game/EnemiesBound/Adventurer_Brat.png": { - "frame": {"x":49,"y":1116,"w":39,"h":51}, + "frame": {"x":539,"y":1133,"w":39,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":9,"w":39,"h":51}, @@ -4226,7 +4618,7 @@ }, "Game/EnemiesBound/Adventurer_Dom.png": { - "frame": {"x":113,"y":1282,"w":35,"h":54}, + "frame": {"x":546,"y":1295,"w":35,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":9,"w":35,"h":54}, @@ -4234,7 +4626,7 @@ }, "Game/EnemiesBound/Adventurer_Sub.png": { - "frame": {"x":521,"y":1188,"w":34,"h":52}, + "frame": {"x":886,"y":1142,"w":34,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":7,"w":34,"h":52}, @@ -4242,7 +4634,7 @@ }, "Game/EnemiesBound/Adventurer_Switch.png": { - "frame": {"x":982,"y":1168,"w":41,"h":52}, + "frame": {"x":448,"y":1183,"w":41,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":7,"w":41,"h":52}, @@ -4250,7 +4642,7 @@ }, "Game/EnemiesBound/Alchemist.png": { - "frame": {"x":927,"y":1329,"w":41,"h":55}, + "frame": {"x":275,"y":1342,"w":41,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":7,"w":41,"h":55}, @@ -4258,7 +4650,7 @@ }, "Game/EnemiesBound/AlchemistPet.png": { - "frame": {"x":858,"y":1438,"w":43,"h":56}, + "frame": {"x":464,"y":1466,"w":43,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":4,"w":43,"h":56}, @@ -4266,15 +4658,31 @@ }, "Game/EnemiesBound/Alkahestor.png": { - "frame": {"x":934,"y":1273,"w":41,"h":54}, + "frame": {"x":324,"y":1288,"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":741,"y":1963,"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":856,"y":1420,"w":36,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":24,"y":10,"w":36,"h":56}, + "sourceSize": {"w":72,"h":72} +}, "Game/EnemiesBound/Bandit.png": { - "frame": {"x":165,"y":1229,"w":38,"h":53}, + "frame": {"x":544,"y":1240,"w":38,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":7,"w":38,"h":53}, @@ -4282,7 +4690,7 @@ }, "Game/EnemiesBound/BanditChief.png": { - "frame": {"x":613,"y":1030,"w":55,"h":50}, + "frame": {"x":1,"y":1061,"w":55,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":19,"w":55,"h":50}, @@ -4290,7 +4698,7 @@ }, "Game/EnemiesBound/BanditGrappler.png": { - "frame": {"x":499,"y":1413,"w":48,"h":56}, + "frame": {"x":146,"y":1452,"w":48,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":7,"w":48,"h":56}, @@ -4298,7 +4706,7 @@ }, "Game/EnemiesBound/Cleric.png": { - "frame": {"x":84,"y":1821,"w":38,"h":61}, + "frame": {"x":537,"y":1893,"w":38,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":2,"w":38,"h":61}, @@ -4306,15 +4714,23 @@ }, "Game/EnemiesBound/CorruptedAdventurer.png": { - "frame": {"x":637,"y":1656,"w":36,"h":59}, + "frame": {"x":789,"y":1719,"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":623,"y":1961,"w":38,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":7,"w":38,"h":63}, + "sourceSize": {"w":72,"h":72} +}, "Game/EnemiesBound/Demon.png": { - "frame": {"x":433,"y":134,"w":57,"h":38}, + "frame": {"x":525,"y":136,"w":57,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":34,"w":57,"h":38}, @@ -4322,7 +4738,7 @@ }, "Game/EnemiesBound/Deputy.png": { - "frame": {"x":1,"y":1222,"w":33,"h":53}, + "frame": {"x":882,"y":1196,"w":33,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":14,"w":33,"h":53}, @@ -4330,7 +4746,7 @@ }, "Game/EnemiesBound/Dragon.png": { - "frame": {"x":886,"y":1213,"w":47,"h":53}, + "frame": {"x":276,"y":1231,"w":47,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":5,"w":47,"h":53}, @@ -4338,31 +4754,31 @@ }, "Game/EnemiesBound/DragonIce.png": { - "frame": {"x":658,"y":1781,"w":47,"h":61}, + "frame": {"x":733,"y":1836,"w":47,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":5,"w":47,"h":61}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/DragonShadow.png": +"Game/EnemiesBound/DragonPoison.png": { - "frame": {"x":577,"y":930,"w":57,"h":47}, + "frame": {"x":750,"y":1532,"w":49,"h":57}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":2,"y":25,"w":57,"h":47}, + "spriteSourceSize": {"x":18,"y":9,"w":49,"h":57}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/DragonShield.png": +"Game/EnemiesBound/DragonShadow.png": { - "frame": {"x":41,"y":168,"w":49,"h":39}, + "frame": {"x":481,"y":928,"w":57,"h":47}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":15,"y":28,"w":49,"h":39}, + "spriteSourceSize": {"x":2,"y":25,"w":57,"h":47}, "sourceSize": {"w":72,"h":72} }, "Game/EnemiesBound/Dryad.png": { - "frame": {"x":424,"y":1352,"w":41,"h":55}, + "frame": {"x":856,"y":1363,"w":41,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":3,"w":41,"h":55}, @@ -4370,7 +4786,7 @@ }, "Game/EnemiesBound/Elemental.png": { - "frame": {"x":610,"y":1189,"w":56,"h":53}, + "frame": {"x":917,"y":1208,"w":56,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":7,"w":56,"h":53}, @@ -4378,7 +4794,7 @@ }, "Game/EnemiesBound/ElementalAir.png": { - "frame": {"x":805,"y":1364,"w":54,"h":56}, + "frame": {"x":162,"y":1394,"w":54,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":54,"h":56}, @@ -4386,7 +4802,7 @@ }, "Game/EnemiesBound/ElementalFire.png": { - "frame": {"x":755,"y":1138,"w":36,"h":52}, + "frame": {"x":677,"y":1189,"w":36,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":7,"w":36,"h":52}, @@ -4394,7 +4810,7 @@ }, "Game/EnemiesBound/ElementalIce.png": { - "frame": {"x":775,"y":1422,"w":44,"h":56}, + "frame": {"x":383,"y":1463,"w":44,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":7,"w":44,"h":56}, @@ -4402,7 +4818,7 @@ }, "Game/EnemiesBound/ElementalLatex.png": { - "frame": {"x":667,"y":1082,"w":33,"h":51}, + "frame": {"x":887,"y":1089,"w":33,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":17,"w":33,"h":51}, @@ -4410,7 +4826,7 @@ }, "Game/EnemiesBound/ElementalRope.png": { - "frame": {"x":549,"y":1414,"w":47,"h":56}, + "frame": {"x":196,"y":1455,"w":47,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":11,"w":47,"h":56}, @@ -4418,7 +4834,7 @@ }, "Game/EnemiesBound/ElementalRubber.png": { - "frame": {"x":758,"y":1085,"w":33,"h":51}, + "frame": {"x":56,"y":1117,"w":33,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":17,"w":33,"h":51}, @@ -4426,7 +4842,7 @@ }, "Game/EnemiesBound/Elf.png": { - "frame": {"x":1,"y":1506,"w":34,"h":59}, + "frame": {"x":644,"y":1649,"w":34,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":0,"w":34,"h":59}, @@ -4434,23 +4850,31 @@ }, "Game/EnemiesBound/ElfRanger.png": { - "frame": {"x":288,"y":134,"w":38,"h":37}, + "frame": {"x":280,"y":134,"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": +"Game/EnemiesBound/EncasedFactoryDollMetal.png": { - "frame": {"x":481,"y":1241,"w":37,"h":54}, + "frame": {"x":782,"y":1905,"w":35,"h":62}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":21,"y":5,"w":37,"h":54}, + "spriteSourceSize": {"x":21,"y":7,"w":35,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/EnemiesBound/FactoryDoll.png": +{ + "frame": {"x":702,"y":1963,"w":37,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, "sourceSize": {"w":72,"h":72} }, "Game/EnemiesBound/GlueTechnician.png": { - "frame": {"x":305,"y":1523,"w":49,"h":57}, + "frame": {"x":401,"y":1581,"w":49,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":7,"w":49,"h":57}, @@ -4458,7 +4882,7 @@ }, "Game/EnemiesBound/GuardHeavy.png": { - "frame": {"x":423,"y":1467,"w":42,"h":58}, + "frame": {"x":172,"y":1632,"w":42,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":5,"w":42,"h":58}, @@ -4466,7 +4890,7 @@ }, "Game/EnemiesBound/Head/AlchemistPet.png": { - "frame": {"x":634,"y":63,"w":28,"h":34}, + "frame": {"x":466,"y":61,"w":28,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":6,"w":28,"h":34}, @@ -4474,7 +4898,7 @@ }, "Game/EnemiesBound/Head/Angel.png": { - "frame": {"x":617,"y":137,"w":32,"h":38}, + "frame": {"x":36,"y":170,"w":32,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":3,"w":32,"h":38}, @@ -4482,23 +4906,15 @@ }, "Game/EnemiesBound/Head/Apprentice.png": { - "frame": {"x":130,"y":59,"w":36,"h":33}, + "frame": {"x":960,"y":31,"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/BanditChief.png": -{ - "frame": {"x":191,"y":1,"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/BanditHunter.png": { - "frame": {"x":457,"y":29,"w":30,"h":30}, + "frame": {"x":309,"y":29,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":7,"w":30,"h":30}, @@ -4506,7 +4922,7 @@ }, "Game/EnemiesBound/Head/BanditPet.png": { - "frame": {"x":190,"y":28,"w":34,"h":29}, + "frame": {"x":76,"y":27,"w":34,"h":29}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":7,"w":34,"h":29}, @@ -4514,23 +4930,15 @@ }, "Game/EnemiesBound/Head/CherubFire.png": { - "frame": {"x":93,"y":132,"w":54,"h":37}, + "frame": {"x":124,"y":131,"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/Conjurer.png": -{ - "frame": {"x":355,"y":29,"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/ConjurerTickler.png": { - "frame": {"x":732,"y":138,"w":41,"h":38}, + "frame": {"x":665,"y":139,"w":41,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":1,"w":41,"h":38}, @@ -4538,7 +4946,7 @@ }, "Game/EnemiesBound/Head/Dragon.png": { - "frame": {"x":432,"y":926,"w":47,"h":47}, + "frame": {"x":1,"y":962,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":3,"w":47,"h":47}, @@ -4546,7 +4954,7 @@ }, "Game/EnemiesBound/Head/DragonCrystal.png": { - "frame": {"x":652,"y":353,"w":47,"h":46}, + "frame": {"x":884,"y":357,"w":47,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":3,"w":47,"h":46}, @@ -4554,7 +4962,7 @@ }, "Game/EnemiesBound/Head/DragonIce.png": { - "frame": {"x":701,"y":354,"w":47,"h":46}, + "frame": {"x":933,"y":357,"w":47,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":4,"w":47,"h":46}, @@ -4562,7 +4970,7 @@ }, "Game/EnemiesBound/Head/DragonLeader.png": { - "frame": {"x":528,"y":929,"w":47,"h":47}, + "frame": {"x":144,"y":967,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":3,"w":47,"h":47}, @@ -4570,7 +4978,7 @@ }, "Game/EnemiesBound/Head/DragonPoison.png": { - "frame": {"x":354,"y":974,"w":48,"h":47}, + "frame": {"x":956,"y":950,"w":48,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":3,"w":48,"h":47}, @@ -4578,7 +4986,7 @@ }, "Game/EnemiesBound/Head/DragonShadow.png": { - "frame": {"x":48,"y":964,"w":47,"h":47}, + "frame": {"x":240,"y":968,"w":47,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":3,"w":47,"h":47}, @@ -4586,23 +4994,15 @@ }, "Game/EnemiesBound/Head/DragonShield.png": { - "frame": {"x":188,"y":172,"w":49,"h":39}, + "frame": {"x":127,"y":170,"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":1,"y":128,"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":609,"y":352,"w":41,"h":46}, + "frame": {"x":982,"y":360,"w":41,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":3,"w":41,"h":46}, @@ -4610,7 +5010,7 @@ }, "Game/EnemiesBound/Head/Elemental.png": { - "frame": {"x":188,"y":133,"w":53,"h":37}, + "frame": {"x":180,"y":134,"w":53,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":7,"w":53,"h":37}, @@ -4618,7 +5018,7 @@ }, "Game/EnemiesBound/Head/ElementalAir.png": { - "frame": {"x":106,"y":1453,"w":33,"h":57}, + "frame": {"x":429,"y":1463,"w":33,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":3,"w":33,"h":57}, @@ -4626,7 +5026,7 @@ }, "Game/EnemiesBound/Head/ElementalEarth.png": { - "frame": {"x":1,"y":339,"w":30,"h":45}, + "frame": {"x":491,"y":304,"w":30,"h":45}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":7,"w":30,"h":45}, @@ -4634,39 +5034,39 @@ }, "Game/EnemiesBound/Head/ElementalIce.png": { - "frame": {"x":245,"y":1232,"w":37,"h":53}, + "frame": {"x":624,"y":1242,"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/ElementalLeather.png": +"Game/EnemiesBound/Head/ElementalWater.png": { - "frame": {"x":660,"y":1,"w":35,"h":27}, + "frame": {"x":180,"y":134,"w":53,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":22,"y":5,"w":35,"h":27}, + "spriteSourceSize": {"x":13,"y":7,"w":53,"h":37}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/Head/ElementalWater.png": +"Game/EnemiesBound/Head/Elf.png": { - "frame": {"x":188,"y":133,"w":53,"h":37}, + "frame": {"x":210,"y":256,"w":34,"h":41}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":13,"y":7,"w":53,"h":37}, + "spriteSourceSize": {"x":24,"y":7,"w":34,"h":41}, "sourceSize": {"w":72,"h":72} }, -"Game/EnemiesBound/Head/Elf.png": +"Game/EnemiesBound/Head/ElfRanger.png": { - "frame": {"x":369,"y":214,"w":34,"h":41}, + "frame": {"x":172,"y":256,"w":36,"h":41}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":24,"y":7,"w":34,"h":41}, + "spriteSourceSize": {"x":22,"y":7,"w":36,"h":41}, "sourceSize": {"w":72,"h":72} }, "Game/EnemiesBound/Head/FastZombie.png": { - "frame": {"x":99,"y":57,"w":29,"h":32}, + "frame": {"x":929,"y":31,"w":29,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":1,"w":29,"h":32}, @@ -4674,7 +5074,7 @@ }, "Game/EnemiesBound/Head/GreaterSkeleton.png": { - "frame": {"x":389,"y":29,"w":32,"h":30}, + "frame": {"x":241,"y":29,"w":32,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":2,"w":32,"h":30}, @@ -4682,15 +5082,23 @@ }, "Game/EnemiesBound/Head/Guard.png": { - "frame": {"x":258,"y":29,"w":28,"h":29}, + "frame": {"x":144,"y":27,"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":816,"y":1,"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":423,"y":29,"w":32,"h":30}, + "frame": {"x":275,"y":29,"w":32,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":2,"w":32,"h":30}, @@ -4698,7 +5106,7 @@ }, "Game/EnemiesBound/Head/HighWizard.png": { - "frame": {"x":233,"y":60,"w":36,"h":33}, + "frame": {"x":1,"y":58,"w":36,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":0,"w":36,"h":33}, @@ -4706,7 +5114,7 @@ }, "Game/EnemiesBound/Head/Jailer.png": { - "frame": {"x":288,"y":29,"w":28,"h":29}, + "frame": {"x":174,"y":27,"w":28,"h":29}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":3,"w":28,"h":29}, @@ -4714,7 +5122,7 @@ }, "Game/EnemiesBound/Head/JungleDryad.png": { - "frame": {"x":609,"y":352,"w":41,"h":46}, + "frame": {"x":982,"y":360,"w":41,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":3,"w":41,"h":46}, @@ -4722,47 +5130,23 @@ }, "Game/EnemiesBound/Head/MageZombie.png": { - "frame": {"x":99,"y":57,"w":29,"h":32}, + "frame": {"x":929,"y":31,"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/Maid.png": -{ - "frame": {"x":697,"y":1,"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":968,"y":1,"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":733,"y":1,"w":34,"h":27}, + "frame": {"x":611,"y":1,"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/MeleeCleric.png": -{ - "frame": {"x":645,"y":30,"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/Miner.png": { - "frame": {"x":805,"y":1,"w":33,"h":27}, + "frame": {"x":683,"y":1,"w":33,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":5,"w":33,"h":27}, @@ -4770,7 +5154,7 @@ }, "Game/EnemiesBound/Head/MummyCursed.png": { - "frame": {"x":875,"y":1,"w":30,"h":27}, + "frame": {"x":753,"y":1,"w":30,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":6,"w":30,"h":27}, @@ -4778,7 +5162,7 @@ }, "Game/EnemiesBound/Head/NawashiZombie.png": { - "frame": {"x":99,"y":57,"w":29,"h":32}, + "frame": {"x":929,"y":31,"w":29,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":1,"w":29,"h":32}, @@ -4786,7 +5170,7 @@ }, "Game/EnemiesBound/Head/Necromancer.png": { - "frame": {"x":309,"y":1,"w":26,"h":26}, + "frame": {"x":415,"y":1,"w":26,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, @@ -4794,7 +5178,7 @@ }, "Game/EnemiesBound/Head/Ninja.png": { - "frame": {"x":840,"y":1,"w":33,"h":27}, + "frame": {"x":718,"y":1,"w":33,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":6,"w":33,"h":27}, @@ -4802,7 +5186,7 @@ }, "Game/EnemiesBound/Head/NinjaStalker.png": { - "frame": {"x":769,"y":1,"w":34,"h":27}, + "frame": {"x":647,"y":1,"w":34,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":6,"w":34,"h":27}, @@ -4810,7 +5194,7 @@ }, "Game/EnemiesBound/Head/SamuraiZombie.png": { - "frame": {"x":813,"y":30,"w":34,"h":32}, + "frame": {"x":623,"y":30,"w":34,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":1,"w":34,"h":32}, @@ -4818,7 +5202,7 @@ }, "Game/EnemiesBound/Head/SlimeAdv.png": { - "frame": {"x":153,"y":28,"w":35,"h":29}, + "frame": {"x":39,"y":27,"w":35,"h":29}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":7,"w":35,"h":29}, @@ -4826,7 +5210,7 @@ }, "Game/EnemiesBound/Head/TalismanZombie.png": { - "frame": {"x":988,"y":102,"w":30,"h":36}, + "frame": {"x":154,"y":93,"w":30,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":2,"w":30,"h":36}, @@ -4834,7 +5218,7 @@ }, "Game/EnemiesBound/Head/Witch.png": { - "frame": {"x":337,"y":1,"w":26,"h":26}, + "frame": {"x":443,"y":1,"w":26,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, @@ -4842,7 +5226,7 @@ }, "Game/EnemiesBound/Head/WitchChain.png": { - "frame": {"x":365,"y":1,"w":26,"h":26}, + "frame": {"x":471,"y":1,"w":26,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, @@ -4850,7 +5234,7 @@ }, "Game/EnemiesBound/Head/WitchEarth.png": { - "frame": {"x":393,"y":1,"w":26,"h":26}, + "frame": {"x":499,"y":1,"w":26,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, @@ -4858,7 +5242,7 @@ }, "Game/EnemiesBound/Head/WitchFlame.png": { - "frame": {"x":576,"y":1,"w":26,"h":26}, + "frame": {"x":527,"y":1,"w":26,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, @@ -4866,7 +5250,7 @@ }, "Game/EnemiesBound/Head/WitchIce.png": { - "frame": {"x":604,"y":1,"w":26,"h":26}, + "frame": {"x":555,"y":1,"w":26,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, @@ -4874,7 +5258,7 @@ }, "Game/EnemiesBound/Head/WitchShock.png": { - "frame": {"x":337,"y":1,"w":26,"h":26}, + "frame": {"x":443,"y":1,"w":26,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, @@ -4882,7 +5266,7 @@ }, "Game/EnemiesBound/Head/WitchSlime.png": { - "frame": {"x":318,"y":29,"w":35,"h":30}, + "frame": {"x":204,"y":29,"w":35,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":7,"w":35,"h":30}, @@ -4890,7 +5274,7 @@ }, "Game/EnemiesBound/Head/WitchWater.png": { - "frame": {"x":632,"y":1,"w":26,"h":26}, + "frame": {"x":583,"y":1,"w":26,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":7,"w":26,"h":26}, @@ -4898,7 +5282,7 @@ }, "Game/EnemiesBound/Head/WolfExecutive.png": { - "frame": {"x":664,"y":63,"w":28,"h":34}, + "frame": {"x":496,"y":62,"w":28,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":6,"w":28,"h":34}, @@ -4906,7 +5290,7 @@ }, "Game/EnemiesBound/Head/Wolfgirl.png": { - "frame": {"x":203,"y":60,"w":28,"h":33}, + "frame": {"x":395,"y":61,"w":28,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":6,"w":28,"h":33}, @@ -4914,7 +5298,7 @@ }, "Game/EnemiesBound/Head/WolfgirlPet.png": { - "frame": {"x":634,"y":63,"w":28,"h":34}, + "frame": {"x":466,"y":61,"w":28,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":6,"w":28,"h":34}, @@ -4922,7 +5306,7 @@ }, "Game/EnemiesBound/Head/WolfGuard.png": { - "frame": {"x":785,"y":30,"w":26,"h":32}, + "frame": {"x":595,"y":30,"w":26,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":7,"w":26,"h":32}, @@ -4930,7 +5314,7 @@ }, "Game/EnemiesBound/Head/WolfOperative.png": { - "frame": {"x":485,"y":1,"w":29,"h":26}, + "frame": {"x":268,"y":1,"w":29,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":6,"w":29,"h":26}, @@ -4938,7 +5322,7 @@ }, "Game/EnemiesBound/Head/Zombie.png": { - "frame": {"x":99,"y":57,"w":29,"h":32}, + "frame": {"x":929,"y":31,"w":29,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":1,"w":29,"h":32}, @@ -4946,7 +5330,7 @@ }, "Game/EnemiesBound/HolyConstruct.png": { - "frame": {"x":93,"y":132,"w":54,"h":37}, + "frame": {"x":124,"y":131,"w":54,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":28,"w":54,"h":37}, @@ -4954,7 +5338,7 @@ }, "Game/EnemiesBound/LabAssistant.png": { - "frame": {"x":509,"y":1355,"w":59,"h":56}, + "frame": {"x":467,"y":1408,"w":59,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":12,"w":59,"h":56}, @@ -4962,15 +5346,23 @@ }, "Game/EnemiesBound/Maid.png": { - "frame": {"x":109,"y":1395,"w":34,"h":56}, + "frame": {"x":311,"y":1401,"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":434,"y":1826,"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":351,"y":1708,"w":57,"h":60}, + "frame": {"x":181,"y":1756,"w":57,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":6,"w":57,"h":60}, @@ -4978,7 +5370,7 @@ }, "Game/EnemiesBound/MaidforcePara.png": { - "frame": {"x":424,"y":1409,"w":41,"h":56}, + "frame": {"x":894,"y":1432,"w":41,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":3,"w":41,"h":56}, @@ -4986,7 +5378,7 @@ }, "Game/EnemiesBound/MaidforceStalker.png": { - "frame": {"x":150,"y":1284,"w":34,"h":54}, + "frame": {"x":583,"y":1296,"w":34,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":5,"w":34,"h":54}, @@ -4994,7 +5386,7 @@ }, "Game/EnemiesBound/MeleeCleric.png": { - "frame": {"x":712,"y":1535,"w":38,"h":59}, + "frame": {"x":710,"y":1712,"w":38,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":2,"w":38,"h":59}, @@ -5002,7 +5394,7 @@ }, "Game/EnemiesBound/Miner.png": { - "frame": {"x":984,"y":1062,"w":34,"h":51}, + "frame": {"x":580,"y":1133,"w":34,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":5,"w":34,"h":51}, @@ -5010,7 +5402,7 @@ }, "Game/EnemiesBound/Mummy.png": { - "frame": {"x":124,"y":1823,"w":38,"h":62}, + "frame": {"x":299,"y":1950,"w":38,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":5,"w":38,"h":62}, @@ -5018,7 +5410,7 @@ }, "Game/EnemiesBound/MummyCursed.png": { - "frame": {"x":313,"y":1705,"w":36,"h":60}, + "frame": {"x":1,"y":1809,"w":36,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":9,"w":36,"h":60}, @@ -5026,7 +5418,7 @@ }, "Game/EnemiesBound/Nawashi.png": { - "frame": {"x":36,"y":1223,"w":41,"h":53}, + "frame": {"x":415,"y":1237,"w":41,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":8,"w":41,"h":53}, @@ -5034,7 +5426,7 @@ }, "Game/EnemiesBound/NinjaStalker.png": { - "frame": {"x":205,"y":1232,"w":38,"h":53}, + "frame": {"x":584,"y":1241,"w":38,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":6,"w":38,"h":53}, @@ -5042,7 +5434,7 @@ }, "Game/EnemiesBound/SamuraiZombie.png": { - "frame": {"x":234,"y":1459,"w":36,"h":58}, + "frame": {"x":1,"y":1504,"w":36,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":7,"w":36,"h":58}, @@ -5050,7 +5442,7 @@ }, "Game/EnemiesBound/SlimeEnthusiast.png": { - "frame": {"x":570,"y":1356,"w":59,"h":56}, + "frame": {"x":581,"y":1410,"w":59,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":12,"w":59,"h":56}, @@ -5058,7 +5450,7 @@ }, "Game/EnemiesBound/TalismanZombie.png": { - "frame": {"x":467,"y":1411,"w":30,"h":57}, + "frame": {"x":991,"y":1434,"w":30,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":25,"y":2,"w":30,"h":57}, @@ -5066,7 +5458,7 @@ }, "Game/EnemiesBound/TapedDoll.png": { - "frame": {"x":977,"y":1277,"w":37,"h":54}, + "frame": {"x":414,"y":1292,"w":37,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":5,"w":37,"h":54}, @@ -5074,7 +5466,7 @@ }, "Game/EnemiesBound/TheWarden.png": { - "frame": {"x":272,"y":1462,"w":53,"h":57}, + "frame": {"x":801,"y":1533,"w":53,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":10,"w":53,"h":57}, @@ -5082,7 +5474,7 @@ }, "Game/EnemiesBound/WardenArcher.png": { - "frame": {"x":675,"y":1657,"w":36,"h":59}, + "frame": {"x":827,"y":1719,"w":36,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":7,"w":36,"h":59}, @@ -5090,7 +5482,7 @@ }, "Game/EnemiesBound/WardenMage.png": { - "frame": {"x":1,"y":1690,"w":42,"h":60}, + "frame": {"x":538,"y":1768,"w":42,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":7,"w":42,"h":60}, @@ -5098,7 +5490,7 @@ }, "Game/EnemiesBound/Witch.png": { - "frame": {"x":305,"y":1767,"w":41,"h":61}, + "frame": {"x":956,"y":1855,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, @@ -5106,7 +5498,7 @@ }, "Game/EnemiesBound/WitchChain.png": { - "frame": {"x":707,"y":1782,"w":41,"h":61}, + "frame": {"x":38,"y":1874,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, @@ -5114,7 +5506,7 @@ }, "Game/EnemiesBound/WitchEarth.png": { - "frame": {"x":750,"y":1785,"w":41,"h":61}, + "frame": {"x":118,"y":1878,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, @@ -5122,7 +5514,7 @@ }, "Game/EnemiesBound/WitchFlame.png": { - "frame": {"x":793,"y":1786,"w":41,"h":61}, + "frame": {"x":161,"y":1881,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, @@ -5130,7 +5522,7 @@ }, "Game/EnemiesBound/WitchIce.png": { - "frame": {"x":836,"y":1804,"w":41,"h":61}, + "frame": {"x":204,"y":1883,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, @@ -5138,7 +5530,7 @@ }, "Game/EnemiesBound/WitchRope.png": { - "frame": {"x":750,"y":1785,"w":41,"h":61}, + "frame": {"x":118,"y":1878,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, @@ -5146,7 +5538,7 @@ }, "Game/EnemiesBound/WitchShock.png": { - "frame": {"x":879,"y":1807,"w":41,"h":61}, + "frame": {"x":247,"y":1883,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, @@ -5154,7 +5546,7 @@ }, "Game/EnemiesBound/WitchSlime.png": { - "frame": {"x":922,"y":1811,"w":41,"h":61}, + "frame": {"x":290,"y":1886,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, @@ -5162,7 +5554,7 @@ }, "Game/EnemiesBound/WitchWater.png": { - "frame": {"x":965,"y":1811,"w":41,"h":61}, + "frame": {"x":333,"y":1887,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":0,"w":41,"h":61}, @@ -5170,7 +5562,7 @@ }, "Game/EnemiesBound/WolfExecutive.png": { - "frame": {"x":903,"y":1444,"w":43,"h":56}, + "frame": {"x":509,"y":1466,"w":43,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":43,"h":56}, @@ -5178,7 +5570,7 @@ }, "Game/EnemiesBound/Wolfgirl.png": { - "frame": {"x":79,"y":1225,"w":41,"h":53}, + "frame": {"x":458,"y":1238,"w":41,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":6,"w":41,"h":53}, @@ -5186,7 +5578,7 @@ }, "Game/EnemiesBound/WolfgirlPet.png": { - "frame": {"x":1,"y":1448,"w":43,"h":56}, + "frame": {"x":554,"y":1468,"w":43,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":4,"w":43,"h":56}, @@ -5194,7 +5586,7 @@ }, "Game/EnemiesBound/WolfGuard.png": { - "frame": {"x":45,"y":1169,"w":39,"h":52}, + "frame": {"x":678,"y":1135,"w":39,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":7,"w":39,"h":52}, @@ -5202,7 +5594,7 @@ }, "Game/EnemiesBound/WolfOperative.png": { - "frame": {"x":122,"y":1227,"w":41,"h":53}, + "frame": {"x":501,"y":1240,"w":41,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":6,"w":41,"h":53}, @@ -5210,7 +5602,7 @@ }, "Game/FastMove.png": { - "frame": {"x":557,"y":1188,"w":51,"h":53}, + "frame": {"x":1,"y":1220,"w":51,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":1,"w":51,"h":53}, @@ -5218,15 +5610,23 @@ }, "Game/FastMoveOff.png": { - "frame": {"x":775,"y":139,"w":41,"h":38}, + "frame": {"x":708,"y":139,"w":41,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":16,"w":41,"h":38}, "sourceSize": {"w":56,"h":56} }, +"Game/FloorGeneric/Cage.png": +{ + "frame": {"x":458,"y":1955,"w":39,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":6,"w":39,"h":63}, + "sourceSize": {"w":72,"h":72} +}, "Game/FloorGeneric/Chest.png": { - "frame": {"x":710,"y":178,"w":55,"h":40}, + "frame": {"x":904,"y":182,"w":55,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":22,"w":55,"h":40}, @@ -5234,7 +5634,7 @@ }, "Game/FloorGeneric/ChestBlue.png": { - "frame": {"x":767,"y":179,"w":55,"h":40}, + "frame": {"x":961,"y":182,"w":55,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":22,"w":55,"h":40}, @@ -5242,7 +5642,7 @@ }, "Game/FloorGeneric/ChestBlueOpen.png": { - "frame": {"x":525,"y":1472,"w":55,"h":57}, + "frame": {"x":697,"y":1472,"w":55,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":5,"w":55,"h":57}, @@ -5250,7 +5650,7 @@ }, "Game/FloorGeneric/ChestDark.png": { - "frame": {"x":824,"y":179,"w":55,"h":40}, + "frame": {"x":1,"y":210,"w":55,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":22,"w":55,"h":40}, @@ -5258,7 +5658,7 @@ }, "Game/FloorGeneric/ChestDarkOpen.png": { - "frame": {"x":582,"y":1473,"w":55,"h":57}, + "frame": {"x":636,"y":1530,"w":55,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":5,"w":55,"h":57}, @@ -5266,7 +5666,7 @@ }, "Game/FloorGeneric/ChestGold.png": { - "frame": {"x":881,"y":180,"w":55,"h":40}, + "frame": {"x":58,"y":211,"w":55,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":22,"w":55,"h":40}, @@ -5274,7 +5674,7 @@ }, "Game/FloorGeneric/ChestGoldOpen.png": { - "frame": {"x":639,"y":1475,"w":55,"h":57}, + "frame": {"x":693,"y":1531,"w":55,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":5,"w":55,"h":57}, @@ -5282,7 +5682,7 @@ }, "Game/FloorGeneric/ChestOpen.png": { - "frame": {"x":696,"y":1476,"w":55,"h":57}, + "frame": {"x":893,"y":1551,"w":55,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":5,"w":55,"h":57}, @@ -5290,7 +5690,7 @@ }, "Game/FloorGeneric/ChestPearl.png": { - "frame": {"x":938,"y":180,"w":55,"h":40}, + "frame": {"x":115,"y":211,"w":55,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":22,"w":55,"h":40}, @@ -5298,7 +5698,7 @@ }, "Game/FloorGeneric/ChestPearlOpen.png": { - "frame": {"x":753,"y":1480,"w":55,"h":57}, + "frame": {"x":950,"y":1551,"w":55,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":5,"w":55,"h":57}, @@ -5306,15 +5706,23 @@ }, "Game/FloorGeneric/Chests/Kitty.png": { - "frame": {"x":605,"y":1244,"w":55,"h":54}, + "frame": {"x":761,"y":1245,"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":725,"y":1899,"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":81,"y":212,"w":55,"h":40}, + "frame": {"x":172,"y":214,"w":55,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":22,"w":55,"h":40}, @@ -5322,7 +5730,7 @@ }, "Game/FloorGeneric/ChestShadowOpen.png": { - "frame": {"x":947,"y":1507,"w":55,"h":57}, + "frame": {"x":39,"y":1567,"w":55,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":5,"w":55,"h":57}, @@ -5330,7 +5738,7 @@ }, "Game/FloorGeneric/ChestSilver.png": { - "frame": {"x":178,"y":213,"w":55,"h":40}, + "frame": {"x":229,"y":214,"w":55,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":22,"w":55,"h":40}, @@ -5338,23 +5746,15 @@ }, "Game/FloorGeneric/ChestSilverOpen.png": { - "frame": {"x":37,"y":1510,"w":55,"h":57}, + "frame": {"x":289,"y":1577,"w":55,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":5,"w":55,"h":57}, "sourceSize": {"w":72,"h":72} }, -"Game/FloorGeneric/Conveyor/DownOn.png": -{ - "frame": {"x":421,"y":1,"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/UpOn.png": { - "frame": {"x":453,"y":1,"w":30,"h":26}, + "frame": {"x":236,"y":1,"w":30,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":21,"w":30,"h":26}, @@ -5362,7 +5762,7 @@ }, "Game/FloorGeneric/CrackRight.png": { - "frame": {"x":913,"y":894,"w":28,"h":49}, + "frame": {"x":991,"y":752,"w":28,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":44,"y":14,"w":28,"h":49}, @@ -5370,7 +5770,7 @@ }, "Game/FloorGeneric/DollStand.png": { - "frame": {"x":849,"y":30,"w":34,"h":32}, + "frame": {"x":659,"y":30,"w":34,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":20,"w":34,"h":32}, @@ -5378,7 +5778,7 @@ }, "Game/FloorGeneric/Dummy2.png": { - "frame": {"x":242,"y":1287,"w":34,"h":54}, + "frame": {"x":619,"y":1297,"w":34,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":18,"w":34,"h":54}, @@ -5386,7 +5786,7 @@ }, "Game/FloorGeneric/Fireflies.png": { - "frame": {"x":843,"y":265,"w":45,"h":42}, + "frame": {"x":887,"y":267,"w":45,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":16,"w":45,"h":42}, @@ -5394,7 +5794,7 @@ }, "Game/FloorGeneric/GhostImportant.png": { - "frame": {"x":892,"y":1682,"w":44,"h":60}, + "frame": {"x":397,"y":1763,"w":44,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":7,"w":44,"h":60}, @@ -5402,7 +5802,7 @@ }, "Game/FloorGeneric/Lantern.png": { - "frame": {"x":995,"y":605,"w":28,"h":48}, + "frame": {"x":993,"y":652,"w":28,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":19,"w":28,"h":48}, @@ -5410,7 +5810,7 @@ }, "Game/FloorGeneric/Leyline.png": { - "frame": {"x":459,"y":977,"w":53,"h":48}, + "frame": {"x":535,"y":978,"w":53,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":6,"w":53,"h":48}, @@ -5418,7 +5818,7 @@ }, "Game/FloorGeneric/Magicflies.png": { - "frame": {"x":890,"y":265,"w":45,"h":42}, + "frame": {"x":934,"y":267,"w":45,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":16,"w":45,"h":42}, @@ -5426,7 +5826,7 @@ }, "Game/FloorGeneric/Signal/Button.png": { - "frame": {"x":995,"y":180,"w":28,"h":47}, + "frame": {"x":991,"y":311,"w":28,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":19,"w":28,"h":47}, @@ -5434,7 +5834,7 @@ }, "Game/FloorGeneric/Tablet.png": { - "frame": {"x":197,"y":1519,"w":53,"h":57}, + "frame": {"x":346,"y":1580,"w":53,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":7,"w":53,"h":57}, @@ -5442,7 +5842,7 @@ }, "Game/FloorGeneric/TabletCursed.png": { - "frame": {"x":927,"y":1106,"w":54,"h":51}, + "frame": {"x":831,"y":1085,"w":54,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":13,"w":54,"h":51}, @@ -5450,7 +5850,7 @@ }, "Game/FloorGeneric/TabletDetermination.png": { - "frame": {"x":319,"y":1181,"w":53,"h":52}, + "frame": {"x":831,"y":1138,"w":53,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":12,"w":53,"h":52}, @@ -5458,7 +5858,7 @@ }, "Game/FloorGeneric/TabletHeart.png": { - "frame": {"x":374,"y":1183,"w":53,"h":52}, + "frame": {"x":922,"y":1154,"w":53,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":12,"w":53,"h":52}, @@ -5466,23 +5866,15 @@ }, "Game/FloorGeneric/TabletSpent.png": { - "frame": {"x":342,"y":1074,"w":53,"h":51}, + "frame": {"x":1,"y":1113,"w":53,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":13,"w":53,"h":51}, "sourceSize": {"w":72,"h":72} }, -"Game/FloorGeneric/Torch.png": -{ - "frame": {"x":146,"y":1119,"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":368,"y":134,"w":32,"h":37}, + "frame": {"x":399,"y":135,"w":32,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":30,"w":32,"h":37}, @@ -5490,7 +5882,7 @@ }, "Game/FloorGeneric/Viewscreen.png": { - "frame": {"x":239,"y":172,"w":46,"h":39}, + "frame": {"x":290,"y":173,"w":46,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":29,"w":46,"h":39}, @@ -5498,7 +5890,7 @@ }, "Game/Floors/Floor_cst/Giant Bubble.png": { - "frame": {"x":932,"y":1054,"w":50,"h":50}, + "frame": {"x":162,"y":1066,"w":50,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":1,"w":50,"h":50}, @@ -5506,7 +5898,7 @@ }, "Game/Floors/Floor_ore/Light.png": { - "frame": {"x":253,"y":1,"w":26,"h":26}, + "frame": {"x":359,"y":1,"w":26,"h":26}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":35,"w":26,"h":26}, @@ -5514,7 +5906,7 @@ }, "Game/HideStruggle.png": { - "frame": {"x":271,"y":60,"w":36,"h":33}, + "frame": {"x":39,"y":58,"w":36,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":5,"w":36,"h":33}, @@ -5522,7 +5914,7 @@ }, "Game/InventoryAction/Bondage.png": { - "frame": {"x":1,"y":1815,"w":41,"h":61}, + "frame": {"x":376,"y":1888,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":4,"w":41,"h":61}, @@ -5530,7 +5922,7 @@ }, "Game/InventoryAction/CommandWord.png": { - "frame": {"x":243,"y":133,"w":43,"h":37}, + "frame": {"x":235,"y":134,"w":43,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":16,"w":43,"h":37}, @@ -5538,7 +5930,7 @@ }, "Game/InventoryAction/Cookie.png": { - "frame": {"x":919,"y":30,"w":32,"h":32}, + "frame": {"x":729,"y":30,"w":32,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":20,"w":32,"h":32}, @@ -5546,7 +5938,7 @@ }, "Game/InventoryAction/CurseInfo.png": { - "frame": {"x":766,"y":981,"w":35,"h":50}, + "frame": {"x":318,"y":1072,"w":35,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":11,"w":35,"h":50}, @@ -5554,7 +5946,7 @@ }, "Game/InventoryAction/CurseStruggle.png": { - "frame": {"x":180,"y":1578,"w":54,"h":58}, + "frame": {"x":744,"y":1591,"w":54,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":7,"w":54,"h":58}, @@ -5562,15 +5954,23 @@ }, "Game/InventoryAction/CurseUnlock.png": { - "frame": {"x":520,"y":1242,"w":35,"h":54}, + "frame": {"x":453,"y":1293,"w":35,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":7,"w":35,"h":54}, "sourceSize": {"w":72,"h":72} }, +"Game/InventoryAction/Cut.png": +{ + "frame": {"x":208,"y":1,"w":26,"h":26}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":23,"y":23,"w":26,"h":26}, + "sourceSize": {"w":72,"h":72} +}, "Game/InventoryAction/Equip.png": { - "frame": {"x":385,"y":492,"w":45,"h":46}, + "frame": {"x":289,"y":923,"w":45,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":13,"w":45,"h":46}, @@ -5578,7 +5978,7 @@ }, "Game/InventoryAction/Favorite.png": { - "frame": {"x":553,"y":29,"w":29,"h":30}, + "frame": {"x":405,"y":29,"w":29,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":21,"w":29,"h":30}, @@ -5586,7 +5986,7 @@ }, "Game/InventoryAction/Macaron.png": { - "frame": {"x":953,"y":31,"w":32,"h":32}, + "frame": {"x":763,"y":30,"w":32,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":20,"w":32,"h":32}, @@ -5594,7 +5994,7 @@ }, "Game/InventoryAction/Offhand.png": { - "frame": {"x":970,"y":1333,"w":51,"h":55}, + "frame": {"x":528,"y":1351,"w":51,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":8,"w":51,"h":55}, @@ -5602,7 +6002,7 @@ }, "Game/InventoryAction/Pick.png": { - "frame": {"x":237,"y":300,"w":45,"h":43}, + "frame": {"x":444,"y":304,"w":45,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":13,"w":45,"h":43}, @@ -5610,7 +6010,7 @@ }, "Game/InventoryAction/Quickslot.png": { - "frame": {"x":987,"y":31,"w":32,"h":32}, + "frame": {"x":797,"y":31,"w":32,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":20,"w":32,"h":32}, @@ -5618,7 +6018,7 @@ }, "Game/InventoryAction/Remove.png": { - "frame": {"x":385,"y":492,"w":45,"h":46}, + "frame": {"x":289,"y":923,"w":45,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":13,"w":45,"h":46}, @@ -5626,7 +6026,7 @@ }, "Game/InventoryAction/Struggle.png": { - "frame": {"x":180,"y":1578,"w":54,"h":58}, + "frame": {"x":744,"y":1591,"w":54,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":7,"w":54,"h":58}, @@ -5634,7 +6034,7 @@ }, "Game/InventoryAction/Unequip.png": { - "frame": {"x":385,"y":588,"w":45,"h":46}, + "frame": {"x":383,"y":925,"w":45,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":13,"w":45,"h":46}, @@ -5642,7 +6042,7 @@ }, "Game/InventoryAction/Unfavorite.png": { - "frame": {"x":584,"y":29,"w":29,"h":30}, + "frame": {"x":436,"y":29,"w":29,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":21,"w":29,"h":30}, @@ -5650,7 +6050,7 @@ }, "Game/InventoryAction/Use.png": { - "frame": {"x":501,"y":1028,"w":58,"h":50}, + "frame": {"x":930,"y":1049,"w":58,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":15,"w":58,"h":50}, @@ -5658,7 +6058,7 @@ }, "Game/Items/AncientPowerSource.png": { - "frame": {"x":506,"y":1531,"w":48,"h":57}, + "frame": {"x":452,"y":1583,"w":48,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":7,"w":48,"h":57}, @@ -5666,7 +6066,7 @@ }, "Game/Items/ArcaneTome.png": { - "frame": {"x":847,"y":1619,"w":44,"h":59}, + "frame": {"x":865,"y":1670,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, @@ -5674,7 +6074,7 @@ }, "Game/Items/BagOfGoodies.png": { - "frame": {"x":77,"y":297,"w":53,"h":43}, + "frame": {"x":230,"y":300,"w":53,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":16,"w":53,"h":43}, @@ -5682,7 +6082,7 @@ }, "Game/Items/Bola.png": { - "frame": {"x":616,"y":980,"w":48,"h":48}, + "frame": {"x":641,"y":979,"w":48,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":12,"w":48,"h":48}, @@ -5690,7 +6090,7 @@ }, "Game/Items/Bomb.png": { - "frame": {"x":557,"y":1243,"w":46,"h":54}, + "frame": {"x":276,"y":1286,"w":46,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":13,"w":46,"h":54}, @@ -5698,7 +6098,7 @@ }, "Game/Items/BondageTome.png": { - "frame": {"x":555,"y":1778,"w":50,"h":61}, + "frame": {"x":581,"y":1833,"w":50,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":5,"w":50,"h":61}, @@ -5706,23 +6106,15 @@ }, "Game/Items/Bow.png": { - "frame": {"x":514,"y":978,"w":49,"h":48}, + "frame": {"x":429,"y":975,"w":49,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":12,"w":49,"h":48}, "sourceSize": {"w":72,"h":72} }, -"Game/Items/Brownies.png": -{ - "frame": {"x":44,"y":251,"w":34,"h":43}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":19,"y":13,"w":34,"h":43}, - "sourceSize": {"w":72,"h":72} -}, "Game/Items/C4.png": { - "frame": {"x":793,"y":1086,"w":47,"h":51}, + "frame": {"x":352,"y":1126,"w":47,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":14,"w":47,"h":51}, @@ -5730,7 +6122,7 @@ }, "Game/Items/Cookie.png": { - "frame": {"x":919,"y":30,"w":32,"h":32}, + "frame": {"x":729,"y":30,"w":32,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":20,"w":32,"h":32}, @@ -5738,7 +6130,7 @@ }, "Game/Items/CookieJailer.png": { - "frame": {"x":724,"y":63,"w":34,"h":34}, + "frame": {"x":526,"y":62,"w":34,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":19,"w":34,"h":34}, @@ -5746,7 +6138,7 @@ }, "Game/Items/Crop.png": { - "frame": {"x":250,"y":971,"w":51,"h":47}, + "frame": {"x":903,"y":938,"w":51,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":12,"w":51,"h":47}, @@ -5754,7 +6146,7 @@ }, "Game/Items/DiscPick.png": { - "frame": {"x":756,"y":221,"w":42,"h":41}, + "frame": {"x":759,"y":222,"w":42,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":16,"w":42,"h":41}, @@ -5762,7 +6154,7 @@ }, "Game/Items/DivineTear.png": { - "frame": {"x":666,"y":980,"w":48,"h":48}, + "frame": {"x":741,"y":981,"w":48,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":12,"w":48,"h":48}, @@ -5770,7 +6162,7 @@ }, "Game/Items/Donut.png": { - "frame": {"x":1,"y":57,"w":32,"h":32}, + "frame": {"x":831,"y":31,"w":32,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":20,"w":32,"h":32}, @@ -5778,7 +6170,7 @@ }, "Game/Items/Dreamcatcher.png": { - "frame": {"x":94,"y":1512,"w":45,"h":57}, + "frame": {"x":99,"y":1508,"w":45,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":9,"w":45,"h":57}, @@ -5786,7 +6178,7 @@ }, "Game/Items/Duster.png": { - "frame": {"x":514,"y":350,"w":42,"h":45}, + "frame": {"x":840,"y":357,"w":42,"h":45}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":10,"w":42,"h":45}, @@ -5794,7 +6186,7 @@ }, "Game/Items/Dynamite.png": { - "frame": {"x":895,"y":1102,"w":30,"h":51}, + "frame": {"x":978,"y":1102,"w":30,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":10,"w":30,"h":51}, @@ -5802,7 +6194,7 @@ }, "Game/Items/EarthRune.png": { - "frame": {"x":942,"y":1002,"w":46,"h":50}, + "frame": {"x":691,"y":1030,"w":46,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":12,"w":46,"h":50}, @@ -5810,7 +6202,7 @@ }, "Game/Items/EscortDrone.png": { - "frame": {"x":982,"y":755,"w":39,"h":49}, + "frame": {"x":336,"y":1021,"w":39,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":3,"w":39,"h":49}, @@ -5818,7 +6210,7 @@ }, "Game/Items/Flail.png": { - "frame": {"x":101,"y":1014,"w":34,"h":50}, + "frame": {"x":355,"y":1074,"w":34,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":12,"w":34,"h":50}, @@ -5826,7 +6218,7 @@ }, "Game/Items/Flashbang.png": { - "frame": {"x":716,"y":981,"w":48,"h":48}, + "frame": {"x":791,"y":982,"w":48,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":13,"w":48,"h":48}, @@ -5834,7 +6226,7 @@ }, "Game/Items/FlashBomb.png": { - "frame": {"x":35,"y":296,"w":40,"h":43}, + "frame": {"x":523,"y":307,"w":40,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":13,"w":40,"h":43}, @@ -5842,7 +6234,7 @@ }, "Game/Items/FourSeasons.png": { - "frame": {"x":239,"y":1401,"w":33,"h":56}, + "frame": {"x":821,"y":1358,"w":33,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":9,"w":33,"h":56}, @@ -5850,23 +6242,23 @@ }, "Game/Items/GoldenTicket.png": { - "frame": {"x":98,"y":1066,"w":50,"h":50}, + "frame": {"x":214,"y":1068,"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/ItemBoots.png": +"Game/Items/Group/ItemArms.png": { - "frame": {"x":157,"y":1,"w":32,"h":25}, + "frame": {"x":1,"y":27,"w":36,"h":29}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":38,"y":43,"w":32,"h":25}, + "spriteSourceSize": {"x":36,"y":40,"w":36,"h":29}, "sourceSize": {"w":72,"h":72} }, "Game/Items/Group/ItemBreast.png": { - "frame": {"x":1,"y":27,"w":30,"h":28}, + "frame": {"x":845,"y":1,"w":30,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":39,"y":39,"w":30,"h":28}, @@ -5874,7 +6266,7 @@ }, "Game/Items/Group/ItemFeet.png": { - "frame": {"x":67,"y":57,"w":30,"h":32}, + "frame": {"x":897,"y":31,"w":30,"h":32}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":39,"y":38,"w":30,"h":32}, @@ -5882,7 +6274,7 @@ }, "Game/Items/Group/ItemHands.png": { - "frame": {"x":974,"y":65,"w":33,"h":35}, + "frame": {"x":818,"y":65,"w":33,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":38,"y":37,"w":33,"h":35}, @@ -5890,7 +6282,7 @@ }, "Game/Items/Group/ItemNeckAccessories.png": { - "frame": {"x":615,"y":29,"w":28,"h":30}, + "frame": {"x":467,"y":29,"w":28,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":40,"y":39,"w":28,"h":30}, @@ -5898,7 +6290,7 @@ }, "Game/Items/Group/ItemTorso.png": { - "frame": {"x":694,"y":63,"w":28,"h":34}, + "frame": {"x":562,"y":62,"w":28,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":40,"y":37,"w":28,"h":34}, @@ -5906,7 +6298,7 @@ }, "Game/Items/Gunpowder.png": { - "frame": {"x":555,"y":61,"w":39,"h":34}, + "frame": {"x":425,"y":61,"w":39,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":31,"w":39,"h":34}, @@ -5914,7 +6306,7 @@ }, "Game/Items/Heart.png": { - "frame": {"x":549,"y":1591,"w":53,"h":59}, + "frame": {"x":391,"y":1640,"w":53,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":5,"w":53,"h":59}, @@ -5922,7 +6314,7 @@ }, "Game/Items/IceRune.png": { - "frame": {"x":50,"y":1064,"w":46,"h":50}, + "frame": {"x":791,"y":1032,"w":46,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":12,"w":46,"h":50}, @@ -5930,7 +6322,7 @@ }, "Game/Items/LeylineMap.png": { - "frame": {"x":913,"y":843,"w":30,"h":49}, + "frame": {"x":991,"y":999,"w":30,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":23,"y":16,"w":30,"h":49}, @@ -5938,15 +6330,23 @@ }, "Game/Items/MagicFlail.png": { - "frame": {"x":290,"y":1582,"w":44,"h":58}, + "frame": {"x":243,"y":1574,"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":599,"y":1468,"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":39,"y":209,"w":40,"h":40}, + "frame": {"x":862,"y":181,"w":40,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":16,"w":40,"h":40}, @@ -5954,7 +6354,7 @@ }, "Game/Items/MoiraiScissors.png": { - "frame": {"x":895,"y":1159,"w":55,"h":52}, + "frame": {"x":772,"y":1191,"w":55,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":9,"w":55,"h":52}, @@ -5962,7 +6362,7 @@ }, "Game/Items/Pick.png": { - "frame": {"x":663,"y":219,"w":43,"h":41}, + "frame": {"x":714,"y":222,"w":43,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":17,"w":43,"h":41}, @@ -5970,7 +6370,7 @@ }, "Game/Items/Pickaxe.png": { - "frame": {"x":971,"y":272,"w":52,"h":43}, + "frame": {"x":340,"y":301,"w":52,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":15,"w":52,"h":43}, @@ -5978,7 +6378,7 @@ }, "Game/Items/Restraint/Armbinders.png": { - "frame": {"x":272,"y":214,"w":35,"h":40}, + "frame": {"x":401,"y":215,"w":35,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":17,"w":35,"h":40}, @@ -5986,7 +6386,7 @@ }, "Game/Items/Restraint/Boxbinders.png": { - "frame": {"x":148,"y":171,"w":38,"h":39}, + "frame": {"x":424,"y":174,"w":38,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":17,"w":38,"h":39}, @@ -5994,7 +6394,7 @@ }, "Game/Items/Restraint/Chastity.png": { - "frame": {"x":800,"y":1600,"w":45,"h":59}, + "frame": {"x":680,"y":1650,"w":45,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, @@ -6002,7 +6402,7 @@ }, "Game/Items/Restraint/ChastityBelts.png": { - "frame": {"x":800,"y":1600,"w":45,"h":59}, + "frame": {"x":680,"y":1650,"w":45,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, @@ -6010,7 +6410,7 @@ }, "Game/Items/Restraint/Glue.png": { - "frame": {"x":479,"y":1298,"w":54,"h":54}, + "frame": {"x":801,"y":1302,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -6018,7 +6418,7 @@ }, "Game/Items/Restraint/HolyRope.png": { - "frame": {"x":646,"y":1415,"w":35,"h":57}, + "frame": {"x":856,"y":1478,"w":35,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":7,"w":35,"h":57}, @@ -6026,7 +6426,7 @@ }, "Game/Items/Restraint/Latex.png": { - "frame": {"x":582,"y":135,"w":33,"h":38}, + "frame": {"x":584,"y":138,"w":33,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":17,"w":33,"h":38}, @@ -6034,7 +6434,7 @@ }, "Game/Items/Restraint/MithrilRope.png": { - "frame": {"x":334,"y":1348,"w":35,"h":56}, + "frame": {"x":274,"y":1399,"w":35,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":6,"w":35,"h":56}, @@ -6042,23 +6442,15 @@ }, "Game/Items/Restraint/Modules.png": { - "frame": {"x":958,"y":1390,"w":52,"h":56}, + "frame": {"x":754,"y":1415,"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":952,"y":1159,"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":402,"y":134,"w":29,"h":37}, + "frame": {"x":433,"y":135,"w":29,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":45,"y":41,"w":29,"h":37}, @@ -6066,7 +6458,7 @@ }, "Game/Items/Restraint/Obsidian.png": { - "frame": {"x":651,"y":137,"w":33,"h":38}, + "frame": {"x":1,"y":170,"w":33,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":17,"w":33,"h":38}, @@ -6074,7 +6466,7 @@ }, "Game/Items/Restraint/Plugs.png": { - "frame": {"x":994,"y":655,"w":28,"h":48}, + "frame": {"x":913,"y":695,"w":28,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":11,"w":28,"h":48}, @@ -6082,7 +6474,7 @@ }, "Game/Items/Restraint/Ribbons.png": { - "frame": {"x":935,"y":1218,"w":44,"h":53}, + "frame": {"x":325,"y":1233,"w":44,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":11,"w":44,"h":53}, @@ -6090,7 +6482,7 @@ }, "Game/Items/Restraint/RopeSnake.png": { - "frame": {"x":912,"y":945,"w":29,"h":51}, + "frame": {"x":647,"y":1134,"w":29,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":10,"w":29,"h":51}, @@ -6098,7 +6490,7 @@ }, "Game/Items/Restraint/Rubber.png": { - "frame": {"x":582,"y":135,"w":33,"h":38}, + "frame": {"x":584,"y":138,"w":33,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":17,"w":33,"h":38}, @@ -6106,15 +6498,23 @@ }, "Game/Items/Restraint/SteelPlugs.png": { - "frame": {"x":994,"y":705,"w":28,"h":48}, + "frame": {"x":961,"y":746,"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":599,"y":1468,"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":893,"y":1621,"w":45,"h":59}, + "frame": {"x":727,"y":1651,"w":45,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, @@ -6122,7 +6522,7 @@ }, "Game/Items/Restraint/Ties.png": { - "frame": {"x":912,"y":945,"w":29,"h":51}, + "frame": {"x":647,"y":1134,"w":29,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":10,"w":29,"h":51}, @@ -6130,7 +6530,7 @@ }, "Game/Items/Restraint/WeakMagicRopes.png": { - "frame": {"x":821,"y":1422,"w":35,"h":57}, + "frame": {"x":893,"y":1490,"w":35,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":7,"w":35,"h":57}, @@ -6138,7 +6538,7 @@ }, "Game/Items/Rock.png": { - "frame": {"x":614,"y":177,"w":36,"h":39}, + "frame": {"x":546,"y":176,"w":36,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":15,"w":36,"h":39}, @@ -6146,7 +6546,7 @@ }, "Game/Items/Rope.png": { - "frame": {"x":451,"y":1027,"w":48,"h":49}, + "frame": {"x":377,"y":1023,"w":48,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":13,"w":48,"h":49}, @@ -6154,7 +6554,7 @@ }, "Game/Items/RopeRune.png": { - "frame": {"x":467,"y":349,"w":45,"h":45}, + "frame": {"x":793,"y":356,"w":45,"h":45}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":16,"w":45,"h":45}, @@ -6162,7 +6562,7 @@ }, "Game/Items/SackOfSacks.png": { - "frame": {"x":132,"y":298,"w":53,"h":43}, + "frame": {"x":285,"y":300,"w":53,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":16,"w":53,"h":43}, @@ -6170,7 +6570,7 @@ }, "Game/Items/Scroll.png": { - "frame": {"x":385,"y":925,"w":45,"h":47}, + "frame": {"x":50,"y":962,"w":45,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":11,"w":45,"h":47}, @@ -6178,7 +6578,7 @@ }, "Game/Items/ScrollArms.png": { - "frame": {"x":481,"y":928,"w":45,"h":47}, + "frame": {"x":97,"y":966,"w":45,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":11,"w":45,"h":47}, @@ -6186,7 +6586,7 @@ }, "Game/Items/ScrollLegs.png": { - "frame": {"x":943,"y":953,"w":45,"h":47}, + "frame": {"x":193,"y":967,"w":45,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":11,"w":45,"h":47}, @@ -6194,7 +6594,7 @@ }, "Game/Items/ScrollPurity.png": { - "frame": {"x":1,"y":963,"w":45,"h":47}, + "frame": {"x":289,"y":971,"w":45,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":11,"w":45,"h":47}, @@ -6202,7 +6602,7 @@ }, "Game/Items/ScrollVerbal.png": { - "frame": {"x":97,"y":965,"w":45,"h":47}, + "frame": {"x":336,"y":972,"w":45,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":11,"w":45,"h":47}, @@ -6210,7 +6610,7 @@ }, "Game/Items/Shield.png": { - "frame": {"x":898,"y":140,"w":38,"h":38}, + "frame": {"x":831,"y":140,"w":38,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":17,"w":38,"h":38}, @@ -6218,7 +6618,7 @@ }, "Game/Items/ShieldMagic.png": { - "frame": {"x":938,"y":140,"w":38,"h":38}, + "frame": {"x":871,"y":141,"w":38,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":17,"w":38,"h":38}, @@ -6226,7 +6626,7 @@ }, "Game/Items/ShieldReinforced.png": { - "frame": {"x":978,"y":140,"w":38,"h":38}, + "frame": {"x":911,"y":142,"w":38,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":17,"w":38,"h":38}, @@ -6234,7 +6634,7 @@ }, "Game/Items/ShieldTower.png": { - "frame": {"x":1,"y":294,"w":32,"h":43}, + "frame": {"x":1,"y":295,"w":32,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":10,"w":32,"h":43}, @@ -6242,7 +6642,7 @@ }, "Game/Items/StaffBind.png": { - "frame": {"x":467,"y":1354,"w":40,"h":55}, + "frame": {"x":613,"y":1353,"w":40,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":8,"w":40,"h":55}, @@ -6250,7 +6650,7 @@ }, "Game/Items/StaffDoll.png": { - "frame": {"x":164,"y":1825,"w":37,"h":62}, + "frame": {"x":378,"y":1951,"w":37,"h":62}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":1,"w":37,"h":62}, @@ -6258,7 +6658,7 @@ }, "Game/Items/StaffTape.png": { - "frame": {"x":844,"y":222,"w":41,"h":41}, + "frame": {"x":847,"y":223,"w":41,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":15,"w":41,"h":41}, @@ -6266,23 +6666,15 @@ }, "Game/Items/TheEncaser.png": { - "frame": {"x":981,"y":1222,"w":42,"h":53}, + "frame": {"x":371,"y":1235,"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":146,"y":1119,"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":831,"y":1252,"w":45,"h":54}, + "frame": {"x":367,"y":1290,"w":45,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":8,"w":45,"h":54}, @@ -6290,7 +6682,7 @@ }, "Game/Items/UniversalSolvent.png": { - "frame": {"x":590,"y":1715,"w":36,"h":61}, + "frame": {"x":782,"y":1842,"w":36,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":5,"w":36,"h":61}, @@ -6298,7 +6690,7 @@ }, "Game/Items/VibeWand.png": { - "frame": {"x":328,"y":134,"w":38,"h":37}, + "frame": {"x":320,"y":134,"w":38,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":19,"w":38,"h":37}, @@ -6306,7 +6698,7 @@ }, "Game/Items/WaterRune.png": { - "frame": {"x":371,"y":1349,"w":51,"h":55}, + "frame": {"x":768,"y":1358,"w":51,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":9,"w":51,"h":55}, @@ -6314,15 +6706,23 @@ }, "Game/Layers.png": { - "frame": {"x":711,"y":308,"w":44,"h":44}, + "frame": {"x":47,"y":340,"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":502,"y":1585,"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":960,"y":603,"w":33,"h":48}, + "frame": {"x":481,"y":590,"w":33,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":4,"w":33,"h":48}, @@ -6330,7 +6730,7 @@ }, "Game/Locks/Blocked.png": { - "frame": {"x":719,"y":1247,"w":54,"h":54}, + "frame": {"x":909,"y":1263,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":54,"h":54}, @@ -6338,15 +6738,23 @@ }, "Game/Locks/Blue.png": { - "frame": {"x":912,"y":503,"w":35,"h":48}, + "frame": {"x":289,"y":536,"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":223,"y":1230,"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":689,"y":1359,"w":56,"h":56}, + "frame": {"x":409,"y":1405,"w":56,"h":56}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":56,"h":56}, @@ -6354,7 +6762,7 @@ }, "Game/Locks/Cyber.png": { - "frame": {"x":932,"y":357,"w":36,"h":48}, + "frame": {"x":97,"y":434,"w":36,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":4,"w":36,"h":48}, @@ -6362,7 +6770,7 @@ }, "Game/Locks/Cyber2.png": { - "frame": {"x":948,"y":753,"w":32,"h":48}, + "frame": {"x":991,"y":702,"w":32,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":4,"w":32,"h":48}, @@ -6370,7 +6778,7 @@ }, "Game/Locks/Cyber3.png": { - "frame": {"x":865,"y":452,"w":36,"h":48}, + "frame": {"x":97,"y":484,"w":36,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":4,"w":36,"h":48}, @@ -6378,39 +6786,31 @@ }, "Game/Locks/Disc.png": { - "frame": {"x":903,"y":998,"w":37,"h":50}, + "frame": {"x":891,"y":1037,"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": +"Game/Locks/Dollmaker.png": { - "frame": {"x":725,"y":1136,"w":28,"h":53}, + "frame": {"x":642,"y":1413,"w":56,"h":56}, "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":14,"y":1,"w":28,"h":53}, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":56,"h":56}, "sourceSize": {"w":56,"h":56} }, -"Game/Locks/Divine2.png": +"Game/Locks/ExCrystal.png": { - "frame": {"x":725,"y":1136,"w":28,"h":53}, + "frame": {"x":391,"y":1074,"w":34,"h":50}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":14,"y":1,"w":28,"h":53}, - "sourceSize": {"w":56,"h":56} -}, -"Game/Locks/Dollmaker.png": -{ - "frame": {"x":747,"y":1360,"w":56,"h":56}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":56,"h":56}, + "spriteSourceSize": {"x":11,"y":4,"w":34,"h":50}, "sourceSize": {"w":56,"h":56} }, "Game/Locks/Fuuka.png": { - "frame": {"x":33,"y":341,"w":42,"h":44}, + "frame": {"x":185,"y":344,"w":42,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":4,"w":42,"h":44}, @@ -6418,7 +6818,7 @@ }, "Game/Locks/Gold.png": { - "frame": {"x":149,"y":132,"w":37,"h":37}, + "frame": {"x":360,"y":134,"w":37,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":9,"w":37,"h":37}, @@ -6426,7 +6826,7 @@ }, "Game/Locks/Grey.png": { - "frame": {"x":959,"y":653,"w":33,"h":48}, + "frame": {"x":868,"y":933,"w":33,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":4,"w":33,"h":48}, @@ -6434,7 +6834,7 @@ }, "Game/Locks/HiSec.png": { - "frame": {"x":482,"y":1187,"w":37,"h":52}, + "frame": {"x":491,"y":1184,"w":37,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":4,"w":37,"h":52}, @@ -6442,7 +6842,7 @@ }, "Game/Locks/Purple.png": { - "frame": {"x":959,"y":703,"w":33,"h":48}, + "frame": {"x":51,"y":1011,"w":33,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":4,"w":33,"h":48}, @@ -6450,7 +6850,7 @@ }, "Game/Locks/Red.png": { - "frame": {"x":990,"y":958,"w":33,"h":50}, + "frame": {"x":990,"y":1050,"w":33,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":4,"w":33,"h":50}, @@ -6458,7 +6858,7 @@ }, "Game/Locks/Red_Hi.png": { - "frame": {"x":990,"y":1010,"w":33,"h":50}, + "frame": {"x":463,"y":1078,"w":33,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":4,"w":33,"h":50}, @@ -6466,7 +6866,7 @@ }, "Game/Locks/Red_Med.png": { - "frame": {"x":758,"y":1033,"w":33,"h":50}, + "frame": {"x":498,"y":1079,"w":33,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":4,"w":33,"h":50}, @@ -6474,7 +6874,7 @@ }, "Game/Locks/Rubber.png": { - "frame": {"x":817,"y":740,"w":33,"h":48}, + "frame": {"x":185,"y":1016,"w":33,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":4,"w":33,"h":48}, @@ -6482,7 +6882,7 @@ }, "Game/Locks/StarCurse.png": { - "frame": {"x":185,"y":1070,"w":50,"h":50}, + "frame": {"x":266,"y":1071,"w":50,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":50,"h":50}, @@ -6490,7 +6890,7 @@ }, "Game/Locks/White.png": { - "frame": {"x":959,"y":653,"w":33,"h":48}, + "frame": {"x":868,"y":933,"w":33,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":4,"w":33,"h":48}, @@ -6498,7 +6898,7 @@ }, "Game/Particles/mmm.png": { - "frame": {"x":573,"y":216,"w":36,"h":42}, + "frame": {"x":809,"y":265,"w":36,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":2,"w":36,"h":42}, @@ -6506,7 +6906,7 @@ }, "Game/Poses/Boxtie.png": { - "frame": {"x":887,"y":222,"w":41,"h":41}, + "frame": {"x":890,"y":224,"w":41,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":41,"h":41}, @@ -6514,7 +6914,7 @@ }, "Game/Poses/Crossed.png": { - "frame": {"x":930,"y":222,"w":41,"h":41}, + "frame": {"x":933,"y":224,"w":41,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":41,"h":41}, @@ -6522,7 +6922,7 @@ }, "Game/Poses/Free.png": { - "frame": {"x":800,"y":221,"w":42,"h":41}, + "frame": {"x":803,"y":222,"w":42,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":42,"h":41}, @@ -6530,7 +6930,7 @@ }, "Game/Poses/Front.png": { - "frame": {"x":973,"y":229,"w":41,"h":41}, + "frame": {"x":976,"y":224,"w":41,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":41,"h":41}, @@ -6538,7 +6938,7 @@ }, "Game/Poses/SetPose.png": { - "frame": {"x":1,"y":251,"w":41,"h":41}, + "frame": {"x":1,"y":252,"w":41,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":6,"w":41,"h":41}, @@ -6546,7 +6946,7 @@ }, "Game/Poses/Up.png": { - "frame": {"x":80,"y":254,"w":41,"h":41}, + "frame": {"x":44,"y":253,"w":41,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":41,"h":41}, @@ -6554,7 +6954,7 @@ }, "Game/Poses/Wristtie.png": { - "frame": {"x":123,"y":254,"w":41,"h":41}, + "frame": {"x":87,"y":253,"w":41,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":41,"h":41}, @@ -6562,7 +6962,7 @@ }, "Game/Poses/Yoked.png": { - "frame": {"x":1,"y":251,"w":41,"h":41}, + "frame": {"x":1,"y":252,"w":41,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":2,"w":41,"h":41}, @@ -6570,7 +6970,7 @@ }, "Game/ShopBasic/2C4.png": { - "frame": {"x":55,"y":1393,"w":52,"h":56}, + "frame": {"x":937,"y":1434,"w":52,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":10,"w":52,"h":56}, @@ -6578,7 +6978,7 @@ }, "Game/ShopBasic/2Dynamite.png": { - "frame": {"x":374,"y":1237,"w":53,"h":54}, + "frame": {"x":221,"y":1285,"w":53,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":6,"w":53,"h":54}, @@ -6586,7 +6986,7 @@ }, "Game/ShopBasic/DivineBelt.png": { - "frame": {"x":893,"y":1621,"w":45,"h":59}, + "frame": {"x":727,"y":1651,"w":45,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, @@ -6594,7 +6994,7 @@ }, "Game/ShopBasic/DivineBelt2.png": { - "frame": {"x":893,"y":1621,"w":45,"h":59}, + "frame": {"x":727,"y":1651,"w":45,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, @@ -6602,7 +7002,7 @@ }, "Game/ShopBasic/Lockpick.png": { - "frame": {"x":287,"y":173,"w":41,"h":39}, + "frame": {"x":338,"y":173,"w":41,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":18,"w":41,"h":39}, @@ -6610,7 +7010,7 @@ }, "Game/ShopBasic/SlimeWalkers.png": { - "frame": {"x":401,"y":302,"w":55,"h":44}, + "frame": {"x":766,"y":309,"w":55,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":16,"w":55,"h":44}, @@ -6618,7 +7018,7 @@ }, "Game/ShrineAuraQuest.png": { - "frame": {"x":489,"y":29,"w":30,"h":30}, + "frame": {"x":341,"y":29,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":21,"y":15,"w":30,"h":30}, @@ -6626,7 +7026,7 @@ }, "Game/Spell1.png": { - "frame": {"x":948,"y":803,"w":31,"h":49}, + "frame": {"x":991,"y":803,"w":31,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":28,"y":4,"w":31,"h":49}, @@ -6634,7 +7034,7 @@ }, "Game/Spell2.png": { - "frame": {"x":897,"y":1050,"w":33,"h":50}, + "frame": {"x":533,"y":1079,"w":33,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":27,"y":4,"w":33,"h":50}, @@ -6642,7 +7042,7 @@ }, "Game/Spell3.png": { - "frame": {"x":670,"y":1030,"w":34,"h":50}, + "frame": {"x":427,"y":1076,"w":34,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":27,"y":3,"w":34,"h":50}, @@ -6650,7 +7050,7 @@ }, "Game/Spell4.png": { - "frame": {"x":981,"y":806,"w":36,"h":49}, + "frame": {"x":427,"y":1025,"w":36,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":26,"y":4,"w":36,"h":49}, @@ -6658,7 +7058,7 @@ }, "Game/Spell5.png": { - "frame": {"x":865,"y":791,"w":33,"h":49}, + "frame": {"x":576,"y":1029,"w":33,"h":49}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":27,"y":5,"w":33,"h":49}, @@ -6666,7 +7066,7 @@ }, "Game/Spells/AllyAggressive.png": { - "frame": {"x":33,"y":91,"w":38,"h":36}, + "frame": {"x":937,"y":66,"w":38,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":18,"w":38,"h":36}, @@ -6674,7 +7074,7 @@ }, "Game/Spells/AllyDefensive.png": { - "frame": {"x":983,"y":1115,"w":40,"h":51}, + "frame": {"x":497,"y":1131,"w":40,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":13,"w":40,"h":51}, @@ -6682,7 +7082,7 @@ }, "Game/Spells/AllyMove.png": { - "frame": {"x":556,"y":1532,"w":47,"h":57}, + "frame": {"x":754,"y":1473,"w":47,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":5,"w":47,"h":57}, @@ -6690,7 +7090,7 @@ }, "Game/Spells/AllyToggle.png": { - "frame": {"x":285,"y":1178,"w":32,"h":54}, + "frame": {"x":875,"y":1251,"w":32,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":8,"w":32,"h":54}, @@ -6698,7 +7098,7 @@ }, "Game/Spells/Analyze.png": { - "frame": {"x":847,"y":1619,"w":44,"h":59}, + "frame": {"x":865,"y":1670,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":6,"w":44,"h":59}, @@ -6706,15 +7106,23 @@ }, "Game/Spells/Animate.png": { - "frame": {"x":401,"y":302,"w":55,"h":44}, + "frame": {"x":766,"y":309,"w":55,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":16,"w":55,"h":44}, "sourceSize": {"w":72,"h":72} }, +"Game/Spells/AnimatePuppet.png": +{ + "frame": {"x":663,"y":1962,"w":37,"h":63}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":5,"w":37,"h":63}, + "sourceSize": {"w":72,"h":72} +}, "Game/Spells/ApprenticeAir.png": { - "frame": {"x":907,"y":1,"w":29,"h":27}, + "frame": {"x":785,"y":1,"w":29,"h":27}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":23,"w":29,"h":27}, @@ -6722,39 +7130,55 @@ }, "Game/Spells/ApprenticeIce.png": { - "frame": {"x":309,"y":61,"w":34,"h":33}, + "frame": {"x":114,"y":58,"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": +"Game/Spells/ApprenticeMagic.png": { - "frame": {"x":796,"y":64,"w":28,"h":35}, + "frame": {"x":862,"y":181,"w":40,"h":40}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":23,"y":20,"w":28,"h":35}, + "spriteSourceSize": {"x":17,"y":17,"w":40,"h":40}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/ApprenticeMagic.png": +"Game/Spells/ArcaneBlast.png": { - "frame": {"x":39,"y":209,"w":40,"h":40}, + "frame": {"x":938,"y":1376,"w":60,"h":56}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":17,"y":17,"w":40,"h":40}, + "spriteSourceSize": {"x":2,"y":9,"w":60,"h":56}, "sourceSize": {"w":72,"h":72} }, "Game/Spells/BattleRhythm.png": { - "frame": {"x":419,"y":258,"w":42,"h":42}, + "frame": {"x":80,"y":296,"w":42,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":15,"w":42,"h":42}, "sourceSize": {"w":72,"h":72} }, +"Game/Spells/BigBoulderLaunch.png": +{ + "frame": {"x":819,"y":1918,"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":168,"y":299,"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":1,"y":1815,"w":41,"h":61}, + "frame": {"x":376,"y":1888,"w":41,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":4,"w":41,"h":61}, @@ -6762,7 +7186,7 @@ }, "Game/Spells/BoulderKick.png": { - "frame": {"x":32,"y":129,"w":59,"h":37}, + "frame": {"x":63,"y":131,"w":59,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":5,"y":17,"w":59,"h":37}, @@ -6770,7 +7194,7 @@ }, "Game/Spells/BoulderLaunch.png": { - "frame": {"x":614,"y":177,"w":36,"h":39}, + "frame": {"x":546,"y":176,"w":36,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":15,"w":36,"h":39}, @@ -6778,7 +7202,7 @@ }, "Game/Spells/Camo.png": { - "frame": {"x":113,"y":1338,"w":32,"h":55}, + "frame": {"x":655,"y":1298,"w":32,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":10,"w":32,"h":55}, @@ -6786,7 +7210,7 @@ }, "Game/Spells/ChainStrike.png": { - "frame": {"x":405,"y":215,"w":57,"h":41}, + "frame": {"x":498,"y":217,"w":57,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":14,"w":57,"h":41}, @@ -6794,7 +7218,7 @@ }, "Game/Spells/Charge.png": { - "frame": {"x":1,"y":1063,"w":47,"h":50}, + "frame": {"x":642,"y":1029,"w":47,"h":50}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":13,"w":47,"h":50}, @@ -6802,7 +7226,7 @@ }, "Game/Spells/Chastity.png": { - "frame": {"x":940,"y":1626,"w":45,"h":59}, + "frame": {"x":774,"y":1652,"w":45,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, @@ -6810,7 +7234,7 @@ }, "Game/Spells/CommandCapture.png": { - "frame": {"x":725,"y":1192,"w":55,"h":53}, + "frame": {"x":111,"y":1225,"w":55,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":9,"w":55,"h":53}, @@ -6818,7 +7242,7 @@ }, "Game/Spells/CommandRelease.png": { - "frame": {"x":385,"y":492,"w":45,"h":46}, + "frame": {"x":289,"y":923,"w":45,"h":46}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":13,"w":45,"h":46}, @@ -6826,15 +7250,23 @@ }, "Game/Spells/CommandSlime.png": { - "frame": {"x":61,"y":1571,"w":58,"h":58}, + "frame": {"x":950,"y":1610,"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":913,"y":645,"w":30,"h":48}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":21,"y":12,"w":30,"h":48}, + "sourceSize": {"w":72,"h":72} +}, "Game/Spells/CommandWord.png": { - "frame": {"x":243,"y":133,"w":43,"h":37}, + "frame": {"x":235,"y":134,"w":43,"h":37}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":16,"w":43,"h":37}, @@ -6842,31 +7274,39 @@ }, "Game/Spells/CommandWordGreater.png": { - "frame": {"x":439,"y":1131,"w":56,"h":52}, + "frame": {"x":235,"y":1176,"w":56,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":1,"w":56,"h":52}, "sourceSize": {"w":72,"h":72} }, -"Game/Spells/DistractionBurst.png": +"Game/Spells/EarthMote.png": { - "frame": {"x":631,"y":1357,"w":56,"h":56}, + "frame": {"x":1,"y":131,"w":60,"h":37}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":8,"y":8,"w":56,"h":56}, + "spriteSourceSize": {"x":8,"y":20,"w":60,"h":37}, "sourceSize": {"w":72,"h":72} }, "Game/Spells/EmpowerCancel.png": { - "frame": {"x":803,"y":984,"w":48,"h":48}, + "frame": {"x":841,"y":983,"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":880,"y":1918,"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":535,"y":1299,"w":54,"h":54}, + "frame": {"x":909,"y":1319,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -6874,7 +7314,7 @@ }, "Game/Spells/EvasiveManeuvers.png": { - "frame": {"x":57,"y":1336,"w":54,"h":55}, + "frame": {"x":712,"y":1357,"w":54,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":5,"w":54,"h":55}, @@ -6882,7 +7322,7 @@ }, "Game/Spells/Firebolt.png": { - "frame": {"x":176,"y":1122,"w":51,"h":51}, + "frame": {"x":197,"y":1120,"w":51,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":11,"w":51,"h":51}, @@ -6890,15 +7330,31 @@ }, "Game/Spells/Firecracker.png": { - "frame": {"x":395,"y":1586,"w":56,"h":59}, + "frame": {"x":275,"y":1636,"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":930,"y":1492,"w":59,"h":57}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":6,"y":5,"w":59,"h":57}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/FlameRune.png": +{ + "frame": {"x":981,"y":267,"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":565,"y":979,"w":49,"h":48}, + "frame": {"x":590,"y":979,"w":49,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":12,"w":49,"h":48}, @@ -6906,7 +7362,7 @@ }, "Game/Spells/FlashBomb.png": { - "frame": {"x":35,"y":296,"w":40,"h":43}, + "frame": {"x":523,"y":307,"w":40,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":13,"w":40,"h":43}, @@ -6914,15 +7370,31 @@ }, "Game/Spells/FleetFooted.png": { - "frame": {"x":245,"y":1343,"w":30,"h":56}, + "frame": {"x":581,"y":1352,"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":104,"y":1392,"w":56,"h":56}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":8,"y":8,"w":56,"h":56}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/Heal.png": +{ + "frame": {"x":941,"y":1918,"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":46,"y":1451,"w":58,"h":57}, + "frame": {"x":291,"y":1518,"w":58,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":7,"w":58,"h":57}, @@ -6930,7 +7402,7 @@ }, "Game/Spells/HolyOrb.png": { - "frame": {"x":277,"y":1347,"w":55,"h":55}, + "frame": {"x":655,"y":1356,"w":55,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":5,"w":55,"h":55}, @@ -6938,7 +7410,7 @@ }, "Game/Spells/IceBreath.png": { - "frame": {"x":44,"y":1817,"w":38,"h":61}, + "frame": {"x":460,"y":1892,"w":38,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":4,"w":38,"h":61}, @@ -6946,15 +7418,31 @@ }, "Game/Spells/IronBlood.png": { - "frame": {"x":229,"y":1123,"w":28,"h":51}, + "frame": {"x":961,"y":796,"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":199,"y":1946,"w":58,"h":62}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":3,"y":7,"w":58,"h":62}, + "sourceSize": {"w":72,"h":72} +}, +"Game/Spells/LimitSurge.png": +{ + "frame": {"x":347,"y":1402,"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":841,"y":1143,"w":52,"h":52}, + "frame": {"x":1,"y":1166,"w":52,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":10,"w":52,"h":52}, @@ -6962,7 +7450,7 @@ }, "Game/Spells/NatureSpirit.png": { - "frame": {"x":252,"y":1521,"w":51,"h":57}, + "frame": {"x":410,"y":1522,"w":51,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":5,"w":51,"h":57}, @@ -6970,7 +7458,7 @@ }, "Game/Spells/NegateRune.png": { - "frame": {"x":591,"y":1300,"w":54,"h":54}, + "frame": {"x":965,"y":1320,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -6978,7 +7466,7 @@ }, "Game/Spells/Offhand.png": { - "frame": {"x":970,"y":1333,"w":51,"h":55}, + "frame": {"x":528,"y":1351,"w":51,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":8,"w":51,"h":55}, @@ -6986,7 +7474,7 @@ }, "Game/Spells/OrgasmResist.png": { - "frame": {"x":417,"y":61,"w":33,"h":33}, + "frame": {"x":257,"y":61,"w":33,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":18,"w":33,"h":33}, @@ -6994,7 +7482,7 @@ }, "Game/Spells/Petsuit.png": { - "frame": {"x":147,"y":1340,"w":37,"h":55}, + "frame": {"x":899,"y":1375,"w":37,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":5,"w":37,"h":55}, @@ -7002,7 +7490,7 @@ }, "Game/Spells/ProblemSolving.png": { - "frame": {"x":810,"y":1540,"w":45,"h":58}, + "frame": {"x":196,"y":1572,"w":45,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":6,"w":45,"h":58}, @@ -7010,7 +7498,7 @@ }, "Game/Spells/Quickness2.png": { - "frame": {"x":647,"y":1301,"w":54,"h":54}, + "frame": {"x":51,"y":1336,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -7018,7 +7506,7 @@ }, "Game/Spells/Quickness3.png": { - "frame": {"x":703,"y":1303,"w":54,"h":54}, + "frame": {"x":107,"y":1336,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -7026,7 +7514,7 @@ }, "Game/Spells/Quickness4.png": { - "frame": {"x":759,"y":1304,"w":54,"h":54}, + "frame": {"x":163,"y":1338,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -7034,7 +7522,7 @@ }, "Game/Spells/Quickness5.png": { - "frame": {"x":815,"y":1308,"w":54,"h":54}, + "frame": {"x":219,"y":1341,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -7042,7 +7530,7 @@ }, "Game/Spells/RecoverObject.png": { - "frame": {"x":1,"y":1115,"w":46,"h":51}, + "frame": {"x":449,"y":1130,"w":46,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":9,"w":46,"h":51}, @@ -7050,7 +7538,7 @@ }, "Game/Spells/RopeStrike.png": { - "frame": {"x":683,"y":1417,"w":44,"h":56}, + "frame": {"x":291,"y":1459,"w":44,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":8,"w":44,"h":56}, @@ -7058,7 +7546,7 @@ }, "Game/Spells/ShadowDance.png": { - "frame": {"x":448,"y":1711,"w":49,"h":60}, + "frame": {"x":834,"y":1793,"w":49,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":1,"w":49,"h":60}, @@ -7066,7 +7554,7 @@ }, "Game/Spells/ShadowSlash.png": { - "frame": {"x":652,"y":1535,"w":58,"h":58}, + "frame": {"x":624,"y":1589,"w":58,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":7,"w":58,"h":58}, @@ -7074,7 +7562,7 @@ }, "Game/Spells/SlimeToLatex.png": { - "frame": {"x":175,"y":1175,"w":52,"h":52}, + "frame": {"x":394,"y":1181,"w":52,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":10,"w":52,"h":52}, @@ -7082,7 +7570,7 @@ }, "Game/Spells/Snare.png": { - "frame": {"x":871,"y":1324,"w":54,"h":54}, + "frame": {"x":357,"y":1346,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -7090,7 +7578,7 @@ }, "Game/Spells/Sowing.png": { - "frame": {"x":141,"y":1517,"w":54,"h":57}, + "frame": {"x":580,"y":1527,"w":54,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":6,"w":54,"h":57}, @@ -7098,7 +7586,7 @@ }, "Game/Spells/SpellChoiceUp1.png": { - "frame": {"x":521,"y":29,"w":30,"h":30}, + "frame": {"x":373,"y":29,"w":30,"h":30}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":20,"w":30,"h":30}, @@ -7106,7 +7594,7 @@ }, "Game/Spells/Strength.png": { - "frame": {"x":652,"y":177,"w":56,"h":40}, + "frame": {"x":804,"y":180,"w":56,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":13,"w":56,"h":40}, @@ -7114,15 +7602,23 @@ }, "Game/Spells/SummonArmbinder.png": { - "frame": {"x":272,"y":214,"w":35,"h":40}, + "frame": {"x":401,"y":215,"w":35,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":17,"w":35,"h":40}, "sourceSize": {"w":72,"h":72} }, +"Game/Spells/Swap.png": +{ + "frame": {"x":565,"y":307,"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":175,"y":1458,"w":57,"h":57}, + "frame": {"x":351,"y":1521,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":7,"w":57,"h":57}, @@ -7130,7 +7626,7 @@ }, "Game/Spells/TrueSteel.png": { - "frame": {"x":858,"y":939,"w":52,"h":47}, + "frame": {"x":708,"y":931,"w":52,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":10,"w":52,"h":47}, @@ -7138,7 +7634,7 @@ }, "Game/Spells/WaterBall.png": { - "frame": {"x":712,"y":264,"w":47,"h":42}, + "frame": {"x":712,"y":265,"w":47,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":16,"w":47,"h":42}, @@ -7146,7 +7642,7 @@ }, "Game/Spells/WaterMote.png": { - "frame": {"x":274,"y":1404,"w":51,"h":56}, + "frame": {"x":42,"y":1450,"w":51,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":14,"w":51,"h":56}, @@ -7154,7 +7650,7 @@ }, "Game/Sprint.png": { - "frame": {"x":519,"y":216,"w":52,"h":41}, + "frame": {"x":612,"y":220,"w":52,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":15,"w":52,"h":41}, @@ -7162,23 +7658,15 @@ }, "Game/Struggle.png": { - "frame": {"x":861,"y":1380,"w":54,"h":56}, + "frame": {"x":218,"y":1397,"w":54,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":54,"h":56}, "sourceSize": {"w":56,"h":56} }, -"Game/UI/accuracy.png": -{ - "frame": {"x":685,"y":30,"w":34,"h":31}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":2,"y":3,"w":34,"h":31}, - "sourceSize": {"w":36,"h":36} -}, "Game/UI/AutoPass/Allies.png": { - "frame": {"x":195,"y":1763,"w":48,"h":60}, + "frame": {"x":488,"y":1767,"w":48,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":0,"w":48,"h":60}, @@ -7186,7 +7674,7 @@ }, "Game/UI/AutoPass/HelplessAllies.png": { - "frame": {"x":327,"y":1406,"w":49,"h":56}, + "frame": {"x":95,"y":1450,"w":49,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":1,"w":49,"h":56}, @@ -7194,7 +7682,7 @@ }, "Game/UI/AutoPass/HelplessEnemies.png": { - "frame": {"x":429,"y":1295,"w":48,"h":55}, + "frame": {"x":1,"y":1331,"w":48,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":2,"w":48,"h":55}, @@ -7202,7 +7690,7 @@ }, "Game/UI/AutoPass/Neutral.png": { - "frame": {"x":268,"y":1703,"w":43,"h":60}, + "frame": {"x":443,"y":1764,"w":43,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":43,"h":60}, @@ -7210,7 +7698,7 @@ }, "Game/UI/AutoPass/Shop.png": { - "frame": {"x":148,"y":1699,"w":58,"h":60}, + "frame": {"x":61,"y":1749,"w":58,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":58,"h":60}, @@ -7218,7 +7706,7 @@ }, "Game/UI/AutoPass/Special.png": { - "frame": {"x":143,"y":1761,"w":50,"h":60}, + "frame": {"x":688,"y":1773,"w":50,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":50,"h":60}, @@ -7226,7 +7714,7 @@ }, "Game/UI/AutoPass/Summons.png": { - "frame": {"x":894,"y":355,"w":36,"h":47}, + "frame": {"x":414,"y":395,"w":36,"h":47}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":13,"y":7,"w":36,"h":47}, @@ -7234,7 +7722,7 @@ }, "Game/UI/AutoPath/StepDuringCombat.png": { - "frame": {"x":757,"y":308,"w":44,"h":44}, + "frame": {"x":93,"y":340,"w":44,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":8,"w":44,"h":44}, @@ -7242,7 +7730,7 @@ }, "Game/UI/AutoPath/SuppressBeforeCombat.png": { - "frame": {"x":803,"y":309,"w":44,"h":44}, + "frame": {"x":139,"y":344,"w":44,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":8,"w":44,"h":44}, @@ -7250,7 +7738,7 @@ }, "Game/UI/AutoPath/SuppressDuringCombat.png": { - "frame": {"x":849,"y":309,"w":44,"h":44}, + "frame": {"x":229,"y":345,"w":44,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":8,"w":44,"h":44}, @@ -7258,7 +7746,7 @@ }, "Game/UI/AutoStruggle.png": { - "frame": {"x":605,"y":1534,"w":45,"h":57}, + "frame": {"x":244,"y":1515,"w":45,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":0,"w":45,"h":57}, @@ -7266,7 +7754,7 @@ }, "Game/UI/BoxLarge.png": { - "frame": {"x":567,"y":260,"w":42,"h":42}, + "frame": {"x":124,"y":296,"w":42,"h":42}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":42,"h":42}, @@ -7274,23 +7762,15 @@ }, "Game/UI/BulletTransparency.png": { - "frame": {"x":636,"y":931,"w":56,"h":47}, + "frame": {"x":540,"y":929,"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_game.png": -{ - "frame": {"x":938,"y":1,"w":28,"h":27}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":10,"y":14,"w":28,"h":27}, - "sourceSize": {"w":42,"h":56} -}, "Game/UI/button_inventory.png": { - "frame": {"x":514,"y":303,"w":37,"h":44}, + "frame": {"x":627,"y":307,"w":37,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":5,"w":37,"h":44}, @@ -7298,7 +7778,7 @@ }, "Game/UI/button_logbook.png": { - "frame": {"x":1,"y":91,"w":30,"h":35}, + "frame": {"x":853,"y":65,"w":30,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":11,"w":30,"h":35}, @@ -7306,7 +7786,7 @@ }, "Game/UI/button_menu.png": { - "frame": {"x":215,"y":345,"w":42,"h":44}, + "frame": {"x":505,"y":352,"w":42,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":6,"w":42,"h":44}, @@ -7314,7 +7794,7 @@ }, "Game/UI/button_spells.png": { - "frame": {"x":39,"y":209,"w":40,"h":40}, + "frame": {"x":862,"y":181,"w":40,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":8,"w":40,"h":40}, @@ -7322,7 +7802,7 @@ }, "Game/UI/Buttons/Mark.png": { - "frame": {"x":826,"y":64,"w":35,"h":35}, + "frame": {"x":670,"y":64,"w":35,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":20,"w":35,"h":35}, @@ -7330,7 +7810,7 @@ }, "Game/UI/Buttons/Release.png": { - "frame": {"x":86,"y":1171,"w":54,"h":52}, + "frame": {"x":719,"y":1136,"w":54,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":14,"w":54,"h":52}, @@ -7338,7 +7818,7 @@ }, "Game/UI/Buttons/Unmark.png": { - "frame": {"x":863,"y":64,"w":35,"h":35}, + "frame": {"x":707,"y":64,"w":35,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":20,"w":35,"h":35}, @@ -7346,7 +7826,7 @@ }, "Game/UI/Checked.png": { - "frame": {"x":826,"y":64,"w":35,"h":35}, + "frame": {"x":670,"y":64,"w":35,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":12,"w":35,"h":35}, @@ -7354,7 +7834,7 @@ }, "Game/UI/CollectionFilter/Available.png": { - "frame": {"x":1,"y":1168,"w":42,"h":52}, + "frame": {"x":350,"y":1179,"w":42,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":9,"w":42,"h":52}, @@ -7362,7 +7842,7 @@ }, "Game/UI/CollectionFilter/Imprisoned.png": { - "frame": {"x":229,"y":1178,"w":54,"h":52}, + "frame": {"x":775,"y":1137,"w":54,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":10,"w":54,"h":52}, @@ -7370,7 +7850,7 @@ }, "Game/UI/CollectionFilter/Negative.png": { - "frame": {"x":895,"y":309,"w":38,"h":44}, + "frame": {"x":666,"y":308,"w":38,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":17,"y":14,"w":38,"h":44}, @@ -7378,7 +7858,7 @@ }, "Game/UI/CollectionFilter/Positive.png": { - "frame": {"x":464,"y":216,"w":53,"h":41}, + "frame": {"x":557,"y":220,"w":53,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":14,"w":53,"h":41}, @@ -7386,7 +7866,7 @@ }, "Game/UI/CollectionFilter/Rank1.png": { - "frame": {"x":761,"y":264,"w":46,"h":42}, + "frame": {"x":761,"y":265,"w":46,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":16,"w":46,"h":42}, @@ -7394,7 +7874,7 @@ }, "Game/UI/CollectionFilter/Rank2.png": { - "frame": {"x":793,"y":1139,"w":46,"h":52}, + "frame": {"x":977,"y":1155,"w":46,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":10,"w":46,"h":52}, @@ -7402,7 +7882,7 @@ }, "Game/UI/CollectionFilter/Rank3.png": { - "frame": {"x":708,"y":220,"w":46,"h":41}, + "frame": {"x":666,"y":220,"w":46,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":15,"w":46,"h":41}, @@ -7410,15 +7890,23 @@ }, "Game/UI/CollectionFilter/Safe.png": { - "frame": {"x":853,"y":988,"w":48,"h":48}, + "frame": {"x":891,"y":987,"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":563,"y":1586,"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/Release.png": { - "frame": {"x":86,"y":1171,"w":54,"h":52}, + "frame": {"x":719,"y":1136,"w":54,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":10,"w":54,"h":52}, @@ -7426,7 +7914,7 @@ }, "Game/UI/Crossout.png": { - "frame": {"x":327,"y":1464,"w":57,"h":57}, + "frame": {"x":463,"y":1524,"w":57,"h":57}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":10,"w":57,"h":57}, @@ -7434,15 +7922,23 @@ }, "Game/UI/CrouchOff.png": { - "frame": {"x":45,"y":1692,"w":41,"h":60}, + "frame": {"x":885,"y":1793,"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":980,"y":408,"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":187,"y":299,"w":48,"h":43}, + "frame": {"x":394,"y":304,"w":48,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":13,"w":48,"h":43}, @@ -7450,7 +7946,7 @@ }, "Game/UI/Door.png": { - "frame": {"x":284,"y":1235,"w":36,"h":53}, + "frame": {"x":663,"y":1243,"w":36,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":3,"w":36,"h":53}, @@ -7458,7 +7954,7 @@ }, "Game/UI/DoorClose.png": { - "frame": {"x":284,"y":1235,"w":36,"h":53}, + "frame": {"x":663,"y":1243,"w":36,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":12,"y":3,"w":36,"h":53}, @@ -7466,7 +7962,7 @@ }, "Game/UI/Expand.png": { - "frame": {"x":455,"y":174,"w":38,"h":39}, + "frame": {"x":584,"y":179,"w":38,"h":39}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":38,"h":39}, @@ -7474,7 +7970,7 @@ }, "Game/UI/Facility/MaidQuarters.png": { - "frame": {"x":90,"y":1118,"w":54,"h":51}, + "frame": {"x":922,"y":1101,"w":54,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":7,"w":54,"h":51}, @@ -7482,7 +7978,7 @@ }, "Game/UI/Facility/Management.png": { - "frame": {"x":90,"y":1118,"w":54,"h":51}, + "frame": {"x":922,"y":1101,"w":54,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":7,"w":54,"h":51}, @@ -7490,7 +7986,7 @@ }, "Game/UI/Facility/Recycler.png": { - "frame": {"x":649,"y":1595,"w":56,"h":59}, + "frame": {"x":333,"y":1639,"w":56,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":8,"w":56,"h":59}, @@ -7498,7 +7994,7 @@ }, "Game/UI/Facility_Prisoners.png": { - "frame": {"x":226,"y":29,"w":30,"h":29}, + "frame": {"x":112,"y":27,"w":30,"h":29}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":44,"y":4,"w":30,"h":29}, @@ -7506,7 +8002,7 @@ }, "Game/UI/Facility_X.png": { - "frame": {"x":760,"y":64,"w":34,"h":34}, + "frame": {"x":592,"y":64,"w":34,"h":34}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":41,"y":1,"w":34,"h":34}, @@ -7514,15 +8010,23 @@ }, "Game/UI/Floppy.png": { - "frame": {"x":971,"y":317,"w":44,"h":44}, + "frame": {"x":275,"y":345,"w":44,"h":44}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":44,"h":44}, "sourceSize": {"w":44,"h":44} }, +"Game/UI/Help.png": +{ + "frame": {"x":847,"y":266,"w":38,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":11,"y":9,"w":38,"h":42}, + "sourceSize": {"w":60,"h":60} +}, "Game/UI/HelpGag.png": { - "frame": {"x":721,"y":30,"w":32,"h":31}, + "frame": {"x":531,"y":29,"w":32,"h":31}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":15,"w":32,"h":31}, @@ -7530,39 +8034,47 @@ }, "Game/UI/Imprison.png": { - "frame": {"x":853,"y":988,"w":48,"h":48}, + "frame": {"x":891,"y":987,"w":48,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":15,"w":48,"h":48}, "sourceSize": {"w":76,"h":76} }, -"Game/UI/Interact.png": +"Game/UI/Inspect.png": { - "frame": {"x":935,"y":310,"w":34,"h":45}, + "frame": {"x":563,"y":1586,"w":59,"h":58}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":13,"y":5,"w":34,"h":45}, + "spriteSourceSize": {"x":0,"y":1,"w":59,"h":58}, "sourceSize": {"w":60,"h":60} }, -"Game/UI/jail.png": +"Game/UI/Interact.png": { - "frame": {"x":938,"y":1,"w":28,"h":27}, + "frame": {"x":659,"y":354,"w":34,"h":45}, "rotated": false, "trimmed": true, - "spriteSourceSize": {"x":5,"y":4,"w":28,"h":27}, - "sourceSize": {"w":36,"h":36} + "spriteSourceSize": {"x":13,"y":5,"w":34,"h":45}, + "sourceSize": {"w":60,"h":60} }, "Game/UI/Load.png": { - "frame": {"x":1,"y":208,"w":36,"h":40}, + "frame": {"x":326,"y":214,"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":847,"y":266,"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":755,"y":30,"w":28,"h":31}, + "frame": {"x":565,"y":29,"w":28,"h":31}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":14,"w":28,"h":31}, @@ -7570,7 +8082,7 @@ }, "Game/UI/Log/Dialogue.png": { - "frame": {"x":386,"y":1464,"w":35,"h":58}, + "frame": {"x":856,"y":1537,"w":35,"h":58}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":2,"w":35,"h":58}, @@ -7578,7 +8090,7 @@ }, "Game/UI/Log/Items.png": { - "frame": {"x":330,"y":173,"w":41,"h":39}, + "frame": {"x":381,"y":174,"w":41,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":10,"y":11,"w":41,"h":39}, @@ -7586,7 +8098,7 @@ }, "Game/UI/Log/Kills.png": { - "frame": {"x":591,"y":1654,"w":44,"h":59}, + "frame": {"x":492,"y":1706,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":1,"w":44,"h":59}, @@ -7594,7 +8106,7 @@ }, "Game/UI/Log/Self.png": { - "frame": {"x":495,"y":175,"w":38,"h":39}, + "frame": {"x":624,"y":179,"w":38,"h":39}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":11,"y":12,"w":38,"h":39}, @@ -7602,23 +8114,39 @@ }, "Game/UI/Log/Struggle.png": { - "frame": {"x":605,"y":1534,"w":45,"h":57}, + "frame": {"x":244,"y":1515,"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":186,"y":96,"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":226,"y":95,"w":33,"h":36}, + "frame": {"x":221,"y":96,"w":33,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":3,"w":33,"h":36}, "sourceSize": {"w":41,"h":41} }, +"Game/UI/MiniMap/DoorOpen.png": +{ + "frame": {"x":26,"y":1,"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":1,"y":1,"w":24,"h":24}, + "frame": {"x":52,"y":1,"w":24,"h":24}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, @@ -7626,7 +8154,7 @@ }, "Game/UI/MiniMap/Grate.png": { - "frame": {"x":27,"y":1,"w":24,"h":24}, + "frame": {"x":78,"y":1,"w":24,"h":24}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, @@ -7634,7 +8162,7 @@ }, "Game/UI/MiniMap/Shrine.png": { - "frame": {"x":53,"y":1,"w":24,"h":24}, + "frame": {"x":104,"y":1,"w":24,"h":24}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, @@ -7642,7 +8170,7 @@ }, "Game/UI/MiniMap/ShrineMana.png": { - "frame": {"x":79,"y":1,"w":24,"h":24}, + "frame": {"x":130,"y":1,"w":24,"h":24}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, @@ -7650,7 +8178,7 @@ }, "Game/UI/MiniMap/ShrineManaQuest.png": { - "frame": {"x":105,"y":1,"w":24,"h":24}, + "frame": {"x":156,"y":1,"w":24,"h":24}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":24,"h":24}, @@ -7658,15 +8186,23 @@ }, "Game/UI/MiniMap/ShrineQuest.png": { - "frame": {"x":131,"y":1,"w":24,"h":24}, + "frame": {"x":182,"y":1,"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/StairsDown.png": +{ + "frame": {"x":1,"y":1,"w":23,"h":23}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":1,"y":0,"w":23,"h":23}, + "sourceSize": {"w":24,"h":24} +}, "Game/UI/miscast.png": { - "frame": {"x":261,"y":95,"w":32,"h":36}, + "frame": {"x":256,"y":96,"w":32,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":0,"w":32,"h":36}, @@ -7674,7 +8210,7 @@ }, "Game/UI/NoPass.png": { - "frame": {"x":591,"y":1654,"w":44,"h":59}, + "frame": {"x":492,"y":1706,"w":44,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":1,"w":44,"h":59}, @@ -7682,7 +8218,7 @@ }, "Game/UI/Pass.png": { - "frame": {"x":408,"y":1647,"w":43,"h":59}, + "frame": {"x":583,"y":1710,"w":43,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":1,"w":43,"h":59}, @@ -7690,7 +8226,7 @@ }, "Game/UI/PathDisplay.png": { - "frame": {"x":452,"y":61,"w":33,"h":33}, + "frame": {"x":292,"y":61,"w":33,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":19,"y":19,"w":33,"h":33}, @@ -7698,23 +8234,15 @@ }, "Game/UI/Play.png": { - "frame": {"x":495,"y":175,"w":38,"h":39}, + "frame": {"x":624,"y":179,"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":611,"y":219,"w":50,"h":41}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":14,"y":15,"w":50,"h":41}, - "sourceSize": {"w":72,"h":72} -}, "Game/UI/Plus.png": { - "frame": {"x":63,"y":27,"w":28,"h":28}, + "frame": {"x":935,"y":1,"w":28,"h":28}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":1,"w":28,"h":28}, @@ -7722,7 +8250,7 @@ }, "Game/UI/Promote.png": { - "frame": {"x":793,"y":1139,"w":46,"h":52}, + "frame": {"x":977,"y":1155,"w":46,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":15,"y":10,"w":46,"h":52}, @@ -7730,7 +8258,7 @@ }, "Game/UI/Rank/Rank1.png": { - "frame": {"x":761,"y":264,"w":46,"h":42}, + "frame": {"x":761,"y":265,"w":46,"h":42}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":16,"w":46,"h":42}, @@ -7738,7 +8266,7 @@ }, "Game/UI/Rank/Rank2.png": { - "frame": {"x":793,"y":1139,"w":46,"h":52}, + "frame": {"x":977,"y":1155,"w":46,"h":52}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":10,"w":46,"h":52}, @@ -7746,7 +8274,7 @@ }, "Game/UI/Rank/Rank3.png": { - "frame": {"x":665,"y":1718,"w":46,"h":61}, + "frame": {"x":820,"y":1855,"w":46,"h":61}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":5,"w":46,"h":61}, @@ -7754,7 +8282,7 @@ }, "Game/UI/Recall.png": { - "frame": {"x":487,"y":61,"w":33,"h":33}, + "frame": {"x":327,"y":61,"w":33,"h":33}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":0,"w":33,"h":33}, @@ -7762,7 +8290,7 @@ }, "Game/UI/Recycler/Armor.png": { - "frame": {"x":186,"y":1343,"w":57,"h":55}, + "frame": {"x":469,"y":1351,"w":57,"h":55}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":8,"w":57,"h":55}, @@ -7770,7 +8298,7 @@ }, "Game/UI/Recycler/Chastity.png": { - "frame": {"x":800,"y":1600,"w":45,"h":59}, + "frame": {"x":680,"y":1650,"w":45,"h":59}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":16,"y":7,"w":45,"h":59}, @@ -7778,7 +8306,7 @@ }, "Game/UI/Recycler/Dress.png": { - "frame": {"x":935,"y":1218,"w":44,"h":53}, + "frame": {"x":325,"y":1233,"w":44,"h":53}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":24,"y":20,"w":44,"h":53}, @@ -7786,7 +8314,7 @@ }, "Game/UI/Recycler/Latex.png": { - "frame": {"x":582,"y":135,"w":33,"h":38}, + "frame": {"x":584,"y":138,"w":33,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":18,"y":17,"w":33,"h":38}, @@ -7794,7 +8322,7 @@ }, "Game/UI/Recycler/Leather.png": { - "frame": {"x":272,"y":214,"w":35,"h":40}, + "frame": {"x":401,"y":215,"w":35,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":17,"w":35,"h":40}, @@ -7802,7 +8330,7 @@ }, "Game/UI/Recycler/Leather2.png": { - "frame": {"x":272,"y":214,"w":35,"h":40}, + "frame": {"x":401,"y":215,"w":35,"h":40}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":17,"w":35,"h":40}, @@ -7810,7 +8338,7 @@ }, "Game/UI/Recycler/Module.png": { - "frame": {"x":958,"y":1390,"w":52,"h":56}, + "frame": {"x":754,"y":1415,"w":52,"h":56}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":20,"y":19,"w":52,"h":56}, @@ -7818,7 +8346,7 @@ }, "Game/UI/Recycler/Rope.png": { - "frame": {"x":912,"y":945,"w":29,"h":51}, + "frame": {"x":647,"y":1134,"w":29,"h":51}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":22,"y":10,"w":29,"h":51}, @@ -7826,7 +8354,7 @@ }, "Game/UI/Reset.png": { - "frame": {"x":188,"y":95,"w":36,"h":36}, + "frame": {"x":116,"y":93,"w":36,"h":36}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":36,"h":36}, @@ -7834,7 +8362,7 @@ }, "Game/UI/Resource/Latex.png": { - "frame": {"x":77,"y":342,"w":44,"h":44}, + "frame": {"x":321,"y":346,"w":44,"h":44}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":14,"y":14,"w":44,"h":44}, @@ -7842,7 +8370,7 @@ }, "Game/UI/Resource/Metal.png": { - "frame": {"x":1,"y":1334,"w":54,"h":54}, + "frame": {"x":413,"y":1349,"w":54,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":9,"y":9,"w":54,"h":54}, @@ -7850,7 +8378,7 @@ }, "Game/UI/Resource/Rope.png": { - "frame": {"x":662,"y":1245,"w":55,"h":54}, + "frame": {"x":818,"y":1246,"w":55,"h":54}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":9,"w":55,"h":54}, @@ -7858,23 +8386,15 @@ }, "Game/UI/Restore.png": { - "frame": {"x":123,"y":343,"w":44,"h":44}, + "frame": {"x":367,"y":349,"w":44,"h":44}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":44,"h":44}, "sourceSize": {"w":44,"h":44} }, -"Game/UI/restraint_nokey.png": -{ - "frame": {"x":223,"y":1,"w":28,"h":25}, - "rotated": false, - "trimmed": true, - "spriteSourceSize": {"x":4,"y":5,"w":28,"h":25}, - "sourceSize": {"w":36,"h":36} -}, "Game/UI/Revert.png": { - "frame": {"x":187,"y":299,"w":48,"h":43}, + "frame": {"x":394,"y":304,"w":48,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":0,"y":3,"w":48,"h":43}, @@ -7882,7 +8402,7 @@ }, "Game/UI/Safe.png": { - "frame": {"x":169,"y":344,"w":44,"h":44}, + "frame": {"x":413,"y":349,"w":44,"h":44}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":44,"h":44}, @@ -7890,7 +8410,7 @@ }, "Game/UI/savedColor_copy.png": { - "frame": {"x":900,"y":64,"w":35,"h":35}, + "frame": {"x":744,"y":64,"w":35,"h":35}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":4,"y":5,"w":35,"h":35}, @@ -7898,23 +8418,39 @@ }, "Game/UI/savedColor_paste.png": { - "frame": {"x":937,"y":65,"w":35,"h":35}, + "frame": {"x":781,"y":65,"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":459,"y":351,"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":535,"y":175,"w":38,"h":39}, + "frame": {"x":664,"y":179,"w":38,"h":39}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":38,"h":39}, "sourceSize": {"w":38,"h":39} }, +"Game/UI/Sleep.png": +{ + "frame": {"x":246,"y":256,"w":59,"h":42}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":7,"y":7,"w":59,"h":42}, + "sourceSize": {"w":71,"h":60} +}, "Game/UI/Star.png": { - "frame": {"x":93,"y":27,"w":28,"h":28}, + "frame": {"x":965,"y":1,"w":28,"h":28}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":28,"h":28}, @@ -7922,7 +8458,7 @@ }, "Game/UI/StarOff.png": { - "frame": {"x":123,"y":27,"w":28,"h":28}, + "frame": {"x":995,"y":1,"w":28,"h":28}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":28,"h":28}, @@ -7930,7 +8466,7 @@ }, "Game/UI/Status.png": { - "frame": {"x":208,"y":1701,"w":58,"h":60}, + "frame": {"x":121,"y":1753,"w":58,"h":60}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":2,"y":0,"w":58,"h":60}, @@ -7938,15 +8474,23 @@ }, "Game/UI/UsePotionInject.png": { - "frame": {"x":1,"y":168,"w":38,"h":38}, + "frame": {"x":951,"y":142,"w":38,"h":38}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":3,"y":3,"w":38,"h":38}, "sourceSize": {"w":44,"h":44} }, +"Game/UI/WaitJail.png": +{ + "frame": {"x":743,"y":180,"w":59,"h":40}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":0,"y":10,"w":59,"h":40}, + "sourceSize": {"w":60,"h":60} +}, "Game/UI/X.png": { - "frame": {"x":345,"y":61,"w":34,"h":33}, + "frame": {"x":150,"y":58,"w":34,"h":33}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":34,"h":33}, @@ -7954,7 +8498,7 @@ }, "Game/UI/Xgold.png": { - "frame": {"x":381,"y":61,"w":34,"h":33}, + "frame": {"x":186,"y":61,"w":34,"h":33}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":34,"h":33}, @@ -7962,7 +8506,7 @@ }, "Game/UI/XRay0.png": { - "frame": {"x":1,"y":1013,"w":48,"h":48}, + "frame": {"x":941,"y":999,"w":48,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":8,"w":48,"h":48}, @@ -7970,7 +8514,7 @@ }, "Game/UI/XRay1.png": { - "frame": {"x":51,"y":1014,"w":48,"h":48}, + "frame": {"x":1,"y":1011,"w":48,"h":48}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":8,"y":8,"w":48,"h":48}, @@ -7978,15 +8522,23 @@ }, "Game/UI/XRay2.png": { - "frame": {"x":137,"y":1016,"w":48,"h":48}, + "frame": {"x":86,"y":1015,"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":977,"y":66,"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":73,"y":91,"w":37,"h":36}, + "frame": {"x":1,"y":93,"w":37,"h":36}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":37,"h":36}, @@ -7994,7 +8546,7 @@ }, "Game/UseTool.png": { - "frame": {"x":237,"y":300,"w":45,"h":43}, + "frame": {"x":444,"y":304,"w":45,"h":43}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":6,"y":5,"w":45,"h":43}, @@ -8005,9 +8557,9 @@ "version": "1.1", "image": "game5.png", "format": "RGBA8888", - "size": {"w":1024,"h":1888}, + "size": {"w":1024,"h":2027}, "scale": "1", "related_multi_packs": [ "game0.json", "game1.json", "game2.json", "game3.json", "game4.json" ], - "smartupdate": "$TexturePacker:SmartUpdate:76d784dd5df773dd2e2ebbec4425c54f:c9bd94d932662e62f0f3a8268b0ee477:54a7432a0665349a58c0c74f51e75c65$" + "smartupdate": "$TexturePacker:SmartUpdate:cd45dd3b98fe2739696c2386a6ef9b3c:9b1095aa07d6e300e2f0b7c24c8c3454:54a7432a0665349a58c0c74f51e75c65$" } } diff --git a/TextureAtlas/game5.png b/TextureAtlas/game5.png index 2cd48f8fa..aa6b6c2f6 100644 Binary files a/TextureAtlas/game5.png and b/TextureAtlas/game5.png differ diff --git a/package.json b/package.json index e9b54c0f5..119a449dc 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "license": "All Rights Reserved", "private": true, "devDependencies": { + "@typescript/lib-dom": "npm:@types/web@^0.0.151", "http-server": "^14.1.1", "pixi-filters": "5.2.0", "pixi.js": "^7.2.1", diff --git a/tsconfig.json b/tsconfig.json index 3c8b74d36..7cdd2776e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,103 +22,104 @@ "Scripts/Element.ts", "Scripts/Translation.ts", "Scripts/Appearance.ts", - "Game/src/base/KDModUtils.js", + "Game/src/base/KDModUtils.ts", "Game/src/base/KDShaders.ts", "Game/src/player/KDAutoStruggle.js", "Game/src/player/KDClasses.js", - "Game/src/base/KDParticles.js", - "Game/src/restraint/KDLocks.js", - "Game/src/item/KDModifier.js", - "Game/src/item/KDHex.js", - "Game/src/item/KDEnchant.js", + "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.js", "Game/src/enemy/KDLoadoutList.js", - "Game/src/restraint/KDApplyVariants.js", - "Game/src/item/KDInventoryActions.js", + "Game/src/restraint/KDApplyVariants.ts", + "Game/src/item/KDInventoryActions.ts", "Game/src/player/KinkyDungeonStats.js", "Game/src/player/KDTraining.js", - "Game/src/map/KinkyDungeonEditorTiles.js", - "Game/src/map/KinkyDungeonEditor.js", - "Game/src/map/KinkyDungeonEditorGen.js", - "Game/src/base/KinkyDungeonErrors.js", - "Game/src/base/KinkyDungeon.js", + "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.js", + "Game/src/base/KinkyDungeonGame.ts", "Game/src/player/KinkyDungeonVibe.js", - "Game/src/effect/KinkyDungeonBuffsList.js", - "Game/src/map/KinkyDungeonAlt.js", + "Game/src/effect/KinkyDungeonBuffsList.ts", + "Game/src/map/KinkyDungeonAlt.ts", "Game/src/map/KDLairs.ts", - "Game/src/base/KinkyDungeonBones.js", - "Game/src/map/KinkyDungeonMapMods.js", - "Game/src/map/KDSideRooms.js", - "Game/src/map/KinkyDungeonBoss.js", + "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/player/KinkyDungeonPerks.js", - "Game/src/map/KinkyDungeonParams.js", - "Game/src/base/KinkyDungeonVision.js", - "Game/src/faction/KinkyDungeonQuest.js", - "Game/src/item/KinkyDungeonLoot.js", + "Game/src/map/KinkyDungeonParams.ts", + "Game/src/base/KinkyDungeonVision.ts", + "Game/src/faction/KinkyDungeonQuest.ts", + "Game/src/item/KinkyDungeonLoot.ts", "Game/src/enemy/KinkyDungeonEnemies.js", "Game/src/enemy/KinkyDungeonPersonality.js", "Game/src/enemy/KinkyDungeonEnemiesList.js", "Game/src/enemy/KinkyDungeonEnemyEventList.js", "Game/src/enemy/KinkyDungeonEnemyTeaseAttacks.js", - "Game/src/map/KinkyDungeonEscapeList.js", - "Game/src/item/KinkyDungeonCurse.js", - "Game/src/restraint/KinkyDungeonRestraints.js", + "Game/src/map/KinkyDungeonEscapeList.ts", + "Game/src/item/KinkyDungeonCurse.ts", + "Game/src/restraint/KinkyDungeonRestraints.ts", "Game/src/restraint/KDTethers.ts", "Game/src/magic/KDAoEList.ts", - "Game/src/fight/KinkyDungeonFight.js", - "Game/src/fight/KinkyDungeonWeaponList.js", + "Game/src/fight/KinkyDungeonFight.ts", + "Game/src/fight/KinkyDungeonWeaponList.ts", "Game/src/base/KinkyDungeonInput.ts", "Game/src/base/KinkyDungeonHUD.ts", - "Game/src/base/KinkyDungeonDraw.js", - "Game/src/restraint/KinkyDungeonFurniture.js", - "Game/src/magic/KinkyDungeonMagic.js", - "Game/src/magic/KinkyDungeonMagicCode.js", - "Game/src/magic/KinkyDungeonMagicList.js", - "Game/src/magic/KinkyDungeonPlayerEffects.js", - "Game/src/map/KinkyDungeonShrine.js", - "Game/src/map/KinkyDungeonObject.js", - "Game/src/item/KinkyDungeonItem.js", + "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.js", "Game/src/player/KDExpressions.ts", "Game/src/enemy/KDPersistence.ts", - "Game/src/map/KinkyDungeonEffectTiles.js", + "Game/src/map/KinkyDungeonEffectTiles.ts", "Game/src/player/KinkyDungeonDressList.js", - "Game/src/item/KinkyDungeonConsumables.js", - "Game/src/item/KinkyDungeonConsumablesList.js", - "Game/src/item/KinkyDungeonInventory.js", - "Game/src/dialogue/KinkyDungeonLore.js", - "Game/src/dialogue/KinkyDungeonLoreList.js", - "Game/src/faction/KinkyDungeonReputation.js", - "Game/src/map/KinkyDungeonTraps.js", - "Game/src/map/KinkyDungeonTiles.js", - "Game/src/map/KinkyDungeonTilesList.js", + "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.js", - "Game/src/effect/KinkyDungeonBuffs.js", - "Game/src/effect/KinkyDungeonEvents.js", + "Game/src/effect/KinkyDungeonBuffs.ts", + "Game/src/effect/KinkyDungeonEvents.ts", "Game/src/enemy/KinkyDungeonSpawns.js", - "Game/src/prison/KinkyDungeonJail.js", - "Game/src/prison/KDPrison.js", + "Game/src/prison/KinkyDungeonJail.ts", + "Game/src/prison/KDPrison.ts", "Game/src/prison/KDPrisonList.ts", - "Game/src/map/KinkyDungeonSetpiece.js", - "Game/src/dialogue/KinkyDungeonDialogue.js", - "Game/src/dialogue/KinkyDungeonDialogueTriggers.js", - "Game/src/dialogue/KinkyDungeonDialogueList.js", + "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.js", - "Game/src/faction/KinkyDungeonFactionsList.js", + "Game/src/faction/KinkyDungeonFactions.ts", + "Game/src/faction/KinkyDungeonFactionsList.ts", "Game/src/player/KinkyDungeonNeeds.js", - "Game/src/prison/KinkyDungeonJailList.js", + "Game/src/prison/KinkyDungeonJailList.ts", "Game/src/KinkyDungeonTests.js", - "Game/src/item/KinkyDungeonLootList.js", - "Game/src/base/KinkyDungeonMusic.js", + "Game/src/item/KinkyDungeonLootList.ts", + "Game/src/base/KinkyDungeonMusic.ts", "Game/src/enemy/KinkyDungeonNames.js", "Game/src/player/KDDelayedActions.js", "Game/src/enemy/KDCommander.js", "Game/src/map/KDJourney.ts", - "Game/src/restraint/KinkyDungeonRestraintsList.js", - "Game/src/collection/KinkyDungeonCollection.js", + "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", @@ -211,7 +212,9 @@ "Data/ModelStylesCosplay.ts", "Data/ModelDresses.ts", "Game/src/player/KDWardrobe.js", - "Game/src/restraint/KDGenRestraintUniform.ts" + "Game/src/restraint/KDGenRestraintUniform.ts", + "Game/src/enemy/KDPathConditions.ts", + "Game/src/map/KDShop.ts" ], "compilerOptions": { "target": "es2020", @@ -228,6 +231,6 @@ "moduleResolution": "node", "allowSyntheticDefaultImports": true, - "lib": ["DOM", "ES2020"] + "lib": ["DOM", "ES2020"], } }