From 4ca298fbc5d6d640379f886a5eeef4569b0b91a5 Mon Sep 17 00:00:00 2001 From: Even Torset Date: Mon, 18 Nov 2024 04:21:03 +0100 Subject: [PATCH 01/31] Renamed and documented all layer-specific props in action 604. --- CHANGELOG.md | 14 +++ src/actions/604.yml | 118 ++++++++++++++----------- src/fxr.ts | 208 ++++++++++++++++++++++++++++---------------- 3 files changed, 212 insertions(+), 128 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e757de9..dc9f7b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [Unreleased] + +- Updated action 604 with new names and documentation for all of the layer-specific properties and fields. + - `mask` is now `layer1`, and the old `layer1` and `layer2` fields are now `layer2` and `layer3` respectively. + - All other properties with the `layer#` prefix have also been changed to match. + - Previously unknown or incorrectly documented properties related to layer 1 (what used to be "mask") have been properly named and documented: + - `layersColor` -> `layer1Color` + - `unk_ds3_p1_23` -> `layer1SpeedU` + - `unk_ds3_p1_24` -> `layer1SpeedV` + - `unk_ds3_p1_25` -> `layer1OffsetU` + - `unk_ds3_p1_26` -> `layer1OffsetV` + - `unk_ds3_p1_27` -> `layer1ScaleU` + - `unk_ds3_p1_28` -> `layer1ScaleV` + ## [17.0.0] - 2024-11-12 - Named and documented three actions: diff --git a/src/actions/604.yml b/src/actions/604.yml index 7be8457..db87944 100644 --- a/src/actions/604.yml +++ b/src/actions/604.yml @@ -165,30 +165,36 @@ properties: see: - color1 - color2 - layersColor: + layer1Color: type: Vector4Value components: 4 default: [1, 1, 1, 1] argument: ParticleAge color: true desc: | - Color multiplier for both of the texture layers. - layer1Color: + Color multiplier for Layer 1. + + Values in this will be clamped to the 0-1 range. + layer2Color: type: Vector4Value components: 4 default: [1, 1, 1, 1] argument: ParticleAge color: true desc: | - Color multiplier for Layer 1. - layer2Color: + Color multiplier for Layer 2. + + Values in this will be clamped to the 0-1 range. + layer3Color: type: Vector4Value components: 4 default: [1, 1, 1, 1] argument: ParticleAge color: true desc: | - Color multiplier for Layer 2. + Color multiplier for Layer 3. + + Values in this will be clamped to the 0-1 range. alphaFadeThreshold: type: ScalarValue argument: ParticleAge @@ -208,41 +214,23 @@ properties: argument: ParticleAge desc: | Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. - unk_ds3_p1_23: - type: ScalarValue - unk_ds3_p1_24: - type: ScalarValue - unk_ds3_p1_25: - type: ScalarValue - unk_ds3_p1_26: - type: ScalarValue - unk_ds3_p1_27: - type: ScalarValue - default: 1 - unk_ds3_p1_28: - type: ScalarValue - default: 1 layer1SpeedU: type: ScalarValue - default: 0 argument: ParticleAge desc: | Horiztonal scroll speed for Layer 1. layer1SpeedV: type: ScalarValue - default: 0 argument: ParticleAge desc: | Vertical scroll speed for Layer 1. layer1OffsetU: type: ScalarValue - default: 0 argument: Constant0 desc: | Horizontal offset for the UV coordinates of Layer 1. layer1OffsetV: type: ScalarValue - default: 0 argument: Constant0 desc: | Vertical offset for the UV coordinates of Layer 1. @@ -260,25 +248,21 @@ properties: Vertical scale for the UV coordinates of Layer 1. layer2SpeedU: type: ScalarValue - default: 0 argument: ParticleAge desc: | Horiztonal scroll speed for Layer 2. layer2SpeedV: type: ScalarValue - default: 0 argument: ParticleAge desc: | Vertical scroll speed for Layer 2. layer2OffsetU: type: ScalarValue - default: 0 argument: Constant0 desc: | Horizontal offset for the UV coordinates of Layer 2. layer2OffsetV: type: ScalarValue - default: 0 argument: Constant0 desc: | Vertical offset for the UV coordinates of Layer 2. @@ -294,6 +278,38 @@ properties: argument: ParticleAge desc: | Vertical scale for the UV coordinates of Layer 2. + layer3SpeedU: + type: ScalarValue + argument: ParticleAge + desc: | + Horiztonal scroll speed for Layer 3. + layer3SpeedV: + type: ScalarValue + argument: ParticleAge + desc: | + Vertical scroll speed for Layer 3. + layer3OffsetU: + type: ScalarValue + argument: Constant0 + desc: | + Horizontal offset for the UV coordinates of Layer 3. + layer3OffsetV: + type: ScalarValue + argument: Constant0 + desc: | + Vertical offset for the UV coordinates of Layer 3. + layer3ScaleU: + type: ScalarValue + default: 1 + argument: ParticleAge + desc: | + Horizontal scale for the UV coordinates of Layer 3. + layer3ScaleV: + type: ScalarValue + default: 1 + argument: ParticleAge + desc: | + Vertical scale for the UV coordinates of Layer 3. rgbMultiplier: type: ScalarValue default: 1 @@ -334,27 +350,27 @@ properties: default: OrientationMode.CameraPlane desc: | Controls the orientation mode for the particles. See {@link OrientationMode} for more information. - mask: + layer1: field: int default: 1 resource: texture textureType: a desc: | - Mask texture ID. - layer1: + Layer 1 texture ID. + layer2: field: int default: 1 resource: texture textureType: a desc: | - Layer 1 texture ID. - layer2: + Layer 2 texture ID. + layer3: field: int default: 1 resource: texture textureType: a desc: | - Layer 2 texture ID. + Layer 3 texture ID. uniformScale: field: bool default: false @@ -631,9 +647,9 @@ games: DS3: fields1: - orientation - - mask - layer1 - layer2 + - layer3 - blendMode - uniformScale - unk_ds3_f1_6 @@ -694,18 +710,12 @@ games: - color1 - color2 - color3 - - layersColor - layer1Color - layer2Color + - layer3Color - alphaFadeThreshold - frameIndex - frameIndexOffset - - unk_ds3_p1_23 - - unk_ds3_p1_24 - - unk_ds3_p1_25 - - unk_ds3_p1_26 - - unk_ds3_p1_27 - - unk_ds3_p1_28 - layer1SpeedU - layer1SpeedV - layer1OffsetU @@ -718,6 +728,12 @@ games: - layer2OffsetV - layer2ScaleU - layer2ScaleV + - layer3SpeedU + - layer3SpeedV + - layer3OffsetU + - layer3OffsetV + - layer3ScaleU + - layer3ScaleV properties2: - rgbMultiplier - alphaMultiplier @@ -729,9 +745,9 @@ games: SDT: fields1: - orientation - - mask - layer1 - layer2 + - layer3 - uniformScale - unk_ds3_f1_6 - columns @@ -804,18 +820,12 @@ games: - color1 - color2 - color3 - - layersColor - layer1Color - layer2Color + - layer3Color - alphaFadeThreshold - frameIndex - frameIndexOffset - - unk_ds3_p1_23 - - unk_ds3_p1_24 - - unk_ds3_p1_25 - - unk_ds3_p1_26 - - unk_ds3_p1_27 - - unk_ds3_p1_28 - layer1SpeedU - layer1SpeedV - layer1OffsetU @@ -828,13 +838,19 @@ games: - layer2OffsetV - layer2ScaleU - layer2ScaleV + - layer3SpeedU + - layer3SpeedV + - layer3OffsetU + - layer3OffsetV + - layer3ScaleU + - layer3ScaleV properties2: DS3 ER: fields1: - orientation - - mask - layer1 - layer2 + - layer3 - uniformScale - unk_ds3_f1_6 - columns diff --git a/src/fxr.ts b/src/fxr.ts index 8eeaaeb..76d9a5c 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -3173,18 +3173,12 @@ const ActionData: Record Date: Tue, 19 Nov 2024 02:39:32 +0100 Subject: [PATCH 02/31] Documentation site improvements. --- CHANGELOG.md | 6 ++++++ package-lock.json | 37 +++++++++++++++++++++++++++++-------- package.json | 11 ++++++----- typedoc.css | 1 + typedoc.json | 16 ++++++++++++++++ 5 files changed, 58 insertions(+), 13 deletions(-) create mode 100644 typedoc.css create mode 100644 typedoc.json diff --git a/CHANGELOG.md b/CHANGELOG.md index dc9f7b6..4454f30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,11 @@ - `unk_ds3_p1_26` -> `layer1OffsetV` - `unk_ds3_p1_27` -> `layer1ScaleU` - `unk_ds3_p1_28` -> `layer1ScaleV` +- The documentation site has been updated with a few improvements. + - It now has a new theme, one that uses colors closer to the FXR Playground style. + - Enum members are now sorted in ascending order based on the value instead of alphabetically. + - Added links to the FXR Playground and Ko-fi to the sidebar. + - Added the library version number to the header. ## [17.0.0] - 2024-11-12 @@ -241,6 +246,7 @@ If you need to update your scripts, here's a table of things to find and replace - External values 2000 and 70200 for AC6 have been documented thanks to lugia19. - Fixed action 301 (EqualDistanceEmitter) missing a type for one of its fields, potentially causing issues when writing to DS3's structure. +[Unreleased]: https://github.com/EvenTorset/fxr/compare/v17.0.0...HEAD [17.0.0]: https://github.com/EvenTorset/fxr/compare/v16.0.0...v17.0.0 [16.0.0]: https://github.com/EvenTorset/fxr/compare/v15.2.0...v16.0.0 [15.2.0]: https://github.com/EvenTorset/fxr/compare/v15.1.0...v15.2.0 diff --git a/package-lock.json b/package-lock.json index 74ba9e5..625db43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,14 @@ "version": "17.0.0", "license": "Unlicense", "devDependencies": { - "@types/node": "^22.5.5", + "@types/node": "^22.9.0", "cheerio": "^1.0.0", - "chokidar": "^4.0.0", + "chokidar": "^4.0.1", "npm-run-all2": "^7.0.1", - "typedoc": "^0.26.7", - "typescript": "^5.6.2", - "yaml": "^2.5.1" + "typedoc": "^0.26.11", + "typedoc-github-theme": "^0.1.2", + "typescript": "^5.6.3", + "yaml": "^2.6.0" } }, "node_modules/@shikijs/core": { @@ -48,6 +49,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~6.19.8" } @@ -147,6 +149,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", "dev": true, + "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -158,10 +161,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -410,6 +414,7 @@ "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-7.0.1.tgz", "integrity": "sha512-Adbv+bJQ8UTAM03rRODqrO5cx0YU5KCG2CvHtSURiadvdTjjgGJXdbc1oQ9CXBh9dnGfHSoSB1Web/0Dzp6kOQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "cross-spawn": "^7.0.3", @@ -618,6 +623,7 @@ "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.11.tgz", "integrity": "sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "lunr": "^2.3.9", "markdown-it": "^14.1.0", @@ -635,11 +641,25 @@ "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x" } }, + "node_modules/typedoc-github-theme": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/typedoc-github-theme/-/typedoc-github-theme-0.1.2.tgz", + "integrity": "sha512-GFwQeq+z4FMtA9u2+wBx/UvzaX6t3xueigv6Jrt1G8JQLLyYuFfWwE3ESuKzpLfDu1+29GK4n70GbIqFRG+gaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "typedoc": "^0.26.0" + } + }, "node_modules/typescript": { "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -713,6 +733,7 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", "dev": true, + "license": "ISC", "bin": { "yaml": "bin.mjs" }, diff --git a/package.json b/package.json index 0d04014..2032004 100644 --- a/package.json +++ b/package.json @@ -44,12 +44,13 @@ }, "homepage": "https://fxr-docs.pages.dev/", "devDependencies": { - "@types/node": "^22.5.5", + "@types/node": "^22.9.0", "cheerio": "^1.0.0", - "chokidar": "^4.0.0", + "chokidar": "^4.0.1", "npm-run-all2": "^7.0.1", - "typedoc": "^0.26.7", - "typescript": "^5.6.2", - "yaml": "^2.5.1" + "typedoc": "^0.26.11", + "typedoc-github-theme": "^0.1.2", + "typescript": "^5.6.3", + "yaml": "^2.6.0" } } diff --git a/typedoc.css b/typedoc.css new file mode 100644 index 0000000..f68e110 --- /dev/null +++ b/typedoc.css @@ -0,0 +1 @@ +footer { display: none; } diff --git a/typedoc.json b/typedoc.json new file mode 100644 index 0000000..6e0d736 --- /dev/null +++ b/typedoc.json @@ -0,0 +1,16 @@ +{ + "sidebarLinks": { + "FXR Playground": "https://fxr-playground.pages.dev/", + "Support me on Ko-fi": "https://ko-fi.com/cccode", + }, + "includeVersion": true, + "plugin": ["typedoc-github-theme"], + "customCss": "typedoc.css", + "hideGenerator": true, + "sort": [ + "enum-value-ascending", + "kind", + "instance-first", + "alphabetical" + ] +} From 5cd652ae2519a4c39dc6c4e0c9b6f83672c4432c Mon Sep 17 00:00:00 2001 From: Even Torset Date: Tue, 19 Nov 2024 04:56:30 +0100 Subject: [PATCH 03/31] Added Node.hasColor and Node.getColor. --- CHANGELOG.md | 3 + src/fxr.ts | 204 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 207 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4454f30..c61bd95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,9 @@ - `unk_ds3_p1_26` -> `layer1OffsetV` - `unk_ds3_p1_27` -> `layer1ScaleU` - `unk_ds3_p1_28` -> `layer1ScaleV` +- Added two new methods to all node classes: + - `getColor` - Calculates the color value for the node the same way that the games do, which can be used to generate accurate color previews for nodes. This function was originally made for the FXR Playground to generate the color previews there, but has been improved slightly since then. + - `hasColor` - A fast way to check if the `getColor` function will return a color or not. Can be used to check if it would make sense to display a color preview for a node. - The documentation site has been updated with a few improvements. - It now has a new theme, one that uses colors closer to the FXR Playground style. - Enum members are now sorted in ascending order based on the value instead of alphabetically. diff --git a/src/fxr.ts b/src/fxr.ts index 76d9a5c..e30f31f 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -1805,6 +1805,12 @@ export interface ActionMeta { isParticle: boolean } +export interface NodeColorOptions { + activeState?: number + side?: 'start' | 'end' | 'middle' + layer?: number +} + export type AnyAction = Action | DataAction export type Vector2 = [x: number, y: number] export type Vector3 = [x: number, y: number, z: number] @@ -8149,6 +8155,14 @@ function validateDataActionProp(container: any, name: string, prop: ActionDataPr } } +function clampVector(v: T, min: T, max: T): T { + return v.map((e, i) => Math.max(min[i], Math.min(max[i], e))) as T +} + +function clampVec4Value(v: Vector4Value, min: Vector4 = [0, 0, 0, 0], max: Vector4 = [1, 1, 1, 1]) { + return v instanceof Property ? v.clamp(min, max) : clampVector(v, min, max) +} + const GameVersionMap = { [Game.DarkSouls3]: FXRVersion.DarkSouls3, [Game.Sekiro]: FXRVersion.Sekiro, @@ -10317,6 +10331,25 @@ abstract class Node { return this } + /** + * Returns true if the node has a color in the given active state, and + * otherwise returns false. This can be used as a fast way to check if + * {@link getColor} will return a color or not. + * @param activeState The index of a {@link State} to check. + */ + abstract hasColor(activeState?: number): boolean + + /** + * Gets a {@link Vector4Property color property} for the node based on the + * given options. The returned color should equal the color of the visual + * effect of the node in-game, if it has a visual effect, except property + * modifiers and other forms of randomization are not applied. Nodes without + * a visual effect will return `null` instead. + * + * This may be useful for generating accurate color previews for nodes. + */ + abstract getColor(opts?: NodeColorOptions): Vector4Property | null + /** * Remaps all resource IDs in the entire branch. * @param func The function that is used to map the old resource IDs to the @@ -10478,6 +10511,9 @@ class GenericNode extends Node { super(type) } + hasColor(activeState?: number) { return false } + getColor(opts?: NodeColorOptions): Vector4Property | null { return null } + getActions(game: Game): AnyAction[] { return this.actions } getConfigs(game: Game): IConfig[] { return this.configs } getNodes(game: Game): Node[] { return this.nodes } @@ -10550,6 +10586,9 @@ class RootNode extends Node { } } + hasColor(activeState?: number) { return false } + getColor(opts?: NodeColorOptions): Vector4Property | null { return null } + getActions(game: Game): AnyAction[] { switch (game) { case Game.DarkSouls3: @@ -10647,6 +10686,9 @@ class ProxyNode extends Node { */ constructor(public sfx: number) { super(NodeType.Proxy) } + hasColor(activeState?: number) { return false } + getColor(opts?: NodeColorOptions): Vector4Property | null { return null } + getActions(game: Game): AnyAction[] { return [ new SFXReference(this.sfx) ] } @@ -10750,6 +10792,9 @@ class LevelsOfDetailNode extends NodeWithConfigs { } } + hasColor(activeState?: number) { return false } + getColor(opts?: NodeColorOptions): Vector4Property | null { return null } + static fromJSON(obj: any): Node { if ('actions' in obj) { return GenericNode.fromJSON(obj) @@ -10810,6 +10855,162 @@ class BasicNode extends NodeWithConfigs { } } + hasColor(activeState: number = 0) { + const config = this.getActiveConfig(activeState) + if (config) { + return config instanceof BasicConfig && ( + config.appearance instanceof PointLight || + config.appearance instanceof GPUStandardParticle || + config.appearance instanceof GPUStandardCorrectParticle || + config.appearance instanceof LightShaft || + config.appearance instanceof GPUSparkParticle || + config.appearance instanceof GPUSparkCorrectParticle || + config.appearance instanceof LensFlare || + config.appearance instanceof SpotLight || + config.particleModifier instanceof ParticleModifier && ( + config.appearance instanceof PointSprite || + config.appearance instanceof Line || + config.appearance instanceof QuadLine || + config.appearance instanceof BillboardEx || + config.appearance instanceof MultiTextureBillboardEx || + config.appearance instanceof Model || + config.appearance instanceof Tracer || + config.appearance instanceof Distortion || + config.appearance instanceof RadialBlur || + config.appearance instanceof DynamicTracer || + config.appearance instanceof RichModel + ) + ) + } + return false + } + + getColor(opts: NodeColorOptions = {}): Vector4Property | null { + let colorProp: Property = new ConstantProperty(1, 1, 1, 1) + let modified = false + const config = this.getActiveConfig(opts.activeState ?? 0) + if (config instanceof BasicConfig) { + const a = config.appearance + if ( + config.particleModifier instanceof ParticleModifier && ( + a instanceof PointSprite || + a instanceof BillboardEx || + a instanceof Model || + a instanceof Tracer || + a instanceof DynamicTracer || + a instanceof RichModel + ) + ) { + colorProp = anyValueMult( + anyValueMult( + clampVec4Value(a.color2), + clampVec4Value(a.color1), + ), + anyValueMult( + clampVec4Value(config.particleModifier.color), + a.color3, + ), + ) + modified = true + } else if ( + config.particleModifier instanceof ParticleModifier && ( + a instanceof Line || + a instanceof QuadLine + ) + ) { + colorProp = anyValueMult( + anyValueMult( + anyValueMult( + clampVec4Value(a.color1), + clampVec4Value(a.color2), + ), + anyValueMult( + clampVec4Value(config.particleModifier.color), + clampVec4Value(a.color3), + ), + ), + opts.side === 'start' ? clampVec4Value(a.startColor) : + opts.side === 'end' ? clampVec4Value(a.endColor) : + anyValueMult( + 0.5, + anyValueSum( + clampVec4Value(a.startColor), + clampVec4Value(a.endColor), + ), + ), + ) + modified = true + } else if ( + config.particleModifier instanceof ParticleModifier && + a instanceof MultiTextureBillboardEx + ) { + colorProp = anyValueMult( + clampVec4Value(opts.layer === 2 ? a.layer2Color : opts.layer === 3 ? a.layer3Color : a.layer1Color), + anyValueMult( + anyValueMult( + clampVec4Value(a.color2), + clampVec4Value(a.color1), + ), + anyValueMult( + clampVec4Value(config.particleModifier.color), + a.color3, + ), + ) + ) + modified = true + } else if ( + config.particleModifier instanceof ParticleModifier && ( + a instanceof Distortion || + a instanceof RadialBlur + ) + ) { + colorProp = anyValueMult( + clampVec4Value(config.particleModifier.color), + clampVec4Value(a.color), + ) as any + modified = true + } else if ( + a instanceof GPUStandardParticle || + a instanceof GPUStandardCorrectParticle || + a instanceof GPUSparkParticle || + a instanceof GPUSparkCorrectParticle + ) { + colorProp = a.color as any + modified = true + } else if ( + a instanceof PointLight || + a instanceof SpotLight + ) { + colorProp = a.diffuseColor as any + modified = true + } else if (a instanceof LensFlare) { + switch (opts.layer ?? 1) { + case 1: colorProp = a.layer1Color as any; break + case 2: colorProp = a.layer2Color as any; break + case 3: colorProp = a.layer3Color as any; break + case 4: colorProp = a.layer4Color as any; break + } + modified = true + } else if (a instanceof LightShaft) { + colorProp = anyValueMult( + anyValueMult( + a.color2, + a.color1, + ), + a.color3, + ) + modified = true + } + if (!(colorProp instanceof Property)) { + colorProp = new ConstantProperty(...(colorProp as Vector4)) + } + } + if (modified) { + return colorProp + } + return null + } + static fromJSON(obj: any): Node { if ('actions' in obj) { return GenericNode.fromJSON(obj) @@ -10864,6 +11065,9 @@ class NodeEmitterNode extends NodeWithConfigs { } } + hasColor(activeState?: number) { return false } + getColor(opts?: NodeColorOptions): Vector4Property | null { return null } + static fromJSON(obj: any): Node { if ('actions' in obj) { return GenericNode.fromJSON(obj) From 1aadb50f2d10305319cab33f5b8a4d6f461388f7 Mon Sep 17 00:00:00 2001 From: Even Torset Date: Thu, 21 Nov 2024 14:23:42 +0100 Subject: [PATCH 04/31] unk_sdt_f2_38 in action 607 is now scaled by scale functions. --- CHANGELOG.md | 1 + src/actions/607.yml | 5 +++++ src/fxr.ts | 9 ++++++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c61bd95..b519011 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ - Enum members are now sorted in ascending order based on the value instead of alphabetically. - Added links to the FXR Playground and Ko-fi to the sidebar. - Added the library version number to the header. +- The `unk_sdt_f2_38` field in `Distortion` is now scaled by the `scale` method on nodes and data actions, and its effect has been documented. Exactly what is does is still unknown, so it remains unnamed. ## [17.0.0] - 2024-11-12 diff --git a/src/actions/607.yml b/src/actions/607.yml index 8a41ca6..6bb80c0 100644 --- a/src/actions/607.yml +++ b/src/actions/607.yml @@ -432,6 +432,11 @@ properties: field: int unk_sdt_f2_38: field: float + scale: true + desc: | + Unknown float. + + This seems to be something distance or depth-related. It's using the same length units as everything else (meters), and seems to be some sort of threshold or maybe offset for something. When the camera is within this distance from the node, the distortion will also affect other particles seen through it. games: DS3: fields1: diff --git a/src/fxr.ts b/src/fxr.ts index e30f31f..3eb082d 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -3600,7 +3600,7 @@ const ActionData: Record Date: Thu, 21 Nov 2024 15:45:53 +0100 Subject: [PATCH 05/31] Added includeViewDistance option to the scale methods. --- CHANGELOG.md | 7 +- build/build.js | 2 + src/actions/10000.yml | 14 +-- src/actions/10001.yml | 14 +-- src/actions/10008.yml | 14 +-- src/actions/10009.yml | 14 +-- src/actions/10012.yml | 14 +-- src/actions/10015.yml | 14 +-- src/actions/10500.yml | 1 + src/actions/128.yml | 1 + src/actions/600.yml | 14 +-- src/actions/601.yml | 14 +-- src/actions/602.yml | 14 +-- src/actions/603.yml | 14 +-- src/actions/604.yml | 14 +-- src/actions/605.yml | 14 +-- src/actions/606.yml | 14 +-- src/actions/607.yml | 16 +-- src/actions/608.yml | 14 +-- src/actions/609.yml | 1 + src/fxr.ts | 242 ++++++++++++++++++++++-------------------- 21 files changed, 246 insertions(+), 220 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b519011..c13a44f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,12 +16,17 @@ - Added two new methods to all node classes: - `getColor` - Calculates the color value for the node the same way that the games do, which can be used to generate accurate color previews for nodes. This function was originally made for the FXR Playground to generate the color previews there, but has been improved slightly since then. - `hasColor` - A fast way to check if the `getColor` function will return a color or not. Can be used to check if it would make sense to display a color preview for a node. +- The `scale` methods now take an options object, which will include various options for scaling. + - The `recurse` parameter in the `scale` method on nodes is now a property of the options object instead of being its own parameter. + - For now, the only other option is `includeViewDistance`, which can be enabled to also scale properties that are based on the view distance in some way. By default, this option is disabled, which means the default behavior of the `scale` method is now different. Before, these properties were also scaled, which could cause some annoying side-effects in some cases. +- The `maxViewDistance` fields in `PointLight` and `Unk10500` are now scaled by the `scale` methods if `includeViewDistance` is enabled. They were previously not scaled at all, which was inconsistent with the other view distance limit fields in other actions. +- The `depthBias` field in `NodeAttributes` is now scaled by the `scale` methods. +- The `unk_sdt_f2_38` field in `Distortion` is now scaled by the `scale` methods if `includeViewDistance` is enabled, and its effect has been documented. Exactly what it does is still unknown, so it remains unnamed. - The documentation site has been updated with a few improvements. - It now has a new theme, one that uses colors closer to the FXR Playground style. - Enum members are now sorted in ascending order based on the value instead of alphabetically. - Added links to the FXR Playground and Ko-fi to the sidebar. - Added the library version number to the header. -- The `unk_sdt_f2_38` field in `Distortion` is now scaled by the `scale` method on nodes and data actions, and its effect has been documented. Exactly what is does is still unknown, so it remains unnamed. ## [17.0.0] - 2024-11-12 diff --git a/build/build.js b/build/build.js index e86859b..b20ffb2 100644 --- a/build/build.js +++ b/build/build.js @@ -61,6 +61,8 @@ const resourceMap = { const scaleMap = { true: 1, ifNotMinusOne: 2, + distance: 3, + distanceIfNotMinusOne: 4, } const timeMap = { diff --git a/src/actions/10000.yml b/src/actions/10000.yml index aa2f11e..3b21759 100644 --- a/src/actions/10000.yml +++ b/src/actions/10000.yml @@ -811,7 +811,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -825,7 +825,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -841,7 +841,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -855,7 +855,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -871,7 +871,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -883,7 +883,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -907,7 +907,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ds3_f2_27: field: int default: 1 diff --git a/src/actions/10001.yml b/src/actions/10001.yml index 8ef3939..f0a8a94 100644 --- a/src/actions/10001.yml +++ b/src/actions/10001.yml @@ -807,7 +807,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -821,7 +821,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -837,7 +837,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -851,7 +851,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -867,7 +867,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -879,7 +879,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -903,7 +903,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ds3_f2_27: field: int default: 1 diff --git a/src/actions/10008.yml b/src/actions/10008.yml index a05c337..f6ef03b 100644 --- a/src/actions/10008.yml +++ b/src/actions/10008.yml @@ -511,7 +511,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -527,7 +527,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -541,7 +541,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -555,7 +555,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -571,7 +571,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -583,7 +583,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -607,7 +607,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ac6_f2_27: field: int default: 1 diff --git a/src/actions/10009.yml b/src/actions/10009.yml index 7d77f30..693b1b2 100644 --- a/src/actions/10009.yml +++ b/src/actions/10009.yml @@ -512,7 +512,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -528,7 +528,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -542,7 +542,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -556,7 +556,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -572,7 +572,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -584,7 +584,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -608,7 +608,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ac6_f2_27: field: int default: 1 diff --git a/src/actions/10012.yml b/src/actions/10012.yml index 4a7026c..c29ea8d 100644 --- a/src/actions/10012.yml +++ b/src/actions/10012.yml @@ -295,7 +295,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -309,7 +309,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -325,7 +325,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -339,7 +339,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -355,7 +355,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -367,7 +367,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -391,7 +391,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ds3_f2_27: field: int default: 1 diff --git a/src/actions/10015.yml b/src/actions/10015.yml index 0c0bcd6..17b4332 100644 --- a/src/actions/10015.yml +++ b/src/actions/10015.yml @@ -474,7 +474,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -488,7 +488,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -504,7 +504,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -518,7 +518,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -534,7 +534,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -546,7 +546,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -570,7 +570,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_er_f2_27: field: int unk_er_f2_28: diff --git a/src/actions/10500.yml b/src/actions/10500.yml index 89592cf..1aed6c0 100644 --- a/src/actions/10500.yml +++ b/src/actions/10500.yml @@ -21,6 +21,7 @@ properties: When enabled, this limits visibility of nodes outside of the distance defined by {@link maxViewDistance}. maxViewDistance: field: float + scale: distance desc: | All nodes that are farther away from the camera than this will not be visible. This restriction requires {@link limitViewDistance} to be enabled. unk_ds3_f1_2: diff --git a/src/actions/128.yml b/src/actions/128.yml index a50d9bd..c72f3bb 100644 --- a/src/actions/128.yml +++ b/src/actions/128.yml @@ -31,6 +31,7 @@ properties: Controls how the node is attached to the parent node. depthBias: field: float + scale: true desc: | Controls the rendering order of this node. Lower values will cause the node to be drawn in front of nodes with a higher value. This only affects the node with this action, it is not inherited by descendant nodes. diff --git a/src/actions/600.yml b/src/actions/600.yml index fbb6969..ca1d5f6 100644 --- a/src/actions/600.yml +++ b/src/actions/600.yml @@ -172,7 +172,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -186,7 +186,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -202,7 +202,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -216,7 +216,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -232,7 +232,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -244,7 +244,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -273,7 +273,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance default: 0 unk_ds3_f2_27: field: int diff --git a/src/actions/601.yml b/src/actions/601.yml index a91bd87..fc4ceb8 100644 --- a/src/actions/601.yml +++ b/src/actions/601.yml @@ -201,7 +201,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -215,7 +215,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -231,7 +231,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -245,7 +245,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -261,7 +261,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -273,7 +273,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -302,7 +302,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance default: 0 unk_ds3_f2_27: field: int diff --git a/src/actions/602.yml b/src/actions/602.yml index e50ca06..7903514 100644 --- a/src/actions/602.yml +++ b/src/actions/602.yml @@ -216,7 +216,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -230,7 +230,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -246,7 +246,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -260,7 +260,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -276,7 +276,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -288,7 +288,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -317,7 +317,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance default: 0 unk_ds3_f2_27: field: int diff --git a/src/actions/603.yml b/src/actions/603.yml index ceeb51e..58d436a 100644 --- a/src/actions/603.yml +++ b/src/actions/603.yml @@ -380,7 +380,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -394,7 +394,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -410,7 +410,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -424,7 +424,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -440,7 +440,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -452,7 +452,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -476,7 +476,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ds3_f2_27: field: int default: 1 diff --git a/src/actions/604.yml b/src/actions/604.yml index db87944..b34fc72 100644 --- a/src/actions/604.yml +++ b/src/actions/604.yml @@ -477,7 +477,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -491,7 +491,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -507,7 +507,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -521,7 +521,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -537,7 +537,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -549,7 +549,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -573,7 +573,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ds3_f2_27: field: int default: 1 diff --git a/src/actions/605.yml b/src/actions/605.yml index be4d184..212795f 100644 --- a/src/actions/605.yml +++ b/src/actions/605.yml @@ -441,7 +441,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -455,7 +455,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -471,7 +471,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -485,7 +485,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -501,7 +501,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -513,7 +513,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -537,7 +537,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ds3_f2_26: field: int default: 1 diff --git a/src/actions/606.yml b/src/actions/606.yml index b5bacfa..e98e93b 100644 --- a/src/actions/606.yml +++ b/src/actions/606.yml @@ -279,7 +279,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -293,7 +293,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -309,7 +309,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -323,7 +323,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -339,7 +339,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -351,7 +351,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -375,7 +375,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ds3_f2_27: field: int default: 1 diff --git a/src/actions/607.yml b/src/actions/607.yml index 6bb80c0..59af20c 100644 --- a/src/actions/607.yml +++ b/src/actions/607.yml @@ -307,7 +307,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -321,7 +321,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -337,7 +337,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -351,7 +351,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -367,7 +367,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -379,7 +379,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -404,7 +404,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ds3_f2_27: field: int default: 1 @@ -432,7 +432,7 @@ properties: field: int unk_sdt_f2_38: field: float - scale: true + scale: distance desc: | Unknown float. diff --git a/src/actions/608.yml b/src/actions/608.yml index 083bdfc..6288276 100644 --- a/src/actions/608.yml +++ b/src/actions/608.yml @@ -185,7 +185,7 @@ properties: minFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -199,7 +199,7 @@ properties: minDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -215,7 +215,7 @@ properties: maxFadeDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. @@ -229,7 +229,7 @@ properties: maxDistance: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. @@ -245,7 +245,7 @@ properties: minDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -257,7 +257,7 @@ properties: maxDistanceThreshold: field: float default: -1 - scale: ifNotMinusOne + scale: distanceIfNotMinusOne desc: | A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. see: @@ -283,7 +283,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ds3_f2_27: field: int default: 1 diff --git a/src/actions/609.yml b/src/actions/609.yml index 08c383d..8367c27 100644 --- a/src/actions/609.yml +++ b/src/actions/609.yml @@ -234,6 +234,7 @@ properties: field: int maxViewDistance: field: float + scale: distance desc: | Controls the maximum distance for the light source to be active. If the camera is farther away from the light source than this distance, it will stop emitting light. diff --git a/src/fxr.ts b/src/fxr.ts index 3eb082d..d822b71 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -1574,6 +1574,14 @@ export enum ScaleCondition { * Only scale the property if the value is not -1. */ IfNotMinusOne = 2, + /** + * Only scale the property if view distance properties are being scaled. + */ + Distance = 3, + /** + * Only scale the property if view distance properties are being scaled and the value is not -1. + */ + DistanceIfNotMinusOne = 4, } /** @@ -1811,6 +1819,10 @@ export interface NodeColorOptions { layer?: number } +export interface ScalingOptions { + includeViewDistance?: boolean +} + export type AnyAction = Action | DataAction export type Vector2 = [x: number, y: number] export type Vector3 = [x: number, y: number, z: number] @@ -2467,7 +2479,7 @@ const ActionData: Record Date: Thu, 21 Nov 2024 18:56:14 +0100 Subject: [PATCH 06/31] More scaling-related things. --- CHANGELOG.md | 18 ++++++--- src/actions/133.yml | 5 +++ src/fxr.ts | 93 +++++++++++++++++++++++++++++++++++++++------ 3 files changed, 99 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c13a44f..ed854d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,17 +16,23 @@ - Added two new methods to all node classes: - `getColor` - Calculates the color value for the node the same way that the games do, which can be used to generate accurate color previews for nodes. This function was originally made for the FXR Playground to generate the color previews there, but has been improved slightly since then. - `hasColor` - A fast way to check if the `getColor` function will return a color or not. Can be used to check if it would make sense to display a color preview for a node. -- The `scale` methods now take an options object, which will include various options for scaling. - - The `recurse` parameter in the `scale` method on nodes is now a property of the options object instead of being its own parameter. - - For now, the only other option is `includeViewDistance`, which can be enabled to also scale properties that are based on the view distance in some way. By default, this option is disabled, which means the default behavior of the `scale` method is now different. Before, these properties were also scaled, which could cause some annoying side-effects in some cases. -- The `maxViewDistance` fields in `PointLight` and `Unk10500` are now scaled by the `scale` methods if `includeViewDistance` is enabled. They were previously not scaled at all, which was inconsistent with the other view distance limit fields in other actions. -- The `depthBias` field in `NodeAttributes` is now scaled by the `scale` methods. -- The `unk_sdt_f2_38` field in `Distortion` is now scaled by the `scale` methods if `includeViewDistance` is enabled, and its effect has been documented. Exactly what it does is still unknown, so it remains unnamed. +- A few improvements and fixes have been made to scaling: + - Configs now have a `scale` method. + - This works just like method on nodes and data actions, but only affects the config it is called on and the actions it contains. + - The `scale` method on nodes with configs now call the method on the configs instead of calling it on the data actions directly. + - This fixes an issue where the view distance thresholds in `LevelsOfDetailConfig` objects would not be scaled by the `scale` method on nodes since these thresholds are stored in the config instead of in an action internally. + - All of the `scale` methods now take a factor and an options object. + - The old `recurse` parameter in the `scale` method on nodes is now a property of the options object instead of being its own parameter. + - For now, the only other option is `includeViewDistance`, which can be enabled to also scale properties that are based on the view distance in some way. By default, this option is disabled, which means the default behavior of the `scale` method is now different. Before, these properties were also scaled, which could cause some annoying side-effects in some cases. + - The `maxViewDistance` fields in `PointLight` and `Unk10500` and the thresholds in `LevelsOfDetailThresholds` are now scaled by the `scale` methods if `includeViewDistance` is enabled. They were previously not scaled at all, which was inconsistent with the other view distance limit fields in other actions. + - The `depthBias` field in `NodeAttributes` is now scaled by the `scale` methods. + - The `unk_sdt_f2_38` field in `Distortion` is now scaled by the `scale` methods if `includeViewDistance` is enabled, and its effect has been documented. Exactly what it does is still unknown, so it remains unnamed. - The documentation site has been updated with a few improvements. - It now has a new theme, one that uses colors closer to the FXR Playground style. - Enum members are now sorted in ascending order based on the value instead of alphabetically. - Added links to the FXR Playground and Ko-fi to the sidebar. - Added the library version number to the header. +- Fixed the `getActionCount` method on `NodeEmitterConfig` objects always returning `10`. It now correctly returns `9` if the given game is `Game.DarkSouls3`, and `10` otherwise. ## [17.0.0] - 2024-11-12 diff --git a/src/actions/133.yml b/src/actions/133.yml index 524609f..8b405e9 100644 --- a/src/actions/133.yml +++ b/src/actions/133.yml @@ -17,26 +17,31 @@ properties: threshold0: field: int default: 10000 + scale: distance desc: | Distance threshold for child node 0. threshold1: field: int default: 10000 + scale: distance desc: | Distance threshold for child node 1. threshold2: field: int default: 10000 + scale: distance desc: | Distance threshold for child node 2. threshold3: field: int default: 10000 + scale: distance desc: | Distance threshold for child node 3. threshold4: field: int default: 10000 + scale: distance desc: | Distance threshold for child node 4. unk_ac6_f1_5: diff --git a/src/fxr.ts b/src/fxr.ts index d822b71..304bbf0 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -1760,12 +1760,33 @@ export interface IAction { export interface IConfig { readonly type: ConfigType + + /** + * Returns the number of actions this config will contain if written to the + * given {@link game}'s structure. + */ getActionCount(game: Game): number + + /** + * Returns and array of the actions this config will contain if written to + * the given {@link game}'s structure. + */ getActions(game: Game): AnyAction[] + + /** + * Create a deep copy of this config. + */ + clone(): IConfig + + /** + * Scale the config by the given {@link factor}. This can be used to change + * the size of effect created by the config. + */ + scale(factor: number, options?: ScalingOptions): this + toJSON(): any minify(): typeof this walkActions(): Generator - clone(): IConfig } export interface IModifier { @@ -2571,11 +2592,11 @@ const ActionData: Record t * factor) + } + return this + } + } export interface BasicConfigParams { @@ -11475,6 +11532,13 @@ class BasicConfig implements IConfig { }) } + scale(factor: number, options: ScalingOptions) { + for (const action of this.walkActions()) if (action instanceof DataAction) { + action.scale(factor, options) + } + return this + } + } export interface NodeEmitterConfigParams { @@ -11554,7 +11618,7 @@ class NodeEmitterConfig implements IConfig { } getActionCount(game: Game): number { - return 10 + return game === Game.DarkSouls3 ? 9 : 10 } getActions(game: Game): AnyAction[] { @@ -11632,6 +11696,13 @@ class NodeEmitterConfig implements IConfig { }) } + scale(factor: number, options: ScalingOptions) { + for (const action of this.walkActions()) if (action instanceof DataAction) { + action.scale(factor, options) + } + return this + } + } //#region Action From e91535f3fce6ee49c4576b8779c931833bbeabac Mon Sep 17 00:00:00 2001 From: Even Torset Date: Fri, 22 Nov 2024 06:51:36 +0100 Subject: [PATCH 07/31] unk_er_f1_7 -> dither --- CHANGELOG.md | 1 + src/actions/10015.yml | 10 ++++++---- src/fxr.ts | 15 +++++++++------ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed854d0..2e70296 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ - `unk_ds3_p1_26` -> `layer1OffsetV` - `unk_ds3_p1_27` -> `layer1ScaleU` - `unk_ds3_p1_28` -> `layer1ScaleV` +- The `unk_er_f1_7` field in `RichModel` has been given a name: `dither`. It's also been documented and had its type corrected. - Added two new methods to all node classes: - `getColor` - Calculates the color value for the node the same way that the games do, which can be used to generate accurate color previews for nodes. This function was originally made for the FXR Playground to generate the color previews there, but has been improved slightly since then. - `hasColor` - A fast way to check if the `getColor` function will return a color or not. Can be used to check if it would make sense to display a color preview for a node. diff --git a/src/actions/10015.yml b/src/actions/10015.yml index 17b4332..48675c9 100644 --- a/src/actions/10015.yml +++ b/src/actions/10015.yml @@ -343,8 +343,10 @@ properties: unk_er_f1_6: field: int default: 1 - unk_er_f1_7: - field: int + dither: + field: bool + desc: | + If enabled, this allows control of the model's opacity regardless of its material by using dithered transparency. If disabled, changes to the alpha values that affect the particle will not have any effect unless the material allows it, but it will look better than the dithered transparency. unk_er_f1_8: field: int default: -2 @@ -608,7 +610,7 @@ games: - uniformScale - unk_er_f1_5 - unk_er_f1_6 - - unk_er_f1_7 + - dither - unk_er_f1_8 - unk_er_f1_9 - anibnd @@ -711,7 +713,7 @@ games: - uniformScale - unk_er_f1_5 - unk_er_f1_6 - - unk_er_f1_7 + - dither - unk_er_f1_8 - unk_er_f1_9 - anibnd diff --git a/src/fxr.ts b/src/fxr.ts index 304bbf0..fcd5374 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -4994,7 +4994,7 @@ const ActionData: Record Date: Sat, 23 Nov 2024 04:02:03 +0100 Subject: [PATCH 08/31] Recoloring rework. --- CHANGELOG.md | 10 + build/build.js | 2 +- src/actions/10000.yml | 2 +- src/actions/10001.yml | 2 +- src/actions/10003.yml | 2 +- src/actions/10008.yml | 2 +- src/actions/10009.yml | 2 +- src/actions/10012.yml | 2 +- src/actions/10014.yml | 8 +- src/actions/10015.yml | 2 +- src/actions/11000.yml | 4 +- src/actions/600.yml | 2 +- src/actions/601.yml | 2 +- src/actions/602.yml | 2 +- src/actions/603.yml | 2 +- src/actions/604.yml | 2 +- src/actions/605.yml | 2 +- src/actions/606.yml | 2 +- src/actions/609.yml | 4 +- src/fxr.ts | 1050 ++++++++++++++++++++++------------------- 20 files changed, 601 insertions(+), 505 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e70296..de1bf2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,16 @@ - Added two new methods to all node classes: - `getColor` - Calculates the color value for the node the same way that the games do, which can be used to generate accurate color previews for nodes. This function was originally made for the FXR Playground to generate the color previews there, but has been improved slightly since then. - `hasColor` - A fast way to check if the `getColor` function will return a color or not. Can be used to check if it would make sense to display a color preview for a node. +- Recoloring functions have been updated to work more like most people expect them to: + - `BasicConfig` now has a `recolor` method, which works just like the one on nodes, except this only recolors the config it is called on. + - Recolor functions are now given the config, action, and property name for context. This can be used to make recolor functions that handle different properties differently. For example, one could change one property to be red and another property in the same action to green using the same recolor function. + - `Recolor.isPrimary` is a new function that labeles some action color properties as "primary" and others as "secondary". By setting primary color properties to a target color and secondary color properties to white, the final color of the effect will match the target color exactly. This function is now used internally in combination with the new context explained above in some of the pre-defined recolor functions, but may also be used to create your own custom ones. + - The `Recolor.replace`, `Recolor.multiply`, and `Recolor.colorBlend` functions have been updated to use this new system for separating primary and secondary color properties, which means that they will produce colors that more closely match what you would expect. For example, using `Recolor.replace` with an orange color should now make the effect orange, whereas before it would most likely end up being pretty red, depending on what actions were used in the effect. + - The `Recolor.replace` function has also been updated to handle opacity and brightness in a smarter way. Optional parameters have been added to disable these changes if needed. This function should now be considered the "standard" recolor function, because it should handle most cases in the most intuitive way. Without messing with the optional parameters, this function should basically just make any effect have exactly the color you give it. + - Some less useful recolor functions have been **removed** in order to make it easier to pick the right function for a job: + - `Recolor.standardBlend` - This function should simply not be needed anymore. It was designed as a hacky way around the old problem of requiring a single recolor function that handled every property equally. `Recolor.replace` can be used in place of this to get similar results, and it also works with grayscale effects, which `Recolor.standardBlend` couldn't handle. + - `Recolor.add` - This recolor function caused a bit of confusion for some and wasn't all that useful anyway. If anyone finds a good use for this, it may be added back, but maybe with some tweaks. + - `Recolor.replaceSaturation` - Similar to the `add` function, this was just not very useful, but it may be added back in some form if needed. - A few improvements and fixes have been made to scaling: - Configs now have a `scale` method. - This works just like method on nodes and data actions, but only affects the config it is called on and the actions it contains. diff --git a/build/build.js b/build/build.js index b20ffb2..f4aae63 100644 --- a/build/build.js +++ b/build/build.js @@ -227,7 +227,7 @@ export default async function(writeToDist = true) { }${ 'time' in v ? `, time: ${timeMap[v.time]}` : '' }${ - 'color' in v ? `, color: 1` : '' + 'color' in v ? `, color: ${v.color === 'primary' ? 1 : 2}` : '' }${ v.omitClassProp ? `, omit: 1` : '' }${ diff --git a/src/actions/10000.yml b/src/actions/10000.yml index 3b21759..dce59bb 100644 --- a/src/actions/10000.yml +++ b/src/actions/10000.yml @@ -83,7 +83,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ParticleAge - color: true + color: primary desc: | Color multiplier. diff --git a/src/actions/10001.yml b/src/actions/10001.yml index f0a8a94..b98c520 100644 --- a/src/actions/10001.yml +++ b/src/actions/10001.yml @@ -83,7 +83,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ParticleAge - color: true + color: primary desc: | Color multiplier. diff --git a/src/actions/10003.yml b/src/actions/10003.yml index 46d59d0..4cf2ac7 100644 --- a/src/actions/10003.yml +++ b/src/actions/10003.yml @@ -29,7 +29,7 @@ properties: type: Vector4Value components: 4 default: [1, 1, 1, 1] - color: true + color: primary unk_ds3_p1_5: type: ScalarValue unk_ds3_p1_6: diff --git a/src/actions/10008.yml b/src/actions/10008.yml index f6ef03b..790df9a 100644 --- a/src/actions/10008.yml +++ b/src/actions/10008.yml @@ -46,7 +46,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ParticleAge - color: true + color: primary desc: | Color multiplier. diff --git a/src/actions/10009.yml b/src/actions/10009.yml index 693b1b2..d17423d 100644 --- a/src/actions/10009.yml +++ b/src/actions/10009.yml @@ -47,7 +47,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ParticleAge - color: true + color: primary desc: | Color multiplier. diff --git a/src/actions/10012.yml b/src/actions/10012.yml index c29ea8d..f1e9032 100644 --- a/src/actions/10012.yml +++ b/src/actions/10012.yml @@ -74,7 +74,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ParticleAge - color: true + color: primary desc: | Color multiplier. diff --git a/src/actions/10014.yml b/src/actions/10014.yml index 0b7d55c..84a36f2 100644 --- a/src/actions/10014.yml +++ b/src/actions/10014.yml @@ -23,7 +23,7 @@ properties: type: Vector4Value components: 4 default: [1, 1, 1, 1] - color: true + color: primary desc: | Layer 1 color. layer2Width: @@ -42,7 +42,7 @@ properties: type: Vector4Value components: 4 default: [1, 1, 1, 1] - color: true + color: primary desc: | Layer 2 color. layer3Width: @@ -61,7 +61,7 @@ properties: type: Vector4Value components: 4 default: [1, 1, 1, 1] - color: true + color: primary desc: | Layer 3 color. layer4Width: @@ -80,7 +80,7 @@ properties: type: Vector4Value components: 4 default: [1, 1, 1, 1] - color: true + color: primary desc: | Layer 4 color. layer1: diff --git a/src/actions/10015.yml b/src/actions/10015.yml index 48675c9..05ffebb 100644 --- a/src/actions/10015.yml +++ b/src/actions/10015.yml @@ -161,7 +161,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ParticleAge - color: true + color: primary desc: | Color multiplier. diff --git a/src/actions/11000.yml b/src/actions/11000.yml index 46efb6c..9b95684 100644 --- a/src/actions/11000.yml +++ b/src/actions/11000.yml @@ -12,7 +12,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ActiveTime - color: true + color: primary desc: | Controls the diffuse color of the light. @@ -24,7 +24,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ActiveTime - color: true + color: primary desc: | Controls the specular color of the light. diff --git a/src/actions/600.yml b/src/actions/600.yml index ca1d5f6..93828af 100644 --- a/src/actions/600.yml +++ b/src/actions/600.yml @@ -62,7 +62,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ParticleAge - color: true + color: primary desc: | Color multiplier. diff --git a/src/actions/601.yml b/src/actions/601.yml index fc4ceb8..3e87532 100644 --- a/src/actions/601.yml +++ b/src/actions/601.yml @@ -29,7 +29,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ParticleAge - color: true + color: primary desc: | Color multiplier. diff --git a/src/actions/602.yml b/src/actions/602.yml index 7903514..a65ff8c 100644 --- a/src/actions/602.yml +++ b/src/actions/602.yml @@ -38,7 +38,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ParticleAge - color: true + color: primary desc: | Color multiplier. diff --git a/src/actions/603.yml b/src/actions/603.yml index 58d436a..7540414 100644 --- a/src/actions/603.yml +++ b/src/actions/603.yml @@ -95,7 +95,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ParticleAge - color: true + color: primary desc: | Color multiplier. diff --git a/src/actions/604.yml b/src/actions/604.yml index b34fc72..fe242ed 100644 --- a/src/actions/604.yml +++ b/src/actions/604.yml @@ -157,7 +157,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ParticleAge - color: true + color: primary desc: | Color multiplier for the particle. diff --git a/src/actions/605.yml b/src/actions/605.yml index 212795f..d8e10ed 100644 --- a/src/actions/605.yml +++ b/src/actions/605.yml @@ -172,7 +172,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ParticleAge - color: true + color: primary desc: | Color multiplier. diff --git a/src/actions/606.yml b/src/actions/606.yml index e98e93b..6d48f46 100644 --- a/src/actions/606.yml +++ b/src/actions/606.yml @@ -72,7 +72,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ParticleAge - color: true + color: primary desc: | Color multiplier. diff --git a/src/actions/609.yml b/src/actions/609.yml index 8367c27..32e63c7 100644 --- a/src/actions/609.yml +++ b/src/actions/609.yml @@ -12,7 +12,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ActiveTime - color: true + color: primary desc: | Controls the diffuse color of the light. @@ -26,7 +26,7 @@ properties: components: 4 default: [1, 1, 1, 1] argument: ActiveTime - color: true + color: primary desc: | Controls the specular color of the light. diff --git a/src/fxr.ts b/src/fxr.ts index fcd5374..37c5a15 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -2070,7 +2070,7 @@ export type ActionDataProp = ( textureType?: string scale?: ScaleCondition time?: TimeOperation - color?: 1 + color?: 1 | 2 omit?: 1 paths?: { [game: string]: [string, number] @@ -2563,7 +2563,7 @@ const ActionData: Record) switch (k) { + case 'commonParticleNormal': + case 'commonParticleMultiply': + case 'commonParticleAdd': + case 'commonParticleSubtract': + palette[k] = v.map(e => ({ + modifier: Property.fromJSON(e.modifier), + color1: Property.fromJSON(e.color1), + color2: Property.fromJSON(e.color2), + color3: Property.fromJSON(e.color3), + rgbMultiplier: Property.fromJSON(e.rgbMultiplier), + bloomColor: e.bloomColor, + })) + break + case 'distortionParticle': + case 'blurParticle': + palette[k] = v.map(e => ({ + modifier: Property.fromJSON(e.modifier), + color: Property.fromJSON(e.color), + rgbMultiplier: Property.fromJSON(e.rgbMultiplier), + bloomColor: e.bloomColor, + })) + break + case 'light': + palette[k] = v.map(e => ({ + diffuseColor: Property.fromJSON(e.diffuseColor), + diffuseMultiplier: Property.fromJSON(e.diffuseMultiplier), + ...'specularColor' in e && { + specularColor: Property.fromJSON(e.specularColor), + specularMultiplier: Property.fromJSON(e.specularMultiplier), + } + })) + break + case 'gpuParticle': + palette[k] = v.map(e => ({ + color: Property.fromJSON(e.color), + rgbMultiplier: e.rgbMultiplier, + colorMin: e.colorMin, + colorMax: e.colorMax, + ...'bloomColor' in e && { + bloomColor: e.bloomColor + } + })) + break + case 'lensFlare': + palette[k] = v.map(e => ({ + color: Property.fromJSON(e.color), + colorMultiplier: e.colorMultiplier, + bloomColor: e.bloomColor, + })) + break + } + + // Set up fallbacks for missing palette entries + if (!('commonParticleNormal' in palette)) { + if ( + 'commonParticleMultiply' in palette || + 'commonParticleAdd' in palette || + 'commonParticleSubtract' in palette + ) { + palette.commonParticleNormal = + palette.commonParticleMultiply ?? + palette.commonParticleAdd ?? + palette.commonParticleSubtract + } else if ('gpuParticle' in palette) { + const e = averagePaletteEntries(palette.gpuParticle)[0] + palette.commonParticleNormal = [{ + modifier: new ConstantProperty(1, 1, 1, 1), + color1: new ConstantProperty(1, 1, 1, 1), + color2: new ConstantProperty(1, 1, 1, 1), + color3: e.color, + bloomColor: e.bloomColor ?? [1, 1, 1, 1], + rgbMultiplier: new ConstantProperty(e.rgbMultiplier), + }] + } else if ('lensFlare' in palette) { + const e = averagePaletteEntries(palette.lensFlare)[0] + palette.commonParticleNormal = [{ + modifier: new ConstantProperty(1, 1, 1, 1), + color1: new ConstantProperty(1, 1, 1, 1), + color2: new ConstantProperty(1, 1, 1, 1), + color3: e.color, + bloomColor: e.bloomColor, + rgbMultiplier: new ConstantProperty(Math.max(...e.colorMultiplier.slice(0, 3))), + }] + } else if ('distortionParticle' in palette) { + const e = averagePaletteEntries(palette.distortionParticle)[0] + palette.commonParticleNormal = [{ + modifier: e.modifier, + color1: new ConstantProperty(1, 1, 1, 1), + color2: new ConstantProperty(1, 1, 1, 1), + color3: e.color, + bloomColor: e.bloomColor, + rgbMultiplier: e.rgbMultiplier, + }] + } else if ('blurParticle' in palette) { + const e = averagePaletteEntries(palette.blurParticle)[0] + palette.commonParticleNormal = [{ + modifier: e.modifier, + color1: new ConstantProperty(1, 1, 1, 1), + color2: new ConstantProperty(1, 1, 1, 1), + color3: e.color, + bloomColor: e.bloomColor, + rgbMultiplier: e.rgbMultiplier, + }] + } else if ('light' in palette) { + const e = averagePaletteEntries(palette.light)[0] + palette.commonParticleNormal = [{ + modifier: new ConstantProperty(1, 1, 1, 1), + color1: new ConstantProperty(1, 1, 1, 1), + color2: new ConstantProperty(1, 1, 1, 1), + color3: e.diffuseColor, + bloomColor: [1, 1, 1, 0], + rgbMultiplier: e.diffuseMultiplier, + }] + } + } + palette.commonParticleMultiply ??= palette.commonParticleNormal + palette.commonParticleAdd ??= palette.commonParticleNormal + palette.commonParticleSubtract ??= palette.commonParticleNormal + let avgCommonNormal: Recolor.PaletteSlots['CommonParticle'] + if (!('distortionParticle' in palette)) { + avgCommonNormal ??= averagePaletteEntries(palette.commonParticleNormal)[0] + palette.distortionParticle = [{ + modifier: new ConstantProperty(1, 1, 1, 1), + color: new ConstantProperty(1, 1, 1, 1), + rgbMultiplier: 1, + bloomColor: [1, 1, 1, 0] + }] + } + palette.blurParticle ??= palette.distortionParticle + if (!('light' in palette)) { + avgCommonNormal ??= averagePaletteEntries(palette.commonParticleNormal)[0] + palette.light = [{ + diffuseColor: anyValueMult( + anyValueMult( + avgCommonNormal.color1, + avgCommonNormal.color2 + ), + avgCommonNormal.color3, + ), + diffuseMultiplier: avgCommonNormal.rgbMultiplier, + }] + } + if (!('gpuParticle' in palette)) { + avgCommonNormal ??= averagePaletteEntries(palette.commonParticleNormal)[0] + palette.gpuParticle = [{ + color: anyValueMult( + anyValueMult( + avgCommonNormal.color1, + avgCommonNormal.color2 + ), + avgCommonNormal.color3, + ), + rgbMultiplier: avgCommonNormal.rgbMultiplier.valueAt(0), + colorMin: [0, 0, 0, 0], + colorMax: [0, 0, 0, 0], + bloomColor: avgCommonNormal.bloomColor, + }] + } + if (!('lensFlare' in palette)) { + avgCommonNormal ??= averagePaletteEntries(palette.commonParticleNormal)[0] + palette.lensFlare = [{ + color: anyValueMult( + anyValueMult( + avgCommonNormal.color1, + avgCommonNormal.color2 + ), + avgCommonNormal.color3, + ), + colorMultiplier: [1, 1, 1, 1], + bloomColor: avgCommonNormal.bloomColor, + }] + } + + function durationFallback(action: any, secondary?: any) { + if (!(action instanceof NodeAttributes || action instanceof ParticleAttributes)) { + action = { duration: 1 } + } + if (!(secondary instanceof NodeAttributes || secondary instanceof ParticleAttributes)) { + secondary = { duration: 1 } + } + return () => { + let d = action.duration instanceof Property ? + action.duration.valueAt(0) : + action.duration + if (d <= 0) { + d = secondary.duration instanceof Property ? + secondary.duration.valueAt(0) : + secondary.duration + } + if (d <= 0) { + d = 1 + } + return d + } + } + + function proc( + paletteProp: AnyValue, + c: T, + k: keyof T, + durationFallback: () => number = () => 1 + ) { + if (k === 'bloomColor') { + ;(c[k] as any) = (paletteProp as Vector4).with(3, Math.min(1, paletteProp[3]) * c[k][3]) as Vector4 + } else if ( + paletteProp instanceof SequenceProperty || + paletteProp instanceof ComponentSequenceProperty + ) { + const d = ( + c[k] instanceof SequenceProperty || + c[k] instanceof ComponentSequenceProperty ? + c[k].duration : + durationFallback() + ) + let alpha: ScalarValue + if (isVectorValue(c[k]) && getComponentCount(c[k] as AnyValue) === 4) { + alpha = separateComponents(c[k])[3] + } + ;(c[k] as any) = paletteProp.clone() + ;(c[k] as any).duration = d + if (isVectorValue(c[k]) && getComponentCount(c[k] as AnyValue) === 4) { + ;(c[k] as any) = setVectorComponent(c[k] as any, 3, alpha) + } + if (c[k] instanceof Property) { + ;(c[k] as VectorProperty) = c[k].minify() + } + } else { + if (isVectorValue(c[k])) { + ;(c[k] as VectorValue) = setVectorComponent( + ( + paletteProp instanceof Property ? paletteProp.clone() : + (paletteProp as Vector).slice() + ) as VectorValue, + 3, separateComponents(c[k])[3] + ) + if (c[k] instanceof Property) { + ;(c[k] as VectorProperty) = c[k].minify() + } + } else { + ;(c[k] as any) = ( + paletteProp instanceof Property ? paletteProp.clone() : + paletteProp + ) + } + } + } + + return { palette, durationFallback, proc } +} + const GameVersionMap = { [Game.DarkSouls3]: FXRVersion.DarkSouls3, [Game.Sekiro]: FXRVersion.Sekiro, @@ -10017,370 +10283,14 @@ abstract class Node { for (const action of this.walkActions(recurse)) if (action instanceof DataAction) { action.recolor(funcOrPalette) } - } else { - if (!( - 'commonParticleNormal' in funcOrPalette || - 'commonParticleMultiply' in funcOrPalette || - 'commonParticleAdd' in funcOrPalette || - 'commonParticleSubtract' in funcOrPalette || - 'distortionParticle' in funcOrPalette || - 'blurParticle' in funcOrPalette || - 'light' in funcOrPalette || - 'gpuParticle' in funcOrPalette || - 'lensFlare' in funcOrPalette - )) { - throw new Error('Invalid color palette.') - } - const palette: Recolor.ColorPalette = {} - for (const [k, v] of Object.entries(funcOrPalette) as Entries) switch (k) { - case 'commonParticleNormal': - case 'commonParticleMultiply': - case 'commonParticleAdd': - case 'commonParticleSubtract': - palette[k] = v.map(e => ({ - modifier: Property.fromJSON(e.modifier), - color1: Property.fromJSON(e.color1), - color2: Property.fromJSON(e.color2), - color3: Property.fromJSON(e.color3), - rgbMultiplier: Property.fromJSON(e.rgbMultiplier), - bloomColor: e.bloomColor, - })) - break - case 'distortionParticle': - case 'blurParticle': - palette[k] = v.map(e => ({ - modifier: Property.fromJSON(e.modifier), - color: Property.fromJSON(e.color), - rgbMultiplier: Property.fromJSON(e.rgbMultiplier), - bloomColor: e.bloomColor, - })) - break - case 'light': - palette[k] = v.map(e => ({ - diffuseColor: Property.fromJSON(e.diffuseColor), - diffuseMultiplier: Property.fromJSON(e.diffuseMultiplier), - ...'specularColor' in e && { - specularColor: Property.fromJSON(e.specularColor), - specularMultiplier: Property.fromJSON(e.specularMultiplier), - } - })) - break - case 'gpuParticle': - palette[k] = v.map(e => ({ - color: Property.fromJSON(e.color), - rgbMultiplier: e.rgbMultiplier, - colorMin: e.colorMin, - colorMax: e.colorMax, - ...'bloomColor' in e && { - bloomColor: e.bloomColor - } - })) - break - case 'lensFlare': - palette[k] = v.map(e => ({ - color: Property.fromJSON(e.color), - colorMultiplier: e.colorMultiplier, - bloomColor: e.bloomColor, - })) - break - } - - // Set up fallbacks for missing palette entries - if (!('commonParticleNormal' in palette)) { - if ( - 'commonParticleMultiply' in palette || - 'commonParticleAdd' in palette || - 'commonParticleSubtract' in palette - ) { - palette.commonParticleNormal = - palette.commonParticleMultiply ?? - palette.commonParticleAdd ?? - palette.commonParticleSubtract - } else if ('gpuParticle' in palette) { - const e = averagePaletteEntries(palette.gpuParticle)[0] - palette.commonParticleNormal = [{ - modifier: new ConstantProperty(1, 1, 1, 1), - color1: new ConstantProperty(1, 1, 1, 1), - color2: new ConstantProperty(1, 1, 1, 1), - color3: e.color, - bloomColor: e.bloomColor ?? [1, 1, 1, 1], - rgbMultiplier: new ConstantProperty(e.rgbMultiplier), - }] - } else if ('lensFlare' in palette) { - const e = averagePaletteEntries(palette.lensFlare)[0] - palette.commonParticleNormal = [{ - modifier: new ConstantProperty(1, 1, 1, 1), - color1: new ConstantProperty(1, 1, 1, 1), - color2: new ConstantProperty(1, 1, 1, 1), - color3: e.color, - bloomColor: e.bloomColor, - rgbMultiplier: new ConstantProperty(Math.max(...e.colorMultiplier.slice(0, 3))), - }] - } else if ('distortionParticle' in palette) { - const e = averagePaletteEntries(palette.distortionParticle)[0] - palette.commonParticleNormal = [{ - modifier: e.modifier, - color1: new ConstantProperty(1, 1, 1, 1), - color2: new ConstantProperty(1, 1, 1, 1), - color3: e.color, - bloomColor: e.bloomColor, - rgbMultiplier: e.rgbMultiplier, - }] - } else if ('blurParticle' in palette) { - const e = averagePaletteEntries(palette.blurParticle)[0] - palette.commonParticleNormal = [{ - modifier: e.modifier, - color1: new ConstantProperty(1, 1, 1, 1), - color2: new ConstantProperty(1, 1, 1, 1), - color3: e.color, - bloomColor: e.bloomColor, - rgbMultiplier: e.rgbMultiplier, - }] - } else if ('light' in palette) { - const e = averagePaletteEntries(palette.light)[0] - palette.commonParticleNormal = [{ - modifier: new ConstantProperty(1, 1, 1, 1), - color1: new ConstantProperty(1, 1, 1, 1), - color2: new ConstantProperty(1, 1, 1, 1), - color3: e.diffuseColor, - bloomColor: [1, 1, 1, 0], - rgbMultiplier: e.diffuseMultiplier, - }] - } - } - palette.commonParticleMultiply ??= palette.commonParticleNormal - palette.commonParticleAdd ??= palette.commonParticleNormal - palette.commonParticleSubtract ??= palette.commonParticleNormal - let avgCommonNormal: Recolor.PaletteSlots['CommonParticle'] - if (!('distortionParticle' in palette)) { - avgCommonNormal ??= averagePaletteEntries(palette.commonParticleNormal)[0] - palette.distortionParticle = [{ - modifier: new ConstantProperty(1, 1, 1, 1), - color: new ConstantProperty(1, 1, 1, 1), - rgbMultiplier: 1, - bloomColor: [1, 1, 1, 0] - }] - } - palette.blurParticle ??= palette.distortionParticle - if (!('light' in palette)) { - avgCommonNormal ??= averagePaletteEntries(palette.commonParticleNormal)[0] - palette.light = [{ - diffuseColor: anyValueMult( - anyValueMult( - avgCommonNormal.color1, - avgCommonNormal.color2 - ), - avgCommonNormal.color3, - ), - diffuseMultiplier: avgCommonNormal.rgbMultiplier, - }] - } - if (!('gpuParticle' in palette)) { - avgCommonNormal ??= averagePaletteEntries(palette.commonParticleNormal)[0] - palette.gpuParticle = [{ - color: anyValueMult( - anyValueMult( - avgCommonNormal.color1, - avgCommonNormal.color2 - ), - avgCommonNormal.color3, - ), - rgbMultiplier: avgCommonNormal.rgbMultiplier.valueAt(0), - colorMin: [0, 0, 0, 0], - colorMax: [0, 0, 0, 0], - bloomColor: avgCommonNormal.bloomColor, - }] - } - if (!('lensFlare' in palette)) { - avgCommonNormal ??= averagePaletteEntries(palette.commonParticleNormal)[0] - palette.lensFlare = [{ - color: anyValueMult( - anyValueMult( - avgCommonNormal.color1, - avgCommonNormal.color2 - ), - avgCommonNormal.color3, - ), - colorMultiplier: [1, 1, 1, 1], - bloomColor: avgCommonNormal.bloomColor, - }] + for (const config of this.walkConfigs(recurse)) if (config instanceof BasicConfig) { + config.recolor(funcOrPalette) } + } else { + const { palette, durationFallback, proc } = genFilledPaletteAndFunctions(funcOrPalette) - function durationFallback(action: any, secondary?: any) { - if (!(action instanceof NodeAttributes || action instanceof ParticleAttributes)) { - action = { duration: 1 } - } - if (!(secondary instanceof NodeAttributes || secondary instanceof ParticleAttributes)) { - secondary = { duration: 1 } - } - return () => { - let d = action.duration instanceof Property ? - action.duration.valueAt(0) : - action.duration - if (d <= 0) { - d = secondary.duration instanceof Property ? - secondary.duration.valueAt(0) : - secondary.duration - } - if (d <= 0) { - d = 1 - } - return d - } - } - function proc( - paletteProp: AnyValue, - c: T, - k: keyof T, - durationFallback: () => number = () => 1 - ) { - if (k === 'bloomColor') { - ;(c[k] as any) = (paletteProp as Vector4).with(3, Math.min(1, paletteProp[3]) * c[k][3]) as Vector4 - } else if ( - paletteProp instanceof SequenceProperty || - paletteProp instanceof ComponentSequenceProperty - ) { - const d = ( - c[k] instanceof SequenceProperty || - c[k] instanceof ComponentSequenceProperty ? - c[k].duration : - durationFallback() - ) - let alpha: ScalarValue - if (isVectorValue(c[k]) && getComponentCount(c[k] as AnyValue) === 4) { - alpha = separateComponents(c[k])[3] - } - ;(c[k] as any) = paletteProp.clone() - ;(c[k] as any).duration = d - if (isVectorValue(c[k]) && getComponentCount(c[k] as AnyValue) === 4) { - ;(c[k] as any) = setVectorComponent(c[k] as any, 3, alpha) - } - if (c[k] instanceof Property) { - ;(c[k] as VectorProperty) = c[k].minify() - } - } else { - if (isVectorValue(c[k])) { - ;(c[k] as VectorValue) = setVectorComponent( - ( - paletteProp instanceof Property ? paletteProp.clone() : - (paletteProp as Vector).slice() - ) as VectorValue, - 3, separateComponents(c[k])[3] - ) - if (c[k] instanceof Property) { - ;(c[k] as VectorProperty) = c[k].minify() - } - } else { - ;(c[k] as any) = ( - paletteProp instanceof Property ? paletteProp.clone() : - paletteProp - ) - } - } - } for (const config of this.walkConfigs(recurse)) if (config instanceof BasicConfig) { - const a = config.appearance - if ( - a instanceof PointSprite || - a instanceof Line || - a instanceof QuadLine || - a instanceof BillboardEx || - a instanceof MultiTextureBillboardEx || - a instanceof Model || - a instanceof RichModel || - a instanceof Tracer || - a instanceof DynamicTracer - ) { - if (!(config.particleModifier instanceof ParticleModifier)) continue - if (a instanceof MultiTextureBillboardEx) { - a.recolorProperty('layersColor', Recolor.grayscale) - a.recolorProperty('layer1Color', Recolor.grayscale) - a.recolorProperty('layer2Color', Recolor.grayscale) - } else if (a instanceof Line || a instanceof QuadLine) { - a.recolorProperty('startColor', Recolor.grayscale) - a.recolorProperty('endColor', Recolor.grayscale) - } - let blendMode = 'blendMode' in a ? a.blendMode : BlendMode.Normal - if (blendMode instanceof Property) { - blendMode = blendMode.valueAt(0) - } - if (blendMode === BlendMode.Source || blendMode === BlendMode.Unk6) { - blendMode = BlendMode.Normal - } else if (blendMode === BlendMode.Unk0 || blendMode === BlendMode.Unk7) { - blendMode = BlendMode.Add - } - const key = `commonParticle${BlendMode[blendMode]}` as KeysOfType< - Recolor.ColorPalette, - Recolor.PaletteSlots['CommonParticle'][] - > - const pc = randomItem(palette[key]) - const ndf = durationFallback(config.nodeAttributes) - const pdf = durationFallback(config.particleAttributes, config.nodeAttributes) - proc(pc.modifier, config.particleModifier, 'color', ndf) - proc(pc.color1, a, 'color1', pdf) - proc(pc.color2, a, 'color2', ndf) - proc(pc.color3, a, 'color3', pdf) - proc(pc.rgbMultiplier, a, 'rgbMultiplier', ndf) - proc(pc.bloomColor, a, 'bloomColor') - } else if (a instanceof Distortion) { - if (!(config.particleModifier instanceof ParticleModifier)) continue - const pc = randomItem(palette.distortionParticle) - const ndf = durationFallback(config.nodeAttributes) - const pdf = durationFallback(config.particleAttributes, config.nodeAttributes) - proc(pc.modifier, config.particleModifier, 'color', ndf) - proc(pc.color, a, 'color', pdf) - proc(pc.rgbMultiplier, a, 'rgbMultiplier', ndf) - proc(pc.bloomColor, a, 'bloomColor') - } else if (a instanceof RadialBlur) { - if (!(config.particleModifier instanceof ParticleModifier)) continue - const pc = randomItem(palette.blurParticle) - const ndf = durationFallback(config.nodeAttributes) - const pdf = durationFallback(config.particleAttributes, config.nodeAttributes) - proc(pc.modifier, config.particleModifier, 'color', ndf) - proc(pc.color, a, 'color', pdf) - proc(pc.rgbMultiplier, a, 'rgbMultiplier', ndf) - proc(pc.bloomColor, a, 'bloomColor') - } else if (a instanceof PointLight || a instanceof SpotLight) { - const pc = randomItem(palette.light) - const df = durationFallback(config.nodeAttributes) - proc(pc.diffuseColor, a, 'diffuseColor', df) - proc(pc.diffuseMultiplier, a, 'diffuseMultiplier', df) - a.separateSpecular = 'specularColor' in pc - if ('specularColor' in pc) { - proc(pc.specularColor, a, 'specularColor', df) - proc(pc.specularMultiplier, a, 'specularMultiplier', df) - } - } else if ( - a instanceof GPUStandardParticle || - a instanceof GPUStandardCorrectParticle || - a instanceof GPUSparkParticle || - a instanceof GPUSparkCorrectParticle - ) { - const pc = randomItem(palette.gpuParticle) - proc(pc.color, a, 'color', durationFallback(config.nodeAttributes)) - proc(pc.rgbMultiplier, a, 'rgbMultiplier') - proc(pc.colorMin, a, 'colorMin') - proc(pc.colorMax, a, 'colorMax') - a.bloom = 'bloomColor' in pc - if ('bloomColor' in pc) { - proc(pc.bloomColor, a, 'bloomColor') - } - } else if ('lensFlare' in palette && a instanceof LensFlare) { - const pc = randomItem(palette.lensFlare) - const df = durationFallback(config.nodeAttributes) - proc(pc.color, a, 'layer1Color', df) - proc(pc.colorMultiplier, a, 'layer1ColorMultiplier', df) - proc(pc.bloomColor, a, 'layer1BloomColor', df) - proc(pc.color, a, 'layer2Color', df) - proc(pc.colorMultiplier, a, 'layer2ColorMultiplier', df) - proc(pc.bloomColor, a, 'layer2BloomColor', df) - proc(pc.color, a, 'layer3Color', df) - proc(pc.colorMultiplier, a, 'layer3ColorMultiplier', df) - proc(pc.bloomColor, a, 'layer3BloomColor', df) - proc(pc.color, a, 'layer4Color', df) - proc(pc.colorMultiplier, a, 'layer4ColorMultiplier', df) - proc(pc.bloomColor, a, 'layer4BloomColor', df) - } + config.recolor(palette, durationFallback, proc) } } return this @@ -11539,6 +11449,152 @@ class BasicConfig implements IConfig { return this } + /** + * Recolors the config by modifying color properties and fields using a given + * function. + * @param func A function used to remap color values. For some easy pre-made + * recolor functions, see the {@link Recolor} namespace. + */ + recolor(func: Recolor.RecolorFunction): this + + /** + * Recolors the config to fit a given color palette. + * @param palette The color palette to apply. This can be generated from + * existing FXR branches using the {@link Node.generateColorPalette} method. + */ + recolor(palette: Recolor.ColorPalette): this + + /** + * @internal + */ + recolor( + funcOrPalette: Recolor.RecolorFunction | Recolor.ColorPalette, + __durationFallback?: (action: any, secondary?: any) => () => any, + __proc?: (paletteProp: AnyValue, c: T, k: keyof T, durationFallback?: () => number) => void + ): this + + recolor( + funcOrPalette: Recolor.RecolorFunction | Recolor.ColorPalette, + __durationFallback?: (action: any, secondary?: any) => () => any, + __proc?: (paletteProp: AnyValue, c: T, k: keyof T, durationFallback?: () => number) => void + ): this { + if (typeof funcOrPalette === 'function') { + for (const action of this.walkActions()) if (action instanceof DataAction) { + action.recolor(funcOrPalette, this) + } + } else { + const { palette, durationFallback, proc } = typeof __durationFallback === 'function' ? { + palette: funcOrPalette, + durationFallback: __durationFallback, + proc: __proc, + } : genFilledPaletteAndFunctions(funcOrPalette) + + const a = this.appearance + if ( + a instanceof PointSprite || + a instanceof Line || + a instanceof QuadLine || + a instanceof BillboardEx || + a instanceof MultiTextureBillboardEx || + a instanceof Model || + a instanceof RichModel || + a instanceof Tracer || + a instanceof DynamicTracer + ) { + if (!(this.particleModifier instanceof ParticleModifier)) return this + if (a instanceof MultiTextureBillboardEx) { + a.recolorProperty('layer1Color', Recolor.grayscale) + a.recolorProperty('layer2Color', Recolor.grayscale) + a.recolorProperty('layer3Color', Recolor.grayscale) + } else if (a instanceof Line || a instanceof QuadLine) { + a.recolorProperty('startColor', Recolor.grayscale) + a.recolorProperty('endColor', Recolor.grayscale) + } + let blendMode = 'blendMode' in a ? a.blendMode : BlendMode.Normal + if (blendMode instanceof Property) { + blendMode = blendMode.valueAt(0) + } + if (blendMode === BlendMode.Source || blendMode === BlendMode.Unk6) { + blendMode = BlendMode.Normal + } else if (blendMode === BlendMode.Unk0 || blendMode === BlendMode.Unk7) { + blendMode = BlendMode.Add + } + const key = `commonParticle${BlendMode[blendMode]}` as KeysOfType< + Recolor.ColorPalette, + Recolor.PaletteSlots['CommonParticle'][] + > + const pc = randomItem(palette[key]) + const ndf = durationFallback(this.nodeAttributes) + const pdf = durationFallback(this.particleAttributes, this.nodeAttributes) + proc(pc.modifier, this.particleModifier, 'color', ndf) + proc(pc.color1, a, 'color1', pdf) + proc(pc.color2, a, 'color2', ndf) + proc(pc.color3, a, 'color3', pdf) + proc(pc.rgbMultiplier, a, 'rgbMultiplier', ndf) + proc(pc.bloomColor, a, 'bloomColor') + } else if (a instanceof Distortion) { + if (!(this.particleModifier instanceof ParticleModifier)) return this + const pc = randomItem(palette.distortionParticle) + const ndf = durationFallback(this.nodeAttributes) + const pdf = durationFallback(this.particleAttributes, this.nodeAttributes) + proc(pc.modifier, this.particleModifier, 'color', ndf) + proc(pc.color, a, 'color', pdf) + proc(pc.rgbMultiplier, a, 'rgbMultiplier', ndf) + proc(pc.bloomColor, a, 'bloomColor') + } else if (a instanceof RadialBlur) { + if (!(this.particleModifier instanceof ParticleModifier)) return this + const pc = randomItem(palette.blurParticle) + const ndf = durationFallback(this.nodeAttributes) + const pdf = durationFallback(this.particleAttributes, this.nodeAttributes) + proc(pc.modifier, this.particleModifier, 'color', ndf) + proc(pc.color, a, 'color', pdf) + proc(pc.rgbMultiplier, a, 'rgbMultiplier', ndf) + proc(pc.bloomColor, a, 'bloomColor') + } else if (a instanceof PointLight || a instanceof SpotLight) { + const pc = randomItem(palette.light) + const df = durationFallback(this.nodeAttributes) + proc(pc.diffuseColor, a, 'diffuseColor', df) + proc(pc.diffuseMultiplier, a, 'diffuseMultiplier', df) + a.separateSpecular = 'specularColor' in pc + if ('specularColor' in pc) { + proc(pc.specularColor, a, 'specularColor', df) + proc(pc.specularMultiplier, a, 'specularMultiplier', df) + } + } else if ( + a instanceof GPUStandardParticle || + a instanceof GPUStandardCorrectParticle || + a instanceof GPUSparkParticle || + a instanceof GPUSparkCorrectParticle + ) { + const pc = randomItem(palette.gpuParticle) + proc(pc.color, a, 'color', durationFallback(this.nodeAttributes)) + proc(pc.rgbMultiplier, a, 'rgbMultiplier') + proc(pc.colorMin, a, 'colorMin') + proc(pc.colorMax, a, 'colorMax') + a.bloom = 'bloomColor' in pc + if ('bloomColor' in pc) { + proc(pc.bloomColor, a, 'bloomColor') + } + } else if ('lensFlare' in palette && a instanceof LensFlare) { + const pc = randomItem(palette.lensFlare) + const df = durationFallback(this.nodeAttributes) + proc(pc.color, a, 'layer1Color', df) + proc(pc.colorMultiplier, a, 'layer1ColorMultiplier', df) + proc(pc.bloomColor, a, 'layer1BloomColor', df) + proc(pc.color, a, 'layer2Color', df) + proc(pc.colorMultiplier, a, 'layer2ColorMultiplier', df) + proc(pc.bloomColor, a, 'layer2BloomColor', df) + proc(pc.color, a, 'layer3Color', df) + proc(pc.colorMultiplier, a, 'layer3ColorMultiplier', df) + proc(pc.bloomColor, a, 'layer3BloomColor', df) + proc(pc.color, a, 'layer4Color', df) + proc(pc.colorMultiplier, a, 'layer4ColorMultiplier', df) + proc(pc.bloomColor, a, 'layer4BloomColor', df) + } + } + return this + } + } export interface NodeEmitterConfigParams { @@ -12029,7 +12085,7 @@ class DataAction implements IAction { * @param key The name of the property. * @param func The function used to recolor the property. */ - recolorProperty(key: string, func: Recolor.RecolorFunction) { + recolorProperty(key: string, func: Recolor.RecolorFunction, context?: BasicConfig) { let prop: Vector4Value = this[key] if ( prop instanceof Property && prop.valueType !== ValueType.Vector4 || @@ -12038,17 +12094,17 @@ class DataAction implements IAction { throw new Error('Cannot recolor non-color property: ' + key) } if (Array.isArray(prop)) { - this[key] = func(prop) + this[key] = func(prop, context, this, key as any) return this } if (prop instanceof ComponentSequenceProperty) { prop = this[key] = prop.combineComponents() } if (prop instanceof ValueProperty) { - prop.value = func(prop.value) + prop.value = func(prop.value, context, this, key as any) } else if (prop instanceof SequenceProperty) { for (const keyframe of prop.keyframes) { - keyframe.value = func(keyframe.value as Vector4) + keyframe.value = func(keyframe.value as Vector4, context, this, key as any) } } prop.modifiers = prop.modifiers.filter(mod => !( @@ -12062,13 +12118,13 @@ class DataAction implements IAction { mod.factor = mod.factor.combineComponents() } if (mod.factor instanceof ValueProperty) { - mod.factor.value = func(mod.factor.value) + mod.factor.value = func(mod.factor.value, context, this, key as any) } else if (mod.factor instanceof SequenceProperty) { for (const keyframe of mod.factor.keyframes) { - keyframe.value = func(keyframe.value as Vector4) + keyframe.value = func(keyframe.value as Vector4, context, this, key as any) } } else { - mod.factor = func(mod.factor) + mod.factor = func(mod.factor, context, this, key as any) } } } @@ -12080,11 +12136,11 @@ class DataAction implements IAction { * pre-made recolor functions, see the {@link Recolor} namespace. * @param func A function used to remap color values. */ - recolor(func: (color: Vector4) => Vector4) { + recolor(func: Recolor.RecolorFunction, context?: BasicConfig) { if ('props' in ActionData[this.type]) { for (const [k, v] of Object.entries(ActionData[this.type].props)) { if ('color' in v) { - this.recolorProperty(k, func) + this.recolorProperty(k, func, context) } } } @@ -42304,7 +42360,12 @@ function PrecipitationModifier( */ namespace Recolor { - export type RecolorFunction = (color: Vector4) => Vector4 + export type RecolorFunction = ( + color: Vector4, + config?: BasicConfig, + action?: T, + property?: keyof T + ) => Vector4 export type PaletteSlots = { CommonParticle: { @@ -42583,59 +42644,93 @@ namespace Recolor { } /** - * Creates a recolor function that preserves original colors with low - * saturation. This has the downside that it is unable to recolor grayscale - * effects, but it is probably the most useful recolor function due to how - * well it keeps the overall look of the original effect while changing its - * colors. - * @param targetColor The target color. + * Because most of the color properties in most actions are multipliers, + * setting all of them to the same color does not make the effect that color. + * Instead, it will make the color much deeper/darker unless it's just white. + * + * This function can be used to filter properties to assign the target color + * to. It does this by defining "primary" and "secondary" color properties + * for all actions with colors. If primary color properties are set to the + * target color and secondary color properties (all non-primary ones) are set + * to white, the final color will match the target color exactly. + * + * For example, {@link BillboardEx} has four color properties: + * - {@link BillboardEx.color1} - Secondary + * - {@link BillboardEx.color2} - Secondary + * - {@link BillboardEx.color3} - **Primary** + * - {@link BillboardEx.bloomColor} - Secondary + * + * This function will return false for color1, color2, and bloomColor, but + * true for color3. Since the product of color1, color2, and color3 is the + * actual color of the particle, and the bloom color is the product of the + * particle color and bloomColor, setting only color3 to the target color + * and the RGB values for the rest of the properties to white will make the + * particle's final color match the target color. + * @param action Any data action. + * @param property A property name from the {@link action}. */ - export function standardBlend(targetColor: Vector3 | Vector4): RecolorFunction { - return ([r, g, b, a]: Vector4): Vector4 => { - const scale = Math.max(r, g, b, 1) - r /= scale - g /= scale - b /= scale - - const min = Math.min(r, g, b) - const max = Math.max(r, g, b) - const s = max > 0 ? (max - min) / max : 0 - - r = lerp(max, targetColor[0], s) * scale - g = lerp(max, targetColor[1], s) * scale - b = lerp(max, targetColor[2], s) * scale - - return [r, g, b, a] - } + export function isPrimary(action: T, property: keyof T): boolean { + return ActionData[action.type]?.props?.[property]?.color === 1 } /** - * Creates a recolor function that simply replaces colors with the given - * color. + * Creates a recolor function that replaces {@link isPrimary primary colors} + * with the given color. + * + * Secondary color properties will be replaced with white. + * + * Some "tricks" are used to keep opacity animations and the general + * brightness similar to the original color. These can be turned off by + * passing `false` for {@link multAlpha}, {@link keepBrightness}, and + * {@link keepScale}. If these are all disabled, the primary color will be + * replaced with the target color without any modifications to it. * @param targetColor The target color. - */ - export function replace(targetColor: Vector4): RecolorFunction { + * @param multAlpha If enabled, the alpha will be multiplied instead of + * replaced. This allows the original opacity to be maintained or just + * tweaked instead of replacing it entirely by a static value, which means + * that fade animations will still work correctly, whereas they may not in + * some cases if it is replaced. Defaults to `true`. + * @param keepBrightness If enabled, this will make the function multiply the + * target color by the brightness of the original color. Defaults to `true`. + * @param keepScale If enabled, this will force the function to maintain the + * scale of the original color. So, if the original color has values greater + * than 1, the target color will be multiplied by the highest value. This is + * ignored if {@link keepBrightness} is enabled. Defaults to `true`. + */ + export function replace( + targetColor: Vector4, + multAlpha: boolean = true, + keepBrightness: boolean = true, + keepScale: boolean = true, + ): RecolorFunction { const [r, g, b, a] = targetColor - return ([r2, g2, b2, a2]: Vector4): Vector4 => [r ?? r2, g ?? g2, b ?? b2, a ?? a2] + if (multAlpha && keepBrightness) { // Extra optimization for the default settings + return ([r2, g2, b2, a2], config, action, prop): Vector4 => { + const scale = Math.max(r2, g2, b2) + if (!isPrimary(action, prop)) return [scale, scale, scale, a2] + return [r * scale, g * scale, b * scale, (a ?? 1) * a2] + } + } + return ([r2, g2, b2, a2], config, action, prop): Vector4 => { + const scale = keepBrightness ? Math.max(r2, g2, b2) : keepScale ? Math.max(1, r2, g2, b2) : 1 + if (!isPrimary(action, prop)) return [scale, scale, scale, a2] + return [r * scale, g * scale, b * scale, multAlpha ? (a ?? 1) * a2 : a ?? a2] + } } /** - * Creates a recolor function that multiplies the original color by the - * given color. + * Creates a recolor function that multiplies + * {@link isPrimary primary color properties} by the given color. + * + * Secondary color properties are left unchanged. * @param targetColor The target color. */ export function multiply(targetColor: Vector4): RecolorFunction { const [r, g, b, a] = targetColor - return ([r2, g2, b2, a2]: Vector4): Vector4 => [r * r2, g * g2, b * b2, a * a2] - } - - /** - * Creates a recolor function that adds the given color to the original - * color. - * @param targetColor The target color. - */ - export function add([r, g, b, a]: Vector4): RecolorFunction { - return ([r2, g2, b2, a2]: Vector4): Vector4 => [r + r2, g + g2, b + b2, a + a2] + return ([r2, g2, b2, a2], config, action, prop): Vector4 => { + if (!isPrimary(action, prop)) return [r2, g2, b2, a2] + return [r * r2, g * g2, b * b2, a * a2] + } } /** @@ -42721,29 +42816,20 @@ namespace Recolor { } /** - * Creates a recolor function that replaces the saturation of the original - * color with that of a given color. - * @param color The color whose saturation will be used. - */ - export function replaceSaturation(color: Vector3 | Vector4): RecolorFunction { - const [ , ts ] = rgbToHsv(...(color.slice(0, 3) as Vector3)) - return ([r, g, b, a]) => { - const scale = Math.max(r, g, b, 1) - const [ h,, v ] = rgbToHsv(r / scale, g / scale, b / scale) - return [...(hsvToRgb(h, ts, v).map(e => e * scale) as Vector3), a] - } - } - - /** - * Creates a recolor function that replaces the hue and saturation of the - * original color with that of a given color. + * Creates a recolor function that replaces the hue and saturation of + * {@link isPrimary primary color properties} with those of a given color. + * + * Secondary color properties will be replaced with grayscale versions of + * the original colors, which means the overall brightness is kept, but only + * the primary color properties affect the hue and saturation. * @param color The color whose hue and saturation will be used. */ export function colorBlend(color: Vector3 | Vector4): RecolorFunction { const rgb = color.slice(0, 3) as Vector3 const inputScale = Math.max(...rgb, 1) const [ th, ts ] = rgbToHsv(...(rgb.map(e => e / inputScale) as Vector3)) - return ([r, g, b, a]) => { + return ([r, g, b, a], config, action, prop) => { + if (!isPrimary(action, prop)) return grayscale([r, g, b, a]) const scale = Math.max(r, g, b, 1) const [ ,, v ] = rgbToHsv(r / scale, g / scale, b / scale) return [...(hsvToRgb(th, ts, v).map(e => e * scale) as Vector3), a] From c5c2ced5208972ab19fba236dcb4b8e1eed934dc Mon Sep 17 00:00:00 2001 From: Even Torset Date: Sat, 23 Nov 2024 05:24:44 +0100 Subject: [PATCH 09/31] Fixed some default values, and added distance scaling to unk_ds3_f2_29. --- CHANGELOG.md | 1 + src/actions/10000.yml | 5 ++- src/actions/10001.yml | 5 ++- src/actions/10012.yml | 6 ++- src/actions/600.yml | 5 +++ src/actions/601.yml | 5 +++ src/actions/602.yml | 5 +++ src/actions/603.yml | 6 ++- src/actions/604.yml | 6 ++- src/actions/606.yml | 6 ++- src/fxr.ts | 93 ++++++++++++++++++++++++++++++++++++------- 11 files changed, 122 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de1bf2a..26d4c03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ - The `maxViewDistance` fields in `PointLight` and `Unk10500` and the thresholds in `LevelsOfDetailThresholds` are now scaled by the `scale` methods if `includeViewDistance` is enabled. They were previously not scaled at all, which was inconsistent with the other view distance limit fields in other actions. - The `depthBias` field in `NodeAttributes` is now scaled by the `scale` methods. - The `unk_sdt_f2_38` field in `Distortion` is now scaled by the `scale` methods if `includeViewDistance` is enabled, and its effect has been documented. Exactly what it does is still unknown, so it remains unnamed. + - The `unk_ds3_f2_29` field in many of the appearance actions has been identified as some kind of view distance threshold, and is therefore now also scaled by the `scale` methods if `includeViewDistance` is enabled. Exactly what this field does is still unknown. - The documentation site has been updated with a few improvements. - It now has a new theme, one that uses colors closer to the FXR Playground style. - Enum members are now sorted in ascending order based on the value instead of alphabetically. diff --git a/src/actions/10000.yml b/src/actions/10000.yml index dce59bb..2065519 100644 --- a/src/actions/10000.yml +++ b/src/actions/10000.yml @@ -927,7 +927,10 @@ properties: Other values are used in AC6, but what they do is unknown. unk_sdt_f2_32: field: int - default: 1 + desc: | + Unknown integer. + + Like in most other actions with this field, when set to 1, it may stop {@link unk_sdt_f2_29} from doing whatever it is doing, but that field may also not work exactly the same in this action, so it's tricky to confirm. It can also cause some ugly "outline" effects on things seen through particles. specular: field: int resource: texture diff --git a/src/actions/10001.yml b/src/actions/10001.yml index b98c520..80d4f3b 100644 --- a/src/actions/10001.yml +++ b/src/actions/10001.yml @@ -923,7 +923,10 @@ properties: Other values are used in AC6, but what they do is unknown. unk_sdt_f2_32: field: int - default: 1 + desc: | + Unknown integer. + + Like in most other actions with this field, when set to 1, it may stop {@link unk_sdt_f2_29} from doing whatever it is doing, but that field may also not work exactly the same in this action, so it's tricky to confirm. It can also cause some ugly "outline" effects on things seen through particles. specular: field: int resource: texture diff --git a/src/actions/10012.yml b/src/actions/10012.yml index f1e9032..4c478c7 100644 --- a/src/actions/10012.yml +++ b/src/actions/10012.yml @@ -399,7 +399,11 @@ properties: field: int unk_ds3_f2_29: field: float - default: 5 + scale: distance + desc: | + Unknown float. + + This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. shadowDarkness: field: float desc: | diff --git a/src/actions/600.yml b/src/actions/600.yml index 93828af..8d5908a 100644 --- a/src/actions/600.yml +++ b/src/actions/600.yml @@ -283,6 +283,11 @@ properties: default: 0 unk_ds3_f2_29: field: float + scale: distance + desc: | + Unknown float. + + This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. unk_sdt_f2_30: field: float unk_sdt_f2_31: diff --git a/src/actions/601.yml b/src/actions/601.yml index 3e87532..cba5129 100644 --- a/src/actions/601.yml +++ b/src/actions/601.yml @@ -312,6 +312,11 @@ properties: default: 0 unk_ds3_f2_29: field: float + scale: distance + desc: | + Unknown float. + + This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. unk_sdt_f2_30: field: int default: 0 diff --git a/src/actions/602.yml b/src/actions/602.yml index a65ff8c..cda008e 100644 --- a/src/actions/602.yml +++ b/src/actions/602.yml @@ -327,6 +327,11 @@ properties: default: 0 unk_ds3_f2_29: field: float + scale: distance + desc: | + Unknown float. + + This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. unk_sdt_f2_30: field: float unk_sdt_f2_31: diff --git a/src/actions/603.yml b/src/actions/603.yml index 7540414..346c238 100644 --- a/src/actions/603.yml +++ b/src/actions/603.yml @@ -484,7 +484,11 @@ properties: field: int unk_ds3_f2_29: field: float - default: 5 + scale: distance + desc: | + Unknown float. + + This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. shadowDarkness: field: float desc: | diff --git a/src/actions/604.yml b/src/actions/604.yml index fe242ed..2cee127 100644 --- a/src/actions/604.yml +++ b/src/actions/604.yml @@ -581,7 +581,11 @@ properties: field: int unk_ds3_f2_29: field: float - default: 5 + scale: distance + desc: | + Unknown float. + + This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. shadowDarkness: field: float desc: | diff --git a/src/actions/606.yml b/src/actions/606.yml index 6d48f46..c4bfd8d 100644 --- a/src/actions/606.yml +++ b/src/actions/606.yml @@ -383,7 +383,11 @@ properties: field: int unk_ds3_f2_29: field: float - default: 5 + scale: distance + desc: | + Unknown float. + + This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. shadowDarkness: field: float desc: | diff --git a/src/fxr.ts b/src/fxr.ts index 37c5a15..b4d535a 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -2878,7 +2878,7 @@ const ActionData: Record Date: Sat, 23 Nov 2024 05:27:15 +0100 Subject: [PATCH 10/31] Added a missing explainer to the changelog. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26d4c03..0d813a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ - `unk_ds3_p1_28` -> `layer1ScaleV` - The `unk_er_f1_7` field in `RichModel` has been given a name: `dither`. It's also been documented and had its type corrected. - Added two new methods to all node classes: - - `getColor` - Calculates the color value for the node the same way that the games do, which can be used to generate accurate color previews for nodes. This function was originally made for the FXR Playground to generate the color previews there, but has been improved slightly since then. + - `getColor` - Calculates the color value for the node the same way that the games do, which can be used to generate accurate color previews for nodes. If the node wouldn't produce anything with a color, this function instead returns `null`. This function was originally made for the FXR Playground to generate the color previews there, but has been improved slightly since then. - `hasColor` - A fast way to check if the `getColor` function will return a color or not. Can be used to check if it would make sense to display a color preview for a node. - Recoloring functions have been updated to work more like most people expect them to: - `BasicConfig` now has a `recolor` method, which works just like the one on nodes, except this only recolors the config it is called on. From 8e09645e14189c150443816c78d54c2a67497be8 Mon Sep 17 00:00:00 2001 From: Even Torset Date: Sat, 23 Nov 2024 05:32:49 +0100 Subject: [PATCH 11/31] Some small changelog updates. --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d813a4..5bc8c18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,11 +13,11 @@ - `unk_ds3_p1_26` -> `layer1OffsetV` - `unk_ds3_p1_27` -> `layer1ScaleU` - `unk_ds3_p1_28` -> `layer1ScaleV` -- The `unk_er_f1_7` field in `RichModel` has been given a name: `dither`. It's also been documented and had its type corrected. +- The `unk_er_f1_7` field in `RichModel` has been given a name: `dither`. It has also been documented and had its type corrected. - Added two new methods to all node classes: - `getColor` - Calculates the color value for the node the same way that the games do, which can be used to generate accurate color previews for nodes. If the node wouldn't produce anything with a color, this function instead returns `null`. This function was originally made for the FXR Playground to generate the color previews there, but has been improved slightly since then. - `hasColor` - A fast way to check if the `getColor` function will return a color or not. Can be used to check if it would make sense to display a color preview for a node. -- Recoloring functions have been updated to work more like most people expect them to: +- Recoloring functions have been updated to be simpler and more intuitive, but also much more useful: - `BasicConfig` now has a `recolor` method, which works just like the one on nodes, except this only recolors the config it is called on. - Recolor functions are now given the config, action, and property name for context. This can be used to make recolor functions that handle different properties differently. For example, one could change one property to be red and another property in the same action to green using the same recolor function. - `Recolor.isPrimary` is a new function that labeles some action color properties as "primary" and others as "secondary". By setting primary color properties to a target color and secondary color properties to white, the final color of the effect will match the target color exactly. This function is now used internally in combination with the new context explained above in some of the pre-defined recolor functions, but may also be used to create your own custom ones. From 87d3e61b48cfdca37b53e0be713f741520b035c5 Mon Sep 17 00:00:00 2001 From: Even Torset Date: Sun, 24 Nov 2024 00:36:36 +0100 Subject: [PATCH 12/31] unk_ds3_f1_7 and unk_ac6_f1_7 -> initialSimulationTime --- CHANGELOG.md | 2 ++ build/build.js | 24 +++++++++++--- build/docs.js | 9 ++++- src/actions/10500.yml | 25 +++++++++----- src/fxr.ts | 77 +++++++++++++++++++++++++++++-------------- 5 files changed, 100 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bc8c18..674b5c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ - `unk_ds3_p1_27` -> `layer1ScaleU` - `unk_ds3_p1_28` -> `layer1ScaleV` - The `unk_er_f1_7` field in `RichModel` has been given a name: `dither`. It has also been documented and had its type corrected. +- The `unk_ds3_f1_7` and `unk_ac6_f1_7` fields in `Unk10500` have been merged into one named `initialSimulationTime`, and it has been properly documented. This was previously two separate fields because it was untested in AC6, where it also has a different field type and unit. It has been tested now, and it does work exactly like the field in the other games, except it's in seconds instead of 1/30s. The library will handle the type and unit conversion automatically, so the unit is always 1s and floats can be used, even if you're writing the effect for one of the other games. This field is now also scaled by the `scaleRateOfTime` methods, which means that it will work the same way on DS3 as the other games. + - This required some changes to how field types are stored in the library, so now each game can have its own type for each field. This is currently only used for this one field, but it might be useful later if similar fields are found. - Added two new methods to all node classes: - `getColor` - Calculates the color value for the node the same way that the games do, which can be used to generate accurate color previews for nodes. If the node wouldn't produce anything with a color, this function instead returns `null`. This function was originally made for the FXR Playground to generate the color previews there, but has been improved slightly since then. - `hasColor` - A fast way to check if the `getColor` function will return a color or not. Can be used to check if it would make sense to display a color preview for a node. diff --git a/build/build.js b/build/build.js index f4aae63..d7c41f1 100644 --- a/build/build.js +++ b/build/build.js @@ -132,6 +132,20 @@ function defValTS(prop) { return defValue.toString() } +function fieldData(field) { + if (typeof field === 'string') { + return fieldMap[field] + } + return `{${Object.entries(field).map(([k, v]) => `[${gameMap[k]}]: ${fieldMap[v]}`).join(', ')}}` +} + +function typeFromField(field) { + if (typeof field === 'string') { + return typeMap[field] + } + return 'number' +} + export default async function(writeToDist = true) { const actionTypes = [] @@ -217,7 +231,7 @@ export default async function(writeToDist = true) { props: { ${Object.entries(data.properties).map(([k, v]) => { return `${k}: { default: ${defValTS(v)}${ - 'field' in v ? `, field: ${fieldMap[v.field]}` : '' + 'field' in v ? `, field: ${fieldData(v.field)}` : '' }${ 'resource' in v ? `, resource: ${resourceMap[v.resource]}` : '' }${ @@ -283,7 +297,7 @@ export default async function(writeToDist = true) { * - ${v.see.map(e => `{@link ${e}}`).join('\n * - ')}`:''} */ ` - ) + `${k}?: ${v.type ?? typeMap[v.field]}` + ) + `${k}?: ${v.type ?? typeFromField(v.field)}` }) .join('') .trim() @@ -318,7 +332,7 @@ export default async function(writeToDist = true) { * - ${v.see.map(e => `{@link ${e}}`).join('\n * - ')}`:''} */ ` : '\n ' - ) + `${k}: ${v.type ?? typeMap[v.field]}` + ) + `${k}: ${v.type ?? typeFromField(v.field)}` }) .join('') .trim() @@ -343,7 +357,9 @@ export default async function(writeToDist = true) { constructor(${ 'properties' in data ? propNames.length > 1 ? `props: ${data.name}Params = {}` : - `${propNames[0]}: ${data.properties[propNames[0]].type ?? typeMap[data.properties[propNames[0]].field]} = ${defValTS(firstProp)}` + `${propNames[0]}: ${ + data.properties[propNames[0]].type ?? typeFromField(data.properties[propNames[0]].field) + } = ${defValTS(firstProp)}` : ''}) { super(ActionType.${data.name}, {${Object.entries(data.meta).map(e => `${e[0]}:${toTSString(e[1])}`)}})${'properties' in data ? ` this.assign(${propNames.length > 1 ? 'props' : `{ ${propNames[0]} }`})` : ''} diff --git a/build/docs.js b/build/docs.js index 6eedd0c..9b15415 100644 --- a/build/docs.js +++ b/build/docs.js @@ -265,7 +265,14 @@ for (const fn of (await fs.readdir(actionsDir)).sort(naturalSorter)) { jsonProp.components = prop.components ?? 1 } if ('field' in prop) { - jsonProp.fieldType = fieldTypeNameMap[prop.field] + if (typeof prop.field === 'string') { + jsonProp.fieldType = fieldTypeNameMap[prop.field] + } else { + jsonProp.fieldType = Object.fromEntries(Object.entries(prop.field).map(([k, v]) => [ + gameMap[k], + fieldTypeNameMap[v] + ])) + } } if ('argument' in prop) { jsonProp.argument = prop.argument diff --git a/src/actions/10500.yml b/src/actions/10500.yml index 1aed6c0..e84a99f 100644 --- a/src/actions/10500.yml +++ b/src/actions/10500.yml @@ -34,14 +34,23 @@ properties: field: float unk_ds3_f1_6: field: int - unk_ac6_f1_7: - field: float + initialSimulationTime: + field: + DS3: int + SDT: int + ER: int + AC6: float + time: inv + desc: | + The game will simulate playing the effect for this amount of time in seconds before actually displaying the effect. This does not mean that it will delay displaying the effect, just that the effect will start as if it had already been playing for this time, kind of like skipping ahead in the animation. This doesn't affect everything in the effect, and a list of things affected has not been made, but it does affect periodic emitters at least. + + Setting this to very high values can cause noticeable stutters in the game when the effect is spawned due to it having to simulate playing the effect for so long. + + In Dark Souls 3, Sekiro, and Elden Ring, this value will be rounded to the nearest 1/30s due to how it is stored in the file format. It is stored differently in Armored Core 6, and so no rounding will happen for that. unk_ds3_f1_8: field: int unk_sdt_f1_9: field: int - unk_ds3_f1_7: - field: int games: DS3: fields1: @@ -52,7 +61,7 @@ games: - unk_ds3_f1_4 - unk_ds3_f1_5 - unk_ds3_f1_6 - - unk_ds3_f1_7 + - initialSimulationTime - unk_ds3_f1_8 SDT: fields1: @@ -63,7 +72,7 @@ games: - unk_ds3_f1_4 - unk_ds3_f1_5 - unk_ds3_f1_6 - - unk_ds3_f1_7 + - initialSimulationTime - unk_ds3_f1_8 - unk_sdt_f1_9 - rateOfTime @@ -76,7 +85,7 @@ games: - unk_ds3_f1_4 - unk_ds3_f1_5 - unk_ds3_f1_6 - - unk_ds3_f1_7 + - initialSimulationTime - unk_ds3_f1_8 - unk_sdt_f1_9 properties1: @@ -90,7 +99,7 @@ games: - unk_ds3_f1_4 - unk_ds3_f1_5 - unk_ds3_f1_6 - - unk_ac6_f1_7 + - initialSimulationTime - unk_ds3_f1_8 - unk_sdt_f1_9 properties1: ER diff --git a/src/fxr.ts b/src/fxr.ts index b4d535a..af206b9 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -2065,7 +2065,7 @@ export type FilledActionGameDataEntry = { } export type ActionDataProp = ( { - field?: FieldType + field?: FieldType | Partial> resource?: ResourceType textureType?: string scale?: ScaleCondition @@ -5460,24 +5460,23 @@ const ActionData: Record adt.props[e].field), null) + c.fields1 = readFieldsWithTypes(br, fieldCount1, gameData.fields1.map((e: string) => + typeof adt.props[e].field === 'number' ? adt.props[e].field : adt.props[e].field[game] + ), null) } if ('fields2' in gameData) { @@ -6060,7 +6065,9 @@ function readDataAction( br.position += 4 } - c.fields2 = readFieldsWithTypes(br, fieldCount2, gameData.fields2.map((e: string) => adt.props[e].field), null) + c.fields2 = readFieldsWithTypes(br, fieldCount2, gameData.fields2.map((e: string) => + typeof adt.props[e].field === 'number' ? adt.props[e].field : adt.props[e].field[game] + ), null) } br.stepOut() let params = Object.fromEntries( @@ -6099,13 +6106,17 @@ function writeDataAction(action: DataAction, bw: BinaryWriter, game: Game, actio bw.writeUint8(0) // Unk03 bw.writeInt32(0) // Unk04 bw.writeInt32(data.fields1 - .map(name => fieldCompCount[adt.props[name].field]) + .map(name => fieldCompCount[ + typeof adt.props[name].field === 'number' ? adt.props[name].field : adt.props[name].field[game] + ]) .reduce((a, e) => a + e, 0) ) bw.writeInt32(data.section10s.length) bw.writeInt32(data.properties1.length) bw.writeInt32(data.fields2 - .map(name => fieldCompCount[adt.props[name].field]) + .map(name => fieldCompCount[ + typeof adt.props[name].field === 'number' ? adt.props[name].field : adt.props[name].field[game] + ]) .reduce((a, e) => a + e, 0) ) bw.writeInt32(0) @@ -8837,6 +8848,20 @@ const ActionDataConversion = { return props } }, + [ActionType.Unk10500]: { + read(props: Unk10500Params, game: Game) { + if (game !== Game.ArmoredCore6) { + props.initialSimulationTime = props.initialSimulationTime / 30 + } + return props + }, + write(props: Unk10500Params, game: Game) { + if (game === Game.EldenRing) { + props.initialSimulationTime = Math.round(props.initialSimulationTime * 30) + } + return props + } + }, [ActionType.SpotLight]: { read(props: SpotLightParams, game: Game) { props.fadeOutTime = props.fadeOutTime / 30 @@ -11989,7 +12014,7 @@ class DataAction implements IAction { const prop = ActionData[this.type].props[name] validateDataActionProp(this, name, prop) return Field.from( - prop.field, + typeof prop.field === 'number' ? prop.field : prop.field[game], this[name] instanceof Property ? this[name].valueAt(0) : this[name] ) }) @@ -39735,11 +39760,15 @@ export interface Unk10500Params { */ unk_ds3_f1_6?: number /** - * Unknown float. + * The game will simulate playing the effect for this amount of time in seconds before actually displaying the effect. This does not mean that it will delay displaying the effect, just that the effect will start as if it had already been playing for this time, kind of like skipping ahead in the animation. This doesn't affect everything in the effect, and a list of things affected has not been made, but it does affect periodic emitters at least. + * + * Setting this to very high values can cause noticeable stutters in the game when the effect is spawned due to it having to simulate playing the effect for so long. + * + * In Dark Souls 3, Sekiro, and Elden Ring, this value will be rounded to the nearest 1/30s due to how it is stored in the file format. It is stored differently in Armored Core 6, and so no rounding will happen for that. * * **Default**: `0` */ - unk_ac6_f1_7?: number + initialSimulationTime?: number /** * Unknown integer. * @@ -39752,12 +39781,6 @@ export interface Unk10500Params { * **Default**: `0` */ unk_sdt_f1_9?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_7?: number } /** @@ -39788,10 +39811,16 @@ class Unk10500 extends DataAction { unk_ds3_f1_4: number unk_ds3_f1_5: number unk_ds3_f1_6: number - unk_ac6_f1_7: number + /** + * The game will simulate playing the effect for this amount of time in seconds before actually displaying the effect. This does not mean that it will delay displaying the effect, just that the effect will start as if it had already been playing for this time, kind of like skipping ahead in the animation. This doesn't affect everything in the effect, and a list of things affected has not been made, but it does affect periodic emitters at least. + * + * Setting this to very high values can cause noticeable stutters in the game when the effect is spawned due to it having to simulate playing the effect for so long. + * + * In Dark Souls 3, Sekiro, and Elden Ring, this value will be rounded to the nearest 1/30s due to how it is stored in the file format. It is stored differently in Armored Core 6, and so no rounding will happen for that. + */ + initialSimulationTime: number unk_ds3_f1_8: number unk_sdt_f1_9: number - unk_ds3_f1_7: number constructor(props: Unk10500Params = {}) { super(ActionType.Unk10500, {isAppearance:false,isParticle:false}) this.assign(props) From 9bf068a407f3307128d81f3a13b580371b7e4be8 Mon Sep 17 00:00:00 2001 From: Even Torset Date: Sun, 24 Nov 2024 04:35:56 +0100 Subject: [PATCH 13/31] Removed data action constructor parameter interfaces. --- CHANGELOG.md | 1 + build/build.js | 71 +- src/enums/InitialDirection.yml | 3 +- src/fxr.ts | 24293 ++++++++++--------------------- 4 files changed, 7568 insertions(+), 16800 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 674b5c2..cbbc62d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ - Added links to the FXR Playground and Ko-fi to the sidebar. - Added the library version number to the header. - Fixed the `getActionCount` method on `NodeEmitterConfig` objects always returning `10`. It now correctly returns `9` if the given game is `Game.DarkSouls3`, and `10` otherwise. +- Replaced all data action constructor parameter interfaces with types based on the classes. This doesn't change anything functionally, but cleans up the code and the documentation site a lot. ~10k lines of code was removed by doing this. ## [17.0.0] - 2024-11-12 diff --git a/build/build.js b/build/build.js index d7c41f1..989d7db 100644 --- a/build/build.js +++ b/build/build.js @@ -72,6 +72,13 @@ const timeMap = { sq: 4, } +const propTypeMap = { + 1: 'scalar', + 2: 'vector2', + 3: 'vector3', + 4: 'vector4', +} + function toTSString(v) { if (typeof v === 'string' || Array.isArray(v)) { return JSON.stringify(v) @@ -279,35 +286,6 @@ export default async function(writeToDist = true) { if (!data.omitClass) { const propNames = Object.keys(data.properties ?? {}) const firstProp = 'properties' in data ? data.properties[propNames[0]] : {} - if ('properties' in data && propNames.length > 1) classes.push(` - export interface ${data.name}Params { - ${Object.entries(data.properties).filter(e => !e[1].omitClassProp).map(([k, v]) => { - const defValue = defValString(v) - return (` - /** - * ${'desc' in v ? v.desc.trim().replace(/\n/g, '\n * ') : `Unknown${'field' in v ? ` ${fieldTypeNameMap[v.field]}` : ''}.`} - * - * **Default**: ${defValue}${ - 'argument' in v ? ` - * - * **Argument**: {@link PropertyArgument.${v.argument} ${argumentNames[v.argument]}}`:''}${ - 'see' in v ? ` - * - * See also: - * - ${v.see.map(e => `{@link ${e}}`).join('\n * - ')}`:''} - */ - ` - ) + `${k}?: ${v.type ?? typeFromField(v.field)}` - }) - .join('') - .trim() - .replace(/^\s{16}(?=\/\*\*| \*)|^\s{14}(?=\w)/gm, ' ') - } - } - `.trim() - .replace(/^\s{8}(?=\})/m, '') - .replace(/^\s{10}(?=\/|\w)/m, ' ') - ) classes.push(` /** * ### {@link ActionType.${data.name} Action ${data.type} - ${data.name}}${'slot' in data ? ` @@ -319,24 +297,27 @@ export default async function(writeToDist = true) { declare readonly type: ActionType.${data.name} declare readonly meta: ActionMeta & {${Object.entries(data.meta).map(e => `${e[0]}:${toTSString(e[1])}`)}} ${Object.entries(data.properties ?? {}).filter(e => !e[1].omitClassProp).map(([k, v]) => { - return ( - 'desc' in v ? ` - /** - * ${v.desc.trim().replace(/\n/g, '\n * ')}${ - 'argument' in v ? ` - * - * **Argument**: {@link PropertyArgument.${v.argument} ${argumentNames[v.argument]}}`:''}${ - 'see' in v ? ` - * - * See also: - * - ${v.see.map(e => `{@link ${e}}`).join('\n * - ')}`:''} - */ - ` : '\n ' - ) + `${k}: ${v.type ?? typeFromField(v.field)}` + return (` + /** + * ${ + 'desc' in v ? + v.desc.trim().replace(/\n/g, '\n * ') : + `Unknown${'field' in v ? ` ${fieldTypeNameMap[v.field]}` : ` ${propTypeMap[v.components] ?? 'scalar'}`}.`} + * + * **Default**: ${defValString(v)}${ + 'argument' in v ? ` + * + * **Argument**: {@link PropertyArgument.${v.argument} ${argumentNames[v.argument]}}`:''}${ + 'see' in v ? ` + * + * See also: + * - ${v.see.map(e => `{@link ${e}}`).join('\n * - ')}`:''} + */ + `) + `${k}: ${v.type ?? typeFromField(v.field)}` }) .join('') .trim() - .replace(/^\s{16}(?=\/\*\*| \*)|^\s{14}(?=\w)/gm, ' ') + .replace(/^\s{14}(?=\/\*\*| \*)|^\s{12}(?=\w)/gm, ' ') }${propNames.length === 1 ? ` /** * @param ${propNames[0]} ${ @@ -356,7 +337,7 @@ export default async function(writeToDist = true) { */` : ''} constructor(${ 'properties' in data ? - propNames.length > 1 ? `props: ${data.name}Params = {}` : + propNames.length > 1 ? `props: Partial> = {}` : `${propNames[0]}: ${ data.properties[propNames[0]].type ?? typeFromField(data.properties[propNames[0]].field) } = ${defValTS(firstProp)}` diff --git a/src/enums/InitialDirection.yml b/src/enums/InitialDirection.yml index c806789..edbd16b 100644 --- a/src/enums/InitialDirection.yml +++ b/src/enums/InitialDirection.yml @@ -1,8 +1,7 @@ name: InitialDirection desc: | An emitted instance's initial direction is used for various things that require a direction, but does not have a set one to follow. - - {@link ActionType.ParticleModifier ParticleModifier action}'s - {@link ParticleModifierParams.speed speed}. + - {@link ActionType.ParticleModifier ParticleModifier action}'s {@link ParticleModifier.speed speed}. - {@link ActionType.Line Line action}'s initial rotation. - {@link ActionType.QuadLine QuadLine action}'s initial rotation. diff --git a/src/fxr.ts b/src/fxr.ts index af206b9..85af163 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -1014,8 +1014,7 @@ export enum ForceVolumeShape { /** * An emitted instance's initial direction is used for various things that require a direction, but does not have a set one to follow. - * - {@link ActionType.ParticleModifier ParticleModifier action}'s - * {@link ParticleModifierParams.speed speed}. + * - {@link ActionType.ParticleModifier ParticleModifier action}'s {@link ParticleModifier.speed speed}. * - {@link ActionType.Line Line action}'s initial rotation. * - {@link ActionType.QuadLine QuadLine action}'s initial rotation. * @@ -1873,28 +1872,31 @@ export type GenComponents = [ [T], [T, T], [T, T, T], [T, T, T, T] ][V] -export type NodeMovementParams = - | NodeSpinParams - | NodeAccelerationParams - | NodeAccelerationRandomTurnsParams - | NodeAccelerationPartialFollowParams - | NodeAccelerationSpinParams - | NodeSpeedParams - | NodeSpeedRandomTurnsParams - | NodeSpeedPartialFollowParams - | NodeSpeedSpinParams - -export type NodeTransformParams = - | StaticNodeTransformParams - | RandomNodeTransformParams - -export type ParticleMovementParams = - | ParticleAccelerationParams - | ParticleAccelerationRandomTurnsParams - | ParticleAccelerationPartialFollowParams - | ParticleSpeedParams - | ParticleSpeedRandomTurnsParams - | ParticleSpeedPartialFollowParams +export type NodeMovementProps = Partial< + | Props + | Props + | Props + | Props + | Props + | Props + | Props + | Props + | Props +> + +export type NodeTransformProps = Partial< + | Props + | Props +> + +export type ParticleMovementProps = Partial< + | Props + | Props + | Props + | Props + | Props + | Props +> export namespace ActionSlots { /*#ActionSlotTypes start*/ @@ -2048,6 +2050,15 @@ export namespace ActionSlots { /*#ActionSlotTypes end*/ } +export type IfEquals = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 ? A : B +export type WritableKeys = { + [K in keyof T]: IfEquals<{ [P in K]: T[K] }, { -readonly [P in K]: T[K] }, K> +}[keyof T] +export type NonFunctionKeys = { + [K in keyof T]: T[K] extends Function ? never : K +}[keyof T] +export type Props = Pick & NonFunctionKeys> + //#region Action Data export type ActionGameDataEntry = { fields1?: Game | (string[] & { fieldsCount?: number }) @@ -8166,7 +8177,7 @@ function anyMatch(iterator: Iterable, predicate: (value: T) => boolean): b * Here, the point light that was created will randomize to have the same * specular color as its diffuse color. This example is not the best, because * this could also have been done by setting - * {@link PointLightParams.separateSpecular separateSpecular} to false, but it + * {@link PointLight.separateSpecular separateSpecular} to false, but it * should at least show how this functions. * @param type The type of seed to generate. */ @@ -8482,12 +8493,12 @@ const GameVersionMap = { const ActionDataConversion = { [ActionType.StaticNodeTransform]: { - read(props: StaticNodeTransformParams, game: Game) { + read(props: Props, game: Game) { props.offset[0] *= -1 props.rotation[0] *= -1 return props }, - write(props: StaticNodeTransformParams, game: Game) { + write(props: Props, game: Game) { props.offset[0] *= -1 props.rotation[0] *= -1 return props @@ -8503,11 +8514,11 @@ const ActionDataConversion = { } }, [ActionType.RandomNodeTransform]: { - read(props: RandomNodeTransformParams, game: Game) { + read(props: Props, game: Game) { props.offset[0] *= -1 return props }, - write(props: RandomNodeTransformParams, game: Game) { + write(props: Props, game: Game) { props.offset[0] *= -1 return props }, @@ -8528,88 +8539,88 @@ const ActionDataConversion = { } }, [ActionType.ParticleSpeedRandomTurns]: { - read(props: ParticleSpeedRandomTurnsParams, game: Game) { + read(props: Props, game: Game) { props.turnInterval = props.turnInterval / 50 return props }, - write(props: ParticleSpeedRandomTurnsParams, game: Game) { + write(props: Props, game: Game) { props.turnInterval = Math.round(props.turnInterval * 50) return props } }, [ActionType.ParticleSpeedPartialFollow]: { - read(props: ParticleSpeedPartialFollowParams, game: Game) { + read(props: Props, game: Game) { props.turnInterval = props.turnInterval / 50 props.followRotation = !props.followRotation return props }, - write(props: ParticleSpeedPartialFollowParams, game: Game) { + write(props: Props, game: Game) { props.turnInterval = Math.round(props.turnInterval * 50) props.followRotation = !props.followRotation return props } }, [ActionType.NodeAccelerationRandomTurns]: { - read(props: NodeAccelerationRandomTurnsParams, game: Game) { + read(props: Props, game: Game) { props.turnInterval = props.turnInterval / 50 return props }, - write(props: NodeAccelerationRandomTurnsParams, game: Game) { + write(props: Props, game: Game) { props.turnInterval = Math.round(props.turnInterval * 50) return props } }, [ActionType.ParticleAccelerationRandomTurns]: { - read(props: ParticleAccelerationRandomTurnsParams, game: Game) { + read(props: Props, game: Game) { props.turnInterval = props.turnInterval / 50 return props }, - write(props: ParticleAccelerationRandomTurnsParams, game: Game) { + write(props: Props, game: Game) { props.turnInterval = Math.round(props.turnInterval * 50) return props } }, [ActionType.ParticleAccelerationPartialFollow]: { - read(props: ParticleAccelerationPartialFollowParams, game: Game) { + read(props: Props, game: Game) { props.turnInterval = props.turnInterval / 50 props.followRotation = !props.followRotation return props }, - write(props: ParticleAccelerationPartialFollowParams, game: Game) { + write(props: Props, game: Game) { props.turnInterval = Math.round(props.turnInterval * 50) props.followRotation = !props.followRotation return props } }, [ActionType.NodeAccelerationPartialFollow]: { - read(props: NodeAccelerationPartialFollowParams, game: Game) { + read(props: Props, game: Game) { props.turnInterval = props.turnInterval / 50 props.followRotation = !props.followRotation return props }, - write(props: NodeAccelerationPartialFollowParams, game: Game) { + write(props: Props, game: Game) { props.turnInterval = Math.round(props.turnInterval * 50) props.followRotation = !props.followRotation return props } }, [ActionType.NodeSpeedRandomTurns]: { - read(props: NodeSpeedRandomTurnsParams, game: Game) { + read(props: Props, game: Game) { props.turnInterval = props.turnInterval / 50 return props }, - write(props: NodeSpeedRandomTurnsParams, game: Game) { + write(props: Props, game: Game) { props.turnInterval = Math.round(props.turnInterval * 50) return props } }, [ActionType.NodeSpeedPartialFollow]: { - read(props: NodeSpeedPartialFollowParams, game: Game) { + read(props: Props, game: Game) { props.turnInterval = props.turnInterval / 50 props.followRotation = !props.followRotation return props }, - write(props: NodeAccelerationPartialFollowParams, game: Game) { + write(props: Props, game: Game) { props.turnInterval = Math.round(props.turnInterval * 50) props.followRotation = !props.followRotation return props @@ -8624,17 +8635,17 @@ const ActionDataConversion = { } }, [ActionType.Distortion]: { - read(props: DistortionParams, game: Game) { + read(props: Props, game: Game) { props.stirSpeed = anyValueMult(180 / Math.PI, props.stirSpeed) return props }, - write(props: DistortionParams, game: Game) { + write(props: Props, game: Game) { props.stirSpeed = anyValueMult(Math.PI / 180, props.stirSpeed) return props } }, [ActionType.PointLight]: { - read(props: PointLightParams, game: Game) { + read(props: Props, game: Game) { props.fadeOutTime = props.fadeOutTime / 30 if (game === Game.DarkSouls3) { props.diffuseMultiplier = 100 @@ -8642,7 +8653,7 @@ const ActionDataConversion = { } return props }, - write(props: PointLightParams, game: Game) { + write(props: Props, game: Game) { props.fadeOutTime = Math.round(props.fadeOutTime * 30) if (game === Game.DarkSouls3) { const diffuseComps = separateComponents(props.diffuseColor) @@ -8678,7 +8689,7 @@ const ActionDataConversion = { } }, [ActionType.GPUStandardParticle]: { - read(props: GPUStandardParticleParams, game: Game) { + read(props: Props, game: Game) { if (props.particleUniformScale) { /* This action's uniform scale field acts differently from every other @@ -8710,7 +8721,7 @@ const ActionDataConversion = { props.particleAngularAccelerationZ = anyValueMult(180 / Math.PI, props.particleAngularAccelerationZ) return props }, - write(props: GPUStandardParticleParams, game: Game) { + write(props: Props, game: Game) { if (props.particleUniformScale) { props.particleSizeY = 0 props.particleSizeYMin = 0 @@ -8730,7 +8741,7 @@ const ActionDataConversion = { } }, [ActionType.GPUStandardCorrectParticle]: { - read(props: GPUStandardCorrectParticleParams, game: Game) { + read(props: Props, game: Game) { if (props.particleUniformScale) { /* This action's uniform scale field acts differently from every other @@ -8762,7 +8773,7 @@ const ActionDataConversion = { props.particleAngularAccelerationZ = anyValueMult(180 / Math.PI, props.particleAngularAccelerationZ) return props }, - write(props: GPUStandardCorrectParticleParams, game: Game) { + write(props: Props, game: Game) { if (props.particleUniformScale) { props.particleSizeY = 0 props.particleSizeYMin = 0 @@ -8785,14 +8796,14 @@ const ActionDataConversion = { } }, [ActionType.GPUSparkParticle]: { - read(props: GPUSparkParticleParams, game: Game) { + read(props: Props, game: Game) { props.emissionInterval /= 30 props.emissionIntervalMin /= 30 props.emissionIntervalMax /= 30 props.particleDuration /= 30 return props }, - write(props: GPUSparkParticleParams, game: Game) { + write(props: Props, game: Game) { props.emissionInterval = Math.round(props.emissionInterval * 30) props.emissionIntervalMin = Math.round(props.emissionIntervalMin * 30) props.emissionIntervalMax = Math.round(props.emissionIntervalMax * 30) @@ -8801,14 +8812,14 @@ const ActionDataConversion = { } }, [ActionType.GPUSparkCorrectParticle]: { - read(props: GPUSparkCorrectParticleParams, game: Game) { + read(props: Props, game: Game) { props.emissionInterval /= 30 props.emissionIntervalMin /= 30 props.emissionIntervalMax /= 30 props.particleDuration /= 30 return props }, - write(props: GPUSparkCorrectParticleParams, game: Game) { + write(props: Props, game: Game) { props.emissionInterval = Math.round(props.emissionInterval * 30) props.emissionIntervalMin = Math.round(props.emissionIntervalMin * 30) props.emissionIntervalMax = Math.round(props.emissionIntervalMax * 30) @@ -8817,45 +8828,45 @@ const ActionDataConversion = { } }, [ActionType.WindForce]: { - read(props: WindForceParams, game: Game) { + read(props: Props, game: Game) { if ('fadeOutTime' in props) { props.fadeOutTime = props.fadeOutTime / 30 } return props }, - write(props: WindForceParams, game: Game) { + write(props: Props, game: Game) { props.fadeOutTime = Math.round(props.fadeOutTime * 30) return props } }, [ActionType.GravityForce]: { - read(props: GravityForceParams, game: Game) { + read(props: Props, game: Game) { props.fadeOutTime = props.fadeOutTime / 30 return props }, - write(props: GravityForceParams, game: Game) { + write(props: Props, game: Game) { props.fadeOutTime = Math.round(props.fadeOutTime * 30) return props } }, [ActionType.TurbulenceForce]: { - read(props: TurbulenceForceParams, game: Game) { + read(props: Props, game: Game) { props.fadeOutTime = props.fadeOutTime / 30 return props }, - write(props: TurbulenceForceParams, game: Game) { + write(props: Props, game: Game) { props.fadeOutTime = Math.round(props.fadeOutTime * 30) return props } }, [ActionType.Unk10500]: { - read(props: Unk10500Params, game: Game) { + read(props: Props, game: Game) { if (game !== Game.ArmoredCore6) { props.initialSimulationTime = props.initialSimulationTime / 30 } return props }, - write(props: Unk10500Params, game: Game) { + write(props: Props, game: Game) { if (game === Game.EldenRing) { props.initialSimulationTime = Math.round(props.initialSimulationTime * 30) } @@ -8863,7 +8874,7 @@ const ActionDataConversion = { } }, [ActionType.SpotLight]: { - read(props: SpotLightParams, game: Game) { + read(props: Props, game: Game) { props.fadeOutTime = props.fadeOutTime / 30 if (game === Game.DarkSouls3) { props.diffuseColor = anyValueMult(1/255, props.diffuseColor) as Vector4Value @@ -8876,7 +8887,7 @@ const ActionDataConversion = { } return props }, - write(props: SpotLightParams, game: Game) { + write(props: Props, game: Game) { props.fadeOutTime = Math.round(props.fadeOutTime * 30) if (game === Game.DarkSouls3) { props.diffuseColor = anyValueMult(anyValueMult(100, props.diffuseMultiplier), props.diffuseColor) as Vector4Value @@ -11142,37 +11153,37 @@ class NodeConfig implements IConfig { case ConfigType.LevelsOfDetail: return new LevelsOfDetailConfig(Property.fromJSON(obj.duration), obj.thresholds, obj.unk_ac6_f1_5) case ConfigType.Basic: { - const params: BasicConfigParams = {} - if ('nodeAttributes' in obj) params.nodeAttributes = Action.fromJSON(obj.nodeAttributes) - if ('nodeTransform' in obj) params.nodeTransform = Action.fromJSON(obj.nodeTransform) - if ('nodeMovement' in obj) params.nodeMovement = Action.fromJSON(obj.nodeMovement) - if ('nodeAudio' in obj) params.nodeAudio = Action.fromJSON(obj.nodeAudio) - if ('emitter' in obj) params.emitter = Action.fromJSON(obj.emitter) - if ('emitterShape' in obj) params.emitterShape = Action.fromJSON(obj.emitterShape) - if ('directionSpread' in obj) params.directionSpread = Action.fromJSON(obj.directionSpread) - if ('particleModifier' in obj) params.particleModifier = Action.fromJSON(obj.particleModifier) - if ('particleAttributes' in obj) params.particleAttributes = Action.fromJSON(obj.particleAttributes) - if ('appearance' in obj) params.appearance = Action.fromJSON(obj.appearance) - if ('particleMovement' in obj) params.particleMovement = Action.fromJSON(obj.particleMovement) - if ('emissionAudio' in obj) params.emissionAudio = Action.fromJSON(obj.emissionAudio) - if ('slot12' in obj) params.slot12 = Action.fromJSON(obj.slot12) - if ('nodeForceMovement' in obj) params.nodeForceMovement = Action.fromJSON(obj.nodeForceMovement) - if ('particleForceMovement' in obj) params.particleForceMovement = Action.fromJSON(obj.particleForceMovement) - return new BasicConfig(params) + const actions: Partial> = {} + if ('nodeAttributes' in obj) actions.nodeAttributes = Action.fromJSON(obj.nodeAttributes) + if ('nodeTransform' in obj) actions.nodeTransform = Action.fromJSON(obj.nodeTransform) + if ('nodeMovement' in obj) actions.nodeMovement = Action.fromJSON(obj.nodeMovement) + if ('nodeAudio' in obj) actions.nodeAudio = Action.fromJSON(obj.nodeAudio) + if ('emitter' in obj) actions.emitter = Action.fromJSON(obj.emitter) + if ('emitterShape' in obj) actions.emitterShape = Action.fromJSON(obj.emitterShape) + if ('directionSpread' in obj) actions.directionSpread = Action.fromJSON(obj.directionSpread) + if ('particleModifier' in obj) actions.particleModifier = Action.fromJSON(obj.particleModifier) + if ('particleAttributes' in obj) actions.particleAttributes = Action.fromJSON(obj.particleAttributes) + if ('appearance' in obj) actions.appearance = Action.fromJSON(obj.appearance) + if ('particleMovement' in obj) actions.particleMovement = Action.fromJSON(obj.particleMovement) + if ('emissionAudio' in obj) actions.emissionAudio = Action.fromJSON(obj.emissionAudio) + if ('slot12' in obj) actions.slot12 = Action.fromJSON(obj.slot12) + if ('nodeForceMovement' in obj) actions.nodeForceMovement = Action.fromJSON(obj.nodeForceMovement) + if ('particleForceMovement' in obj) actions.particleForceMovement = Action.fromJSON(obj.particleForceMovement) + return new BasicConfig(actions) } case ConfigType.NodeEmitter: { - const params: NodeEmitterConfigParams = {} - if ('nodeAttributes' in obj) params.nodeAttributes = Action.fromJSON(obj.nodeAttributes) - if ('nodeTransform' in obj) params.nodeTransform = Action.fromJSON(obj.nodeTransform) - if ('nodeMovement' in obj) params.nodeMovement = Action.fromJSON(obj.nodeMovement) - if ('nodeAudio' in obj) params.nodeAudio = Action.fromJSON(obj.nodeAudio) - if ('emitter' in obj) params.emitter = Action.fromJSON(obj.emitter) - if ('emitterShape' in obj) params.emitterShape = Action.fromJSON(obj.emitterShape) - if ('directionSpread' in obj) params.directionSpread = Action.fromJSON(obj.directionSpread) - if ('nodeSelector' in obj) params.nodeSelector = Action.fromJSON(obj.nodeSelector) - if ('emissionAudio' in obj) params.emissionAudio = Action.fromJSON(obj.emissionAudio) - if ('nodeForceMovement' in obj) params.nodeForceMovement = Action.fromJSON(obj.nodeForceMovement) - return new NodeEmitterConfig(params) + const actions: Partial> = {} + if ('nodeAttributes' in obj) actions.nodeAttributes = Action.fromJSON(obj.nodeAttributes) + if ('nodeTransform' in obj) actions.nodeTransform = Action.fromJSON(obj.nodeTransform) + if ('nodeMovement' in obj) actions.nodeMovement = Action.fromJSON(obj.nodeMovement) + if ('nodeAudio' in obj) actions.nodeAudio = Action.fromJSON(obj.nodeAudio) + if ('emitter' in obj) actions.emitter = Action.fromJSON(obj.emitter) + if ('emitterShape' in obj) actions.emitterShape = Action.fromJSON(obj.emitterShape) + if ('directionSpread' in obj) actions.directionSpread = Action.fromJSON(obj.directionSpread) + if ('nodeSelector' in obj) actions.nodeSelector = Action.fromJSON(obj.nodeSelector) + if ('emissionAudio' in obj) actions.emissionAudio = Action.fromJSON(obj.emissionAudio) + if ('nodeForceMovement' in obj) actions.nodeForceMovement = Action.fromJSON(obj.nodeForceMovement) + return new NodeEmitterConfig(actions) } } throw new Error('Invalid config JSON: ' + JSON.stringify(obj)) @@ -11262,24 +11273,6 @@ class LevelsOfDetailConfig implements IConfig { } -export interface BasicConfigParams { - nodeAttributes?: ActionSlots.NodeAttributesAction - nodeTransform?: ActionSlots.NodeTransformAction - nodeMovement?: ActionSlots.NodeMovementAction - nodeAudio?: ActionSlots.NodeAudioAction - emitter?: ActionSlots.EmitterAction - emitterShape?:ActionSlots.EmitterShapeAction - directionSpread?:ActionSlots.DirectionSpreadAction - particleModifier?: ActionSlots.ParticleModifierAction - particleAttributes?: ActionSlots.ParticleAttributesAction - appearance?:ActionSlots.AppearanceAction - particleMovement?: ActionSlots.ParticleMovementAction - emissionAudio?: ActionSlots.EmissionAudioAction - slot12?: ActionSlots.Unknown130Action - nodeForceMovement?: ActionSlots.NodeForceMovementAction - particleForceMovement?: ActionSlots.ParticleForceMovementAction -} - /** * Config used in {@link NodeType.Basic basic nodes} to apply transforms and * emit particles of many different types. @@ -11322,9 +11315,9 @@ class BasicConfig implements IConfig { nodeForceMovement: ActionSlots.NodeForceMovementAction = new Action particleForceMovement: ActionSlots.ParticleForceMovementAction = new Action - constructor(params: BasicConfigParams | AnyAction[] = []) { - if (Array.isArray(params)) { - for (const action of params) { + constructor(actions: Partial> | AnyAction[] = []) { + if (Array.isArray(actions)) { + for (const action of actions) { const index = ConfigActionSlots[ConfigType.Basic].findIndex(a => a.includes(action.type)) switch (index) { case 0: this.nodeAttributes = action as Action; break; @@ -11345,21 +11338,21 @@ class BasicConfig implements IConfig { } } } else { - if ('nodeAttributes' in params) this.nodeAttributes = params.nodeAttributes - if ('nodeTransform' in params) this.nodeTransform = params.nodeTransform - if ('nodeMovement' in params) this.nodeMovement = params.nodeMovement - if ('nodeAudio' in params) this.nodeAudio = params.nodeAudio - if ('emitter' in params) this.emitter = params.emitter - if ('emitterShape' in params) this.emitterShape = params.emitterShape - if ('directionSpread' in params) this.directionSpread = params.directionSpread - if ('particleModifier' in params) this.particleModifier = params.particleModifier - if ('particleAttributes' in params) this.particleAttributes = params.particleAttributes - if ('appearance' in params) this.appearance = params.appearance - if ('particleMovement' in params) this.particleMovement = params.particleMovement - if ('emissionAudio' in params) this.emissionAudio = params.emissionAudio - if ('slot12' in params) this.slot12 = params.slot12 - if ('nodeForceMovement' in params) this.nodeForceMovement = params.nodeForceMovement - if ('particleForceMovement' in params) this.particleForceMovement = params.particleForceMovement + if ('nodeAttributes' in actions) this.nodeAttributes = actions.nodeAttributes + if ('nodeTransform' in actions) this.nodeTransform = actions.nodeTransform + if ('nodeMovement' in actions) this.nodeMovement = actions.nodeMovement + if ('nodeAudio' in actions) this.nodeAudio = actions.nodeAudio + if ('emitter' in actions) this.emitter = actions.emitter + if ('emitterShape' in actions) this.emitterShape = actions.emitterShape + if ('directionSpread' in actions) this.directionSpread = actions.directionSpread + if ('particleModifier' in actions) this.particleModifier = actions.particleModifier + if ('particleAttributes' in actions) this.particleAttributes = actions.particleAttributes + if ('appearance' in actions) this.appearance = actions.appearance + if ('particleMovement' in actions) this.particleMovement = actions.particleMovement + if ('emissionAudio' in actions) this.emissionAudio = actions.emissionAudio + if ('slot12' in actions) this.slot12 = actions.slot12 + if ('nodeForceMovement' in actions) this.nodeForceMovement = actions.nodeForceMovement + if ('particleForceMovement' in actions) this.particleForceMovement = actions.particleForceMovement } } @@ -11622,19 +11615,6 @@ class BasicConfig implements IConfig { } -export interface NodeEmitterConfigParams { - nodeAttributes?: ActionSlots.NodeAttributesAction - nodeTransform?: ActionSlots.NodeTransformAction - nodeMovement?: ActionSlots.NodeMovementAction - nodeAudio?: ActionSlots.NodeAudioAction - emitter?: ActionSlots.EmitterAction - emitterShape?: ActionSlots.EmitterShapeAction - directionSpread?: ActionSlots.DirectionSpreadAction - nodeSelector?: ActionSlots.NodeSelectorAction - emissionAudio?: ActionSlots.EmissionAudioAction - nodeForceMovement?: ActionSlots.NodeForceMovementAction -} - /** * Config used in {@link NodeType.NodeEmitter node emitter nodes} to control * the emission of child nodes. @@ -11667,7 +11647,7 @@ class NodeEmitterConfig implements IConfig { emissionAudio: ActionSlots.EmissionAudioAction = new Action nodeForceMovement: ActionSlots.NodeForceMovementAction = new Action - constructor(params: NodeEmitterConfigParams | AnyAction[] = []) { + constructor(params: Partial> | AnyAction[] = []) { if (Array.isArray(params)) { for (const action of params) { const index = ConfigActionSlots[ConfigType.NodeEmitter].findIndex(a => a.includes(action.type)) @@ -12318,7 +12298,7 @@ class DataAction implements IAction { * shortcut. It only exists to make things easier, not to control exactly what * happens. */ -function NodeMovement(params: NodeMovementParams = {}) { +function NodeMovement(params: NodeMovementProps = {}) { const acceleration = 'accelerationZ' in params || 'accelerationMultiplierZ' in params, speed = 'speedMultiplierZ' in params, randomTurns = 'maxTurnAngle' in params || 'turnInterval' in params, @@ -12381,7 +12361,7 @@ function NodeMovement(params: NodeMovementParams = {}) { * depends on the arguments given, which means that if any of the randomization * arguments are used, it will produce a {@link RandomNodeTransform}. */ -function NodeTransform(params: NodeTransformParams = {}) { +function NodeTransform(params: NodeTransformProps = {}) { if ( 'offsetVariance' in params || 'rotationVariance' in params @@ -12412,7 +12392,7 @@ function NodeTransform(params: NodeTransformParams = {}) { * shortcut. It only exists to make things easier, not to control exactly what * happens. */ -function ParticleMovement(params: ParticleMovementParams = {}) { +function ParticleMovement(params: ParticleMovementProps = {}) { if ( 'speed' in params || 'speedMultiplier' in params @@ -12453,7 +12433,15 @@ function ParticleMovement(params: ParticleMovementParams = {}) { } /*#ActionClasses start*/ -export interface NodeAccelerationParams { +/** + * ### {@link ActionType.NodeAcceleration Action 1 - NodeAcceleration} + * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} + * + * Controls the movement of the node. This is the most basic action for controlling the acceleration of nodes. + */ +class NodeAcceleration extends DataAction { + declare readonly type: ActionType.NodeAcceleration + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the speed of the node along its Z-axis. * @@ -12461,7 +12449,7 @@ export interface NodeAccelerationParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - speedZ?: ScalarValue + speedZ: ScalarValue /** * Controls the acceleration of the node along its Z-axis. This value cannot be negative. * @@ -12469,7 +12457,7 @@ export interface NodeAccelerationParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationZ?: ScalarValue + accelerationZ: ScalarValue /** * Multiplier for {@link accelerationZ}. * @@ -12477,7 +12465,7 @@ export interface NodeAccelerationParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationMultiplierZ?: ScalarValue + accelerationMultiplierZ: ScalarValue /** * Controls the acceleration of the node along its Y-axis. * @@ -12485,89 +12473,31 @@ export interface NodeAccelerationParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationY?: ScalarValue + accelerationY: ScalarValue /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_0?: number + unk_ds3_f1_0: number /** * When set to 1, this makes the node align with the direction it's moving. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. * * **Default**: `0` */ - alignWithMotion?: number + alignWithMotion: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_2?: number -} - -/** - * ### {@link ActionType.NodeAcceleration Action 1 - NodeAcceleration} - * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} - * - * Controls the movement of the node. This is the most basic action for controlling the acceleration of nodes. - */ -class NodeAcceleration extends DataAction { - declare readonly type: ActionType.NodeAcceleration - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * Controls the speed of the node along its Z-axis. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - speedZ: ScalarValue - /** - * Controls the acceleration of the node along its Z-axis. This value cannot be negative. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationZ: ScalarValue - /** - * Multiplier for {@link accelerationZ}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationMultiplierZ: ScalarValue - /** - * Controls the acceleration of the node along its Y-axis. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationY: ScalarValue - unk_ds3_f1_0: number - /** - * When set to 1, this makes the node align with the direction it's moving. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. - */ - alignWithMotion: number unk_ds3_f1_2: number - constructor(props: NodeAccelerationParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.NodeAcceleration, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface NodeTranslationParams { - /** - * An offset for the position of the node. - * - * **Default**: `[0, 0, 0]` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - translation?: Vector3Value - /** - * Unknown. An integer that has at least three valid values: 0, 1, 2. It did not exist until Elden Ring. - * - * **Default**: `0` - */ - unk_er_f1_0?: number -} - /** * ### {@link ActionType.NodeTranslation Action 15 - NodeTranslation} * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} @@ -12580,20 +12510,32 @@ class NodeTranslation extends DataAction { /** * An offset for the position of the node. * + * **Default**: `[0, 0, 0]` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ translation: Vector3Value /** * Unknown. An integer that has at least three valid values: 0, 1, 2. It did not exist until Elden Ring. + * + * **Default**: `0` */ unk_er_f1_0: number - constructor(props: NodeTranslationParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.NodeTranslation, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface NodeSpinParams { +/** + * ### {@link ActionType.NodeSpin Action 34 - NodeSpin} + * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} + * + * Controls the angular speed of the node. + */ +class NodeSpin extends DataAction { + declare readonly type: ActionType.NodeSpin + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The node's angular speed around its local X-axis in degrees per second. * @@ -12604,7 +12546,7 @@ export interface NodeSpinParams { * See also: * - {@link angularSpeedMultiplierX} */ - angularSpeedX?: ScalarValue + angularSpeedX: ScalarValue /** * Multiplier for {@link angularSpeedX}. * @@ -12612,7 +12554,7 @@ export interface NodeSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - angularSpeedMultiplierX?: ScalarValue + angularSpeedMultiplierX: ScalarValue /** * The node's angular speed around its local Y-axis in degrees per second. * @@ -12623,7 +12565,7 @@ export interface NodeSpinParams { * See also: * - {@link angularSpeedMultiplierY} */ - angularSpeedY?: ScalarValue + angularSpeedY: ScalarValue /** * Multiplier for {@link angularSpeedY}. * @@ -12631,7 +12573,7 @@ export interface NodeSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - angularSpeedMultiplierY?: ScalarValue + angularSpeedMultiplierY: ScalarValue /** * The node's angular speed around its local Z-axis in degrees per second. * @@ -12642,7 +12584,7 @@ export interface NodeSpinParams { * See also: * - {@link angularSpeedMultiplierZ} */ - angularSpeedZ?: ScalarValue + angularSpeedZ: ScalarValue /** * Multiplier for {@link angularSpeedZ}. * @@ -12650,91 +12592,19 @@ export interface NodeSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - angularSpeedMultiplierZ?: ScalarValue + angularSpeedMultiplierZ: ScalarValue /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_0?: number -} - -/** - * ### {@link ActionType.NodeSpin Action 34 - NodeSpin} - * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} - * - * Controls the angular speed of the node. - */ -class NodeSpin extends DataAction { - declare readonly type: ActionType.NodeSpin - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * The node's angular speed around its local X-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angularSpeedMultiplierX} - */ - angularSpeedX: ScalarValue - /** - * Multiplier for {@link angularSpeedX}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - angularSpeedMultiplierX: ScalarValue - /** - * The node's angular speed around its local Y-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angularSpeedMultiplierY} - */ - angularSpeedY: ScalarValue - /** - * Multiplier for {@link angularSpeedY}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - angularSpeedMultiplierY: ScalarValue - /** - * The node's angular speed around its local Z-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angularSpeedMultiplierZ} - */ - angularSpeedZ: ScalarValue - /** - * Multiplier for {@link angularSpeedZ}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - angularSpeedMultiplierZ: ScalarValue unk_ds3_f1_0: number - constructor(props: NodeSpinParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.NodeSpin, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface StaticNodeTransformParams { - /** - * Translation of the node. - * - * **Default**: `[0, 0, 0]` - */ - offset?: Vector3 - /** - * The rotation of the node. - * - * **Default**: `[0, 0, 0]` - */ - rotation?: Vector3 -} - /** * ### {@link ActionType.StaticNodeTransform Action 35 - StaticNodeTransform} * **Slot**: {@link ActionSlots.NodeTransformAction NodeTransform} @@ -12746,45 +12616,22 @@ class StaticNodeTransform extends DataAction { declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Translation of the node. + * + * **Default**: `[0, 0, 0]` */ offset: Vector3 /** * The rotation of the node. + * + * **Default**: `[0, 0, 0]` */ rotation: Vector3 - constructor(props: StaticNodeTransformParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.StaticNodeTransform, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface RandomNodeTransformParams { - /** - * Translation of the node. - * - * **Default**: `[0, 0, 0]` - */ - offset?: Vector3 - /** - * The rotation of the node. - * - * **Default**: `[0, 0, 0]` - */ - rotation?: Vector3 - /** - * The maximum random change in translation of the node. A random value between the {@link offset base value} minus this and the base value plus this will be the final offset used. - * - * **Default**: `[0, 0, 0]` - */ - offsetVariance?: Vector3 - /** - * The maximum random change in rotation of the node. A random value between the {@link rotation base value} minus this and the base value plus this will be the final rotation used. - * - * **Default**: `[0, 0, 0]` - */ - rotationVariance?: Vector3 -} - /** * ### {@link ActionType.RandomNodeTransform Action 36 - RandomNodeTransform} * **Slot**: {@link ActionSlots.NodeTransformAction NodeTransform} @@ -12796,41 +12643,34 @@ class RandomNodeTransform extends DataAction { declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Translation of the node. + * + * **Default**: `[0, 0, 0]` */ offset: Vector3 /** * The rotation of the node. + * + * **Default**: `[0, 0, 0]` */ rotation: Vector3 /** * The maximum random change in translation of the node. A random value between the {@link offset base value} minus this and the base value plus this will be the final offset used. + * + * **Default**: `[0, 0, 0]` */ offsetVariance: Vector3 /** * The maximum random change in rotation of the node. A random value between the {@link rotation base value} minus this and the base value plus this will be the final rotation used. + * + * **Default**: `[0, 0, 0]` */ rotationVariance: Vector3 - constructor(props: RandomNodeTransformParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.RandomNodeTransform, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface NodeAttachToCameraParams { - /** - * Disable this to stop the node from following the rotation of the camera. - * - * **Default**: `true` - */ - followRotation?: boolean - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_ds3_f1_1?: number -} - /** * ### {@link ActionType.NodeAttachToCamera Action 46 - NodeAttachToCamera} * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} @@ -12842,54 +12682,20 @@ class NodeAttachToCamera extends DataAction { declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Disable this to stop the node from following the rotation of the camera. - */ - followRotation: boolean - unk_ds3_f1_1: number - constructor(props: NodeAttachToCameraParams = {}) { - super(ActionType.NodeAttachToCamera, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface ParticleAccelerationParams { - /** - * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. - * - * Unless it's left at 0, this changes the current direction of the particles, which can affect various other things, for example the rotation of {@link ActionType.Line Line} and {@link ActionType.QuadLine QuadLine} particles, and the direction of this action's {@link acceleration}. It does not affect the particles' {@link InitialDirection initial direction}. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - gravity?: ScalarValue - /** - * The particles' acceleration in their current direction, which is usually their {@link InitialDirection initial direction}, but can be changed over time by other things, for example this action's {@link gravity}. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - acceleration?: ScalarValue - /** - * Multiplier for {@link acceleration}. - * - * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `true` */ - accelerationMultiplier?: ScalarValue + followRotation: boolean /** * Unknown integer. * - * **Default**: `0` - */ - unk_ds3_f1_0?: number - /** - * Unknown float. - * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f1_1?: number + unk_ds3_f1_1: number + constructor(props: Partial> = {}) { + super(ActionType.NodeAttachToCamera, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** @@ -12906,68 +12712,43 @@ class ParticleAcceleration extends DataAction { * * Unless it's left at 0, this changes the current direction of the particles, which can affect various other things, for example the rotation of {@link ActionType.Line Line} and {@link ActionType.QuadLine QuadLine} particles, and the direction of this action's {@link acceleration}. It does not affect the particles' {@link InitialDirection initial direction}. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - gravity: ScalarValue - /** - * The particles' acceleration in their current direction, which is usually their {@link InitialDirection initial direction}, but can be changed over time by other things, for example this action's {@link gravity}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - acceleration: ScalarValue - /** - * Multiplier for {@link acceleration}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - accelerationMultiplier: ScalarValue - unk_ds3_f1_0: number - unk_ds3_f1_1: number - constructor(props: ParticleAccelerationParams = {}) { - super(ActionType.ParticleAcceleration, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface ParticleSpeedParams { - /** - * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. - * - * Unless it's left at 0, this changes the current direction of the particles, which can affect various other things, for example the rotation of {@link ActionType.Line Line} and {@link ActionType.QuadLine QuadLine} particles, and the direction of this action's {@link speed}. It does not affect the particles' {@link InitialDirection initial direction}. - * * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - gravity?: ScalarValue + gravity: ScalarValue /** - * The particles' speed in their current direction, which is usually their {@link InitialDirection initial direction}, but can be changed over time by other things, for example this action's {@link gravity}. + * The particles' acceleration in their current direction, which is usually their {@link InitialDirection initial direction}, but can be changed over time by other things, for example this action's {@link gravity}. * * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - speed?: ScalarValue + acceleration: ScalarValue /** - * Multiplier for {@link speed}. + * Multiplier for {@link acceleration}. * * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - speedMultiplier?: ScalarValue + accelerationMultiplier: ScalarValue /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_0?: number + unk_ds3_f1_0: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_1?: number + unk_ds3_f1_1: number + constructor(props: Partial> = {}) { + super(ActionType.ParticleAcceleration, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** @@ -12979,35 +12760,6 @@ export interface ParticleSpeedParams { class ParticleSpeed extends DataAction { declare readonly type: ActionType.ParticleSpeed declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. - * - * Unless it's left at 0, this changes the current direction of the particles, which can affect various other things, for example the rotation of {@link ActionType.Line Line} and {@link ActionType.QuadLine QuadLine} particles, and the direction of this action's {@link speed}. It does not affect the particles' {@link InitialDirection initial direction}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - gravity: ScalarValue - /** - * The particles' speed in their current direction, which is usually their {@link InitialDirection initial direction}, but can be changed over time by other things, for example this action's {@link gravity}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - speed: ScalarValue - /** - * Multiplier for {@link speed}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - speedMultiplier: ScalarValue - unk_ds3_f1_0: number - unk_ds3_f1_1: number - constructor(props: ParticleSpeedParams = {}) { - super(ActionType.ParticleSpeed, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface ParticleSpeedRandomTurnsParams { /** * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. * @@ -13017,7 +12769,7 @@ export interface ParticleSpeedRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - gravity?: ScalarValue + gravity: ScalarValue /** * The particles' speed in their current direction, which is usually their {@link InitialDirection initial direction}, but can be changed over time by other things, for example this action's {@link gravity}. * @@ -13025,7 +12777,7 @@ export interface ParticleSpeedRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - speed?: ScalarValue + speed: ScalarValue /** * Multiplier for {@link speed}. * @@ -13033,31 +12785,23 @@ export interface ParticleSpeedRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - speedMultiplier?: ScalarValue + speedMultiplier: ScalarValue /** - * The particles will turn a random amount based on this value at intervals defined by {@link turnInterval}. - * - * This turning affects the particles' current direction, which can affect various other things, for example this action's {@link speed}. + * Unknown integer. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - maxTurnAngle?: ScalarValue + unk_ds3_f1_0: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_0?: number - /** - * The particles will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. - * - * This turning affects the particles' current direction, which can affect various other things, for example this action's {@link speed}. - * - * **Default**: `0` - */ - turnInterval?: number + unk_ds3_f1_1: number + constructor(props: Partial> = {}) { + super(ActionType.ParticleSpeed, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** @@ -13069,48 +12813,6 @@ export interface ParticleSpeedRandomTurnsParams { class ParticleSpeedRandomTurns extends DataAction { declare readonly type: ActionType.ParticleSpeedRandomTurns declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. - * - * Unless it's left at 0, this changes the current direction of the particles, which can affect various other things, for example the rotation of {@link ActionType.Line Line} and {@link ActionType.QuadLine QuadLine} particles, and the direction of this action's {@link speed}. It does not affect the particles' {@link InitialDirection initial direction}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - gravity: ScalarValue - /** - * The particles' speed in their current direction, which is usually their {@link InitialDirection initial direction}, but can be changed over time by other things, for example this action's {@link gravity}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - speed: ScalarValue - /** - * Multiplier for {@link speed}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - speedMultiplier: ScalarValue - /** - * The particles will turn a random amount based on this value at intervals defined by {@link turnInterval}. - * - * This turning affects the particles' current direction, which can affect various other things, for example this action's {@link speed}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - maxTurnAngle: ScalarValue - unk_ds3_f1_0: number - /** - * The particles will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. - * - * This turning affects the particles' current direction, which can affect various other things, for example this action's {@link speed}. - */ - turnInterval: number - constructor(props: ParticleSpeedRandomTurnsParams = {}) { - super(ActionType.ParticleSpeedRandomTurns, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface ParticleSpeedPartialFollowParams { /** * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. * @@ -13120,7 +12822,7 @@ export interface ParticleSpeedPartialFollowParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - gravity?: ScalarValue + gravity: ScalarValue /** * The particles' speed in their current direction, which is usually their {@link InitialDirection initial direction}, but can be changed over time by other things, for example this action's {@link gravity}. * @@ -13128,7 +12830,7 @@ export interface ParticleSpeedPartialFollowParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - speed?: ScalarValue + speed: ScalarValue /** * Multiplier for {@link speed}. * @@ -13136,7 +12838,7 @@ export interface ParticleSpeedPartialFollowParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - speedMultiplier?: ScalarValue + speedMultiplier: ScalarValue /** * The particles will turn a random amount based on this value at intervals defined by {@link turnInterval}. * @@ -13146,24 +12848,13 @@ export interface ParticleSpeedPartialFollowParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - maxTurnAngle?: ScalarValue - /** - * Controls how well the particles should follow the parent node if they are not attached. At 0, the particles will not follow at all. At 1, the particles will follow perfectly, as if attached to the parent node. Negative values will make the particles move in the opposite direction compared to the parent node. Values greater than 1 will make the particles exaggerate the parent node's movement. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link followRotation} - */ - followFactor?: ScalarValue + maxTurnAngle: ScalarValue /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_0?: number + unk_ds3_f1_0: number /** * The particles will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. * @@ -13171,13 +12862,11 @@ export interface ParticleSpeedPartialFollowParams { * * **Default**: `0` */ - turnInterval?: number - /** - * Disabling this will make {@link followFactor} only affect translation and not rotation. - * - * **Default**: `true` - */ - followRotation?: boolean + turnInterval: number + constructor(props: Partial> = {}) { + super(ActionType.ParticleSpeedRandomTurns, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** @@ -13194,18 +12883,24 @@ class ParticleSpeedPartialFollow extends DataAction { * * Unless it's left at 0, this changes the current direction of the particles, which can affect various other things, for example the rotation of {@link ActionType.Line Line} and {@link ActionType.QuadLine QuadLine} particles, and the direction of this action's {@link speed}. It does not affect the particles' {@link InitialDirection initial direction}. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ gravity: ScalarValue /** * The particles' speed in their current direction, which is usually their {@link InitialDirection initial direction}, but can be changed over time by other things, for example this action's {@link gravity}. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ speed: ScalarValue /** * Multiplier for {@link speed}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ speedMultiplier: ScalarValue @@ -13214,60 +12909,48 @@ class ParticleSpeedPartialFollow extends DataAction { * * This turning affects the particles' current direction, which can affect various other things, for example this action's {@link speed}. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ maxTurnAngle: ScalarValue /** * Controls how well the particles should follow the parent node if they are not attached. At 0, the particles will not follow at all. At 1, the particles will follow perfectly, as if attached to the parent node. Negative values will make the particles move in the opposite direction compared to the parent node. Values greater than 1 will make the particles exaggerate the parent node's movement. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: * - {@link followRotation} */ followFactor: ScalarValue + /** + * Unknown float. + * + * **Default**: `0` + */ unk_ds3_f1_0: number /** * The particles will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. * * This turning affects the particles' current direction, which can affect various other things, for example this action's {@link speed}. + * + * **Default**: `0` */ turnInterval: number /** * Disabling this will make {@link followFactor} only affect translation and not rotation. + * + * **Default**: `true` */ followRotation: boolean - constructor(props: ParticleSpeedPartialFollowParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.ParticleSpeedPartialFollow, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface NodeSoundParams { - /** - * The ID of the sound to play. - * - * **Default**: `0` - */ - sound?: number - /** - * Volume multiplier. - * - * Does not seem to work in Elden Ring, and probably doesn't in Armored Core 6 either. - * - * **Default**: `1` - */ - volume?: number - /** - * Controls whether the sound will repeat or not. - * - * Does not seem to work in Elden Ring, and probably doesn't in Armored Core 6 either. - * - * **Default**: `false` - */ - repeat?: boolean -} - /** * ### {@link ActionType.NodeSound Action 75 - NodeSound} * **Slot**: {@link ActionSlots.NodeAudioAction NodeAudio} @@ -13279,41 +12962,32 @@ class NodeSound extends DataAction { declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The ID of the sound to play. + * + * **Default**: `0` */ sound: number /** * Volume multiplier. * * Does not seem to work in Elden Ring, and probably doesn't in Armored Core 6 either. + * + * **Default**: `1` */ volume: number /** * Controls whether the sound will repeat or not. * * Does not seem to work in Elden Ring, and probably doesn't in Armored Core 6 either. + * + * **Default**: `false` */ repeat: boolean - constructor(props: NodeSoundParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.NodeSound, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface EmissionSoundParams { - /** - * The ID of the sound to play. - * - * **Default**: `0` - */ - sound?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_1?: number -} - /** * ### {@link ActionType.EmissionSound Action 81 - EmissionSound} * **Slot**: {@link ActionSlots.EmissionAudioAction EmissionAudio} @@ -13325,16 +12999,31 @@ class EmissionSound extends DataAction { declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The ID of the sound to play. + * + * **Default**: `0` */ sound: number + /** + * Unknown float. + * + * **Default**: `1` + */ unk_ds3_f1_1: number - constructor(props: EmissionSoundParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.EmissionSound, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface NodeAccelerationRandomTurnsParams { +/** + * ### {@link ActionType.NodeAccelerationRandomTurns Action 83 - NodeAccelerationRandomTurns} + * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} + * + * Controls the movement of the node. This extends {@link ActionType.NodeAcceleration NodeAcceleration} with the ability to make the node turn a random amount at a given interval. + */ +class NodeAccelerationRandomTurns extends DataAction { + declare readonly type: ActionType.NodeAccelerationRandomTurns + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the speed of the node along its Z-axis. * @@ -13342,7 +13031,7 @@ export interface NodeAccelerationRandomTurnsParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - speedZ?: ScalarValue + speedZ: ScalarValue /** * Controls the acceleration of the node along its Z-axis. This value cannot be negative. * @@ -13350,7 +13039,7 @@ export interface NodeAccelerationRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationZ?: ScalarValue + accelerationZ: ScalarValue /** * Multiplier for {@link accelerationZ}. * @@ -13358,7 +13047,7 @@ export interface NodeAccelerationRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationMultiplierZ?: ScalarValue + accelerationMultiplierZ: ScalarValue /** * Controls the acceleration of the node along its Y-axis. * @@ -13366,7 +13055,7 @@ export interface NodeAccelerationRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationY?: ScalarValue + accelerationY: ScalarValue /** * The node will turn a random amount based on this value at intervals defined by {@link turnInterval}. * @@ -13374,84 +13063,42 @@ export interface NodeAccelerationRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - maxTurnAngle?: ScalarValue + maxTurnAngle: ScalarValue /** * When set to 1, this makes the node align with the direction it's moving. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. * * **Default**: `0` */ - alignWithMotion?: number + alignWithMotion: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_1?: number + unk_ds3_f1_1: number /** * The node will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. * * **Default**: `0` */ - turnInterval?: number + turnInterval: number + constructor(props: Partial> = {}) { + super(ActionType.NodeAccelerationRandomTurns, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** - * ### {@link ActionType.NodeAccelerationRandomTurns Action 83 - NodeAccelerationRandomTurns} - * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} + * ### {@link ActionType.ParticleAccelerationRandomTurns Action 84 - ParticleAccelerationRandomTurns} + * **Slot**: {@link ActionSlots.ParticleMovementAction ParticleMovement} * - * Controls the movement of the node. This extends {@link ActionType.NodeAcceleration NodeAcceleration} with the ability to make the node turn a random amount at a given interval. + * Controls the movement of particles. This extends {@link ActionType.ParticleAcceleration ParticleAcceleration} with the ability to make particles make random turns at a fixed interval. */ -class NodeAccelerationRandomTurns extends DataAction { - declare readonly type: ActionType.NodeAccelerationRandomTurns +class ParticleAccelerationRandomTurns extends DataAction { + declare readonly type: ActionType.ParticleAccelerationRandomTurns declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** - * Controls the speed of the node along its Z-axis. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - speedZ: ScalarValue - /** - * Controls the acceleration of the node along its Z-axis. This value cannot be negative. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationZ: ScalarValue - /** - * Multiplier for {@link accelerationZ}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationMultiplierZ: ScalarValue - /** - * Controls the acceleration of the node along its Y-axis. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationY: ScalarValue - /** - * The node will turn a random amount based on this value at intervals defined by {@link turnInterval}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - maxTurnAngle: ScalarValue - /** - * When set to 1, this makes the node align with the direction it's moving. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. - */ - alignWithMotion: number - unk_ds3_f1_1: number - /** - * The node will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. - */ - turnInterval: number - constructor(props: NodeAccelerationRandomTurnsParams = {}) { - super(ActionType.NodeAccelerationRandomTurns, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface ParticleAccelerationRandomTurnsParams { - /** - * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. + * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. * * Unless it's left at 0, this changes the current direction of the particles, which can affect various other things, for example the rotation of {@link ActionType.Line Line} and {@link ActionType.QuadLine QuadLine} particles, and the direction of this action's {@link acceleration}. It does not affect the particles' {@link InitialDirection initial direction}. * @@ -13459,7 +13106,7 @@ export interface ParticleAccelerationRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - gravity?: ScalarValue + gravity: ScalarValue /** * The particles' acceleration in their current direction, which is usually their {@link InitialDirection initial direction}, but can be changed over time by other things, for example this action's {@link gravity}. * @@ -13467,7 +13114,7 @@ export interface ParticleAccelerationRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - acceleration?: ScalarValue + acceleration: ScalarValue /** * Multiplier for {@link acceleration}. * @@ -13475,7 +13122,7 @@ export interface ParticleAccelerationRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - accelerationMultiplier?: ScalarValue + accelerationMultiplier: ScalarValue /** * The particles will turn a random amount based on this value at intervals defined by {@link turnInterval}. * @@ -13485,13 +13132,13 @@ export interface ParticleAccelerationRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - maxTurnAngle?: ScalarValue + maxTurnAngle: ScalarValue /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_0?: number + unk_ds3_f1_0: number /** * The particles will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. * @@ -13499,60 +13146,22 @@ export interface ParticleAccelerationRandomTurnsParams { * * **Default**: `0` */ - turnInterval?: number + turnInterval: number + constructor(props: Partial> = {}) { + super(ActionType.ParticleAccelerationRandomTurns, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** - * ### {@link ActionType.ParticleAccelerationRandomTurns Action 84 - ParticleAccelerationRandomTurns} + * ### {@link ActionType.ParticleAccelerationPartialFollow Action 105 - ParticleAccelerationPartialFollow} * **Slot**: {@link ActionSlots.ParticleMovementAction ParticleMovement} * - * Controls the movement of particles. This extends {@link ActionType.ParticleAcceleration ParticleAcceleration} with the ability to make particles make random turns at a fixed interval. + * Controls the movement of particles. This extends {@link ActionType.ParticleAccelerationRandomTurns ParticleAccelerationRandomTurns} with the ability to make particles partially follow the parent node. */ -class ParticleAccelerationRandomTurns extends DataAction { - declare readonly type: ActionType.ParticleAccelerationRandomTurns +class ParticleAccelerationPartialFollow extends DataAction { + declare readonly type: ActionType.ParticleAccelerationPartialFollow declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. - * - * Unless it's left at 0, this changes the current direction of the particles, which can affect various other things, for example the rotation of {@link ActionType.Line Line} and {@link ActionType.QuadLine QuadLine} particles, and the direction of this action's {@link acceleration}. It does not affect the particles' {@link InitialDirection initial direction}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - gravity: ScalarValue - /** - * The particles' acceleration in their current direction, which is usually their {@link InitialDirection initial direction}, but can be changed over time by other things, for example this action's {@link gravity}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - acceleration: ScalarValue - /** - * Multiplier for {@link acceleration}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - accelerationMultiplier: ScalarValue - /** - * The particles will turn a random amount based on this value at intervals defined by {@link turnInterval}. - * - * This turning affects the particles' current direction, which can affect various other things, for example this action's {@link acceleration}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - maxTurnAngle: ScalarValue - unk_ds3_f1_0: number - /** - * The particles will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. - * - * This turning affects the particles' current direction, which can affect various other things, for example this action's {@link acceleration}. - */ - turnInterval: number - constructor(props: ParticleAccelerationRandomTurnsParams = {}) { - super(ActionType.ParticleAccelerationRandomTurns, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface ParticleAccelerationPartialFollowParams { /** * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. * @@ -13562,7 +13171,7 @@ export interface ParticleAccelerationPartialFollowParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - gravity?: ScalarValue + gravity: ScalarValue /** * The particles' acceleration in their current direction, which is usually their {@link InitialDirection initial direction}, but can be changed over time by other things, for example this action's {@link gravity}. * @@ -13570,7 +13179,7 @@ export interface ParticleAccelerationPartialFollowParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - acceleration?: ScalarValue + acceleration: ScalarValue /** * Multiplier for {@link acceleration}. * @@ -13578,7 +13187,7 @@ export interface ParticleAccelerationPartialFollowParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - accelerationMultiplier?: ScalarValue + accelerationMultiplier: ScalarValue /** * The particles will turn a random amount based on this value at intervals defined by {@link turnInterval}. * @@ -13588,7 +13197,7 @@ export interface ParticleAccelerationPartialFollowParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - maxTurnAngle?: ScalarValue + maxTurnAngle: ScalarValue /** * Controls how well the particles should follow the parent node if they are not attached. At 0, the particles will not follow at all. At 1, the particles will follow perfectly, as if attached to the parent node. Negative values will make the particles move in the opposite direction compared to the parent node. Values greater than 1 will make the particles exaggerate the parent node's movement. * @@ -13599,13 +13208,13 @@ export interface ParticleAccelerationPartialFollowParams { * See also: * - {@link followRotation} */ - followFactor?: ScalarValue + followFactor: ScalarValue /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_0?: number + unk_ds3_f1_0: number /** * The particles will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. * @@ -13613,79 +13222,28 @@ export interface ParticleAccelerationPartialFollowParams { * * **Default**: `0` */ - turnInterval?: number + turnInterval: number /** * Disabling this will make {@link followFactor} only affect translation and not rotation. * * **Default**: `true` */ - followRotation?: boolean -} - -/** - * ### {@link ActionType.ParticleAccelerationPartialFollow Action 105 - ParticleAccelerationPartialFollow} - * **Slot**: {@link ActionSlots.ParticleMovementAction ParticleMovement} - * - * Controls the movement of particles. This extends {@link ActionType.ParticleAccelerationRandomTurns ParticleAccelerationRandomTurns} with the ability to make particles partially follow the parent node. - */ -class ParticleAccelerationPartialFollow extends DataAction { - declare readonly type: ActionType.ParticleAccelerationPartialFollow - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. - * - * Unless it's left at 0, this changes the current direction of the particles, which can affect various other things, for example the rotation of {@link ActionType.Line Line} and {@link ActionType.QuadLine QuadLine} particles, and the direction of this action's {@link acceleration}. It does not affect the particles' {@link InitialDirection initial direction}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - gravity: ScalarValue - /** - * The particles' acceleration in their current direction, which is usually their {@link InitialDirection initial direction}, but can be changed over time by other things, for example this action's {@link gravity}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - acceleration: ScalarValue - /** - * Multiplier for {@link acceleration}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - accelerationMultiplier: ScalarValue - /** - * The particles will turn a random amount based on this value at intervals defined by {@link turnInterval}. - * - * This turning affects the particles' current direction, which can affect various other things, for example this action's {@link acceleration}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - maxTurnAngle: ScalarValue - /** - * Controls how well the particles should follow the parent node if they are not attached. At 0, the particles will not follow at all. At 1, the particles will follow perfectly, as if attached to the parent node. Negative values will make the particles move in the opposite direction compared to the parent node. Values greater than 1 will make the particles exaggerate the parent node's movement. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link followRotation} - */ - followFactor: ScalarValue - unk_ds3_f1_0: number - /** - * The particles will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. - * - * This turning affects the particles' current direction, which can affect various other things, for example this action's {@link acceleration}. - */ - turnInterval: number - /** - * Disabling this will make {@link followFactor} only affect translation and not rotation. - */ followRotation: boolean - constructor(props: ParticleAccelerationPartialFollowParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.ParticleAccelerationPartialFollow, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface NodeAccelerationPartialFollowParams { +/** + * ### {@link ActionType.NodeAccelerationPartialFollow Action 106 - NodeAccelerationPartialFollow} + * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} + * + * Controls the movement of the node. This extends {@link ActionType.NodeAccelerationRandomTurns NodeAccelerationRandomTurns} with the ability to make the node partially follow or exaggerate the parent node's movement. + */ +class NodeAccelerationPartialFollow extends DataAction { + declare readonly type: ActionType.NodeAccelerationPartialFollow + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the speed of the node along its Z-axis. * @@ -13693,7 +13251,7 @@ export interface NodeAccelerationPartialFollowParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - speedZ?: ScalarValue + speedZ: ScalarValue /** * Controls the acceleration of the node along its Z-axis. This value cannot be negative. * @@ -13704,7 +13262,7 @@ export interface NodeAccelerationPartialFollowParams { * See also: * - {@link accelerationY} */ - accelerationZ?: ScalarValue + accelerationZ: ScalarValue /** * Multiplier for {@link accelerationZ}. * @@ -13712,7 +13270,7 @@ export interface NodeAccelerationPartialFollowParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationMultiplierZ?: ScalarValue + accelerationMultiplierZ: ScalarValue /** * Controls the acceleration of the node along the global Y-axis. When set to anything that isn't 0, this overrides the direction of {@link accelerationZ}. * @@ -13722,7 +13280,7 @@ export interface NodeAccelerationPartialFollowParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationY?: ScalarValue + accelerationY: ScalarValue /** * The node will turn a random amount based on this value at intervals defined by {@link turnInterval}. * @@ -13730,7 +13288,7 @@ export interface NodeAccelerationPartialFollowParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - maxTurnAngle?: ScalarValue + maxTurnAngle: ScalarValue /** * Controls how well the node should follow the parent node if it is not attached. At 0, the node will not follow at all. At 1, the node will follow perfectly, as if attached to the parent node. Negative values will make the node move in the opposite direction compared to the parent node. Values greater than 1 will make the node exaggerate the parent node's movement. * @@ -13741,106 +13299,46 @@ export interface NodeAccelerationPartialFollowParams { * See also: * - {@link followRotation} */ - followFactor?: ScalarValue + followFactor: ScalarValue /** * When set to 1, this makes the node align with the direction it's moving. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. * * **Default**: `0` */ - alignWithMotion?: number + alignWithMotion: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_1?: number + unk_ds3_f1_1: number /** * The node will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. * * **Default**: `0` */ - turnInterval?: number + turnInterval: number /** * Disabling this will make {@link followFactor} only affect translation and not rotation. * * **Default**: `true` */ - followRotation?: boolean + followRotation: boolean + constructor(props: Partial> = {}) { + super(ActionType.NodeAccelerationPartialFollow, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** - * ### {@link ActionType.NodeAccelerationPartialFollow Action 106 - NodeAccelerationPartialFollow} + * ### {@link ActionType.NodeAccelerationSpin Action 113 - NodeAccelerationSpin} * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} * - * Controls the movement of the node. This extends {@link ActionType.NodeAccelerationRandomTurns NodeAccelerationRandomTurns} with the ability to make the node partially follow or exaggerate the parent node's movement. + * Controls the movement of the node. This extends {@link ActionType.NodeAcceleration NodeAcceleration} with the ability to control the node's angular speed. */ -class NodeAccelerationPartialFollow extends DataAction { - declare readonly type: ActionType.NodeAccelerationPartialFollow +class NodeAccelerationSpin extends DataAction { + declare readonly type: ActionType.NodeAccelerationSpin declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * Controls the speed of the node along its Z-axis. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - speedZ: ScalarValue - /** - * Controls the acceleration of the node along its Z-axis. This value cannot be negative. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link accelerationY} - */ - accelerationZ: ScalarValue - /** - * Multiplier for {@link accelerationZ}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationMultiplierZ: ScalarValue - /** - * Controls the acceleration of the node along the global Y-axis. When set to anything that isn't 0, this overrides the direction of {@link accelerationZ}. - * - * Note that this for some reason uses the *global* Y-axis instead of the local one, which is used by the same property in {@link ActionType.NodeAcceleration NodeAcceleration}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationY: ScalarValue - /** - * The node will turn a random amount based on this value at intervals defined by {@link turnInterval}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - maxTurnAngle: ScalarValue - /** - * Controls how well the node should follow the parent node if it is not attached. At 0, the node will not follow at all. At 1, the node will follow perfectly, as if attached to the parent node. Negative values will make the node move in the opposite direction compared to the parent node. Values greater than 1 will make the node exaggerate the parent node's movement. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link followRotation} - */ - followFactor: ScalarValue - /** - * When set to 1, this makes the node align with the direction it's moving. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. - */ - alignWithMotion: number - unk_ds3_f1_1: number - /** - * The node will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. - */ - turnInterval: number - /** - * Disabling this will make {@link followFactor} only affect translation and not rotation. - */ - followRotation: boolean - constructor(props: NodeAccelerationPartialFollowParams = {}) { - super(ActionType.NodeAccelerationPartialFollow, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface NodeAccelerationSpinParams { /** * Controls the speed of the node along its Z-axis. * @@ -13848,7 +13346,7 @@ export interface NodeAccelerationSpinParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - speedZ?: ScalarValue + speedZ: ScalarValue /** * Controls the acceleration of the node along its Z-axis. This value cannot be negative. * @@ -13856,7 +13354,7 @@ export interface NodeAccelerationSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationZ?: ScalarValue + accelerationZ: ScalarValue /** * Multiplier for {@link accelerationZ}. * @@ -13864,7 +13362,7 @@ export interface NodeAccelerationSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationMultiplierZ?: ScalarValue + accelerationMultiplierZ: ScalarValue /** * Controls the acceleration of the node along its Y-axis. * @@ -13872,7 +13370,7 @@ export interface NodeAccelerationSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationY?: ScalarValue + accelerationY: ScalarValue /** * The node's angular speed around its local X-axis in degrees per second. * @@ -13883,7 +13381,7 @@ export interface NodeAccelerationSpinParams { * See also: * - {@link angularSpeedMultiplierX} */ - angularSpeedX?: ScalarValue + angularSpeedX: ScalarValue /** * Multiplier for {@link angularSpeedX}. * @@ -13891,7 +13389,7 @@ export interface NodeAccelerationSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - angularSpeedMultiplierX?: ScalarValue + angularSpeedMultiplierX: ScalarValue /** * The node's angular speed around its local Y-axis in degrees per second. * @@ -13902,7 +13400,7 @@ export interface NodeAccelerationSpinParams { * See also: * - {@link angularSpeedMultiplierY} */ - angularSpeedY?: ScalarValue + angularSpeedY: ScalarValue /** * Multiplier for {@link angularSpeedY}. * @@ -13910,7 +13408,7 @@ export interface NodeAccelerationSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - angularSpeedMultiplierY?: ScalarValue + angularSpeedMultiplierY: ScalarValue /** * The node's angular speed around its local Z-axis in degrees per second. * @@ -13921,7 +13419,7 @@ export interface NodeAccelerationSpinParams { * See also: * - {@link angularSpeedMultiplierZ} */ - angularSpeedZ?: ScalarValue + angularSpeedZ: ScalarValue /** * Multiplier for {@link angularSpeedZ}. * @@ -13929,125 +13427,46 @@ export interface NodeAccelerationSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - angularSpeedMultiplierZ?: ScalarValue + angularSpeedMultiplierZ: ScalarValue /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_0?: number + unk_ds3_f1_0: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_1?: number + unk_ds3_f1_1: number /** * When set to 1, this makes the node align with the direction it's moving, which also disables the angular speed from this action. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. * * **Default**: `0` */ - alignWithMotion?: number + alignWithMotion: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_3?: number + unk_ds3_f1_3: number + constructor(props: Partial> = {}) { + super(ActionType.NodeAccelerationSpin, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** - * ### {@link ActionType.NodeAccelerationSpin Action 113 - NodeAccelerationSpin} + * ### {@link ActionType.NodeSpeed Action 120 - NodeSpeed} * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} * - * Controls the movement of the node. This extends {@link ActionType.NodeAcceleration NodeAcceleration} with the ability to control the node's angular speed. + * Controls the movement of the node. This is the most basic action for controlling the speed of nodes. */ -class NodeAccelerationSpin extends DataAction { - declare readonly type: ActionType.NodeAccelerationSpin +class NodeSpeed extends DataAction { + declare readonly type: ActionType.NodeSpeed declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * Controls the speed of the node along its Z-axis. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - speedZ: ScalarValue - /** - * Controls the acceleration of the node along its Z-axis. This value cannot be negative. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationZ: ScalarValue - /** - * Multiplier for {@link accelerationZ}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationMultiplierZ: ScalarValue - /** - * Controls the acceleration of the node along its Y-axis. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationY: ScalarValue - /** - * The node's angular speed around its local X-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angularSpeedMultiplierX} - */ - angularSpeedX: ScalarValue - /** - * Multiplier for {@link angularSpeedX}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - angularSpeedMultiplierX: ScalarValue - /** - * The node's angular speed around its local Y-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angularSpeedMultiplierY} - */ - angularSpeedY: ScalarValue - /** - * Multiplier for {@link angularSpeedY}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - angularSpeedMultiplierY: ScalarValue - /** - * The node's angular speed around its local Z-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angularSpeedMultiplierZ} - */ - angularSpeedZ: ScalarValue - /** - * Multiplier for {@link angularSpeedZ}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - angularSpeedMultiplierZ: ScalarValue - unk_ds3_f1_0: number - unk_ds3_f1_1: number - /** - * When set to 1, this makes the node align with the direction it's moving, which also disables the angular speed from this action. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. - */ - alignWithMotion: number - unk_ds3_f1_3: number - constructor(props: NodeAccelerationSpinParams = {}) { - super(ActionType.NodeAccelerationSpin, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface NodeSpeedParams { /** * Controls the speed of the node along its Z-axis. * @@ -14055,7 +13474,7 @@ export interface NodeSpeedParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - speedZ?: ScalarValue + speedZ: ScalarValue /** * Multiplier for {@link speedZ}. * @@ -14063,7 +13482,7 @@ export interface NodeSpeedParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - speedMultiplierZ?: ScalarValue + speedMultiplierZ: ScalarValue /** * Controls the acceleration of the node along its Y-axis. * @@ -14071,67 +13490,40 @@ export interface NodeSpeedParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationY?: ScalarValue + accelerationY: ScalarValue /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_0?: number + unk_ds3_f1_0: number /** * When set to 1, this makes the node align with the direction it's moving. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. * * **Default**: `0` */ - alignWithMotion?: number + alignWithMotion: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_2?: number + unk_ds3_f1_2: number + constructor(props: Partial> = {}) { + super(ActionType.NodeSpeed, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** - * ### {@link ActionType.NodeSpeed Action 120 - NodeSpeed} + * ### {@link ActionType.NodeSpeedRandomTurns Action 121 - NodeSpeedRandomTurns} * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} * - * Controls the movement of the node. This is the most basic action for controlling the speed of nodes. + * Controls the movement of the node. This extends {@link ActionType.NodeSpeed NodeSpeed} with the ability to make the node turn a random amount at a given interval. */ -class NodeSpeed extends DataAction { - declare readonly type: ActionType.NodeSpeed +class NodeSpeedRandomTurns extends DataAction { + declare readonly type: ActionType.NodeSpeedRandomTurns declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * Controls the speed of the node along its Z-axis. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - speedZ: ScalarValue - /** - * Multiplier for {@link speedZ}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - speedMultiplierZ: ScalarValue - /** - * Controls the acceleration of the node along its Y-axis. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationY: ScalarValue - unk_ds3_f1_0: number - /** - * When set to 1, this makes the node align with the direction it's moving. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. - */ - alignWithMotion: number - unk_ds3_f1_2: number - constructor(props: NodeSpeedParams = {}) { - super(ActionType.NodeSpeed, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface NodeSpeedRandomTurnsParams { /** * Controls the speed of the node along its Z-axis. * @@ -14139,7 +13531,7 @@ export interface NodeSpeedRandomTurnsParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - speedZ?: ScalarValue + speedZ: ScalarValue /** * Multiplier for {@link speedZ}. * @@ -14147,7 +13539,7 @@ export interface NodeSpeedRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - speedMultiplierZ?: ScalarValue + speedMultiplierZ: ScalarValue /** * Controls the acceleration of the node along its Y-axis. * @@ -14155,7 +13547,7 @@ export interface NodeSpeedRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationY?: ScalarValue + accelerationY: ScalarValue /** * The node will turn a random amount based on this value at intervals defined by {@link turnInterval}. * @@ -14163,76 +13555,40 @@ export interface NodeSpeedRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - maxTurnAngle?: ScalarValue + maxTurnAngle: ScalarValue /** * When set to 1, this makes the node align with the direction it's moving. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. * * **Default**: `0` */ - alignWithMotion?: number + alignWithMotion: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_1?: number + unk_ds3_f1_1: number /** * The node will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. * * **Default**: `0` */ - turnInterval?: number + turnInterval: number + constructor(props: Partial> = {}) { + super(ActionType.NodeSpeedRandomTurns, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** - * ### {@link ActionType.NodeSpeedRandomTurns Action 121 - NodeSpeedRandomTurns} + * ### {@link ActionType.NodeSpeedPartialFollow Action 122 - NodeSpeedPartialFollow} * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} * - * Controls the movement of the node. This extends {@link ActionType.NodeSpeed NodeSpeed} with the ability to make the node turn a random amount at a given interval. + * Controls the movement of the node. This extends {@link ActionType.NodeSpeedRandomTurns NodeSpeedRandomTurns} with the ability to make the node partially follow or exaggerate the parent node's movement. */ -class NodeSpeedRandomTurns extends DataAction { - declare readonly type: ActionType.NodeSpeedRandomTurns +class NodeSpeedPartialFollow extends DataAction { + declare readonly type: ActionType.NodeSpeedPartialFollow declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * Controls the speed of the node along its Z-axis. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - speedZ: ScalarValue - /** - * Multiplier for {@link speedZ}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - speedMultiplierZ: ScalarValue - /** - * Controls the acceleration of the node along its Y-axis. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationY: ScalarValue - /** - * The node will turn a random amount based on this value at intervals defined by {@link turnInterval}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - maxTurnAngle: ScalarValue - /** - * When set to 1, this makes the node align with the direction it's moving. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. - */ - alignWithMotion: number - unk_ds3_f1_1: number - /** - * The node will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. - */ - turnInterval: number - constructor(props: NodeSpeedRandomTurnsParams = {}) { - super(ActionType.NodeSpeedRandomTurns, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface NodeSpeedPartialFollowParams { /** * Controls the speed of the node along its Z-axis. * @@ -14240,7 +13596,7 @@ export interface NodeSpeedPartialFollowParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - speedZ?: ScalarValue + speedZ: ScalarValue /** * Multiplier for {@link speedZ}. * @@ -14248,7 +13604,7 @@ export interface NodeSpeedPartialFollowParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - speedMultiplierZ?: ScalarValue + speedMultiplierZ: ScalarValue /** * Controls the acceleration of the node along its Y-axis. * @@ -14258,7 +13614,7 @@ export interface NodeSpeedPartialFollowParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationY?: ScalarValue + accelerationY: ScalarValue /** * The node will turn a random amount based on this value at intervals defined by {@link turnInterval}. * @@ -14266,7 +13622,7 @@ export interface NodeSpeedPartialFollowParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - maxTurnAngle?: ScalarValue + maxTurnAngle: ScalarValue /** * Controls how well the node should follow the parent node if it is not attached. At 0, the node will not follow at all. At 1, the node will follow perfectly, as if attached to the parent node. Negative values will make the node move in the opposite direction compared to the parent node. Values greater than 1 will make the node exaggerate the parent node's movement. * @@ -14277,140 +13633,89 @@ export interface NodeSpeedPartialFollowParams { * See also: * - {@link followRotation} */ - followFactor?: ScalarValue + followFactor: ScalarValue /** * When set to 1, this makes the node align with the direction it's moving. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. * * **Default**: `0` */ - alignWithMotion?: number + alignWithMotion: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_1?: number + unk_ds3_f1_1: number /** * The node will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. * * **Default**: `0` */ - turnInterval?: number + turnInterval: number /** * Disabling this will make {@link followFactor} only affect translation and not rotation. * * **Default**: `true` */ - followRotation?: boolean + followRotation: boolean + constructor(props: Partial> = {}) { + super(ActionType.NodeSpeedPartialFollow, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** - * ### {@link ActionType.NodeSpeedPartialFollow Action 122 - NodeSpeedPartialFollow} + * ### {@link ActionType.NodeSpeedSpin Action 123 - NodeSpeedSpin} * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} * - * Controls the movement of the node. This extends {@link ActionType.NodeSpeedRandomTurns NodeSpeedRandomTurns} with the ability to make the node partially follow or exaggerate the parent node's movement. + * Controls the movement of the node. This extends {@link ActionType.NodeSpeed NodeSpeed} with the ability to control the node's angular speed. */ -class NodeSpeedPartialFollow extends DataAction { - declare readonly type: ActionType.NodeSpeedPartialFollow +class NodeSpeedSpin extends DataAction { + declare readonly type: ActionType.NodeSpeedSpin declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the speed of the node along its Z-axis. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ speedZ: ScalarValue /** * Multiplier for {@link speedZ}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ speedMultiplierZ: ScalarValue /** * Controls the acceleration of the node along its Y-axis. * - * Note that this for some reason uses the *global* Y-axis instead of the local one, which is used by the same property in {@link ActionType.NodeSpeed NodeSpeed}. + * **Default**: `0` * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ accelerationY: ScalarValue /** - * The node will turn a random amount based on this value at intervals defined by {@link turnInterval}. + * The node's angular speed around its local X-axis in degrees per second. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - maxTurnAngle: ScalarValue - /** - * Controls how well the node should follow the parent node if it is not attached. At 0, the node will not follow at all. At 1, the node will follow perfectly, as if attached to the parent node. Negative values will make the node move in the opposite direction compared to the parent node. Values greater than 1 will make the node exaggerate the parent node's movement. + * **Default**: `0` * * **Argument**: {@link PropertyArgument.ActiveTime Active time} * * See also: - * - {@link followRotation} + * - {@link angularSpeedMultiplierX} */ - followFactor: ScalarValue + angularSpeedX: ScalarValue /** - * When set to 1, this makes the node align with the direction it's moving. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. + * Multiplier for {@link angularSpeedX}. + * + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - alignWithMotion: number - unk_ds3_f1_1: number - /** - * The node will turn a random amount based on {@link maxTurnAngle} at this interval. The units are seconds, but due to how the field that stores this value works, the value will be rounded to the nearest 0.02 seconds. - */ - turnInterval: number - /** - * Disabling this will make {@link followFactor} only affect translation and not rotation. - */ - followRotation: boolean - constructor(props: NodeSpeedPartialFollowParams = {}) { - super(ActionType.NodeSpeedPartialFollow, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface NodeSpeedSpinParams { - /** - * Controls the speed of the node along its Z-axis. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - speedZ?: ScalarValue - /** - * Multiplier for {@link speedZ}. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - speedMultiplierZ?: ScalarValue - /** - * Controls the acceleration of the node along its Y-axis. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationY?: ScalarValue - /** - * The node's angular speed around its local X-axis in degrees per second. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angularSpeedMultiplierX} - */ - angularSpeedX?: ScalarValue - /** - * Multiplier for {@link angularSpeedX}. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - angularSpeedMultiplierX?: ScalarValue + angularSpeedMultiplierX: ScalarValue /** * The node's angular speed around its local Y-axis in degrees per second. * @@ -14421,7 +13726,7 @@ export interface NodeSpeedSpinParams { * See also: * - {@link angularSpeedMultiplierY} */ - angularSpeedY?: ScalarValue + angularSpeedY: ScalarValue /** * Multiplier for {@link angularSpeedY}. * @@ -14429,7 +13734,7 @@ export interface NodeSpeedSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - angularSpeedMultiplierY?: ScalarValue + angularSpeedMultiplierY: ScalarValue /** * The node's angular speed around its local Z-axis in degrees per second. * @@ -14440,7 +13745,7 @@ export interface NodeSpeedSpinParams { * See also: * - {@link angularSpeedMultiplierZ} */ - angularSpeedZ?: ScalarValue + angularSpeedZ: ScalarValue /** * Multiplier for {@link angularSpeedZ}. * @@ -14448,157 +13753,37 @@ export interface NodeSpeedSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - angularSpeedMultiplierZ?: ScalarValue + angularSpeedMultiplierZ: ScalarValue /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_0?: number + unk_ds3_f1_0: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_1?: number + unk_ds3_f1_1: number /** * When set to 1, this makes the node align with the direction it's moving, which also disables the angular speed from this action. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. * * **Default**: `0` */ - alignWithMotion?: number + alignWithMotion: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_3?: number -} - -/** - * ### {@link ActionType.NodeSpeedSpin Action 123 - NodeSpeedSpin} - * **Slot**: {@link ActionSlots.NodeMovementAction NodeMovement} - * - * Controls the movement of the node. This extends {@link ActionType.NodeSpeed NodeSpeed} with the ability to control the node's angular speed. - */ -class NodeSpeedSpin extends DataAction { - declare readonly type: ActionType.NodeSpeedSpin - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * Controls the speed of the node along its Z-axis. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - speedZ: ScalarValue - /** - * Multiplier for {@link speedZ}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - speedMultiplierZ: ScalarValue - /** - * Controls the acceleration of the node along its Y-axis. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationY: ScalarValue - /** - * The node's angular speed around its local X-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angularSpeedMultiplierX} - */ - angularSpeedX: ScalarValue - /** - * Multiplier for {@link angularSpeedX}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - angularSpeedMultiplierX: ScalarValue - /** - * The node's angular speed around its local Y-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angularSpeedMultiplierY} - */ - angularSpeedY: ScalarValue - /** - * Multiplier for {@link angularSpeedY}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - angularSpeedMultiplierY: ScalarValue - /** - * The node's angular speed around its local Z-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angularSpeedMultiplierZ} - */ - angularSpeedZ: ScalarValue - /** - * Multiplier for {@link angularSpeedZ}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - angularSpeedMultiplierZ: ScalarValue - unk_ds3_f1_0: number - unk_ds3_f1_1: number - /** - * When set to 1, this makes the node align with the direction it's moving, which also disables the angular speed from this action. Setting it to higher values seems to do the same as setting it to 0, which means it's probably not a boolean, but what those values do exactly is unknown. - */ - alignWithMotion: number unk_ds3_f1_3: number - constructor(props: NodeSpeedSpinParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.NodeSpeedSpin, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface NodeAttributesParams { - /** - * The node duration in seconds. Can be set to -1 to make the node last forever. - * - * **Default**: `-1` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - duration?: ScalarValue - /** - * The delay in seconds before the node becomes active. - * - * **Default**: `0` - */ - delay?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_ds3_f1_1?: number - /** - * Controls how the node is attached to the parent node. - * - * **Default**: {@link AttachMode.Parent} - */ - attachment?: AttachMode - /** - * Controls the rendering order of this node. Lower values will cause the node to be drawn in front of nodes with a higher value. This only affects the node with this action, it is not inherited by descendant nodes. - * - * This does not affect the actual depth of the node in the scene. It will still draw behind other objects even with a big negative bias. It only affects the order it is rendered in relative to other effects. - * - * Model particles and light sources are not affected by this in any way. Most, if not all, other types of appearances are affected by it, even GPU particles and lens flares. - * - * **Default**: `0` - */ - depthBias?: number -} - /** * ### {@link ActionType.NodeAttributes Action 128 - NodeAttributes} * **Slot**: {@link ActionSlots.NodeAttributesAction NodeAttributes} @@ -14611,16 +13796,27 @@ class NodeAttributes extends DataAction { /** * The node duration in seconds. Can be set to -1 to make the node last forever. * + * **Default**: `-1` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ duration: ScalarValue /** * The delay in seconds before the node becomes active. + * + * **Default**: `0` */ delay: number + /** + * Unknown integer. + * + * **Default**: `1` + */ unk_ds3_f1_1: number /** * Controls how the node is attached to the parent node. + * + * **Default**: {@link AttachMode.Parent} */ attachment: AttachMode /** @@ -14629,31 +13825,16 @@ class NodeAttributes extends DataAction { * This does not affect the actual depth of the node in the scene. It will still draw behind other objects even with a big negative bias. It only affects the order it is rendered in relative to other effects. * * Model particles and light sources are not affected by this in any way. Most, if not all, other types of appearances are affected by it, even GPU particles and lens flares. + * + * **Default**: `0` */ depthBias: number - constructor(props: NodeAttributesParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.NodeAttributes, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface ParticleAttributesParams { - /** - * The particle duration in seconds. Can be set to -1 to make particles last forever. - * - * **Default**: `-1` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - duration?: ScalarValue - /** - * Controls how the particles are attached to the node. - * - * **Default**: {@link AttachMode.Parent} - */ - attachment?: AttachMode -} - /** * ### {@link ActionType.ParticleAttributes Action 129 - ParticleAttributes} * **Slot**: {@link ActionSlots.ParticleAttributesAction ParticleAttributes} @@ -14666,218 +13847,140 @@ class ParticleAttributes extends DataAction { /** * The particle duration in seconds. Can be set to -1 to make particles last forever. * + * **Default**: `-1` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ duration: ScalarValue /** * Controls how the particles are attached to the node. + * + * **Default**: {@link AttachMode.Parent} */ attachment: AttachMode - constructor(props: ParticleAttributesParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.ParticleAttributes, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface Unk130Params { +/** + * ### {@link ActionType.Unk130 Action 130 - Unk130} + * **Slot**: {@link ActionSlots.Unknown130Action Unknown130} + * + * Unknown action that is in every basic config in every game, and still literally nothing is known about it. + */ +class Unk130 extends DataAction { + declare readonly type: ActionType.Unk130 + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p1_0?: ScalarValue + unk_ds3_p1_0: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p1_1?: ScalarValue + unk_ds3_p1_1: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p1_2?: ScalarValue + unk_ds3_p1_2: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p1_3?: ScalarValue + unk_ds3_p1_3: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p1_4?: ScalarValue + unk_ds3_p1_4: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p1_5?: ScalarValue + unk_ds3_p1_5: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p1_6?: ScalarValue + unk_ds3_p1_6: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p1_7?: ScalarValue + unk_ds3_p1_7: ScalarValue /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_0?: number + unk_ds3_f1_0: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_1?: number + unk_ds3_f1_1: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_2?: number + unk_ds3_f1_2: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_3?: number + unk_ds3_f1_3: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_4?: number + unk_ds3_f1_4: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_5?: number + unk_ds3_f1_5: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_6?: number + unk_ds3_f1_6: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_7?: number + unk_ds3_f1_7: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_8?: number -} - -/** - * ### {@link ActionType.Unk130 Action 130 - Unk130} - * **Slot**: {@link ActionSlots.Unknown130Action Unknown130} - * - * Unknown action that is in every basic config in every game, and still literally nothing is known about it. - */ -class Unk130 extends DataAction { - declare readonly type: ActionType.Unk130 - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - unk_ds3_p1_0: ScalarValue - unk_ds3_p1_1: ScalarValue - unk_ds3_p1_2: ScalarValue - unk_ds3_p1_3: ScalarValue - unk_ds3_p1_4: ScalarValue - unk_ds3_p1_5: ScalarValue - unk_ds3_p1_6: ScalarValue - unk_ds3_p1_7: ScalarValue - unk_ds3_f1_0: number - unk_ds3_f1_1: number - unk_ds3_f1_2: number - unk_ds3_f1_3: number - unk_ds3_f1_4: number - unk_ds3_f1_5: number - unk_ds3_f1_6: number - unk_ds3_f1_7: number unk_ds3_f1_8: number - constructor(props: Unk130Params = {}) { + constructor(props: Partial> = {}) { super(ActionType.Unk130, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface ParticleModifierParams { - /** - * Controls the speed of the particles emitted from this node, but only if the config has an action in the {@link ActionSlots.ParticleMovementAction ParticleMovement slot} that enables acceleration of particles. The direction is the particle's {@link InitialDirection initial direction}. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - speed?: ScalarValue - /** - * Multiplier for the scale along the X-axis for the particles emitted from this node. - * - * If {@link uniformScale} is enabled, this also affects the Y and Z axes. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - scaleX?: ScalarValue - /** - * Multiplier for the scale along the Y-axis for the particles emitted from this node. - * - * If {@link uniformScale} is enabled, {@link scaleX} also affects the Y-axis, and this property is ignored. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - scaleY?: ScalarValue - /** - * Multiplier for the scale along the Z-axis for the particles emitted from this node. - * - * If {@link uniformScale} is enabled, {@link scaleX} also affects the Z-axis, and this property is ignored. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - scaleZ?: ScalarValue - /** - * Color multiplier for the particles emitted from this node. - * - * Values in this are unrestricted and can go above 1. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - color?: Vector4Value - /** - * Scales the particles emitted from this node uniformly based on {@link scaleX}. The other scale properties in this action have no effect when this is enabled. - * - * **Default**: `false` - * - * See also: - * - {@link scaleX} - * - {@link scaleY} - * - {@link scaleZ} - */ - uniformScale?: boolean -} - /** * ### {@link ActionType.ParticleModifier Action 131 - ParticleModifier} * **Slot**: {@link ActionSlots.ParticleModifierAction ParticleModifier} @@ -14892,6 +13995,8 @@ class ParticleModifier extends DataAction { /** * Controls the speed of the particles emitted from this node, but only if the config has an action in the {@link ActionSlots.ParticleMovementAction ParticleMovement slot} that enables acceleration of particles. The direction is the particle's {@link InitialDirection initial direction}. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ speed: ScalarValue @@ -14900,6 +14005,8 @@ class ParticleModifier extends DataAction { * * If {@link uniformScale} is enabled, this also affects the Y and Z axes. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ scaleX: ScalarValue @@ -14908,6 +14015,8 @@ class ParticleModifier extends DataAction { * * If {@link uniformScale} is enabled, {@link scaleX} also affects the Y-axis, and this property is ignored. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ scaleY: ScalarValue @@ -14916,6 +14025,8 @@ class ParticleModifier extends DataAction { * * If {@link uniformScale} is enabled, {@link scaleX} also affects the Z-axis, and this property is ignored. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ scaleZ: ScalarValue @@ -14924,19 +14035,23 @@ class ParticleModifier extends DataAction { * * Values in this are unrestricted and can go above 1. * + * **Default**: `[1, 1, 1, 1]` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ color: Vector4Value /** * Scales the particles emitted from this node uniformly based on {@link scaleX}. The other scale properties in this action have no effect when this is enabled. * + * **Default**: `false` + * * See also: * - {@link scaleX} * - {@link scaleY} * - {@link scaleZ} */ uniformScale: boolean - constructor(props: ParticleModifierParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.ParticleModifier, {isAppearance:false,isParticle:false}) this.assign(props) } @@ -14953,6 +14068,8 @@ class SFXReference extends DataAction { declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The ID of the referenced SFX. + * + * **Default**: `0` */ sfx: number /** @@ -14966,7 +14083,15 @@ class SFXReference extends DataAction { } } -export interface LevelsOfDetailThresholdsParams { +/** + * ### {@link ActionType.LevelsOfDetailThresholds Action 133 - LevelsOfDetailThresholds} + * **Slot**: {@link ActionSlots.LevelsOfDetailThresholdsAction LevelsOfDetailThresholds} + * + * Used in the {@link ConfigType.LevelsOfDetail levels of detail config} to manage the duration and thresholds for the {@link NodeType.LevelsOfDetail levels of detail node}. + */ +class LevelsOfDetailThresholds extends DataAction { + declare readonly type: ActionType.LevelsOfDetailThresholds + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The node duration in seconds. Can be set to -1 to make the node last forever. * @@ -14974,82 +14099,44 @@ export interface LevelsOfDetailThresholdsParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - duration?: ScalarValue + duration: ScalarValue /** * Distance threshold for child node 0. * * **Default**: `10000` */ - threshold0?: number + threshold0: number /** * Distance threshold for child node 1. * * **Default**: `10000` */ - threshold1?: number + threshold1: number /** * Distance threshold for child node 2. * * **Default**: `10000` */ - threshold2?: number + threshold2: number /** * Distance threshold for child node 3. * * **Default**: `10000` */ - threshold3?: number + threshold3: number /** * Distance threshold for child node 4. * * **Default**: `10000` */ - threshold4?: number + threshold4: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_5?: number -} - -/** - * ### {@link ActionType.LevelsOfDetailThresholds Action 133 - LevelsOfDetailThresholds} - * **Slot**: {@link ActionSlots.LevelsOfDetailThresholdsAction LevelsOfDetailThresholds} - * - * Used in the {@link ConfigType.LevelsOfDetail levels of detail config} to manage the duration and thresholds for the {@link NodeType.LevelsOfDetail levels of detail node}. - */ -class LevelsOfDetailThresholds extends DataAction { - declare readonly type: ActionType.LevelsOfDetailThresholds - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * The node duration in seconds. Can be set to -1 to make the node last forever. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - duration: ScalarValue - /** - * Distance threshold for child node 0. - */ - threshold0: number - /** - * Distance threshold for child node 1. - */ - threshold1: number - /** - * Distance threshold for child node 2. - */ - threshold2: number - /** - * Distance threshold for child node 3. - */ - threshold3: number - /** - * Distance threshold for child node 4. - */ - threshold4: number unk_ac6_f1_5: number - constructor(props: LevelsOfDetailThresholdsParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.LevelsOfDetailThresholds, {isAppearance:false,isParticle:false}) this.assign(props) } @@ -15068,6 +14155,8 @@ class StateConfigMap extends DataAction { * A list of config indices. * * The index of each value represents the index of the state, and the value represents the index of the config that should be active when the state is active. + * + * **Default**: `[0]` */ configIndices: number[] /** @@ -15111,6 +14200,8 @@ class SelectRandomNode extends DataAction { * Probability weights for each child node to be selected for emission. * * The weights are stored as integers, so non-integer values in this list will be truncated. + * + * **Default**: `[1]` */ weights: number[] /** @@ -15126,7 +14217,15 @@ class SelectRandomNode extends DataAction { } } -export interface PeriodicEmitterParams { +/** + * ### {@link ActionType.PeriodicEmitter Action 300 - PeriodicEmitter} + * **Slot**: {@link ActionSlots.EmitterAction Emitter} + * + * Emits particles periodically. + */ +class PeriodicEmitter extends DataAction { + declare readonly type: ActionType.PeriodicEmitter + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Time between emitting new particles in seconds. * @@ -15134,7 +14233,7 @@ export interface PeriodicEmitterParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - interval?: ScalarValue + interval: ScalarValue /** * The number of particles to emit per interval. They all spawn at the same time per interval. * @@ -15142,7 +14241,7 @@ export interface PeriodicEmitterParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - perInterval?: ScalarValue + perInterval: ScalarValue /** * The total number of intervals to emit particles. Once this limit is reached, the emitter is will stop emitting. Can be set to -1 to disable the limit. * @@ -15150,7 +14249,7 @@ export interface PeriodicEmitterParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - totalIntervals?: ScalarValue + totalIntervals: ScalarValue /** * Maximum number of concurrent particles. Can be set to -1 to disable the limit. * @@ -15158,56 +14257,28 @@ export interface PeriodicEmitterParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - maxConcurrent?: ScalarValue + maxConcurrent: ScalarValue /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_1?: number + unk_ds3_f1_1: number + constructor(props: Partial> = {}) { + super(ActionType.PeriodicEmitter, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** - * ### {@link ActionType.PeriodicEmitter Action 300 - PeriodicEmitter} + * ### {@link ActionType.EqualDistanceEmitter Action 301 - EqualDistanceEmitter} * **Slot**: {@link ActionSlots.EmitterAction Emitter} * - * Emits particles periodically. + * Emits particles once it has moved a certain distance from where it last emitted particles. */ -class PeriodicEmitter extends DataAction { - declare readonly type: ActionType.PeriodicEmitter +class EqualDistanceEmitter extends DataAction { + declare readonly type: ActionType.EqualDistanceEmitter declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * Time between emitting new particles in seconds. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - interval: ScalarValue - /** - * The number of particles to emit per interval. They all spawn at the same time per interval. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - perInterval: ScalarValue - /** - * The total number of intervals to emit particles. Once this limit is reached, the emitter is will stop emitting. Can be set to -1 to disable the limit. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - totalIntervals: ScalarValue - /** - * Maximum number of concurrent particles. Can be set to -1 to disable the limit. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - maxConcurrent: ScalarValue - unk_ds3_f1_1: number - constructor(props: PeriodicEmitterParams = {}) { - super(ActionType.PeriodicEmitter, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface EqualDistanceEmitterParams { /** * How much the emitter must move to trigger emission. * @@ -15215,13 +14286,13 @@ export interface EqualDistanceEmitterParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - threshold?: ScalarValue + threshold: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `-1` */ - unk_ds3_p1_2?: ScalarValue + unk_ds3_p1_2: ScalarValue /** * Maximum number of concurrent particles. Can be set to -1 to disable the limit. * @@ -15229,53 +14300,26 @@ export interface EqualDistanceEmitterParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - maxConcurrent?: ScalarValue + maxConcurrent: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `1` */ - unk_ds3_p1_1?: ScalarValue + unk_ds3_p1_1: ScalarValue /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_1?: number + unk_ds3_f1_1: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f1_1?: number -} - -/** - * ### {@link ActionType.EqualDistanceEmitter Action 301 - EqualDistanceEmitter} - * **Slot**: {@link ActionSlots.EmitterAction Emitter} - * - * Emits particles once it has moved a certain distance from where it last emitted particles. - */ -class EqualDistanceEmitter extends DataAction { - declare readonly type: ActionType.EqualDistanceEmitter - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * How much the emitter must move to trigger emission. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - threshold: ScalarValue - unk_ds3_p1_2: ScalarValue - /** - * Maximum number of concurrent particles. Can be set to -1 to disable the limit. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - maxConcurrent: ScalarValue - unk_ds3_p1_1: ScalarValue - unk_ds3_f1_1: number unk_sdt_f1_1: number - constructor(props: EqualDistanceEmitterParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.EqualDistanceEmitter, {isAppearance:false,isParticle:false}) this.assign(props) } @@ -15307,6 +14351,8 @@ class PointEmitterShape extends DataAction { declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the initial direction for particles. See {@link InitialDirection} for more information. + * + * **Default**: {@link InitialDirection.Emitter} */ direction: InitialDirection /** @@ -15320,35 +14366,6 @@ class PointEmitterShape extends DataAction { } } -export interface DiskEmitterShapeParams { - /** - * Radius of the disk. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - radius?: ScalarValue - /** - * Controls how the random emission points are distributed within the disk. - * - At 0, particles are equally likely to emit from anywhere inside the disk. - * - At 1, particles have a 100% chance of being emitted from the center point. - * - At -1, particles have a 100% chance of being emitted from the perimeter circle of the disk. - * - Values between these smoothly blend between them. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - distribution?: ScalarValue - /** - * Controls the initial direction for particles. See {@link InitialDirection} for more information. - * - * **Default**: {@link InitialDirection.Emitter} - */ - direction?: InitialDirection -} - /** * ### {@link ActionType.DiskEmitterShape Action 401 - DiskEmitterShape} * **Slot**: {@link ActionSlots.EmitterShapeAction EmitterShape} @@ -15361,6 +14378,8 @@ class DiskEmitterShape extends DataAction { /** * Radius of the disk. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ radius: ScalarValue @@ -15371,20 +14390,32 @@ class DiskEmitterShape extends DataAction { * - At -1, particles have a 100% chance of being emitted from the perimeter circle of the disk. * - Values between these smoothly blend between them. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ distribution: ScalarValue /** * Controls the initial direction for particles. See {@link InitialDirection} for more information. + * + * **Default**: {@link InitialDirection.Emitter} */ direction: InitialDirection - constructor(props: DiskEmitterShapeParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.DiskEmitterShape, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface RectangleEmitterShapeParams { +/** + * ### {@link ActionType.RectangleEmitterShape Action 402 - RectangleEmitterShape} + * **Slot**: {@link ActionSlots.EmitterShapeAction EmitterShape} + * + * Makes the emitter rectangular. + */ +class RectangleEmitterShape extends DataAction { + declare readonly type: ActionType.RectangleEmitterShape + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Width of the rectangle. * @@ -15392,7 +14423,7 @@ export interface RectangleEmitterShapeParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - sizeX?: ScalarValue + sizeX: ScalarValue /** * Height of the rectangle. * @@ -15400,7 +14431,7 @@ export interface RectangleEmitterShapeParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - sizeY?: ScalarValue + sizeY: ScalarValue /** * Controls how the random emission points are distributed within the rectangle. * - At 0, particles are equally likely to emit from anywhere inside the rectangle. @@ -15412,73 +14443,19 @@ export interface RectangleEmitterShapeParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - distribution?: ScalarValue + distribution: ScalarValue /** * Controls the initial direction for particles. See {@link InitialDirection} for more information. * * **Default**: {@link InitialDirection.Emitter} */ - direction?: InitialDirection -} - -/** - * ### {@link ActionType.RectangleEmitterShape Action 402 - RectangleEmitterShape} - * **Slot**: {@link ActionSlots.EmitterShapeAction EmitterShape} - * - * Makes the emitter rectangular. - */ -class RectangleEmitterShape extends DataAction { - declare readonly type: ActionType.RectangleEmitterShape - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * Width of the rectangle. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - sizeX: ScalarValue - /** - * Height of the rectangle. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - sizeY: ScalarValue - /** - * Controls how the random emission points are distributed within the rectangle. - * - At 0, particles are equally likely to emit from anywhere inside the rectangle. - * - At 1, particles have a 100% chance of being emitted from the center point. - * - At -1, particles have a 100% chance of being emitted from the perimeter of the rectangle. - * - Values between these smoothly blend between them. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - distribution: ScalarValue - /** - * Controls the initial direction for particles. See {@link InitialDirection} for more information. - */ direction: InitialDirection - constructor(props: RectangleEmitterShapeParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.RectangleEmitterShape, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface SphereEmitterShapeParams { - /** - * Radius of the sphere. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - radius?: ScalarValue - /** - * If true, particles will be emitted from anywhere within the sphere. Otherwise the particles will be emitted only from the surface of the sphere. - * - * **Default**: `true` - */ - emitInside?: boolean -} - /** * ### {@link ActionType.SphereEmitterShape Action 403 - SphereEmitterShape} * **Slot**: {@link ActionSlots.EmitterShapeAction EmitterShape} @@ -15491,58 +14468,23 @@ class SphereEmitterShape extends DataAction { /** * Radius of the sphere. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ radius: ScalarValue /** * If true, particles will be emitted from anywhere within the sphere. Otherwise the particles will be emitted only from the surface of the sphere. + * + * **Default**: `true` */ emitInside: boolean - constructor(props: SphereEmitterShapeParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.SphereEmitterShape, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface BoxEmitterShapeParams { - /** - * Width of the cuboid. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - sizeX?: ScalarValue - /** - * Height of the cuboid. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - sizeY?: ScalarValue - /** - * Depth of the cuboid. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - sizeZ?: ScalarValue - /** - * Controls the initial direction for particles. See {@link InitialDirection} for more information. - * - * **Default**: {@link InitialDirection.Emitter} - */ - direction?: InitialDirection - /** - * If true, particles will be emitted from anywhere within the cuboid. Otherwise the particles will be emitted only from the surface of the cuboid. - * - * **Default**: `true` - */ - emitInside?: boolean -} - /** * ### {@link ActionType.BoxEmitterShape Action 404 - BoxEmitterShape} * **Slot**: {@link ActionSlots.EmitterShapeAction EmitterShape} @@ -15555,72 +14497,45 @@ class BoxEmitterShape extends DataAction { /** * Width of the cuboid. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ sizeX: ScalarValue /** * Height of the cuboid. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ sizeY: ScalarValue /** * Depth of the cuboid. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ sizeZ: ScalarValue /** * Controls the initial direction for particles. See {@link InitialDirection} for more information. + * + * **Default**: {@link InitialDirection.Emitter} */ direction: InitialDirection /** * If true, particles will be emitted from anywhere within the cuboid. Otherwise the particles will be emitted only from the surface of the cuboid. + * + * **Default**: `true` */ emitInside: boolean - constructor(props: BoxEmitterShapeParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.BoxEmitterShape, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface CylinderEmitterShapeParams { - /** - * The radius of the cylinder. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - radius?: ScalarValue - /** - * The height of the cylinder. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - height?: ScalarValue - /** - * Controls the initial direction for particles. See {@link InitialDirection} for more information. - * - * **Default**: {@link InitialDirection.Emitter} - */ - direction?: InitialDirection - /** - * If true, particles will be emitted from anywhere within the cylinder. Otherwise the particles will be emitted only from the surface of the cylinder, excluding the ends. - * - * **Default**: `true` - */ - emitInside?: boolean - /** - * If true, the cylinder will be aligned with the Y-axis instead of the Z-axis. - * - * **Default**: `true` - */ - yAxis?: boolean -} - /** * ### {@link ActionType.CylinderEmitterShape Action 405 - CylinderEmitterShape} * **Slot**: {@link ActionSlots.EmitterShapeAction EmitterShape} @@ -15633,28 +14548,38 @@ class CylinderEmitterShape extends DataAction { /** * The radius of the cylinder. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ radius: ScalarValue /** * The height of the cylinder. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ height: ScalarValue /** * Controls the initial direction for particles. See {@link InitialDirection} for more information. + * + * **Default**: {@link InitialDirection.Emitter} */ direction: InitialDirection /** * If true, particles will be emitted from anywhere within the cylinder. Otherwise the particles will be emitted only from the surface of the cylinder, excluding the ends. + * + * **Default**: `true` */ emitInside: boolean /** * If true, the cylinder will be aligned with the Y-axis instead of the Z-axis. + * + * **Default**: `true` */ yAxis: boolean - constructor(props: CylinderEmitterShapeParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.CylinderEmitterShape, {isAppearance:false,isParticle:false}) this.assign(props) } @@ -15675,36 +14600,6 @@ class NoSpread extends DataAction { } } -export interface CircularSpreadParams { - /** - * The maximum change in direction in degrees, the angle of the cone. - * - * **Default**: `30` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - angle?: ScalarValue - /** - * Controls the distribution of the random directions that can be chosen. - * - At 0, all directions within the cone have an equal chance of being chosen. - * - At 1, the default direction is guaranteed to be chosen. - * - At -1, the maximum change in direction is guaranteed, meaning the chosen direction will always be a fixed number of degrees away from the default direction based on {@link angle}. - * - Values between these values smoothly blend between them. - * - Values outside of the -1 to 1 range also work, but may do some unexpected things. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - distribution?: ScalarValue - /** - * No so much unknown, just unnamed. If enabled, this limits the possible directions to only positive values on one axis, effectively cutting the cone of possible directions in half. - * - * **Default**: `false` - */ - unk_er_f1_0?: boolean -} - /** * ### {@link ActionType.CircularSpread Action 501 - CircularSpread} * **Slot**: {@link ActionSlots.DirectionSpreadAction DirectionSpread} @@ -15717,6 +14612,8 @@ class CircularSpread extends DataAction { /** * The maximum change in direction in degrees, the angle of the cone. * + * **Default**: `30` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ angle: ScalarValue @@ -15728,63 +14625,23 @@ class CircularSpread extends DataAction { * - Values between these values smoothly blend between them. * - Values outside of the -1 to 1 range also work, but may do some unexpected things. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ distribution: ScalarValue /** * No so much unknown, just unnamed. If enabled, this limits the possible directions to only positive values on one axis, effectively cutting the cone of possible directions in half. + * + * **Default**: `false` */ unk_er_f1_0: boolean - constructor(props: CircularSpreadParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.CircularSpread, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface EllipticalSpreadParams { - /** - * The maximum change in direction in degrees, one of the angles of the elliptical cone. - * - * **Default**: `30` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angleY} - */ - angleX?: ScalarValue - /** - * The maximum change in direction in degrees, one of the angles of the elliptical cone. - * - * **Default**: `30` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angleY} - */ - angleY?: ScalarValue - /** - * Controls the distribution of the random directions that can be chosen. - * - At 0, all directions within the cone have an equal chance of being chosen. - * - At 1, the default direction is guaranteed to be chosen. - * - At -1, the maximum change in direction is guaranteed, meaning the chosen direction will always be a fixed number of degrees away from the default direction based on {@link angleX} and {@link angleY}. - * - Values between these values smoothly blend between them. - * - Values outside of the -1 to 1 range also work, but may do some unexpected things. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - distribution?: ScalarValue - /** - * No so much unknown, just unnamed. If enabled, this limits the possible directions to only positive values on one axis, effectively cutting the cone of possible directions in half. - * - * **Default**: `false` - */ - unk_er_f1_0?: boolean -} - /** * ### {@link ActionType.EllipticalSpread Action 502 - EllipticalSpread} * **Slot**: {@link ActionSlots.DirectionSpreadAction DirectionSpread} @@ -15797,6 +14654,8 @@ class EllipticalSpread extends DataAction { /** * The maximum change in direction in degrees, one of the angles of the elliptical cone. * + * **Default**: `30` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} * * See also: @@ -15806,6 +14665,8 @@ class EllipticalSpread extends DataAction { /** * The maximum change in direction in degrees, one of the angles of the elliptical cone. * + * **Default**: `30` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} * * See also: @@ -15820,57 +14681,23 @@ class EllipticalSpread extends DataAction { * - Values between these values smoothly blend between them. * - Values outside of the -1 to 1 range also work, but may do some unexpected things. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ distribution: ScalarValue /** * No so much unknown, just unnamed. If enabled, this limits the possible directions to only positive values on one axis, effectively cutting the cone of possible directions in half. + * + * **Default**: `false` */ unk_er_f1_0: boolean - constructor(props: EllipticalSpreadParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.EllipticalSpread, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface RectangularSpreadParams { - /** - * The maximum change in direction in degrees, one of the angles of the elliptical cone. - * - * **Default**: `30` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angleY} - */ - angleX?: ScalarValue - /** - * The maximum change in direction in degrees, one of the angles of the elliptical cone. - * - * **Default**: `30` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angleX} - */ - angleY?: ScalarValue - /** - * Controls the distribution of the random directions that can be chosen. - * - At 0, all directions within the cone have an equal chance of being chosen. - * - At 1, the default direction is guaranteed to be chosen. - * - At -1, the maximum change in direction is guaranteed, meaning the chosen direction will always be a fixed number of degrees away from the default direction based on {@link angleX} and {@link angleY}. - * - Values between these values smoothly blend between them. - * - Values outside of the -1 to 1 range also work, but may do some unexpected things. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - distribution?: ScalarValue -} - /** * ### {@link ActionType.RectangularSpread Action 503 - RectangularSpread} * **Slot**: {@link ActionSlots.DirectionSpreadAction DirectionSpread} @@ -15883,6 +14710,8 @@ class RectangularSpread extends DataAction { /** * The maximum change in direction in degrees, one of the angles of the elliptical cone. * + * **Default**: `30` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} * * See also: @@ -15892,6 +14721,8 @@ class RectangularSpread extends DataAction { /** * The maximum change in direction in degrees, one of the angles of the elliptical cone. * + * **Default**: `30` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} * * See also: @@ -15906,16 +14737,26 @@ class RectangularSpread extends DataAction { * - Values between these values smoothly blend between them. * - Values outside of the -1 to 1 range also work, but may do some unexpected things. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ distribution: ScalarValue - constructor(props: RectangularSpreadParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.RectangularSpread, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface PointSpriteParams { +/** + * ### {@link ActionType.PointSprite Action 600 - PointSprite} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * Very basic point sprite particle. Similar to {@link ActionType.BillboardEx BillboardEx}, but far simpler. + */ +class PointSprite extends DataAction { + declare readonly type: ActionType.PointSprite + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Texture ID. * @@ -15923,7 +14764,7 @@ export interface PointSpriteParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - texture?: ScalarValue + texture: ScalarValue /** * Blend mode. * @@ -15931,7 +14772,7 @@ export interface PointSpriteParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - blendMode?: BlendMode | ScalarProperty + blendMode: BlendMode | ScalarProperty /** * Particle size. * @@ -15939,7 +14780,7 @@ export interface PointSpriteParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - size?: ScalarValue + size: ScalarValue /** * Color multiplier. * @@ -15953,7 +14794,7 @@ export interface PointSpriteParams { * - {@link color2} * - {@link color3} */ - color1?: Vector4Value + color1: Vector4Value /** * Color multiplier. * @@ -15967,7 +14808,7 @@ export interface PointSpriteParams { * - {@link color1} * - {@link color3} */ - color2?: Vector4Value + color2: Vector4Value /** * Color multiplier. * @@ -15981,7 +14822,7 @@ export interface PointSpriteParams { * - {@link color1} * - {@link color2} */ - color3?: Vector4Value + color3: Vector4Value /** * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * @@ -15989,7 +14830,7 @@ export interface PointSpriteParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - rgbMultiplier?: ScalarValue + rgbMultiplier: ScalarValue /** * Alpha multiplier. * @@ -15997,31 +14838,31 @@ export interface PointSpriteParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - alphaMultiplier?: ScalarValue + alphaMultiplier: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p2_2?: ScalarValue + unk_ds3_p2_2: ScalarValue /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_3?: Vector4Value + unk_ds3_p2_3: Vector4Value /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_4?: Vector4Value + unk_ds3_p2_4: Vector4Value /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_5?: Vector4Value + unk_ds3_p2_5: Vector4Value /** * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. * @@ -16031,61 +14872,61 @@ export interface PointSpriteParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - alphaThreshold?: ScalarValue + alphaThreshold: ScalarValue /** * Unknown integer. * * **Default**: `-2` */ - unk_ds3_f1_2?: number + unk_ds3_f1_2: number /** * Unknown integer. * * **Default**: `-2` */ - unk_ds3_f1_3?: number + unk_ds3_f1_3: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_4?: number + unk_ds3_f1_4: number /** * Unknown integer. * * **Default**: `1` */ - unk_er_f1_3?: number + unk_er_f1_3: number /** * Unknown integer. * * **Default**: `1` */ - unk_er_f1_4?: number + unk_er_f1_4: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_0?: number + unk_ds3_f2_0: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_1?: number + unk_ds3_f2_1: number /** * Unknown integer. * * **Default**: `8` */ - unk_ds3_f2_2?: number + unk_ds3_f2_2: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_3?: number + unk_ds3_f2_3: number /** * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. * @@ -16098,7 +14939,7 @@ export interface PointSpriteParams { * See also: * - {@link bloomColor} */ - bloom?: boolean + bloom: boolean /** * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. * @@ -16111,37 +14952,37 @@ export interface PointSpriteParams { * See also: * - {@link bloom} */ - bloomColor?: Vector4 + bloomColor: Vector4 /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f2_9?: number + unk_ds3_f2_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_10?: number + unk_ds3_f2_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_11?: number + unk_ds3_f2_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_12?: number + unk_ds3_f2_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_13?: number + unk_ds3_f2_13: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -16156,7 +14997,7 @@ export interface PointSpriteParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minFadeDistance?: number + minFadeDistance: number /** * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -16173,7 +15014,7 @@ export interface PointSpriteParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minDistance?: number + minDistance: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -16188,7 +15029,7 @@ export interface PointSpriteParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxFadeDistance?: number + maxFadeDistance: number /** * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -16205,7 +15046,7 @@ export interface PointSpriteParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxDistance?: number + maxDistance: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -16218,7 +15059,7 @@ export interface PointSpriteParams { * - {@link maxDistance} * - {@link maxDistanceThreshold} */ - minDistanceThreshold?: number + minDistanceThreshold: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -16231,61 +15072,61 @@ export interface PointSpriteParams { * - {@link maxDistance} * - {@link minDistanceThreshold} */ - maxDistanceThreshold?: number + maxDistanceThreshold: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_20?: number + unk_ds3_f2_20: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_21?: number + unk_ds3_f2_21: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_22?: number + unk_ds3_f2_22: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_23?: number + unk_ds3_f2_23: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_24?: number + unk_ds3_f2_24: number /** * Unknown float. * * **Default**: `1` */ - unkDepthBlend1?: number + unkDepthBlend1: number /** * Unknown float. * * **Default**: `0` */ - unkDepthBlend2?: number + unkDepthBlend2: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_27?: number + unk_ds3_f2_27: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_28?: number + unk_ds3_f2_28: number /** * Unknown float. * @@ -16293,19 +15134,19 @@ export interface PointSpriteParams { * * **Default**: `0` */ - unk_ds3_f2_29?: number + unk_ds3_f2_29: number /** * Unknown float. * * **Default**: `0` */ - unk_sdt_f2_30?: number + unk_sdt_f2_30: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_31?: number + unk_sdt_f2_31: number /** * Unknown integer. * @@ -16313,146 +15154,262 @@ export interface PointSpriteParams { * * **Default**: `0` */ - unk_sdt_f2_32?: number + unk_sdt_f2_32: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_33?: number + unk_sdt_f2_33: number /** * Unknown float. * * **Default**: `0` */ - unk_sdt_f2_34?: number + unk_sdt_f2_34: number /** * Unknown integer. * * **Default**: `-1` */ - unk_sdt_f2_35?: number + unk_sdt_f2_35: number /** * Unknown integer. * * **Default**: `-2` */ - unk_sdt_f2_36?: number + unk_sdt_f2_36: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_37?: number + unk_sdt_f2_37: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_38?: number + unk_sdt_f2_38: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_39?: number + unk_er_f2_39: number + constructor(props: Partial> = {}) { + super(ActionType.PointSprite, {isAppearance:true,isParticle:true}) + this.assign(props) + } } /** - * ### {@link ActionType.PointSprite Action 600 - PointSprite} + * ### {@link ActionType.Line Action 601 - Line} * **Slot**: {@link ActionSlots.AppearanceAction Appearance} * - * Very basic point sprite particle. Similar to {@link ActionType.BillboardEx BillboardEx}, but far simpler. + * Simple line particle. It automatically rotates to match the direction it's moving. */ -class PointSprite extends DataAction { - declare readonly type: ActionType.PointSprite +class Line extends DataAction { + declare readonly type: ActionType.Line declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} - /** - * Texture ID. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - texture: ScalarValue /** * Blend mode. * + * **Default**: {@link BlendMode.Normal} + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ blendMode: BlendMode | ScalarProperty /** - * Particle size. + * The length of the line. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * + * See also: + * - {@link lengthMultiplier} */ - size: ScalarValue + length: ScalarValue /** * Color multiplier. * - * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. + * Values in this will be clamped to the 0-1 range. This is seemingly identical to {@link color2}. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * + * **Default**: `[1, 1, 1, 1]` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: * - {@link color2} * - {@link color3} + * - {@link startColor} + * - {@link endColor} */ color1: Vector4Value /** * Color multiplier. * - * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. + * Values in this will be clamped to the 0-1 range. This is seemingly identical to {@link color1}. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: * - {@link color1} * - {@link color3} + * - {@link startColor} + * - {@link endColor} */ color2: Vector4Value /** - * Color multiplier. + * The color for the start of the line. * - * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. + * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * + * See also: + * - {@link color1} + * - {@link color2} + * - {@link color3} + * - {@link endColor} + */ + startColor: Vector4Value + /** + * The color for the end of the line. + * + * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * + * See also: + * - {@link color1} + * - {@link color2} + * - {@link color3} + * - {@link startColor} + */ + endColor: Vector4Value + /** + * Multiplier for the line {@link length}. + * + * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + */ + lengthMultiplier: ScalarValue + /** + * Color multiplier. + * + * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} * * See also: * - {@link color1} * - {@link color2} + * - {@link startColor} + * - {@link endColor} */ color3: Vector4Value /** * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ rgbMultiplier: ScalarValue /** * Alpha multiplier. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ alphaMultiplier: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_ds3_p2_2: ScalarValue + /** + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` + */ unk_ds3_p2_3: Vector4Value + /** + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` + */ unk_ds3_p2_4: Vector4Value + /** + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` + */ unk_ds3_p2_5: Vector4Value /** * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. * * This threshold creates a hard cut-off between visible and not visible, which is unlike the alpha *fade* threshold properties in some similar actions. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ alphaThreshold: ScalarValue - unk_ds3_f1_2: number - unk_ds3_f1_3: number - unk_ds3_f1_4: number - unk_er_f1_3: number - unk_er_f1_4: number + /** + * Unknown integer. + * + * **Default**: `-1` + */ + unk_ds3_f1_1: number + /** + * Unknown integer. + * + * **Default**: `1` + */ + unk_er_f1_1: number + /** + * Unknown integer. + * + * **Default**: `1` + */ + unk_er_f1_2: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_0: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_1: number + /** + * Unknown integer. + * + * **Default**: `8` + */ unk_ds3_f2_2: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_3: number /** * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. @@ -16461,6 +15418,8 @@ class PointSprite extends DataAction { * - This has no effect if the "Effects Quality" setting is set to "Low". * - This does not affect the natural bloom effect from high color values. * + * **Default**: `true` + * * See also: * - {@link bloomColor} */ @@ -16472,20 +15431,49 @@ class PointSprite extends DataAction { * - This has no effect if the "Effects Quality" setting is set to "Low". * - This does not affect the natural bloom effect from high color values. * + * **Default**: `[1, 1, 1, 0]` + * * See also: * - {@link bloom} */ bloomColor: Vector4 + /** + * Unknown float. + * + * **Default**: `0` + */ unk_ds3_f2_9: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_10: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_11: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_12: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_13: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. * + * **Default**: `-1` + * * See also: * - {@link minDistance} * - {@link maxFadeDistance} @@ -16501,6 +15489,8 @@ class PointSprite extends DataAction { * * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link maxFadeDistance} @@ -16514,6 +15504,8 @@ class PointSprite extends DataAction { * * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -16529,6 +15521,8 @@ class PointSprite extends DataAction { * * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -16540,6 +15534,8 @@ class PointSprite extends DataAction { /** * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -16551,6 +15547,8 @@ class PointSprite extends DataAction { /** * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -16559,43 +15557,147 @@ class PointSprite extends DataAction { * - {@link minDistanceThreshold} */ maxDistanceThreshold: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_20: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_21: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_22: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_23: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_24: number + /** + * Unknown float. + * + * **Default**: `1` + */ unkDepthBlend1: number + /** + * Unknown float. + * + * **Default**: `0` + */ unkDepthBlend2: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_27: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_28: number /** * Unknown float. * * This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. + * + * **Default**: `0` */ unk_ds3_f2_29: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_sdt_f2_30: number - unk_sdt_f2_31: number + /** + * When set to 1, this stops the particles from being shown indoors. + * + * Other values are used in AC6, but what they do is unknown. + * + * **Default**: `0` + */ + unkHideIndoors: number /** * Unknown integer. * * When set to 1, it seems to stop {@link unk_ds3_f2_29} from doing whatever it is doing, and it can also cause some ugly "outline" effects on things seen through particles. + * + * **Default**: `0` */ unk_sdt_f2_32: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_sdt_f2_33: number + /** + * Unknown float. + * + * **Default**: `0` + */ unk_sdt_f2_34: number + /** + * Unknown integer. + * + * **Default**: `-2` + */ unk_sdt_f2_35: number + /** + * Unknown integer. + * + * **Default**: `-2` + */ unk_sdt_f2_36: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_sdt_f2_37: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_sdt_f2_38: number - unk_er_f2_39: number - constructor(props: PointSpriteParams = {}) { - super(ActionType.PointSprite, {isAppearance:true,isParticle:true}) + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_sdt_f2_39: number + constructor(props: Partial> = {}) { + super(ActionType.Line, {isAppearance:true,isParticle:true}) this.assign(props) } } -export interface LineParams { +/** + * ### {@link ActionType.QuadLine Action 602 - QuadLine} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * Simple rectangular particle, very similar to {@link ActionType.Line Line particles}, but has properties that control the width as well as the length. It automatically rotates to match the direction it's moving. + */ +class QuadLine extends DataAction { + declare readonly type: ActionType.QuadLine + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Blend mode. * @@ -16603,7 +15705,18 @@ export interface LineParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - blendMode?: BlendMode | ScalarProperty + blendMode: BlendMode | ScalarProperty + /** + * The width of the line. + * + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * + * See also: + * - {@link widthMultiplier} + */ + width: ScalarValue /** * The length of the line. * @@ -16614,7 +15727,7 @@ export interface LineParams { * See also: * - {@link lengthMultiplier} */ - length?: ScalarValue + length: ScalarValue /** * Color multiplier. * @@ -16630,7 +15743,7 @@ export interface LineParams { * - {@link startColor} * - {@link endColor} */ - color1?: Vector4Value + color1: Vector4Value /** * Color multiplier. * @@ -16646,9 +15759,9 @@ export interface LineParams { * - {@link startColor} * - {@link endColor} */ - color2?: Vector4Value + color2: Vector4Value /** - * The color for the start of the line. + * The color for the leading edge of the quad. * * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. * @@ -16662,9 +15775,9 @@ export interface LineParams { * - {@link color3} * - {@link endColor} */ - startColor?: Vector4Value + startColor: Vector4Value /** - * The color for the end of the line. + * The color for the trailing edge of the quad. * * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. * @@ -16678,7 +15791,15 @@ export interface LineParams { * - {@link color3} * - {@link startColor} */ - endColor?: Vector4Value + endColor: Vector4Value + /** + * Multiplier for the line {@link width}. + * + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + */ + widthMultiplier: ScalarValue /** * Multiplier for the line {@link length}. * @@ -16686,7 +15807,7 @@ export interface LineParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - lengthMultiplier?: ScalarValue + lengthMultiplier: ScalarValue /** * Color multiplier. * @@ -16702,7 +15823,7 @@ export interface LineParams { * - {@link startColor} * - {@link endColor} */ - color3?: Vector4Value + color3: Vector4Value /** * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * @@ -16710,7 +15831,7 @@ export interface LineParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - rgbMultiplier?: ScalarValue + rgbMultiplier: ScalarValue /** * Alpha multiplier. * @@ -16718,31 +15839,31 @@ export interface LineParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - alphaMultiplier?: ScalarValue + alphaMultiplier: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p2_2?: ScalarValue + unk_ds3_p2_2: ScalarValue /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_3?: Vector4Value + unk_ds3_p2_3: Vector4Value /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_4?: Vector4Value + unk_ds3_p2_4: Vector4Value /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_5?: Vector4Value + unk_ds3_p2_5: Vector4Value /** * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. * @@ -16752,49 +15873,49 @@ export interface LineParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - alphaThreshold?: ScalarValue + alphaThreshold: ScalarValue /** * Unknown integer. * * **Default**: `-1` */ - unk_ds3_f1_1?: number + unk_ds3_f1_1: number /** * Unknown integer. * * **Default**: `1` */ - unk_er_f1_1?: number + unk_er_f1_1: number /** * Unknown integer. * * **Default**: `1` */ - unk_er_f1_2?: number + unk_er_f1_2: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_0?: number + unk_ds3_f2_0: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_1?: number + unk_ds3_f2_1: number /** * Unknown integer. * * **Default**: `8` */ - unk_ds3_f2_2?: number + unk_ds3_f2_2: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_3?: number + unk_ds3_f2_3: number /** * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. * @@ -16807,7 +15928,7 @@ export interface LineParams { * See also: * - {@link bloomColor} */ - bloom?: boolean + bloom: boolean /** * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. * @@ -16820,37 +15941,37 @@ export interface LineParams { * See also: * - {@link bloom} */ - bloomColor?: Vector4 + bloomColor: Vector4 /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f2_9?: number + unk_ds3_f2_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_10?: number + unk_ds3_f2_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_11?: number + unk_ds3_f2_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_12?: number + unk_ds3_f2_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_13?: number + unk_ds3_f2_13: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -16865,7 +15986,7 @@ export interface LineParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minFadeDistance?: number + minFadeDistance: number /** * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -16882,7 +16003,7 @@ export interface LineParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minDistance?: number + minDistance: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -16897,7 +16018,7 @@ export interface LineParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxFadeDistance?: number + maxFadeDistance: number /** * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -16914,7 +16035,7 @@ export interface LineParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxDistance?: number + maxDistance: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -16927,7 +16048,7 @@ export interface LineParams { * - {@link maxDistance} * - {@link maxDistanceThreshold} */ - minDistanceThreshold?: number + minDistanceThreshold: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -16940,61 +16061,61 @@ export interface LineParams { * - {@link maxDistance} * - {@link minDistanceThreshold} */ - maxDistanceThreshold?: number + maxDistanceThreshold: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_20?: number + unk_ds3_f2_20: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_21?: number + unk_ds3_f2_21: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_22?: number + unk_ds3_f2_22: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_23?: number + unk_ds3_f2_23: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_24?: number + unk_ds3_f2_24: number /** * Unknown float. * * **Default**: `1` */ - unkDepthBlend1?: number + unkDepthBlend1: number /** * Unknown float. * * **Default**: `0` */ - unkDepthBlend2?: number + unkDepthBlend2: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_27?: number + unk_ds3_f2_27: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_28?: number + unk_ds3_f2_28: number /** * Unknown float. * @@ -17002,21 +16123,19 @@ export interface LineParams { * * **Default**: `0` */ - unk_ds3_f2_29?: number + unk_ds3_f2_29: number /** - * Unknown integer. + * Unknown float. * * **Default**: `0` */ - unk_sdt_f2_30?: number + unk_sdt_f2_30: number /** - * When set to 1, this stops the particles from being shown indoors. - * - * Other values are used in AC6, but what they do is unknown. + * Unknown integer. * * **Default**: `0` */ - unkHideIndoors?: number + unk_sdt_f2_31: number /** * Unknown integer. * @@ -17024,547 +16143,535 @@ export interface LineParams { * * **Default**: `0` */ - unk_sdt_f2_32?: number + unk_sdt_f2_32: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_33?: number + unk_sdt_f2_33: number /** * Unknown float. * * **Default**: `0` */ - unk_sdt_f2_34?: number + unk_sdt_f2_34: number /** * Unknown integer. * * **Default**: `-2` */ - unk_sdt_f2_35?: number + unk_sdt_f2_35: number /** * Unknown integer. * * **Default**: `-2` */ - unk_sdt_f2_36?: number + unk_sdt_f2_36: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_37?: number + unk_sdt_f2_37: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_38?: number + unk_sdt_f2_38: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_39?: number + unk_sdt_f2_39: number + constructor(props: Partial> = {}) { + super(ActionType.QuadLine, {isAppearance:true,isParticle:true}) + this.assign(props) + } } /** - * ### {@link ActionType.Line Action 601 - Line} + * ### {@link ActionType.BillboardEx Action 603 - BillboardEx} * **Slot**: {@link ActionSlots.AppearanceAction Appearance} * - * Simple line particle. It automatically rotates to match the direction it's moving. + * Particle with a texture that may be animated. This is the most common particle type and it has a lot of useful fields and properties. */ -class Line extends DataAction { - declare readonly type: ActionType.Line +class BillboardEx extends DataAction { + declare readonly type: ActionType.BillboardEx declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} + /** + * Texture ID. + * + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + */ + texture: ScalarValue /** * Blend mode. * + * **Default**: {@link BlendMode.Normal} + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ blendMode: BlendMode | ScalarProperty /** - * The length of the line. + * X position offset. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `0` * - * See also: - * - {@link lengthMultiplier} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - length: ScalarValue + offsetX: ScalarValue /** - * Color multiplier. + * Y position offset. * - * Values in this will be clamped to the 0-1 range. This is seemingly identical to {@link color2}. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + */ + offsetY: ScalarValue + /** + * Z position offset. * - * See also: - * - {@link color2} - * - {@link color3} - * - {@link startColor} - * - {@link endColor} + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - color1: Vector4Value + offsetZ: ScalarValue /** - * Color multiplier. + * The width of the particle. * - * Values in this will be clamped to the 0-1 range. This is seemingly identical to {@link color1}. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * If {@link uniformScale} is enabled, this also controls the height. + * + * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link color1} - * - {@link color3} - * - {@link startColor} - * - {@link endColor} + * - {@link scaleVariationX} */ - color2: Vector4Value + width: ScalarValue /** - * The color for the start of the line. + * The height of the particle. * - * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * If {@link uniformScale} is enabled, {@link width} also controls the height, and this property is ignored. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link color1} - * - {@link color2} - * - {@link color3} - * - {@link endColor} + * - {@link scaleVariationY} */ - startColor: Vector4Value + height: ScalarValue /** - * The color for the end of the line. + * Color multiplier. * - * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link color1} * - {@link color2} * - {@link color3} - * - {@link startColor} */ - endColor: Vector4Value + color1: Vector4Value /** - * Multiplier for the line {@link length}. + * Color multiplier. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. + * + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * + * See also: + * - {@link color1} + * - {@link color3} */ - lengthMultiplier: ScalarValue + color2: Vector4Value /** * Color multiplier. * - * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: * - {@link color1} * - {@link color2} - * - {@link startColor} - * - {@link endColor} */ color3: Vector4Value /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - rgbMultiplier: ScalarValue - /** - * Alpha multiplier. + * Values above this threshold will be stretched to fill the alpha range, so values near the threshold will be less visible, creating a smooth transition between the parts that have been hidden by the threshold and the ones that are still visible. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - alphaMultiplier: ScalarValue - unk_ds3_p2_2: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value + alphaFadeThreshold: ScalarValue /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. + * Rotation around the X-axis in degrees. * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the alpha *fade* threshold properties in some similar actions. + * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * + * See also: + * - {@link angularSpeedX} + * - {@link angularSpeedMultiplierX} */ - alphaThreshold: ScalarValue - unk_ds3_f1_1: number - unk_er_f1_1: number - unk_er_f1_2: number - unk_ds3_f2_0: number - unk_ds3_f2_1: number - unk_ds3_f2_2: number - unk_ds3_f2_3: number + rotationX: ScalarValue /** - * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. + * Rotation around the Y-axis in degrees. * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: - * - {@link bloomColor} + * - {@link angularSpeedY} + * - {@link angularSpeedMultiplierY} */ - bloom: boolean + rotationY: ScalarValue /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. + * Rotation around the Z-axis in degrees. * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: - * - {@link bloom} + * - {@link angularSpeedZ} + * - {@link angularSpeedMultiplierZ} */ - bloomColor: Vector4 - unk_ds3_f2_9: number - unk_ds3_f2_10: number - unk_ds3_f2_11: number - unk_ds3_f2_12: number - unk_ds3_f2_13: number + rotationZ: ScalarValue /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. + * Angular speed around the X-axis in degrees per second. * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link rotationX} + * - {@link angularSpeedMultiplierX} */ - minFadeDistance: number + angularSpeedX: ScalarValue /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * Multiplier for {@link angularSpeedX}. * - * This requires {@link minFadeDistance} to be set to a positive value or 0. + * **Default**: `1` * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link rotationX} */ - minDistance: number + angularSpeedMultiplierX: ScalarValue /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. + * Angular speed around the Y-axis in degrees per second. * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link rotationY} + * - {@link angularSpeedMultiplierY} */ - maxFadeDistance: number + angularSpeedY: ScalarValue /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * Multiplier for {@link angularSpeedY}. * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. + * **Default**: `1` * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link rotationY} */ - maxDistance: number + angularSpeedMultiplierY: ScalarValue /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * Angular speed around the Z-axis in degrees per second. + * + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} + * - {@link rotationZ} + * - {@link angularSpeedMultiplierZ} */ - minDistanceThreshold: number + angularSpeedZ: ScalarValue /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * Multiplier for {@link angularSpeedZ}. + * + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} + * - {@link rotationZ} */ - maxDistanceThreshold: number - unk_ds3_f2_20: number - unk_ds3_f2_21: number - unk_ds3_f2_22: number - unk_ds3_f2_23: number - unk_ds3_f2_24: number - unkDepthBlend1: number - unkDepthBlend2: number - unk_ds3_f2_27: number - unk_ds3_f2_28: number + angularSpeedMultiplierZ: ScalarValue /** - * Unknown float. + * Positive values will make the particle draw in front of objects closer to the camera, while negative values will make it draw behind objects farther away from the camera. * - * This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. - */ - unk_ds3_f2_29: number - unk_sdt_f2_30: number - /** - * When set to 1, this stops the particles from being shown indoors. + * **Default**: `0` * - * Other values are used in AC6, but what they do is unknown. + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - unkHideIndoors: number + depthOffset: ScalarValue /** - * Unknown integer. + * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. * - * When set to 1, it seems to stop {@link unk_ds3_f2_29} from doing whatever it is doing, and it can also cause some ugly "outline" effects on things seen through particles. - */ - unk_sdt_f2_32: number - unk_sdt_f2_33: number - unk_sdt_f2_34: number - unk_sdt_f2_35: number - unk_sdt_f2_36: number - unk_sdt_f2_37: number - unk_sdt_f2_38: number - unk_sdt_f2_39: number - constructor(props: LineParams = {}) { - super(ActionType.Line, {isAppearance:true,isParticle:true}) - this.assign(props) - } -} - -export interface QuadLineParams { - /** - * Blend mode. + * Seemingly identical to {@link frameIndexOffset}? The sum of these two properties is the actual frame index that gets used. * - * **Default**: {@link BlendMode.Normal} + * **Default**: `0` * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - blendMode?: BlendMode | ScalarProperty + frameIndex: ScalarValue /** - * The width of the line. - * - * **Default**: `1` + * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `0` * - * See also: - * - {@link widthMultiplier} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - width?: ScalarValue + frameIndexOffset: ScalarValue /** - * The length of the line. - * - * **Default**: `1` + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `0` + */ + unk_ds3_p1_21: ScalarValue + /** + * Unknown scalar. * - * See also: - * - {@link lengthMultiplier} + * **Default**: `0` */ - length?: ScalarValue + unk_ds3_p1_22: ScalarValue /** - * Color multiplier. + * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * - * Values in this will be clamped to the 0-1 range. This is seemingly identical to {@link color2}. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * **Default**: `1` * - * **Default**: `[1, 1, 1, 1]` + * **Argument**: {@link PropertyArgument.ActiveTime Active time} + */ + rgbMultiplier: ScalarValue + /** + * Alpha multiplier. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` * - * See also: - * - {@link color2} - * - {@link color3} - * - {@link startColor} - * - {@link endColor} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - color1?: Vector4Value + alphaMultiplier: ScalarValue /** - * Color multiplier. + * Unknown scalar. * - * Values in this will be clamped to the 0-1 range. This is seemingly identical to {@link color1}. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * **Default**: `0` + */ + unk_ds3_p2_2: ScalarValue + /** + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` + */ + unk_ds3_p2_3: Vector4Value + /** + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `[1, 1, 1, 1]` + */ + unk_ds3_p2_4: Vector4Value + /** + * Unknown vector4. * - * See also: - * - {@link color1} - * - {@link color3} - * - {@link startColor} - * - {@link endColor} + * **Default**: `[1, 1, 1, 1]` */ - color2?: Vector4Value + unk_ds3_p2_5: Vector4Value /** - * The color for the leading edge of the quad. + * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. * - * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * This threshold creates a hard cut-off between visible and not visible, which is unlike the {@link alphaFadeThreshold}. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` * * **Argument**: {@link PropertyArgument.ActiveTime Active time} + */ + alphaThreshold: ScalarValue + /** + * Controls the orientation mode for the particles. See {@link OrientationMode} for more information. * - * See also: - * - {@link color1} - * - {@link color2} - * - {@link color3} - * - {@link endColor} + * **Default**: {@link OrientationMode.CameraPlane} */ - startColor?: Vector4Value + orientation: OrientationMode /** - * The color for the trailing edge of the quad. + * Normal map texture ID. * - * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * **Default**: `0` + */ + normalMap: number + /** + * Each particle will pick a random number between this value and 1, and the width of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly thinner, down to half width. Setting it to 2 will make them randomly wider, up to double width. * - * **Default**: `[1, 1, 1, 1]` + * If {@link uniformScale} is enabled, this also affects the height. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` * * See also: - * - {@link color1} - * - {@link color2} - * - {@link color3} - * - {@link startColor} + * - {@link scaleVariationY} */ - endColor?: Vector4Value + scaleVariationX: number /** - * Multiplier for the line {@link width}. + * Each particle will pick a random number between this value and 1, and the height of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shorter, down to half height. Setting it to 2 will make them randomly taller, up to double height. + * + * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the height, and this field is ignored. * * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * See also: + * - {@link scaleVariationX} */ - widthMultiplier?: ScalarValue + scaleVariationY: number /** - * Multiplier for the line {@link length}. + * If enabled, the particle width-related properties and fields will control both the width and height of the particles, and the height counterparts will be ignored. * - * **Default**: `1` + * **Default**: `false` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * See also: + * - {@link width} + * - {@link height} + * - {@link scaleVariationX} + * - {@link scaleVariationY} */ - lengthMultiplier?: ScalarValue + uniformScale: boolean /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * Unknown integer. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` + */ + unk_ds3_f1_7: number + /** + * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` * * See also: - * - {@link color1} - * - {@link color2} - * - {@link startColor} - * - {@link endColor} + * - {@link totalFrames} */ - color3?: Vector4Value + columns: number /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. * * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * See also: + * - {@link columns} */ - rgbMultiplier?: ScalarValue + totalFrames: number /** - * Alpha multiplier. + * If enabled, the texture animation will use linear interpolation to mix frames when the frame index is not a whole number. For example, if the frame index is 0.5, enabling this will cause the average of the first two frames to be shown instead of just the first frame. * - * **Default**: `1` + * If disabled, the frame index will be truncated to get a whole number. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `true` + * + * See also: + * - {@link frameIndex} + * - {@link frameIndexOffset} */ - alphaMultiplier?: ScalarValue + interpolateFrames: boolean /** - * Unknown. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_p2_2?: ScalarValue + unk_ds3_f1_11: number /** - * Unknown. + * Unknown integer. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` */ - unk_ds3_p2_3?: Vector4Value + unk_ds3_f1_12: number /** - * Unknown. + * Unknown float. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `-1` */ - unk_ds3_p2_4?: Vector4Value + unk_ds3_f1_13: number /** - * Unknown. + * Controls how the particles should render when behind something else. If disabled, the particles will simply be drawn behind anything they are behind in the world. If enabled, they will instead display in front of the object if they are close enough, and will fade out with distance from the object's surface that is blocking the view of the particle. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `true` */ - unk_ds3_p2_5?: Vector4Value + depthBlend: boolean /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. - * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the alpha *fade* threshold properties in some similar actions. - * - * **Default**: `0` + * Controls the shape of the particles. If disabled, the particles will be rectangular. If enabled, they will be octagonal. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `false` */ - alphaThreshold?: ScalarValue + octagonal: boolean /** * Unknown integer. * - * **Default**: `-1` + * **Default**: `0` */ - unk_ds3_f1_1?: number + unk_ds3_f1_16: number /** * Unknown integer. * * **Default**: `1` */ - unk_er_f1_1?: number + unk_sdt_f1_15: number /** * Unknown integer. * * **Default**: `1` */ - unk_er_f1_2?: number + unk_sdt_f1_16: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_0?: number + unk_sdt_f1_17: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_1?: number + unk_ds3_f2_0: number + /** + * Unknown boolean. + * + * **Default**: `0` + */ + unk_ds3_f2_1: boolean /** * Unknown integer. * * **Default**: `8` */ - unk_ds3_f2_2?: number + unk_ds3_f2_2: number /** - * Unknown integer. + * Unknown float. * * **Default**: `0` */ - unk_ds3_f2_3?: number + unk_ds3_f2_3: number /** * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. * @@ -17577,7 +16684,7 @@ export interface QuadLineParams { * See also: * - {@link bloomColor} */ - bloom?: boolean + bloom: boolean /** * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. * @@ -17590,37 +16697,37 @@ export interface QuadLineParams { * See also: * - {@link bloom} */ - bloomColor?: Vector4 + bloomColor: Vector4 /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f2_9?: number + unk_ds3_f2_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_10?: number + unk_ds3_f2_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_11?: number + unk_ds3_f2_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_12?: number + unk_ds3_f2_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_13?: number + unk_ds3_f2_13: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -17635,7 +16742,7 @@ export interface QuadLineParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minFadeDistance?: number + minFadeDistance: number /** * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -17652,7 +16759,7 @@ export interface QuadLineParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minDistance?: number + minDistance: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -17667,7 +16774,7 @@ export interface QuadLineParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxFadeDistance?: number + maxFadeDistance: number /** * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -17684,7 +16791,7 @@ export interface QuadLineParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxDistance?: number + maxDistance: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -17697,7 +16804,7 @@ export interface QuadLineParams { * - {@link maxDistance} * - {@link maxDistanceThreshold} */ - minDistanceThreshold?: number + minDistanceThreshold: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -17710,61 +16817,61 @@ export interface QuadLineParams { * - {@link maxDistance} * - {@link minDistanceThreshold} */ - maxDistanceThreshold?: number + maxDistanceThreshold: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_20?: number + unk_ds3_f2_20: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_21?: number + unk_ds3_f2_21: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_22?: number + unk_ds3_f2_22: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_23?: number + unk_ds3_f2_23: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_24?: number + unk_ds3_f2_24: number /** * Unknown float. * * **Default**: `1` */ - unkDepthBlend1?: number + unkDepthBlend1: number /** * Unknown float. * * **Default**: `0` */ - unkDepthBlend2?: number + unkDepthBlend2: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f2_27?: number + unk_ds3_f2_27: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_28?: number + unk_ds3_f2_28: number /** * Unknown float. * @@ -17772,19 +16879,21 @@ export interface QuadLineParams { * * **Default**: `0` */ - unk_ds3_f2_29?: number + unk_ds3_f2_29: number /** - * Unknown float. + * Controls how dark shaded parts of the particle are. * * **Default**: `0` */ - unk_sdt_f2_30?: number + shadowDarkness: number /** - * Unknown integer. + * When set to 1, this stops the particles from being shown indoors. + * + * Other values are used in AC6, but what they do is unknown. * * **Default**: `0` */ - unk_sdt_f2_31?: number + unkHideIndoors: number /** * Unknown integer. * @@ -17792,600 +16901,516 @@ export interface QuadLineParams { * * **Default**: `0` */ - unk_sdt_f2_32?: number + unk_sdt_f2_32: number + /** + * Specular texture ID. + * + * **Default**: `0` + * + * See also: + * - {@link lighting} + * - {@link glossiness} + * - {@link specularity} + */ + specular: number + /** + * Controls how sharp the specular highlights are. + * + * **Default**: `0.25` + * + * See also: + * - {@link lighting} + * - {@link specular} + * - {@link specularity} + */ + glossiness: number + /** + * Controls how the particles are lit. See {@link LightingMode} for more information. + * + * **Default**: {@link LightingMode.Unlit} + */ + lighting: LightingMode + /** + * Unknown integer. + * + * **Default**: `-2` + */ + unk_sdt_f2_36: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_33?: number + unk_sdt_f2_37: number /** - * Unknown float. + * Controls how bright the specular highlights are. + * + * **Default**: `0.5` + * + * See also: + * - {@link lighting} + * - {@link specular} + * - {@link glossiness} + */ + specularity: number + /** + * Unknown integer. + * + * **Default**: `1` + */ + unk_sdt_f2_39: number + /** + * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_34?: number + unk_sdt_f2_40: number /** * Unknown integer. * - * **Default**: `-2` + * **Default**: `0` */ - unk_sdt_f2_35?: number + unk_sdt_f2_41: number /** * Unknown integer. * - * **Default**: `-2` + * **Default**: `0` */ - unk_sdt_f2_36?: number + unk_sdt_f2_42: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_37?: number + unk_sdt_f2_43: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_38?: number + unk_sdt_f2_44: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_39?: number + unk_ac6_f2_45: number + constructor(props: Partial> = {}) { + super(ActionType.BillboardEx, {isAppearance:true,isParticle:true}) + this.assign(props) + } } /** - * ### {@link ActionType.QuadLine Action 602 - QuadLine} + * ### {@link ActionType.MultiTextureBillboardEx Action 604 - MultiTextureBillboardEx} * **Slot**: {@link ActionSlots.AppearanceAction Appearance} * - * Simple rectangular particle, very similar to {@link ActionType.Line Line particles}, but has properties that control the width as well as the length. It automatically rotates to match the direction it's moving. + * Particle with multiple textures that can scroll. */ -class QuadLine extends DataAction { - declare readonly type: ActionType.QuadLine +class MultiTextureBillboardEx extends DataAction { + declare readonly type: ActionType.MultiTextureBillboardEx declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Blend mode. * + * **Default**: {@link BlendMode.Normal} + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ blendMode: BlendMode | ScalarProperty /** - * The width of the line. + * X position offset. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `0` * - * See also: - * - {@link widthMultiplier} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - width: ScalarValue + offsetX: ScalarValue /** - * The length of the line. + * Y position offset. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `0` * - * See also: - * - {@link lengthMultiplier} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - length: ScalarValue + offsetY: ScalarValue /** - * Color multiplier. + * Z position offset. * - * Values in this will be clamped to the 0-1 range. This is seemingly identical to {@link color2}. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link color2} - * - {@link color3} - * - {@link startColor} - * - {@link endColor} */ - color1: Vector4Value + offsetZ: ScalarValue /** - * Color multiplier. + * The width of the particle. * - * Values in this will be clamped to the 0-1 range. This is seemingly identical to {@link color1}. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * If {@link uniformScale} is enabled, this also controls the height. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` * - * See also: - * - {@link color1} - * - {@link color3} - * - {@link startColor} - * - {@link endColor} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - color2: Vector4Value + width: ScalarValue /** - * The color for the leading edge of the quad. + * The height of the particle. * - * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * If {@link uniformScale} is enabled, {@link width} also controls the height, and this property is ignored. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` * - * See also: - * - {@link color1} - * - {@link color2} - * - {@link color3} - * - {@link endColor} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - startColor: Vector4Value + height: ScalarValue /** - * The color for the trailing edge of the quad. + * Rotation around the X-axis in degrees. * - * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: - * - {@link color1} - * - {@link color2} - * - {@link color3} - * - {@link startColor} + * - {@link angularSpeedX} + * - {@link angularSpeedMultiplierX} */ - endColor: Vector4Value + rotationX: ScalarValue /** - * Multiplier for the line {@link width}. + * Rotation around the Y-axis in degrees. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - widthMultiplier: ScalarValue - /** - * Multiplier for the line {@link length}. + * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * + * See also: + * - {@link angularSpeedY} + * - {@link angularSpeedMultiplierY} */ - lengthMultiplier: ScalarValue + rotationY: ScalarValue /** - * Color multiplier. + * Rotation around the Z-axis in degrees. * - * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: - * - {@link color1} - * - {@link color2} - * - {@link startColor} - * - {@link endColor} - */ - color3: Vector4Value - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * - {@link angularSpeedZ} + * - {@link angularSpeedMultiplierZ} */ - rgbMultiplier: ScalarValue + rotationZ: ScalarValue /** - * Alpha multiplier. + * Angular speed around the X-axis in degrees per second. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaMultiplier: ScalarValue - unk_ds3_p2_2: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value - /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. + * **Default**: `0` * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the alpha *fade* threshold properties in some similar actions. + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * See also: + * - {@link rotationX} + * - {@link angularSpeedMultiplierX} */ - alphaThreshold: ScalarValue - unk_ds3_f1_1: number - unk_er_f1_1: number - unk_er_f1_2: number - unk_ds3_f2_0: number - unk_ds3_f2_1: number - unk_ds3_f2_2: number - unk_ds3_f2_3: number + angularSpeedX: ScalarValue /** - * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. + * Multiplier for {@link angularSpeedX}. * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link bloomColor} + * - {@link rotationX} */ - bloom: boolean + angularSpeedMultiplierX: ScalarValue /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. + * Angular speed around the Y-axis in degrees per second. * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link bloom} + * - {@link rotationY} + * - {@link angularSpeedMultiplierY} */ - bloomColor: Vector4 - unk_ds3_f2_9: number - unk_ds3_f2_10: number - unk_ds3_f2_11: number - unk_ds3_f2_12: number - unk_ds3_f2_13: number + angularSpeedY: ScalarValue /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. + * Multiplier for {@link angularSpeedY}. * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link rotationY} */ - minFadeDistance: number + angularSpeedMultiplierY: ScalarValue /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * Angular speed around the Z-axis in degrees per second. * - * This requires {@link minFadeDistance} to be set to a positive value or 0. + * **Default**: `0` * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link rotationZ} + * - {@link angularSpeedMultiplierZ} */ - minDistance: number + angularSpeedZ: ScalarValue /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. + * Multiplier for {@link angularSpeedZ}. * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link rotationZ} */ - maxFadeDistance: number + angularSpeedMultiplierZ: ScalarValue /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * Color multiplier for the particle. * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxDistance: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * **Default**: `[1, 1, 1, 1]` * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} - */ - minDistanceThreshold: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} + * - {@link color2} + * - {@link color3} */ - maxDistanceThreshold: number - unk_ds3_f2_20: number - unk_ds3_f2_21: number - unk_ds3_f2_22: number - unk_ds3_f2_23: number - unk_ds3_f2_24: number - unkDepthBlend1: number - unkDepthBlend2: number - unk_ds3_f2_27: number - unk_ds3_f2_28: number + color1: Vector4Value /** - * Unknown float. + * Color multiplier for the particle. * - * This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. - */ - unk_ds3_f2_29: number - unk_sdt_f2_30: number - unk_sdt_f2_31: number - /** - * Unknown integer. + * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. * - * When set to 1, it seems to stop {@link unk_ds3_f2_29} from doing whatever it is doing, and it can also cause some ugly "outline" effects on things seen through particles. - */ - unk_sdt_f2_32: number - unk_sdt_f2_33: number - unk_sdt_f2_34: number - unk_sdt_f2_35: number - unk_sdt_f2_36: number - unk_sdt_f2_37: number - unk_sdt_f2_38: number - unk_sdt_f2_39: number - constructor(props: QuadLineParams = {}) { - super(ActionType.QuadLine, {isAppearance:true,isParticle:true}) - this.assign(props) - } -} - -export interface BillboardExParams { - /** - * Texture ID. + * **Default**: `[1, 1, 1, 1]` * - * **Default**: `1` + * **Argument**: {@link PropertyArgument.EmissionTime Emission time} * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * See also: + * - {@link color1} + * - {@link color3} */ - texture?: ScalarValue + color2: Vector4Value /** - * Blend mode. - * - * **Default**: {@link BlendMode.Normal} + * Color multiplier for the particle. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - blendMode?: BlendMode | ScalarProperty - /** - * X position offset. + * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. * - * **Default**: `0` + * **Default**: `[1, 1, 1, 1]` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - offsetX?: ScalarValue - /** - * Y position offset. * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * See also: + * - {@link color1} + * - {@link color2} */ - offsetY?: ScalarValue + color3: Vector4Value /** - * Z position offset. + * Color multiplier for Layer 1. * - * **Default**: `0` + * Values in this will be clamped to the 0-1 range. + * + * **Default**: `[1, 1, 1, 1]` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - offsetZ?: ScalarValue + layer1Color: Vector4Value /** - * The width of the particle. + * Color multiplier for Layer 2. * - * If {@link uniformScale} is enabled, this also controls the height. + * Values in this will be clamped to the 0-1 range. * - * **Default**: `1` + * **Default**: `[1, 1, 1, 1]` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationX} */ - width?: ScalarValue + layer2Color: Vector4Value /** - * The height of the particle. + * Color multiplier for Layer 3. * - * If {@link uniformScale} is enabled, {@link width} also controls the height, and this property is ignored. + * Values in this will be clamped to the 0-1 range. * - * **Default**: `1` + * **Default**: `[1, 1, 1, 1]` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationY} */ - height?: ScalarValue + layer3Color: Vector4Value /** - * Color multiplier. + * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. * - * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. + * Values above this threshold will be stretched to fill the alpha range, so values near the threshold will be less visible, creating a smooth transition between the parts that have been hidden by the threshold and the ones that are still visible. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link color2} - * - {@link color3} */ - color1?: Vector4Value + alphaFadeThreshold: ScalarValue /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. + * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. * - * **Default**: `[1, 1, 1, 1]` + * Seemingly identical to {@link frameIndexOffset}? The sum of these two properties is the actual frame index that gets used. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `0` * - * See also: - * - {@link color1} - * - {@link color3} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - color2?: Vector4Value + frameIndex: ScalarValue /** - * Color multiplier. - * - * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. + * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link color1} - * - {@link color2} */ - color3?: Vector4Value + frameIndexOffset: ScalarValue /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. - * - * Values above this threshold will be stretched to fill the alpha range, so values near the threshold will be less visible, creating a smooth transition between the parts that have been hidden by the threshold and the ones that are still visible. + * Horiztonal scroll speed for Layer 1. * * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - alphaFadeThreshold?: ScalarValue + layer1SpeedU: ScalarValue /** - * Rotation around the X-axis in degrees. + * Vertical scroll speed for Layer 1. * * **Default**: `0` * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link angularSpeedX} - * - {@link angularSpeedMultiplierX} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - rotationX?: ScalarValue + layer1SpeedV: ScalarValue /** - * Rotation around the Y-axis in degrees. + * Horizontal offset for the UV coordinates of Layer 1. * * **Default**: `0` * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link angularSpeedY} - * - {@link angularSpeedMultiplierY} */ - rotationY?: ScalarValue + layer1OffsetU: ScalarValue /** - * Rotation around the Z-axis in degrees. + * Vertical offset for the UV coordinates of Layer 1. * * **Default**: `0` * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link angularSpeedZ} - * - {@link angularSpeedMultiplierZ} */ - rotationZ?: ScalarValue + layer1OffsetV: ScalarValue /** - * Angular speed around the X-axis in degrees per second. + * Horizontal scale for the UV coordinates of Layer 1. * - * **Default**: `0` + * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationX} - * - {@link angularSpeedMultiplierX} */ - angularSpeedX?: ScalarValue + layer1ScaleU: ScalarValue /** - * Multiplier for {@link angularSpeedX}. + * Vertical scale for the UV coordinates of Layer 1. * * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationX} */ - angularSpeedMultiplierX?: ScalarValue + layer1ScaleV: ScalarValue /** - * Angular speed around the Y-axis in degrees per second. + * Horiztonal scroll speed for Layer 2. * * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationY} - * - {@link angularSpeedMultiplierY} */ - angularSpeedY?: ScalarValue + layer2SpeedU: ScalarValue /** - * Multiplier for {@link angularSpeedY}. + * Vertical scroll speed for Layer 2. * - * **Default**: `1` + * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationY} */ - angularSpeedMultiplierY?: ScalarValue + layer2SpeedV: ScalarValue /** - * Angular speed around the Z-axis in degrees per second. + * Horizontal offset for the UV coordinates of Layer 2. * * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + */ + layer2OffsetU: ScalarValue + /** + * Vertical offset for the UV coordinates of Layer 2. * - * See also: - * - {@link rotationZ} - * - {@link angularSpeedMultiplierZ} + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - angularSpeedZ?: ScalarValue + layer2OffsetV: ScalarValue /** - * Multiplier for {@link angularSpeedZ}. + * Horizontal scale for the UV coordinates of Layer 2. * * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationZ} */ - angularSpeedMultiplierZ?: ScalarValue + layer2ScaleU: ScalarValue /** - * Positive values will make the particle draw in front of objects closer to the camera, while negative values will make it draw behind objects farther away from the camera. + * Vertical scale for the UV coordinates of Layer 2. * - * **Default**: `0` + * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - depthOffset?: ScalarValue + layer2ScaleV: ScalarValue /** - * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. - * - * Seemingly identical to {@link frameIndexOffset}? The sum of these two properties is the actual frame index that gets used. + * Horiztonal scroll speed for Layer 3. * * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - frameIndex?: ScalarValue + layer3SpeedU: ScalarValue /** - * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. + * Vertical scroll speed for Layer 3. * * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - frameIndexOffset?: ScalarValue + layer3SpeedV: ScalarValue /** - * Unknown. + * Horizontal offset for the UV coordinates of Layer 3. * * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - unk_ds3_p1_21?: ScalarValue + layer3OffsetU: ScalarValue /** - * Unknown. + * Vertical offset for the UV coordinates of Layer 3. * * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + */ + layer3OffsetV: ScalarValue + /** + * Horizontal scale for the UV coordinates of Layer 3. + * + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + */ + layer3ScaleU: ScalarValue + /** + * Vertical scale for the UV coordinates of Layer 3. + * + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - unk_ds3_p1_22?: ScalarValue + layer3ScaleV: ScalarValue /** * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * @@ -18393,7 +17418,7 @@ export interface BillboardExParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - rgbMultiplier?: ScalarValue + rgbMultiplier: ScalarValue /** * Alpha multiplier. * @@ -18401,31 +17426,31 @@ export interface BillboardExParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - alphaMultiplier?: ScalarValue + alphaMultiplier: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p2_2?: ScalarValue + unk_ds3_p2_2: ScalarValue /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_3?: Vector4Value + unk_ds3_p2_3: Vector4Value /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_4?: Vector4Value + unk_ds3_p2_4: Vector4Value /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_5?: Vector4Value + unk_ds3_p2_5: Vector4Value /** * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. * @@ -18435,41 +17460,31 @@ export interface BillboardExParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - alphaThreshold?: ScalarValue + alphaThreshold: ScalarValue /** * Controls the orientation mode for the particles. See {@link OrientationMode} for more information. * * **Default**: {@link OrientationMode.CameraPlane} */ - orientation?: OrientationMode + orientation: OrientationMode /** - * Normal map texture ID. + * Layer 1 texture ID. * - * **Default**: `0` + * **Default**: `1` */ - normalMap?: number + layer1: number /** - * Each particle will pick a random number between this value and 1, and the width of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly thinner, down to half width. Setting it to 2 will make them randomly wider, up to double width. - * - * If {@link uniformScale} is enabled, this also affects the height. + * Layer 2 texture ID. * * **Default**: `1` - * - * See also: - * - {@link scaleVariationY} */ - scaleVariationX?: number + layer2: number /** - * Each particle will pick a random number between this value and 1, and the height of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shorter, down to half height. Setting it to 2 will make them randomly taller, up to double height. - * - * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the height, and this field is ignored. + * Layer 3 texture ID. * * **Default**: `1` - * - * See also: - * - {@link scaleVariationX} */ - scaleVariationY?: number + layer3: number /** * If enabled, the particle width-related properties and fields will control both the width and height of the particles, and the height counterparts will be ignored. * @@ -18478,16 +17493,14 @@ export interface BillboardExParams { * See also: * - {@link width} * - {@link height} - * - {@link scaleVariationX} - * - {@link scaleVariationY} */ - uniformScale?: boolean + uniformScale: boolean /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_7?: number + unk_ds3_f1_6: number /** * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. * @@ -18496,7 +17509,7 @@ export interface BillboardExParams { * See also: * - {@link totalFrames} */ - columns?: number + columns: number /** * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. * @@ -18505,7 +17518,7 @@ export interface BillboardExParams { * See also: * - {@link columns} */ - totalFrames?: number + totalFrames: number /** * If enabled, the texture animation will use linear interpolation to mix frames when the frame index is not a whole number. For example, if the frame index is 0.5, enabling this will cause the average of the first two frames to be shown instead of just the first frame. * @@ -18517,85 +17530,79 @@ export interface BillboardExParams { * - {@link frameIndex} * - {@link frameIndexOffset} */ - interpolateFrames?: boolean + interpolateFrames: boolean /** * Unknown integer. * - * **Default**: `0` + * **Default**: `-2` */ - unk_ds3_f1_11?: number + unk_ds3_f1_10: number /** * Unknown integer. * - * **Default**: `0` - */ - unk_ds3_f1_12?: number - /** - * Unknown float. - * - * **Default**: `-1` + * **Default**: `-2` */ - unk_ds3_f1_13?: number + unk_ds3_f1_11: number /** * Controls how the particles should render when behind something else. If disabled, the particles will simply be drawn behind anything they are behind in the world. If enabled, they will instead display in front of the object if they are close enough, and will fade out with distance from the object's surface that is blocking the view of the particle. * * **Default**: `true` */ - depthBlend?: boolean + depthBlend: boolean /** * Controls the shape of the particles. If disabled, the particles will be rectangular. If enabled, they will be octagonal. * * **Default**: `false` */ - octagonal?: boolean + octagonal: boolean /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_16?: number + unk_ds3_f1_14: number /** * Unknown integer. * * **Default**: `1` */ - unk_sdt_f1_15?: number + unk_er_f1_14: number /** * Unknown integer. * * **Default**: `1` */ - unk_sdt_f1_16?: number + unk_er_f1_15: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f1_17?: number + unk_er_f1_16: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_0?: number + unk_ds3_f2_0: number /** - * Unknown boolean. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_1?: boolean + unk_ds3_f2_1: number /** * Unknown integer. * * **Default**: `8` */ - unk_ds3_f2_2?: number + unk_ds3_f2_2: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f2_3?: number + unk_ds3_f2_3: number /** * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. * @@ -18608,7 +17615,7 @@ export interface BillboardExParams { * See also: * - {@link bloomColor} */ - bloom?: boolean + bloom: boolean /** * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. * @@ -18621,37 +17628,37 @@ export interface BillboardExParams { * See also: * - {@link bloom} */ - bloomColor?: Vector4 + bloomColor: Vector4 /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f2_9?: number + unk_ds3_f2_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_10?: number + unk_ds3_f2_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_11?: number + unk_ds3_f2_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_12?: number + unk_ds3_f2_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_13?: number + unk_ds3_f2_13: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -18666,7 +17673,7 @@ export interface BillboardExParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minFadeDistance?: number + minFadeDistance: number /** * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -18683,7 +17690,7 @@ export interface BillboardExParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minDistance?: number + minDistance: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -18698,7 +17705,7 @@ export interface BillboardExParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxFadeDistance?: number + maxFadeDistance: number /** * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -18715,7 +17722,7 @@ export interface BillboardExParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxDistance?: number + maxDistance: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -18728,7 +17735,7 @@ export interface BillboardExParams { * - {@link maxDistance} * - {@link maxDistanceThreshold} */ - minDistanceThreshold?: number + minDistanceThreshold: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -18741,61 +17748,61 @@ export interface BillboardExParams { * - {@link maxDistance} * - {@link minDistanceThreshold} */ - maxDistanceThreshold?: number + maxDistanceThreshold: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_20?: number + unk_ds3_f2_20: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_21?: number + unk_ds3_f2_21: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_22?: number + unk_ds3_f2_22: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_23?: number + unk_ds3_f2_23: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_24?: number + unk_ds3_f2_24: number /** * Unknown float. * * **Default**: `1` */ - unkDepthBlend1?: number + unkDepthBlend1: number /** * Unknown float. * * **Default**: `0` */ - unkDepthBlend2?: number + unkDepthBlend2: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f2_27?: number + unk_ds3_f2_27: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_28?: number + unk_ds3_f2_28: number /** * Unknown float. * @@ -18803,21 +17810,19 @@ export interface BillboardExParams { * * **Default**: `0` */ - unk_ds3_f2_29?: number + unk_ds3_f2_29: number /** * Controls how dark shaded parts of the particle are. * * **Default**: `0` */ - shadowDarkness?: number + shadowDarkness: number /** - * When set to 1, this stops the particles from being shown indoors. - * - * Other values are used in AC6, but what they do is unknown. + * Unknown integer. * * **Default**: `0` */ - unkHideIndoors?: number + unk_sdt_f2_31: number /** * Unknown integer. * @@ -18825,7 +17830,7 @@ export interface BillboardExParams { * * **Default**: `0` */ - unk_sdt_f2_32?: number + unk_sdt_f2_32: number /** * Specular texture ID. * @@ -18834,9 +17839,8 @@ export interface BillboardExParams { * See also: * - {@link lighting} * - {@link glossiness} - * - {@link specularity} */ - specular?: number + specular: number /** * Controls how sharp the specular highlights are. * @@ -18845,190 +17849,155 @@ export interface BillboardExParams { * See also: * - {@link lighting} * - {@link specular} - * - {@link specularity} */ - glossiness?: number + glossiness: number /** * Controls how the particles are lit. See {@link LightingMode} for more information. * * **Default**: {@link LightingMode.Unlit} */ - lighting?: LightingMode + lighting: LightingMode /** * Unknown integer. * * **Default**: `-2` */ - unk_sdt_f2_36?: number + unk_sdt_f2_36: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_37?: number + unk_sdt_f2_37: number /** - * Controls how bright the specular highlights are. - * - * **Default**: `0.5` + * Unknown integer. * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link glossiness} + * **Default**: `1` */ - specularity?: number + unk_sdt_f2_38: number /** * Unknown integer. * * **Default**: `1` */ - unk_sdt_f2_39?: number + unk_sdt_f2_39: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_40?: number + unk_sdt_f2_40: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_41?: number + unk_sdt_f2_41: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_42?: number + unk_er_f2_42: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_43?: number + unk_er_f2_43: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_er_f2_44: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_44?: number + unk_er_f2_45: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_45?: number + unk_ac6_f2_46: number + constructor(props: Partial> = {}) { + super(ActionType.MultiTextureBillboardEx, {isAppearance:true,isParticle:true}) + this.assign(props) + } } /** - * ### {@link ActionType.BillboardEx Action 603 - BillboardEx} + * ### {@link ActionType.Model Action 605 - Model} * **Slot**: {@link ActionSlots.AppearanceAction Appearance} * - * Particle with a texture that may be animated. This is the most common particle type and it has a lot of useful fields and properties. + * Particle with a 3D model. + * + * Some models don't work properly with this action for some reason. For example, the Carian greatsword model in Elden Ring (88300), gets horribly stretched and distorted when used with this action. If you find a model like this that you want to use, try using the {@link ActionType.RichModel RichModel action} instead. */ -class BillboardEx extends DataAction { - declare readonly type: ActionType.BillboardEx +class Model extends DataAction { + declare readonly type: ActionType.Model declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** - * Texture ID. + * Model ID. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - texture: ScalarValue - /** - * Blend mode. + * **Default**: `80201` * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - blendMode: BlendMode | ScalarProperty - /** - * X position offset. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - offsetX: ScalarValue - /** - * Y position offset. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - offsetY: ScalarValue - /** - * Z position offset. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - offsetZ: ScalarValue + model: ScalarValue /** * The width of the particle. * - * If {@link uniformScale} is enabled, this also controls the height. + * If {@link uniformScale} is enabled, this also controls the height and depth. + * + * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: * - {@link scaleVariationX} + * - {@link sizeY} + * - {@link sizeZ} */ - width: ScalarValue + sizeX: ScalarValue /** * The height of the particle. * - * If {@link uniformScale} is enabled, {@link width} also controls the height, and this property is ignored. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationY} - */ - height: ScalarValue - /** - * Color multiplier. + * If {@link uniformScale} is enabled, {@link sizeX} also controls the height, and this property is ignored. * - * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. + * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link color2} - * - {@link color3} + * - {@link scaleVariationY} + * - {@link sizeX} + * - {@link sizeZ} */ - color1: Vector4Value + sizeY: ScalarValue /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. - * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * The depth of the particle. * - * See also: - * - {@link color1} - * - {@link color3} - */ - color2: Vector4Value - /** - * Color multiplier. + * If {@link uniformScale} is enabled, {@link sizeX} also controls the depth, and this property is ignored. * - * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. + * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link color1} - * - {@link color2} - */ - color3: Vector4Value - /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. - * - * Values above this threshold will be stretched to fill the alpha range, so values near the threshold will be less visible, creating a smooth transition between the parts that have been hidden by the threshold and the ones that are still visible. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * - {@link scaleVariationZ} + * - {@link sizeX} + * - {@link sizeY} */ - alphaFadeThreshold: ScalarValue + sizeZ: ScalarValue /** * Rotation around the X-axis in degrees. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: @@ -19039,6 +18008,8 @@ class BillboardEx extends DataAction { /** * Rotation around the Y-axis in degrees. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: @@ -19049,6 +18020,8 @@ class BillboardEx extends DataAction { /** * Rotation around the Z-axis in degrees. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: @@ -19059,6 +18032,8 @@ class BillboardEx extends DataAction { /** * Angular speed around the X-axis in degrees per second. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -19069,6 +18044,8 @@ class BillboardEx extends DataAction { /** * Multiplier for {@link angularSpeedX}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -19078,6 +18055,8 @@ class BillboardEx extends DataAction { /** * Angular speed around the Y-axis in degrees per second. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -19088,6 +18067,8 @@ class BillboardEx extends DataAction { /** * Multiplier for {@link angularSpeedY}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -19097,6 +18078,8 @@ class BillboardEx extends DataAction { /** * Angular speed around the Z-axis in degrees per second. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -19107,6 +18090,8 @@ class BillboardEx extends DataAction { /** * Multiplier for {@link angularSpeedZ}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -19114,66 +18099,223 @@ class BillboardEx extends DataAction { */ angularSpeedMultiplierZ: ScalarValue /** - * Positive values will make the particle draw in front of objects closer to the camera, while negative values will make it draw behind objects farther away from the camera. + * Blend mode. + * + * Note that the materials used by the model may affect how the different blend modes work. Don't expect the blend modes to always work exactly like they do in other types of instances. + * + * **Default**: {@link BlendMode.Normal} + * + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + */ + blendMode: BlendMode | ScalarProperty + /** + * Color multiplier. + * + * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. + * + * **Default**: `[1, 1, 1, 1]` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * + * See also: + * - {@link color2} + * - {@link color3} */ - depthOffset: ScalarValue + color1: Vector4Value + /** + * Color multiplier. + * + * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. + * + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * + * See also: + * - {@link color1} + * - {@link color3} + */ + color2: Vector4Value + /** + * Color multiplier. + * + * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. + * + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * + * See also: + * - {@link color1} + * - {@link color2} + */ + color3: Vector4Value + /** + * Unknown scalar. + * + * **Default**: `0` + */ + unk_ds3_p1_15: ScalarValue /** * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. * * Seemingly identical to {@link frameIndexOffset}? The sum of these two properties is the actual frame index that gets used. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ frameIndex: ScalarValue /** * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ frameIndexOffset: ScalarValue - unk_ds3_p1_21: ScalarValue - unk_ds3_p1_22: ScalarValue + /** + * Horizontal offset for the UV coordinates of the model. + * + * If the texture is an animation sheet that is split up into multiple frames using {@link columns} and/or {@link totalFrames}, this property has no effect. + * + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * + * See also: + * - {@link speedU} + * - {@link offsetV} + */ + offsetU: ScalarValue + /** + * Vertical offset for the UV coordinates of the model. + * + * If the texture is an animation sheet that is split up into multiple frames using {@link columns} and/or {@link totalFrames}, this property has no effect. + * + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + */ + offsetV: ScalarValue + /** + * Horiztonal scroll speed for the model's texture. + * + * If the texture is an animation sheet that is split up into multiple frames using {@link columns} and/or {@link totalFrames}, this property has no effect. + * + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * + * See also: + * - {@link speedMultiplierU} + * - {@link offsetU} + */ + speedU: ScalarValue + /** + * Multiplier for {@link speedU}. + * + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + */ + speedMultiplierU: ScalarValue + /** + * Vertical scroll speed for the model's texture. + * + * If the texture is an animation sheet that is split up into multiple frames using {@link columns} and/or {@link totalFrames}, this property has no effect. + * + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * + * See also: + * - {@link speedMultiplierV} + * - {@link offsetV} + */ + speedV: ScalarValue + /** + * Multiplier for {@link speedV}. + * + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + */ + speedMultiplierV: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ + unk_ds3_p1_24: ScalarValue /** * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ rgbMultiplier: ScalarValue /** * Alpha multiplier. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ alphaMultiplier: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_ds3_p2_2: ScalarValue + /** + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` + */ unk_ds3_p2_3: Vector4Value + /** + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` + */ unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. + * Unknown vector4. * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the {@link alphaFadeThreshold}. + * **Default**: `[1, 1, 1, 1]` + */ + unk_ds3_p2_5: Vector4Value + /** + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - alphaThreshold: ScalarValue + unk_ds3_p2_6: ScalarValue /** - * Controls the orientation mode for the particles. See {@link OrientationMode} for more information. + * Unknown scalar. + * + * **Default**: `0` */ - orientation: OrientationMode + unk_ds3_p2_7: ScalarValue /** - * Normal map texture ID. + * Model orientation mode. See {@link ModelOrientationMode} for more information. + * + * **Default**: {@link ModelOrientationMode.ParticleDirection} */ - normalMap: number + orientation: ModelOrientationMode /** * Each particle will pick a random number between this value and 1, and the width of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly thinner, down to half width. Setting it to 2 will make them randomly wider, up to double width. * * If {@link uniformScale} is enabled, this also affects the height. * + * **Default**: `1` + * * See also: * - {@link scaleVariationY} + * - {@link scaleVariationZ} */ scaleVariationX: number /** @@ -19181,24 +18323,44 @@ class BillboardEx extends DataAction { * * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the height, and this field is ignored. * + * **Default**: `1` + * * See also: * - {@link scaleVariationX} + * - {@link scaleVariationZ} */ scaleVariationY: number /** - * If enabled, the particle width-related properties and fields will control both the width and height of the particles, and the height counterparts will be ignored. + * Each particle will pick a random number between this value and 1, and the depth of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shallower, down to half depth. Setting it to 2 will make them randomly deeper, up to double depth. + * + * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the depth, and this field is ignored. + * + * **Default**: `1` * * See also: - * - {@link width} - * - {@link height} * - {@link scaleVariationX} * - {@link scaleVariationY} */ + scaleVariationZ: number + /** + * If enabled, the particle X scale-related properties and fields will control the scale in all axes, and the Y and Z counterparts will be ignored. + * + * **Default**: `false` + * + * See also: + * - {@link sizeX} + * - {@link sizeY} + * - {@link sizeZ} + * - {@link scaleVariationX} + * - {@link scaleVariationY} + * - {@link scaleVariationZ} + */ uniformScale: boolean - unk_ds3_f1_7: number /** * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. * + * **Default**: `1` + * * See also: * - {@link totalFrames} */ @@ -19206,50 +18368,140 @@ class BillboardEx extends DataAction { /** * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. * + * **Default**: `1` + * * See also: * - {@link columns} */ totalFrames: number /** - * If enabled, the texture animation will use linear interpolation to mix frames when the frame index is not a whole number. For example, if the frame index is 0.5, enabling this will cause the average of the first two frames to be shown instead of just the first frame. + * Unknown integer. * - * If disabled, the frame index will be truncated to get a whole number. + * **Default**: `-2` + */ + unk_ds3_f1_9: number + /** + * Unknown integer. * - * See also: - * - {@link frameIndex} - * - {@link frameIndexOffset} + * **Default**: `-2` + */ + unk_ds3_f1_10: number + /** + * Unknown boolean. + * + * **Default**: `true` + */ + unk_ds3_f1_11: boolean + /** + * Unknown boolean. + * + * **Default**: `true` + */ + unk_ds3_f1_12: boolean + /** + * Unknown integer. + * + * **Default**: `1` */ - interpolateFrames: boolean - unk_ds3_f1_11: number - unk_ds3_f1_12: number unk_ds3_f1_13: number /** - * Controls how the particles should render when behind something else. If disabled, the particles will simply be drawn behind anything they are behind in the world. If enabled, they will instead display in front of the object if they are close enough, and will fade out with distance from the object's surface that is blocking the view of the particle. + * Anibnd ID. + * + * **Default**: `0` + * + * See also: + * - {@link animation} + * - {@link loopAnimation} + * - {@link animationSpeed} */ - depthBlend: boolean + anibnd: number /** - * Controls the shape of the particles. If disabled, the particles will be rectangular. If enabled, they will be octagonal. + * Controls which animation in the {@link anibnd} to play. + * + * **Default**: `0` + * + * See also: + * - {@link anibnd} + * - {@link loopAnimation} + * - {@link animationSpeed} + */ + animation: number + /** + * If disabled, the {@link animation} will only play once and then freeze on the last frame. If enabled, the animation will loop. + * + * **Default**: `true` + * + * See also: + * - {@link anibnd} + * - {@link animation} + * - {@link animationSpeed} + */ + loopAnimation: boolean + /** + * Controls the speed at which the {@link animation} plays. + * + * **Default**: `1` + * + * See also: + * - {@link anibnd} + * - {@link animation} + * - {@link loopAnimation} + */ + animationSpeed: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ds3_f1_18: number + /** + * Unknown integer. + * + * **Default**: `1` + */ + unk_er_f1_17: number + /** + * Unknown integer. + * + * **Default**: `1` + */ + unk_er_f1_18: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_er_f1_19: number + /** + * Unknown integer. + * + * **Default**: `0` */ - octagonal: boolean - unk_ds3_f1_16: number - unk_sdt_f1_15: number - unk_sdt_f1_16: number - unk_sdt_f1_17: number unk_ds3_f2_0: number - unk_ds3_f2_1: boolean + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ds3_f2_1: number + /** + * Unknown integer. + * + * **Default**: `8` + */ unk_ds3_f2_2: number - unk_ds3_f2_3: number /** - * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. + * Unknown integer. * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. + * **Default**: `0` + */ + unk_ds3_f2_3: number + /** + * Unknown integer. * - * See also: - * - {@link bloomColor} + * **Default**: `1` */ - bloom: boolean + unk_ds3_f2_4: number /** * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. * @@ -19257,20 +18509,46 @@ class BillboardEx extends DataAction { * - This has no effect if the "Effects Quality" setting is set to "Low". * - This does not affect the natural bloom effect from high color values. * - * See also: - * - {@link bloom} + * **Default**: `[1, 1, 1, 0]` */ bloomColor: Vector4 + /** + * Unknown float. + * + * **Default**: `0` + */ unk_ds3_f2_9: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_10: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_11: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_12: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_13: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. * + * **Default**: `-1` + * * See also: * - {@link minDistance} * - {@link maxFadeDistance} @@ -19286,6 +18564,8 @@ class BillboardEx extends DataAction { * * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link maxFadeDistance} @@ -19299,6 +18579,8 @@ class BillboardEx extends DataAction { * * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -19314,6 +18596,8 @@ class BillboardEx extends DataAction { * * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -19325,6 +18609,8 @@ class BillboardEx extends DataAction { /** * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -19336,6 +18622,8 @@ class BillboardEx extends DataAction { /** * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -19344,243 +18632,189 @@ class BillboardEx extends DataAction { * - {@link minDistanceThreshold} */ maxDistanceThreshold: number - unk_ds3_f2_20: number - unk_ds3_f2_21: number - unk_ds3_f2_22: number - unk_ds3_f2_23: number - unk_ds3_f2_24: number - unkDepthBlend1: number - unkDepthBlend2: number - unk_ds3_f2_27: number - unk_ds3_f2_28: number /** * Unknown float. * - * This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. + * **Default**: `0` */ - unk_ds3_f2_29: number + unk_ds3_f2_20: number /** - * Controls how dark shaded parts of the particle are. + * Unknown integer. + * + * **Default**: `0` */ - shadowDarkness: number + unk_ds3_f2_21: number /** - * When set to 1, this stops the particles from being shown indoors. + * Unknown integer. * - * Other values are used in AC6, but what they do is unknown. + * **Default**: `0` */ - unkHideIndoors: number + unk_ds3_f2_22: number /** * Unknown integer. * - * When set to 1, it seems to stop {@link unk_ds3_f2_29} from doing whatever it is doing, and it can also cause some ugly "outline" effects on things seen through particles. + * **Default**: `0` */ - unk_sdt_f2_32: number + unk_ds3_f2_23: number /** - * Specular texture ID. + * Unknown float. * - * See also: - * - {@link lighting} - * - {@link glossiness} - * - {@link specularity} + * **Default**: `0` */ - specular: number + unk_ds3_f2_24: number /** - * Controls how sharp the specular highlights are. + * Unknown float. * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link specularity} + * **Default**: `1` */ - glossiness: number + unkDepthBlend1: number /** - * Controls how the particles are lit. See {@link LightingMode} for more information. + * Unknown float. + * + * **Default**: `0` */ - lighting: LightingMode - unk_sdt_f2_36: number - unk_sdt_f2_37: number + unkDepthBlend2: number /** - * Controls how bright the specular highlights are. + * Unknown integer. * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link glossiness} + * **Default**: `1` */ - specularity: number - unk_sdt_f2_39: number - unk_sdt_f2_40: number - unk_sdt_f2_41: number - unk_sdt_f2_42: number - unk_sdt_f2_43: number - unk_sdt_f2_44: number - unk_ac6_f2_45: number - constructor(props: BillboardExParams = {}) { - super(ActionType.BillboardEx, {isAppearance:true,isParticle:true}) - this.assign(props) - } -} - -export interface MultiTextureBillboardExParams { + unk_ds3_f2_26: number /** - * Blend mode. - * - * **Default**: {@link BlendMode.Normal} + * Unknown integer. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `0` */ - blendMode?: BlendMode | ScalarProperty + unk_ds3_f2_27: number /** - * X position offset. + * Unknown float. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - offsetX?: ScalarValue + unk_sdt_f2_29: number /** - * Y position offset. + * Unknown float. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - offsetY?: ScalarValue + unk_sdt_f2_30: number /** - * Z position offset. + * Unknown integer. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - offsetZ?: ScalarValue + unk_sdt_f2_31: number /** - * The width of the particle. - * - * If {@link uniformScale} is enabled, this also controls the height. + * Unknown integer. * - * **Default**: `1` + * When set to 1, it can cause some ugly "outline" effects on things seen through particles. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - width?: ScalarValue + unk_sdt_f2_32: number /** - * The height of the particle. - * - * If {@link uniformScale} is enabled, {@link width} also controls the height, and this property is ignored. - * - * **Default**: `1` + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - height?: ScalarValue + unk_sdt_f2_33: number /** - * Rotation around the X-axis in degrees. + * Unknown float. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link angularSpeedX} - * - {@link angularSpeedMultiplierX} */ - rotationX?: ScalarValue + unk_sdt_f2_34: number /** - * Rotation around the Y-axis in degrees. + * Unknown integer. * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `-2` + */ + unk_sdt_f2_35: number + /** + * Unknown integer. * - * See also: - * - {@link angularSpeedY} - * - {@link angularSpeedMultiplierY} + * **Default**: `-2` */ - rotationY?: ScalarValue + unk_sdt_f2_36: number /** - * Rotation around the Z-axis in degrees. + * Unknown integer. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link angularSpeedZ} - * - {@link angularSpeedMultiplierZ} */ - rotationZ?: ScalarValue + unk_sdt_f2_37: number /** - * Angular speed around the X-axis in degrees per second. + * Unknown integer. * * **Default**: `0` + */ + unk_ac6_f2_38: number + /** + * Unknown float. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationX} - * - {@link angularSpeedMultiplierX} + * **Default**: `0` */ - angularSpeedX?: ScalarValue + unk_ds3_f2_28: number + constructor(props: Partial> = {}) { + super(ActionType.Model, {isAppearance:true,isParticle:true}) + this.assign(props) + } +} + +/** + * ### {@link ActionType.Tracer Action 606 - Tracer} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * Creates a trail behind moving effects. + */ +class Tracer extends DataAction { + declare readonly type: ActionType.Tracer + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** - * Multiplier for {@link angularSpeedX}. + * Texture ID. * * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationX} + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - angularSpeedMultiplierX?: ScalarValue + texture: ScalarValue /** - * Angular speed around the Y-axis in degrees per second. - * - * **Default**: `0` + * Blend mode. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: {@link BlendMode.Normal} * - * See also: - * - {@link rotationY} - * - {@link angularSpeedMultiplierY} + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - angularSpeedY?: ScalarValue + blendMode: BlendMode | ScalarProperty /** - * Multiplier for {@link angularSpeedY}. + * The width of the trail. * * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationY} */ - angularSpeedMultiplierY?: ScalarValue + width: ScalarValue /** - * Angular speed around the Z-axis in degrees per second. - * - * **Default**: `0` + * Multiplier for {@link width}. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` * - * See also: - * - {@link rotationZ} - * - {@link angularSpeedMultiplierZ} + * **Argument**: {@link PropertyArgument.EmissionTime Emission time} */ - angularSpeedZ?: ScalarValue + widthMultiplier: ScalarValue /** - * Multiplier for {@link angularSpeedZ}. - * - * **Default**: `1` + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` + */ + unk_ds3_p1_2: ScalarValue + /** + * Unknown scalar. * - * See also: - * - {@link rotationZ} + * **Default**: `0` */ - angularSpeedMultiplierZ?: ScalarValue + unk_ds3_p1_3: ScalarValue /** - * Color multiplier for the particle. + * Color multiplier. * * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. * @@ -19592,9 +18826,9 @@ export interface MultiTextureBillboardExParams { * - {@link color2} * - {@link color3} */ - color1?: Vector4Value + color1: Vector4Value /** - * Color multiplier for the particle. + * Color multiplier. * * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. * @@ -19606,9 +18840,9 @@ export interface MultiTextureBillboardExParams { * - {@link color1} * - {@link color3} */ - color2?: Vector4Value + color2: Vector4Value /** - * Color multiplier for the particle. + * Color multiplier. * * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. * @@ -19620,37 +18854,7 @@ export interface MultiTextureBillboardExParams { * - {@link color1} * - {@link color2} */ - color3?: Vector4Value - /** - * Color multiplier for Layer 1. - * - * Values in this will be clamped to the 0-1 range. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layer1Color?: Vector4Value - /** - * Color multiplier for Layer 2. - * - * Values in this will be clamped to the 0-1 range. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layer2Color?: Vector4Value - /** - * Color multiplier for Layer 3. - * - * Values in this will be clamped to the 0-1 range. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layer3Color?: Vector4Value + color3: Vector4Value /** * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. * @@ -19660,7 +18864,7 @@ export interface MultiTextureBillboardExParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - alphaFadeThreshold?: ScalarValue + alphaFadeThreshold: ScalarValue /** * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. * @@ -19670,7 +18874,7 @@ export interface MultiTextureBillboardExParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - frameIndex?: ScalarValue + frameIndex: ScalarValue /** * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. * @@ -19678,241 +18882,145 @@ export interface MultiTextureBillboardExParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - frameIndexOffset?: ScalarValue + frameIndexOffset: ScalarValue /** - * Horiztonal scroll speed for Layer 1. + * Controls how much of the texture's width is used per segment. If {@link attachedUV} is enabled, this instead controls how much of the texture's width to use for the entire trail. * - * **Default**: `0` + * **Default**: `0.1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - layer1SpeedU?: ScalarValue + textureFraction: ScalarValue /** - * Vertical scroll speed for Layer 1. + * Controls how fast the UV coordinates should move horizontally. * * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - layer1SpeedV?: ScalarValue + speedU: ScalarValue /** - * Horizontal offset for the UV coordinates of Layer 1. + * Controls how much the UV coordinates should be randomly offset by per segment. * * **Default**: `0` * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - layer1OffsetU?: ScalarValue + varianceV: ScalarValue /** - * Vertical offset for the UV coordinates of Layer 1. - * - * **Default**: `0` + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `-1` */ - layer1OffsetV?: ScalarValue + unk_ds3_p1_13: ScalarValue /** - * Horizontal scale for the UV coordinates of Layer 1. + * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - layer1ScaleU?: ScalarValue + rgbMultiplier: ScalarValue /** - * Vertical scale for the UV coordinates of Layer 1. + * Alpha multiplier. * * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - layer1ScaleV?: ScalarValue + alphaMultiplier: ScalarValue /** - * Horiztonal scroll speed for Layer 2. + * Controls the intensity of the distortion effect. At 0, there is no distortion at all. * * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layer2SpeedU?: ScalarValue - /** - * Vertical scroll speed for Layer 2. - * - * **Default**: `0` + * **Argument**: {@link PropertyArgument.ActiveTime Active time} * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * See also: + * - {@link normalMap} */ - layer2SpeedV?: ScalarValue + distortionIntensity: ScalarValue /** - * Horizontal offset for the UV coordinates of Layer 2. - * - * **Default**: `0` + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `[1, 1, 1, 1]` */ - layer2OffsetU?: ScalarValue + unk_ds3_p2_3: Vector4Value /** - * Vertical offset for the UV coordinates of Layer 2. - * - * **Default**: `0` + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `[1, 1, 1, 1]` */ - layer2OffsetV?: ScalarValue + unk_ds3_p2_4: Vector4Value /** - * Horizontal scale for the UV coordinates of Layer 2. - * - * **Default**: `1` + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `[1, 1, 1, 1]` */ - layer2ScaleU?: ScalarValue + unk_ds3_p2_5: Vector4Value /** - * Vertical scale for the UV coordinates of Layer 2. - * - * **Default**: `1` + * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layer2ScaleV?: ScalarValue - /** - * Horiztonal scroll speed for Layer 3. + * This threshold creates a hard cut-off between visible and not visible, which is unlike the {@link alphaFadeThreshold}. * * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - layer3SpeedU?: ScalarValue + alphaThreshold: ScalarValue /** - * Vertical scroll speed for Layer 3. - * - * **Default**: `0` + * Tracer orientation mode. See {@link TracerOrientationMode} for more information. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: {@link TracerOrientationMode.LocalZ} */ - layer3SpeedV?: ScalarValue + orientation: TracerOrientationMode /** - * Horizontal offset for the UV coordinates of Layer 3. - * - * **Default**: `0` + * Normal map texture ID. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - layer3OffsetU?: ScalarValue - /** - * Vertical offset for the UV coordinates of Layer 3. + * This is used to control the distortion effect of the trail. * * **Default**: `0` * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - layer3OffsetV?: ScalarValue - /** - * Horizontal scale for the UV coordinates of Layer 3. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * See also: + * - {@link distortionIntensity} */ - layer3ScaleU?: ScalarValue + normalMap: number /** - * Vertical scale for the UV coordinates of Layer 3. - * - * **Default**: `1` + * The trail is made up of multiple quads, or *segments*. This controls how many seconds to wait between new segments being created. Lower values produce a smoother trail. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - layer3ScaleV?: ScalarValue + segmentInterval: number /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * The trail is made up of multiple quads, or *segments*. This controls how long each segment should last in seconds. * * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - rgbMultiplier?: ScalarValue + segmentDuration: number /** - * Alpha multiplier. - * - * **Default**: `1` + * The trail is made up of multiple quads, or *segments*. This controls how many segments may exist at the same time. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `100` */ - alphaMultiplier?: ScalarValue + concurrentSegments: number /** - * Unknown. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_p2_2?: ScalarValue - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_3?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_4?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_5?: Vector4Value + unk_ds3_f1_7: number /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. - * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the {@link alphaFadeThreshold}. + * Unknown float. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaThreshold?: ScalarValue - /** - * Controls the orientation mode for the particles. See {@link OrientationMode} for more information. - * - * **Default**: {@link OrientationMode.CameraPlane} - */ - orientation?: OrientationMode - /** - * Layer 1 texture ID. - * - * **Default**: `1` - */ - layer1?: number - /** - * Layer 2 texture ID. - * - * **Default**: `1` - */ - layer2?: number - /** - * Layer 3 texture ID. - * - * **Default**: `1` - */ - layer3?: number - /** - * If enabled, the particle width-related properties and fields will control both the width and height of the particles, and the height counterparts will be ignored. - * - * **Default**: `false` - * - * See also: - * - {@link width} - * - {@link height} */ - uniformScale?: boolean + unk_ds3_f1_8: number /** - * Unknown integer. + * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_6?: number + unk_ds3_f1_9: number /** * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. * @@ -19921,7 +19029,7 @@ export interface MultiTextureBillboardExParams { * See also: * - {@link totalFrames} */ - columns?: number + columns: number /** * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. * @@ -19930,91 +19038,73 @@ export interface MultiTextureBillboardExParams { * See also: * - {@link columns} */ - totalFrames?: number + totalFrames: number /** - * If enabled, the texture animation will use linear interpolation to mix frames when the frame index is not a whole number. For example, if the frame index is 0.5, enabling this will cause the average of the first two frames to be shown instead of just the first frame. - * - * If disabled, the frame index will be truncated to get a whole number. + * Controls whether or not the UV of the trail should be attached to the node or not. If it is attached, the texture will slide along the segments to follow the source wherever it moves, as if it was a flag attached to a pole. If it is not attached, the texture will stay where it was when the segment was created, like a skid mark on a road where the road is the segments and the mark is the texture, it wouldn't follow the car/node that made it. * * **Default**: `true` - * - * See also: - * - {@link frameIndex} - * - {@link frameIndexOffset} */ - interpolateFrames?: boolean + attachedUV: boolean /** * Unknown integer. * - * **Default**: `-2` + * **Default**: `-1` */ - unk_ds3_f1_10?: number + unk_ds3_f1_13: number /** * Unknown integer. * - * **Default**: `-2` - */ - unk_ds3_f1_11?: number - /** - * Controls how the particles should render when behind something else. If disabled, the particles will simply be drawn behind anything they are behind in the world. If enabled, they will instead display in front of the object if they are close enough, and will fade out with distance from the object's surface that is blocking the view of the particle. - * - * **Default**: `true` - */ - depthBlend?: boolean - /** - * Controls the shape of the particles. If disabled, the particles will be rectangular. If enabled, they will be octagonal. - * - * **Default**: `false` + * **Default**: `-1` */ - octagonal?: boolean + unk_ds3_f1_14: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_14?: number + unk_ds3_f1_15: number /** * Unknown integer. * * **Default**: `1` */ - unk_er_f1_14?: number + unk_er_f1_14: number /** * Unknown integer. * * **Default**: `1` */ - unk_er_f1_15?: number + unk_er_f1_15: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f1_16?: number + unk_er_f1_16: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_0?: number + unk_ds3_f2_0: number /** - * Unknown integer. + * Unknown boolean. * * **Default**: `0` */ - unk_ds3_f2_1?: number + unk_ds3_f2_1: boolean /** * Unknown integer. * * **Default**: `8` */ - unk_ds3_f2_2?: number + unk_ds3_f2_2: number /** - * Unknown float. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_3?: number + unk_ds3_f2_3: number /** * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. * @@ -20027,7 +19117,7 @@ export interface MultiTextureBillboardExParams { * See also: * - {@link bloomColor} */ - bloom?: boolean + bloom: boolean /** * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. * @@ -20040,37 +19130,37 @@ export interface MultiTextureBillboardExParams { * See also: * - {@link bloom} */ - bloomColor?: Vector4 + bloomColor: Vector4 /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f2_9?: number + unk_ds3_f2_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_10?: number + unk_ds3_f2_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_11?: number + unk_ds3_f2_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_12?: number + unk_ds3_f2_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_13?: number + unk_ds3_f2_13: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -20085,7 +19175,7 @@ export interface MultiTextureBillboardExParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minFadeDistance?: number + minFadeDistance: number /** * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -20102,7 +19192,7 @@ export interface MultiTextureBillboardExParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minDistance?: number + minDistance: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -20117,7 +19207,7 @@ export interface MultiTextureBillboardExParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxFadeDistance?: number + maxFadeDistance: number /** * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -20134,7 +19224,7 @@ export interface MultiTextureBillboardExParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxDistance?: number + maxDistance: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -20147,7 +19237,7 @@ export interface MultiTextureBillboardExParams { * - {@link maxDistance} * - {@link maxDistanceThreshold} */ - minDistanceThreshold?: number + minDistanceThreshold: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -20160,61 +19250,61 @@ export interface MultiTextureBillboardExParams { * - {@link maxDistance} * - {@link minDistanceThreshold} */ - maxDistanceThreshold?: number + maxDistanceThreshold: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_20?: number + unk_ds3_f2_20: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_21?: number + unk_ds3_f2_21: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_22?: number + unk_ds3_f2_22: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_23?: number + unk_ds3_f2_23: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_24?: number + unk_ds3_f2_24: number /** * Unknown float. * * **Default**: `1` */ - unkDepthBlend1?: number + unkDepthBlend1: number /** * Unknown float. * * **Default**: `0` */ - unkDepthBlend2?: number + unkDepthBlend2: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f2_27?: number + unk_ds3_f2_27: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_28?: number + unk_ds3_f2_28: number /** * Unknown float. * @@ -20222,19 +19312,19 @@ export interface MultiTextureBillboardExParams { * * **Default**: `0` */ - unk_ds3_f2_29?: number + unk_ds3_f2_29: number /** - * Controls how dark shaded parts of the particle are. + * Controls how dark shaded parts of the trail are. * * **Default**: `0` */ - shadowDarkness?: number + shadowDarkness: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_31?: number + unk_sdt_f2_31: number /** * Unknown integer. * @@ -20242,7 +19332,7 @@ export interface MultiTextureBillboardExParams { * * **Default**: `0` */ - unk_sdt_f2_32?: number + unk_sdt_f2_32: number /** * Specular texture ID. * @@ -20251,8 +19341,9 @@ export interface MultiTextureBillboardExParams { * See also: * - {@link lighting} * - {@link glossiness} + * - {@link specularity} */ - specular?: number + specular: number /** * Controls how sharp the specular highlights are. * @@ -20261,510 +19352,424 @@ export interface MultiTextureBillboardExParams { * See also: * - {@link lighting} * - {@link specular} + * - {@link specularity} */ - glossiness?: number + glossiness: number /** - * Controls how the particles are lit. See {@link LightingMode} for more information. + * Controls how the trail is lit. See {@link LightingMode} for more information. * * **Default**: {@link LightingMode.Unlit} */ - lighting?: LightingMode + lighting: LightingMode /** * Unknown integer. * * **Default**: `-2` */ - unk_sdt_f2_36?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f2_37?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_sdt_f2_38?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_sdt_f2_39?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f2_40?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f2_41?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_er_f2_42?: number + unk_sdt_f2_36: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_43?: number + unk_sdt_f2_37: number /** - * Unknown float. + * Controls how bright the specular highlights are. * - * **Default**: `0` - */ - unk_er_f2_44?: number - /** - * Unknown integer. + * **Default**: `0.5` * - * **Default**: `0` + * See also: + * - {@link lighting} + * - {@link specular} + * - {@link glossiness} */ - unk_er_f2_45?: number + specularity: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_46?: number + unk_er_f2_39: number + constructor(props: Partial> = {}) { + super(ActionType.Tracer, {isAppearance:true,isParticle:true}) + this.assign(props) + } } /** - * ### {@link ActionType.MultiTextureBillboardEx Action 604 - MultiTextureBillboardEx} + * ### {@link ActionType.Distortion Action 607 - Distortion} * **Slot**: {@link ActionSlots.AppearanceAction Appearance} * - * Particle with multiple textures that can scroll. + * A particle that distorts anything seen through it. + * + * Note: This particle is not visible if the "Effects" setting is set to "Low". */ -class MultiTextureBillboardEx extends DataAction { - declare readonly type: ActionType.MultiTextureBillboardEx +class Distortion extends DataAction { + declare readonly type: ActionType.Distortion declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Blend mode. * + * **Default**: {@link BlendMode.Normal} + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ blendMode: BlendMode | ScalarProperty /** * X position offset. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ offsetX: ScalarValue /** * Y position offset. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ offsetY: ScalarValue /** * Z position offset. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ offsetZ: ScalarValue /** * The width of the particle. * - * If {@link uniformScale} is enabled, this also controls the height. + * If {@link uniformScale} is enabled, this also controls the height and depth. + * + * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * + * See also: + * - {@link scaleVariationX} + * - {@link sizeY} + * - {@link sizeZ} */ - width: ScalarValue + sizeX: ScalarValue /** * The height of the particle. * - * If {@link uniformScale} is enabled, {@link width} also controls the height, and this property is ignored. + * If {@link uniformScale} is enabled, {@link sizeX} also controls the height, and this property is ignored. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - height: ScalarValue - /** - * Rotation around the X-axis in degrees. + * **Default**: `1` * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link angularSpeedX} - * - {@link angularSpeedMultiplierX} + * - {@link scaleVariationY} + * - {@link sizeX} + * - {@link sizeZ} */ - rotationX: ScalarValue + sizeY: ScalarValue /** - * Rotation around the Y-axis in degrees. + * The depth of the particle. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * If {@link uniformScale} is enabled, {@link sizeX} also controls the depth, and this property is ignored. * - * See also: - * - {@link angularSpeedY} - * - {@link angularSpeedMultiplierY} - */ - rotationY: ScalarValue - /** - * Rotation around the Z-axis in degrees. + * If the distortion {@link shape} is set to {@link DistortionShape.Rectangle Rectangle}, this property won't have any effect since the rectangle is 2-dimensional. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link angularSpeedZ} - * - {@link angularSpeedMultiplierZ} + * - {@link scaleVariationZ} + * - {@link sizeX} + * - {@link sizeY} */ - rotationZ: ScalarValue + sizeZ: ScalarValue /** - * Angular speed around the X-axis in degrees per second. + * Color multiplier. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. * - * See also: - * - {@link rotationX} - * - {@link angularSpeedMultiplierX} + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - angularSpeedX: ScalarValue + color: Vector4Value /** - * Multiplier for {@link angularSpeedX}. + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationX} + * **Default**: `[1, 1, 1, 1]` */ - angularSpeedMultiplierX: ScalarValue + unk_ds3_p1_7: Vector4Value /** - * Angular speed around the Y-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Controls the intensity of the distortion effect. At 0, there is no distortion at all. * - * See also: - * - {@link rotationY} - * - {@link angularSpeedMultiplierY} - */ - angularSpeedY: ScalarValue - /** - * Multiplier for {@link angularSpeedY}. + * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationY} */ - angularSpeedMultiplierY: ScalarValue + intensity: ScalarValue /** - * Angular speed around the Z-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Unknown scalar. * - * See also: - * - {@link rotationZ} - * - {@link angularSpeedMultiplierZ} + * **Default**: `0` */ - angularSpeedZ: ScalarValue + unk_ds3_p1_9: ScalarValue /** - * Multiplier for {@link angularSpeedZ}. + * Controls the speed of the stirring effect in degrees per second. Requires {@link mode} to be set to {@link DistortionMode.Stir}. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `60` * - * See also: - * - {@link rotationZ} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - angularSpeedMultiplierZ: ScalarValue + stirSpeed: ScalarValue /** - * Color multiplier for the particle. + * The distortion effect is only applied to an ellipse inside the particle. This property controls how large this ellipse is. At 1, it inscribes the particle's rectangle. At values greater than 1, it is the same size as 1, but there might be strange artifacts around the edges of the distortion. * - * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. + * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link color2} - * - {@link color3} */ - color1: Vector4Value + radius: ScalarValue /** - * Color multiplier for the particle. - * - * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. + * Horizontal offset for the {@link normalMap normal map}. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `0` * - * See also: - * - {@link color1} - * - {@link color3} + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - color2: Vector4Value + normalMapOffsetU: ScalarValue /** - * Color multiplier for the particle. - * - * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. + * Vertical offset for the {@link normalMap normal map}. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` * - * See also: - * - {@link color1} - * - {@link color2} + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - color3: Vector4Value + normalMapOffsetV: ScalarValue /** - * Color multiplier for Layer 1. + * Horizontal offset speed for the {@link normalMap normal map}. * - * Values in this will be clamped to the 0-1 range. + * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - layer1Color: Vector4Value + normalMapSpeedU: ScalarValue /** - * Color multiplier for Layer 2. + * Vertical offset speed for the {@link normalMap normal map}. * - * Values in this will be clamped to the 0-1 range. + * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - layer2Color: Vector4Value + normalMapSpeedV: ScalarValue /** - * Color multiplier for Layer 3. + * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * - * Values in this will be clamped to the 0-1 range. + * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - layer3Color: Vector4Value + rgbMultiplier: ScalarValue /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. + * Alpha multiplier. * - * Values above this threshold will be stretched to fill the alpha range, so values near the threshold will be less visible, creating a smooth transition between the parts that have been hidden by the threshold and the ones that are still visible. + * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - alphaFadeThreshold: ScalarValue + alphaMultiplier: ScalarValue /** - * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. - * - * Seemingly identical to {@link frameIndexOffset}? The sum of these two properties is the actual frame index that gets used. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - frameIndex: ScalarValue + unk_ds3_p2_2: ScalarValue /** - * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `[1, 1, 1, 1]` */ - frameIndexOffset: ScalarValue + unk_ds3_p2_3: Vector4Value /** - * Horiztonal scroll speed for Layer 1. + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `[1, 1, 1, 1]` */ - layer1SpeedU: ScalarValue + unk_ds3_p2_4: Vector4Value /** - * Vertical scroll speed for Layer 1. + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `[1, 1, 1, 1]` */ - layer1SpeedV: ScalarValue + unk_ds3_p2_5: Vector4Value /** - * Horizontal offset for the UV coordinates of Layer 1. + * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - layer1OffsetU: ScalarValue - /** - * Vertical offset for the UV coordinates of Layer 1. + * This threshold creates a hard cut-off between visible and not visible, which is unlike the alpha *fade* threshold properties in some similar actions. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - layer1OffsetV: ScalarValue - /** - * Horizontal scale for the UV coordinates of Layer 1. + * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - layer1ScaleU: ScalarValue + alphaThreshold: ScalarValue /** - * Vertical scale for the UV coordinates of Layer 1. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - layer1ScaleV: ScalarValue + unk_er_p2_7: ScalarValue /** - * Horiztonal scroll speed for Layer 2. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - layer2SpeedU: ScalarValue + unk_er_p2_8: ScalarValue /** - * Vertical scroll speed for Layer 2. + * Controls what type of distortion to apply. See {@link DistortionMode} for more details. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: {@link DistortionMode.NormalMap} */ - layer2SpeedV: ScalarValue + mode: DistortionMode /** - * Horizontal offset for the UV coordinates of Layer 2. + * Controls the shape of the particle. See {@link DistortionShape} for more information. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: {@link DistortionShape.Rectangle} */ - layer2OffsetU: ScalarValue + shape: DistortionShape /** - * Vertical offset for the UV coordinates of Layer 2. + * Controls the orientation mode for the particles. See {@link OrientationMode} for more information. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: {@link OrientationMode.CameraPlane} */ - layer2OffsetV: ScalarValue + orientation: OrientationMode /** - * Horizontal scale for the UV coordinates of Layer 2. + * Texture ID. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layer2ScaleU: ScalarValue - /** - * Vertical scale for the UV coordinates of Layer 2. + * This texture seems to completely hide the distortion effect. It's probably best to just leave it at 0 unless you are trying to figure out how to use it properly. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - layer2ScaleV: ScalarValue + texture: number /** - * Horiztonal scroll speed for Layer 3. + * Normal map texture ID. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layer3SpeedU: ScalarValue - /** - * Vertical scroll speed for Layer 3. + * Only used if the distortion {@link mode} is set to something that uses it. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - layer3SpeedV: ScalarValue + normalMap: number /** - * Horizontal offset for the UV coordinates of Layer 3. + * Mask texture ID. This texture is used to control the color and opacity of the particle. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `0` */ - layer3OffsetU: ScalarValue + mask: number /** - * Vertical offset for the UV coordinates of Layer 3. + * Each particle will pick a random number between this value and 1, and the width of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly thinner, down to half width. Setting it to 2 will make them randomly wider, up to double width. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - layer3OffsetV: ScalarValue - /** - * Horizontal scale for the UV coordinates of Layer 3. + * If {@link uniformScale} is enabled, this also affects the height. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layer3ScaleU: ScalarValue - /** - * Vertical scale for the UV coordinates of Layer 3. + * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * See also: + * - {@link scaleVariationY} + * - {@link scaleVariationZ} */ - layer3ScaleV: ScalarValue + scaleVariationX: number /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * Each particle will pick a random number between this value and 1, and the height of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shorter, down to half height. Setting it to 2 will make them randomly taller, up to double height. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - rgbMultiplier: ScalarValue - /** - * Alpha multiplier. + * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the height, and this field is ignored. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` + * + * See also: + * - {@link scaleVariationX} + * - {@link scaleVariationZ} */ - alphaMultiplier: ScalarValue - unk_ds3_p2_2: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value + scaleVariationY: number /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. + * Each particle will pick a random number between this value and 1, and the depth of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shallower, down to half depth. Setting it to 2 will make them randomly deeper, up to double depth. * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the {@link alphaFadeThreshold}. + * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the depth, and this field is ignored. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaThreshold: ScalarValue - /** - * Controls the orientation mode for the particles. See {@link OrientationMode} for more information. + * **Default**: `1` + * + * See also: + * - {@link scaleVariationX} + * - {@link scaleVariationY} */ - orientation: OrientationMode + scaleVariationZ: number /** - * Layer 1 texture ID. + * If enabled, the particle X scale-related properties and fields will control the scale in all axes, and the Y and Z counterparts will be ignored. + * + * **Default**: `false` + * + * See also: + * - {@link sizeX} + * - {@link sizeY} + * - {@link sizeZ} + * - {@link scaleVariationX} + * - {@link scaleVariationY} + * - {@link scaleVariationZ} */ - layer1: number + uniformScale: boolean /** - * Layer 2 texture ID. + * Unknown integer. + * + * **Default**: `-2` */ - layer2: number + unk_ds3_f1_11: number /** - * Layer 3 texture ID. + * Unknown integer. + * + * **Default**: `0` */ - layer3: number + unk_ds3_f1_12: number /** - * If enabled, the particle width-related properties and fields will control both the width and height of the particles, and the height counterparts will be ignored. + * Unknown integer. * - * See also: - * - {@link width} - * - {@link height} + * **Default**: `1` */ - uniformScale: boolean - unk_ds3_f1_6: number + unk_er_f1_12: number /** - * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. + * Unknown integer. * - * See also: - * - {@link totalFrames} + * **Default**: `1` */ - columns: number + unk_er_f1_13: number /** - * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. + * Unknown integer. * - * See also: - * - {@link columns} + * **Default**: `0` */ - totalFrames: number + unk_ds3_f2_0: number /** - * If enabled, the texture animation will use linear interpolation to mix frames when the frame index is not a whole number. For example, if the frame index is 0.5, enabling this will cause the average of the first two frames to be shown instead of just the first frame. - * - * If disabled, the frame index will be truncated to get a whole number. + * Unknown integer. * - * See also: - * - {@link frameIndex} - * - {@link frameIndexOffset} + * **Default**: `0` */ - interpolateFrames: boolean - unk_ds3_f1_10: number - unk_ds3_f1_11: number + unk_ds3_f2_1: number /** - * Controls how the particles should render when behind something else. If disabled, the particles will simply be drawn behind anything they are behind in the world. If enabled, they will instead display in front of the object if they are close enough, and will fade out with distance from the object's surface that is blocking the view of the particle. + * Unknown integer. + * + * **Default**: `8` */ - depthBlend: boolean + unk_ds3_f2_2: number /** - * Controls the shape of the particles. If disabled, the particles will be rectangular. If enabled, they will be octagonal. + * Unknown float. + * + * **Default**: `1` */ - octagonal: boolean - unk_ds3_f1_14: number - unk_er_f1_14: number - unk_er_f1_15: number - unk_er_f1_16: number - unk_ds3_f2_0: number - unk_ds3_f2_1: number - unk_ds3_f2_2: number unk_ds3_f2_3: number /** - * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. + * Unknown integer. * - * See also: - * - {@link bloomColor} + * **Default**: `0` */ - bloom: boolean + unk_ds3_f2_4: number /** * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. * @@ -20772,20 +19777,46 @@ class MultiTextureBillboardEx extends DataAction { * - This has no effect if the "Effects Quality" setting is set to "Low". * - This does not affect the natural bloom effect from high color values. * - * See also: - * - {@link bloom} + * **Default**: `[1, 1, 1, 0]` */ bloomColor: Vector4 + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_9: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_10: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_11: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_12: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ds3_f2_13: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. * + * **Default**: `-1` + * * See also: * - {@link minDistance} * - {@link maxFadeDistance} @@ -20801,6 +19832,8 @@ class MultiTextureBillboardEx extends DataAction { * * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link maxFadeDistance} @@ -20814,6 +19847,8 @@ class MultiTextureBillboardEx extends DataAction { * * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -20829,6 +19864,8 @@ class MultiTextureBillboardEx extends DataAction { * * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -20840,6 +19877,8 @@ class MultiTextureBillboardEx extends DataAction { /** * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -20851,6 +19890,8 @@ class MultiTextureBillboardEx extends DataAction { /** * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -20859,378 +19900,241 @@ class MultiTextureBillboardEx extends DataAction { * - {@link minDistanceThreshold} */ maxDistanceThreshold: number - unk_ds3_f2_20: number - unk_ds3_f2_21: number - unk_ds3_f2_22: number - unk_ds3_f2_23: number - unk_ds3_f2_24: number - unkDepthBlend1: number - unkDepthBlend2: number - unk_ds3_f2_27: number - unk_ds3_f2_28: number /** * Unknown float. * - * This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. - */ - unk_ds3_f2_29: number - /** - * Controls how dark shaded parts of the particle are. + * **Default**: `1` */ - shadowDarkness: number - unk_sdt_f2_31: number + unk_ds3_f2_20: number /** * Unknown integer. * - * When set to 1, it seems to stop {@link unk_ds3_f2_29} from doing whatever it is doing, and it can also cause some ugly "outline" effects on things seen through particles. + * **Default**: `0` */ - unk_sdt_f2_32: number + unk_ds3_f2_21: number /** - * Specular texture ID. + * Unknown integer. * - * See also: - * - {@link lighting} - * - {@link glossiness} + * **Default**: `0` */ - specular: number + unk_ds3_f2_22: number /** - * Controls how sharp the specular highlights are. + * Unknown integer. * - * See also: - * - {@link lighting} - * - {@link specular} - */ - glossiness: number - /** - * Controls how the particles are lit. See {@link LightingMode} for more information. + * **Default**: `0` */ - lighting: LightingMode - unk_sdt_f2_36: number - unk_sdt_f2_37: number - unk_sdt_f2_38: number - unk_sdt_f2_39: number - unk_sdt_f2_40: number - unk_sdt_f2_41: number - unk_er_f2_42: number - unk_er_f2_43: number - unk_er_f2_44: number - unk_er_f2_45: number - unk_ac6_f2_46: number - constructor(props: MultiTextureBillboardExParams = {}) { - super(ActionType.MultiTextureBillboardEx, {isAppearance:true,isParticle:true}) - this.assign(props) - } -} - -export interface ModelParams { + unk_ds3_f2_23: number /** - * Model ID. - * - * **Default**: `80201` + * Unknown integer. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `0` */ - model?: ScalarValue + unk_ds3_f2_24: number /** - * The width of the particle. - * - * If {@link uniformScale} is enabled, this also controls the height and depth. + * Unknown float. * * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationX} - * - {@link sizeY} - * - {@link sizeZ} */ - sizeX?: ScalarValue + unkDepthBlend1: number /** - * The height of the particle. - * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the height, and this property is ignored. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Unknown float. * - * See also: - * - {@link scaleVariationY} - * - {@link sizeX} - * - {@link sizeZ} + * **Default**: `0` */ - sizeY?: ScalarValue + unkDepthBlend2: number /** - * The depth of the particle. - * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the depth, and this property is ignored. + * Unknown integer. * * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationZ} - * - {@link sizeX} - * - {@link sizeY} */ - sizeZ?: ScalarValue + unk_ds3_f2_27: number /** - * Rotation around the X-axis in degrees. + * Unknown integer. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link angularSpeedX} - * - {@link angularSpeedMultiplierX} */ - rotationX?: ScalarValue + unk_ds3_f2_28: number /** - * Rotation around the Y-axis in degrees. + * Unknown integer. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link angularSpeedY} - * - {@link angularSpeedMultiplierY} */ - rotationY?: ScalarValue + unk_ds3_f2_29: number /** - * Rotation around the Z-axis in degrees. + * Unknown float. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link angularSpeedZ} - * - {@link angularSpeedMultiplierZ} */ - rotationZ?: ScalarValue + unk_sdt_f2_30: number /** - * Angular speed around the X-axis in degrees per second. + * Unknown integer. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationX} - * - {@link angularSpeedMultiplierX} */ - angularSpeedX?: ScalarValue + unk_sdt_f2_31: number /** - * Multiplier for {@link angularSpeedX}. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Unknown integer. * - * See also: - * - {@link rotationX} + * **Default**: `0` */ - angularSpeedMultiplierX?: ScalarValue + unk_sdt_f2_32: number /** - * Angular speed around the Y-axis in degrees per second. + * Unknown integer. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationY} - * - {@link angularSpeedMultiplierY} */ - angularSpeedY?: ScalarValue + unk_sdt_f2_33: number /** - * Multiplier for {@link angularSpeedY}. + * Unknown float. * - * **Default**: `1` + * **Default**: `0` + */ + unk_sdt_f2_34: number + /** + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `-1` + */ + unk_sdt_f2_35: number + /** + * Unknown integer. * - * See also: - * - {@link rotationY} + * **Default**: `-2` */ - angularSpeedMultiplierY?: ScalarValue + unk_sdt_f2_36: number /** - * Angular speed around the Z-axis in degrees per second. + * Unknown integer. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationZ} - * - {@link angularSpeedMultiplierZ} */ - angularSpeedZ?: ScalarValue + unk_sdt_f2_37: number /** - * Multiplier for {@link angularSpeedZ}. - * - * **Default**: `1` + * Unknown float. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * This seems to be something distance or depth-related. It's using the same length units as everything else (meters), and seems to be some sort of threshold or maybe offset for something. When the camera is within this distance from the node, the distortion will also affect other particles seen through it. * - * See also: - * - {@link rotationZ} + * **Default**: `0` */ - angularSpeedMultiplierZ?: ScalarValue + unk_sdt_f2_38: number + constructor(props: Partial> = {}) { + super(ActionType.Distortion, {isAppearance:true,isParticle:true}) + this.assign(props) + } +} + +/** + * ### {@link ActionType.RadialBlur Action 608 - RadialBlur} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * A particle that applies a radial blur to anything seen through it. + * + * Note: This particle is not visible if the "Effects" setting is set to "Low". + */ +class RadialBlur extends DataAction { + declare readonly type: ActionType.RadialBlur + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Blend mode. * - * Note that the materials used by the model may affect how the different blend modes work. Don't expect the blend modes to always work exactly like they do in other types of instances. - * * **Default**: {@link BlendMode.Normal} * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - blendMode?: BlendMode | ScalarProperty + blendMode: BlendMode | ScalarProperty /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. - * - * **Default**: `[1, 1, 1, 1]` + * Mask texture ID. This texture is used to control the opacity of the particle. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` * - * See also: - * - {@link color2} - * - {@link color3} + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - color1?: Vector4Value + mask: ScalarValue /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. + * X position offset. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link color1} - * - {@link color3} + * - {@link offsetY} + * - {@link offsetZ} */ - color2?: Vector4Value + offsetX: ScalarValue /** - * Color multiplier. - * - * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. + * Y position offset. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link color1} - * - {@link color2} - */ - color3?: Vector4Value - /** - * Unknown. - * - * **Default**: `0` + * - {@link offsetX} + * - {@link offsetZ} */ - unk_ds3_p1_15?: ScalarValue + offsetY: ScalarValue /** - * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. - * - * Seemingly identical to {@link frameIndexOffset}? The sum of these two properties is the actual frame index that gets used. + * Z position offset. * * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - frameIndex?: ScalarValue - /** - * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. - * - * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * See also: + * - {@link offsetX} + * - {@link offsetY} */ - frameIndexOffset?: ScalarValue + offsetZ: ScalarValue /** - * Horizontal offset for the UV coordinates of the model. + * The width of the particle. * - * If the texture is an animation sheet that is split up into multiple frames using {@link columns} and/or {@link totalFrames}, this property has no effect. + * If {@link uniformScale} is enabled, this also controls the height. * - * **Default**: `0` + * **Default**: `1` * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link speedU} - * - {@link offsetV} - */ - offsetU?: ScalarValue - /** - * Vertical offset for the UV coordinates of the model. - * - * If the texture is an animation sheet that is split up into multiple frames using {@link columns} and/or {@link totalFrames}, this property has no effect. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * - {@link height} */ - offsetV?: ScalarValue + width: ScalarValue /** - * Horiztonal scroll speed for the model's texture. + * The height of the particle. * - * If the texture is an animation sheet that is split up into multiple frames using {@link columns} and/or {@link totalFrames}, this property has no effect. + * If {@link uniformScale} is enabled, {@link width} also controls the height, and this property is ignored. * - * **Default**: `0` + * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link speedMultiplierU} - * - {@link offsetU} + * - {@link width} */ - speedU?: ScalarValue + height: ScalarValue /** - * Multiplier for {@link speedU}. + * Color multiplier. * - * **Default**: `0` + * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. + * + * **Default**: `[1, 1, 1, 1]` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - speedMultiplierU?: ScalarValue + color: Vector4Value /** - * Vertical scroll speed for the model's texture. + * Unknown vector4. * - * If the texture is an animation sheet that is split up into multiple frames using {@link columns} and/or {@link totalFrames}, this property has no effect. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link speedMultiplierV} - * - {@link offsetV} + * **Default**: `[1, 1, 1, 1]` */ - speedV?: ScalarValue + unk_ds3_p1_6: Vector4Value /** - * Multiplier for {@link speedV}. + * Controls the amount of blur to apply. Values greater than 1 may appear glitchy. * - * **Default**: `0` + * **Default**: `0.5` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - speedMultiplierV?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_24?: ScalarValue + blurRadius: ScalarValue /** * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * @@ -21238,7 +20142,7 @@ export interface ModelParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - rgbMultiplier?: ScalarValue + rgbMultiplier: ScalarValue /** * Alpha multiplier. * @@ -21246,245 +20150,105 @@ export interface ModelParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - alphaMultiplier?: ScalarValue + alphaMultiplier: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p2_2?: ScalarValue + unk_ds3_p2_2: ScalarValue /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_3?: Vector4Value + unk_ds3_p2_3: Vector4Value /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_4?: Vector4Value + unk_ds3_p2_4: Vector4Value /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_5?: Vector4Value + unk_ds3_p2_5: Vector4Value /** - * Unknown. + * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. * - * **Default**: `0` - */ - unk_ds3_p2_6?: ScalarValue - /** - * Unknown. + * This threshold creates a hard cut-off between visible and not visible, which is unlike the alpha *fade* threshold properties in some similar actions. * * **Default**: `0` - */ - unk_ds3_p2_7?: ScalarValue - /** - * Model orientation mode. See {@link ModelOrientationMode} for more information. - * - * **Default**: {@link ModelOrientationMode.ParticleDirection} - */ - orientation?: ModelOrientationMode - /** - * Each particle will pick a random number between this value and 1, and the width of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly thinner, down to half width. Setting it to 2 will make them randomly wider, up to double width. - * - * If {@link uniformScale} is enabled, this also affects the height. - * - * **Default**: `1` - * - * See also: - * - {@link scaleVariationY} - * - {@link scaleVariationZ} - */ - scaleVariationX?: number - /** - * Each particle will pick a random number between this value and 1, and the height of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shorter, down to half height. Setting it to 2 will make them randomly taller, up to double height. - * - * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the height, and this field is ignored. - * - * **Default**: `1` - * - * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationZ} - */ - scaleVariationY?: number - /** - * Each particle will pick a random number between this value and 1, and the depth of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shallower, down to half depth. Setting it to 2 will make them randomly deeper, up to double depth. - * - * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the depth, and this field is ignored. - * - * **Default**: `1` * - * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationY} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - scaleVariationZ?: number + alphaThreshold: ScalarValue /** - * If enabled, the particle X scale-related properties and fields will control the scale in all axes, and the Y and Z counterparts will be ignored. + * If enabled, the particle width-related properties and fields will control both the width and height of the particles, and the height counterparts will be ignored. * * **Default**: `false` * * See also: - * - {@link sizeX} - * - {@link sizeY} - * - {@link sizeZ} - * - {@link scaleVariationX} - * - {@link scaleVariationY} - * - {@link scaleVariationZ} - */ - uniformScale?: boolean - /** - * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. - * - * **Default**: `1` - * - * See also: - * - {@link totalFrames} - */ - columns?: number - /** - * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. - * - * **Default**: `1` - * - * See also: - * - {@link columns} - */ - totalFrames?: number - /** - * Unknown integer. - * - * **Default**: `-2` - */ - unk_ds3_f1_9?: number - /** - * Unknown integer. - * - * **Default**: `-2` - */ - unk_ds3_f1_10?: number - /** - * Unknown boolean. - * - * **Default**: `true` - */ - unk_ds3_f1_11?: boolean - /** - * Unknown boolean. - * - * **Default**: `true` - */ - unk_ds3_f1_12?: boolean - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_ds3_f1_13?: number - /** - * Anibnd ID. - * - * **Default**: `0` - * - * See also: - * - {@link animation} - * - {@link loopAnimation} - * - {@link animationSpeed} - */ - anibnd?: number - /** - * Controls which animation in the {@link anibnd} to play. - * - * **Default**: `0` - * - * See also: - * - {@link anibnd} - * - {@link loopAnimation} - * - {@link animationSpeed} - */ - animation?: number - /** - * If disabled, the {@link animation} will only play once and then freeze on the last frame. If enabled, the animation will loop. - * - * **Default**: `true` - * - * See also: - * - {@link anibnd} - * - {@link animation} - * - {@link animationSpeed} + * - {@link width} + * - {@link height} */ - loopAnimation?: boolean + uniformScale: boolean /** - * Controls the speed at which the {@link animation} plays. + * Controls how many times to apply the effect. Higher values can have a significant impact on performance. * * **Default**: `1` - * - * See also: - * - {@link anibnd} - * - {@link animation} - * - {@link loopAnimation} */ - animationSpeed?: number + iterations: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_18?: number + unk_ds3_f1_4: number /** * Unknown integer. * * **Default**: `1` */ - unk_er_f1_17?: number + unk_er_f1_3: number /** * Unknown integer. * * **Default**: `1` */ - unk_er_f1_18?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_er_f1_19?: number + unk_er_f1_4: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_0?: number + unk_ds3_f2_0: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_1?: number + unk_ds3_f2_1: number /** * Unknown integer. * * **Default**: `8` */ - unk_ds3_f2_2?: number + unk_ds3_f2_2: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f2_3?: number + unk_ds3_f2_3: number /** * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_ds3_f2_4?: number + unk_ds3_f2_4: number /** * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. * @@ -21494,37 +20258,37 @@ export interface ModelParams { * * **Default**: `[1, 1, 1, 0]` */ - bloomColor?: Vector4 + bloomColor: Vector4 /** - * Unknown float. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_9?: number + unk_ds3_f2_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_10?: number + unk_ds3_f2_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_11?: number + unk_ds3_f2_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_12?: number + unk_ds3_f2_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_13?: number + unk_ds3_f2_13: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -21539,7 +20303,7 @@ export interface ModelParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minFadeDistance?: number + minFadeDistance: number /** * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -21556,7 +20320,7 @@ export interface ModelParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minDistance?: number + minDistance: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -21571,7 +20335,7 @@ export interface ModelParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxFadeDistance?: number + maxFadeDistance: number /** * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -21588,7 +20352,7 @@ export interface ModelParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxDistance?: number + maxDistance: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -21601,7 +20365,7 @@ export interface ModelParams { * - {@link maxDistance} * - {@link maxDistanceThreshold} */ - minDistanceThreshold?: number + minDistanceThreshold: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -21614,8907 +20378,914 @@ export interface ModelParams { * - {@link maxDistance} * - {@link minDistanceThreshold} */ - maxDistanceThreshold?: number + maxDistanceThreshold: number /** * Unknown float. * - * **Default**: `0` + * **Default**: `0.5` */ - unk_ds3_f2_20?: number + unk_ds3_f2_20: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f2_21?: number + unk_ds3_f2_21: number /** - * Unknown integer. + * Unknown float. * * **Default**: `0` */ - unk_ds3_f2_22?: number + unk_ds3_f2_22: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_23?: number + unk_ds3_f2_23: number /** - * Unknown float. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_24?: number + unk_ds3_f2_24: number /** * Unknown float. * * **Default**: `1` */ - unkDepthBlend1?: number + unkDepthBlend1: number /** * Unknown float. * * **Default**: `0` */ - unkDepthBlend2?: number + unkDepthBlend2: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f2_26?: number + unk_ds3_f2_27: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_27?: number + unk_ds3_f2_28: number /** * Unknown float. * * **Default**: `0` */ - unk_sdt_f2_29?: number + unk_ds3_f2_29: number /** * Unknown float. * * **Default**: `0` */ - unk_sdt_f2_30?: number + unk_sdt_f2_30: number + constructor(props: Partial> = {}) { + super(ActionType.RadialBlur, {isAppearance:true,isParticle:true}) + this.assign(props) + } +} + +/** + * ### {@link ActionType.PointLight Action 609 - PointLight} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * Point light source. + */ +class PointLight extends DataAction { + declare readonly type: ActionType.PointLight + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** - * Unknown integer. + * Controls the diffuse color of the light. * - * **Default**: `0` + * Values in this are unrestricted and can go above 1. + * + * If {@link separateSpecular} is disabled, this also controls the specular color of the light. + * + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * + * See also: + * - {@link specularColor} */ - unk_sdt_f2_31?: number + diffuseColor: Vector4Value /** - * Unknown integer. + * Controls the specular color of the light. * - * When set to 1, it can cause some ugly "outline" effects on things seen through particles. + * Values in this are unrestricted and can go above 1. * - * **Default**: `0` + * If {@link separateSpecular} is disabled, this property is ignored and {@link diffuseColor} controls both the diffuse as well as the specular color. + * + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - unk_sdt_f2_32?: number + specularColor: Vector4Value /** - * Unknown integer. + * The maximum distance that the light may travel from the source, and the radius of the sphere in which other effects caused by the light source (for example {@link volumeDensity} and its related fields) may act. * - * **Default**: `0` + * **Default**: `10` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - unk_sdt_f2_33?: number + radius: ScalarValue /** - * Unknown float. + * Unknown scalar. * * **Default**: `0` */ - unk_sdt_f2_34?: number + unk_ds3_p1_3: ScalarValue /** - * Unknown integer. + * Unknown scalar. * - * **Default**: `-2` + * **Default**: `0` */ - unk_sdt_f2_35?: number + unk_ds3_p1_4: ScalarValue /** - * Unknown integer. + * Unknown scalar. * - * **Default**: `-2` + * **Default**: `0` */ - unk_sdt_f2_36?: number + unk_ds3_p1_5: ScalarValue /** - * Unknown integer. + * Unknown scalar. * * **Default**: `0` */ - unk_sdt_f2_37?: number + unk_ds3_p1_6: ScalarValue /** - * Unknown integer. + * Unknown scalar. * - * **Default**: `0` + * **Default**: `10` */ - unk_ac6_f2_38?: number + unk_ds3_p1_7: ScalarValue /** - * Unknown float. + * Unknown scalar. * - * **Default**: `0` + * **Default**: `10` */ - unk_ds3_f2_28?: number -} - -/** - * ### {@link ActionType.Model Action 605 - Model} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * Particle with a 3D model. - * - * Some models don't work properly with this action for some reason. For example, the Carian greatsword model in Elden Ring (88300), gets horribly stretched and distorted when used with this action. If you find a model like this that you want to use, try using the {@link ActionType.RichModel RichModel action} instead. - */ -class Model extends DataAction { - declare readonly type: ActionType.Model - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} + unk_ds3_p1_8: ScalarValue /** - * Model ID. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `10` */ - model: ScalarValue + unk_ds3_p1_9: ScalarValue /** - * The width of the particle. - * - * If {@link uniformScale} is enabled, this also controls the height and depth. + * Affects the falloff of the light in some way, and how the normal of surfaces affect the intensity of the light. + * - At 0 or negative values, this completely disabled the light. + * - At 1, the light behaves like you would expect. + * - At values between 0 and 1, it seemingly makes the falloff of the light over distance stronger, so the light will sooner fade to nothing. + * - At values greater than 1, it will make the falloff weaker until near the {@link radius maximum distance}, and then it will very quickly fade to nothing. It also makes the normal of the surfaces hit by the light matter less. At very high values, anything within the radius basically becomes full bright. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` * * See also: - * - {@link scaleVariationX} - * - {@link sizeY} - * - {@link sizeZ} + * - {@link falloffExponent} */ - sizeX: ScalarValue + unk_ds3_p2_0: ScalarValue /** - * The height of the particle. - * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the height, and this property is ignored. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Unknown scalar. * - * See also: - * - {@link scaleVariationY} - * - {@link sizeX} - * - {@link sizeZ} + * **Default**: `1` */ - sizeY: ScalarValue + unk_ds3_p2_1: ScalarValue /** - * The depth of the particle. - * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the depth, and this property is ignored. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationZ} - * - {@link sizeX} - * - {@link sizeY} - */ - sizeZ: ScalarValue - /** - * Rotation around the X-axis in degrees. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link angularSpeedX} - * - {@link angularSpeedMultiplierX} - */ - rotationX: ScalarValue - /** - * Rotation around the Y-axis in degrees. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link angularSpeedY} - * - {@link angularSpeedMultiplierY} - */ - rotationY: ScalarValue - /** - * Rotation around the Z-axis in degrees. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link angularSpeedZ} - * - {@link angularSpeedMultiplierZ} - */ - rotationZ: ScalarValue - /** - * Angular speed around the X-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationX} - * - {@link angularSpeedMultiplierX} - */ - angularSpeedX: ScalarValue - /** - * Multiplier for {@link angularSpeedX}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationX} - */ - angularSpeedMultiplierX: ScalarValue - /** - * Angular speed around the Y-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationY} - * - {@link angularSpeedMultiplierY} - */ - angularSpeedY: ScalarValue - /** - * Multiplier for {@link angularSpeedY}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationY} - */ - angularSpeedMultiplierY: ScalarValue - /** - * Angular speed around the Z-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationZ} - * - {@link angularSpeedMultiplierZ} - */ - angularSpeedZ: ScalarValue - /** - * Multiplier for {@link angularSpeedZ}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationZ} - */ - angularSpeedMultiplierZ: ScalarValue - /** - * Blend mode. - * - * Note that the materials used by the model may affect how the different blend modes work. Don't expect the blend modes to always work exactly like they do in other types of instances. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - blendMode: BlendMode | ScalarProperty - /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link color2} - * - {@link color3} - */ - color1: Vector4Value - /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. - * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} - * - * See also: - * - {@link color1} - * - {@link color3} - */ - color2: Vector4Value - /** - * Color multiplier. - * - * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link color1} - * - {@link color2} - */ - color3: Vector4Value - unk_ds3_p1_15: ScalarValue - /** - * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. - * - * Seemingly identical to {@link frameIndexOffset}? The sum of these two properties is the actual frame index that gets used. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - frameIndex: ScalarValue - /** - * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - frameIndexOffset: ScalarValue - /** - * Horizontal offset for the UV coordinates of the model. - * - * If the texture is an animation sheet that is split up into multiple frames using {@link columns} and/or {@link totalFrames}, this property has no effect. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link speedU} - * - {@link offsetV} - */ - offsetU: ScalarValue - /** - * Vertical offset for the UV coordinates of the model. - * - * If the texture is an animation sheet that is split up into multiple frames using {@link columns} and/or {@link totalFrames}, this property has no effect. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - offsetV: ScalarValue - /** - * Horiztonal scroll speed for the model's texture. - * - * If the texture is an animation sheet that is split up into multiple frames using {@link columns} and/or {@link totalFrames}, this property has no effect. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link speedMultiplierU} - * - {@link offsetU} - */ - speedU: ScalarValue - /** - * Multiplier for {@link speedU}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - speedMultiplierU: ScalarValue - /** - * Vertical scroll speed for the model's texture. - * - * If the texture is an animation sheet that is split up into multiple frames using {@link columns} and/or {@link totalFrames}, this property has no effect. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link speedMultiplierV} - * - {@link offsetV} - */ - speedV: ScalarValue - /** - * Multiplier for {@link speedV}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - speedMultiplierV: ScalarValue - unk_ds3_p1_24: ScalarValue - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - rgbMultiplier: ScalarValue - /** - * Alpha multiplier. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaMultiplier: ScalarValue - unk_ds3_p2_2: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value - unk_ds3_p2_6: ScalarValue - unk_ds3_p2_7: ScalarValue - /** - * Model orientation mode. See {@link ModelOrientationMode} for more information. - */ - orientation: ModelOrientationMode - /** - * Each particle will pick a random number between this value and 1, and the width of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly thinner, down to half width. Setting it to 2 will make them randomly wider, up to double width. - * - * If {@link uniformScale} is enabled, this also affects the height. - * - * See also: - * - {@link scaleVariationY} - * - {@link scaleVariationZ} - */ - scaleVariationX: number - /** - * Each particle will pick a random number between this value and 1, and the height of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shorter, down to half height. Setting it to 2 will make them randomly taller, up to double height. - * - * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the height, and this field is ignored. - * - * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationZ} - */ - scaleVariationY: number - /** - * Each particle will pick a random number between this value and 1, and the depth of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shallower, down to half depth. Setting it to 2 will make them randomly deeper, up to double depth. - * - * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the depth, and this field is ignored. - * - * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationY} - */ - scaleVariationZ: number - /** - * If enabled, the particle X scale-related properties and fields will control the scale in all axes, and the Y and Z counterparts will be ignored. - * - * See also: - * - {@link sizeX} - * - {@link sizeY} - * - {@link sizeZ} - * - {@link scaleVariationX} - * - {@link scaleVariationY} - * - {@link scaleVariationZ} - */ - uniformScale: boolean - /** - * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. - * - * See also: - * - {@link totalFrames} - */ - columns: number - /** - * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. - * - * See also: - * - {@link columns} - */ - totalFrames: number - unk_ds3_f1_9: number - unk_ds3_f1_10: number - unk_ds3_f1_11: boolean - unk_ds3_f1_12: boolean - unk_ds3_f1_13: number - /** - * Anibnd ID. - * - * See also: - * - {@link animation} - * - {@link loopAnimation} - * - {@link animationSpeed} - */ - anibnd: number - /** - * Controls which animation in the {@link anibnd} to play. - * - * See also: - * - {@link anibnd} - * - {@link loopAnimation} - * - {@link animationSpeed} - */ - animation: number - /** - * If disabled, the {@link animation} will only play once and then freeze on the last frame. If enabled, the animation will loop. - * - * See also: - * - {@link anibnd} - * - {@link animation} - * - {@link animationSpeed} - */ - loopAnimation: boolean - /** - * Controls the speed at which the {@link animation} plays. - * - * See also: - * - {@link anibnd} - * - {@link animation} - * - {@link loopAnimation} - */ - animationSpeed: number - unk_ds3_f1_18: number - unk_er_f1_17: number - unk_er_f1_18: number - unk_er_f1_19: number - unk_ds3_f2_0: number - unk_ds3_f2_1: number - unk_ds3_f2_2: number - unk_ds3_f2_3: number - unk_ds3_f2_4: number - /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - */ - bloomColor: Vector4 - unk_ds3_f2_9: number - unk_ds3_f2_10: number - unk_ds3_f2_11: number - unk_ds3_f2_12: number - unk_ds3_f2_13: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minFadeDistance: number - /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minDistance: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxFadeDistance: number - /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxDistance: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} - */ - minDistanceThreshold: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - */ - maxDistanceThreshold: number - unk_ds3_f2_20: number - unk_ds3_f2_21: number - unk_ds3_f2_22: number - unk_ds3_f2_23: number - unk_ds3_f2_24: number - unkDepthBlend1: number - unkDepthBlend2: number - unk_ds3_f2_26: number - unk_ds3_f2_27: number - unk_sdt_f2_29: number - unk_sdt_f2_30: number - unk_sdt_f2_31: number - /** - * Unknown integer. - * - * When set to 1, it can cause some ugly "outline" effects on things seen through particles. - */ - unk_sdt_f2_32: number - unk_sdt_f2_33: number - unk_sdt_f2_34: number - unk_sdt_f2_35: number - unk_sdt_f2_36: number - unk_sdt_f2_37: number - unk_ac6_f2_38: number - unk_ds3_f2_28: number - constructor(props: ModelParams = {}) { - super(ActionType.Model, {isAppearance:true,isParticle:true}) - this.assign(props) - } -} - -export interface TracerParams { - /** - * Texture ID. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - texture?: ScalarValue - /** - * Blend mode. - * - * **Default**: {@link BlendMode.Normal} - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - blendMode?: BlendMode | ScalarProperty - /** - * The width of the trail. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - width?: ScalarValue - /** - * Multiplier for {@link width}. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} - */ - widthMultiplier?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_2?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_3?: ScalarValue - /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link color2} - * - {@link color3} - */ - color1?: Vector4Value - /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} - * - * See also: - * - {@link color1} - * - {@link color3} - */ - color2?: Vector4Value - /** - * Color multiplier. - * - * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link color1} - * - {@link color2} - */ - color3?: Vector4Value - /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. - * - * Values above this threshold will be stretched to fill the alpha range, so values near the threshold will be less visible, creating a smooth transition between the parts that have been hidden by the threshold and the ones that are still visible. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - alphaFadeThreshold?: ScalarValue - /** - * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. - * - * Seemingly identical to {@link frameIndexOffset}? The sum of these two properties is the actual frame index that gets used. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - frameIndex?: ScalarValue - /** - * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - frameIndexOffset?: ScalarValue - /** - * Controls how much of the texture's width is used per segment. If {@link attachedUV} is enabled, this instead controls how much of the texture's width to use for the entire trail. - * - * **Default**: `0.1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - textureFraction?: ScalarValue - /** - * Controls how fast the UV coordinates should move horizontally. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - speedU?: ScalarValue - /** - * Controls how much the UV coordinates should be randomly offset by per segment. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - varianceV?: ScalarValue - /** - * Unknown. - * - * **Default**: `-1` - */ - unk_ds3_p1_13?: ScalarValue - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - rgbMultiplier?: ScalarValue - /** - * Alpha multiplier. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaMultiplier?: ScalarValue - /** - * Controls the intensity of the distortion effect. At 0, there is no distortion at all. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link normalMap} - */ - distortionIntensity?: ScalarValue - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_3?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_4?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_5?: Vector4Value - /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. - * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the {@link alphaFadeThreshold}. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaThreshold?: ScalarValue - /** - * Tracer orientation mode. See {@link TracerOrientationMode} for more information. - * - * **Default**: {@link TracerOrientationMode.LocalZ} - */ - orientation?: TracerOrientationMode - /** - * Normal map texture ID. - * - * This is used to control the distortion effect of the trail. - * - * **Default**: `0` - * - * See also: - * - {@link distortionIntensity} - */ - normalMap?: number - /** - * The trail is made up of multiple quads, or *segments*. This controls how many seconds to wait between new segments being created. Lower values produce a smoother trail. - * - * **Default**: `0` - */ - segmentInterval?: number - /** - * The trail is made up of multiple quads, or *segments*. This controls how long each segment should last in seconds. - * - * **Default**: `1` - */ - segmentDuration?: number - /** - * The trail is made up of multiple quads, or *segments*. This controls how many segments may exist at the same time. - * - * **Default**: `100` - */ - concurrentSegments?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_7?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_8?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_9?: number - /** - * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. - * - * **Default**: `1` - * - * See also: - * - {@link totalFrames} - */ - columns?: number - /** - * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. - * - * **Default**: `1` - * - * See also: - * - {@link columns} - */ - totalFrames?: number - /** - * Controls whether or not the UV of the trail should be attached to the node or not. If it is attached, the texture will slide along the segments to follow the source wherever it moves, as if it was a flag attached to a pole. If it is not attached, the texture will stay where it was when the segment was created, like a skid mark on a road where the road is the segments and the mark is the texture, it wouldn't follow the car/node that made it. - * - * **Default**: `true` - */ - attachedUV?: boolean - /** - * Unknown integer. - * - * **Default**: `-1` - */ - unk_ds3_f1_13?: number - /** - * Unknown integer. - * - * **Default**: `-1` - */ - unk_ds3_f1_14?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_15?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_er_f1_14?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_er_f1_15?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_er_f1_16?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_0?: number - /** - * Unknown boolean. - * - * **Default**: `0` - */ - unk_ds3_f2_1?: boolean - /** - * Unknown integer. - * - * **Default**: `8` - */ - unk_ds3_f2_2?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_3?: number - /** - * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - * - * **Default**: `true` - * - * See also: - * - {@link bloomColor} - */ - bloom?: boolean - /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - * - * **Default**: `[1, 1, 1, 0]` - * - * See also: - * - {@link bloom} - */ - bloomColor?: Vector4 - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f2_9?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_10?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_11?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_12?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_13?: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * **Default**: `-1` - * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minFadeDistance?: number - /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minDistance?: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxFadeDistance?: number - /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxDistance?: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} - */ - minDistanceThreshold?: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - */ - maxDistanceThreshold?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_20?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_21?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_22?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_23?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_24?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unkDepthBlend1?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unkDepthBlend2?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_ds3_f2_27?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_28?: number - /** - * Unknown float. - * - * This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. - * - * **Default**: `0` - */ - unk_ds3_f2_29?: number - /** - * Controls how dark shaded parts of the trail are. - * - * **Default**: `0` - */ - shadowDarkness?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f2_31?: number - /** - * Unknown integer. - * - * When set to 1, it seems to stop {@link unk_ds3_f2_29} from doing whatever it is doing, and it can also cause some ugly "outline" effects on things seen through particles. - * - * **Default**: `0` - */ - unk_sdt_f2_32?: number - /** - * Specular texture ID. - * - * **Default**: `0` - * - * See also: - * - {@link lighting} - * - {@link glossiness} - * - {@link specularity} - */ - specular?: number - /** - * Controls how sharp the specular highlights are. - * - * **Default**: `0.25` - * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link specularity} - */ - glossiness?: number - /** - * Controls how the trail is lit. See {@link LightingMode} for more information. - * - * **Default**: {@link LightingMode.Unlit} - */ - lighting?: LightingMode - /** - * Unknown integer. - * - * **Default**: `-2` - */ - unk_sdt_f2_36?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f2_37?: number - /** - * Controls how bright the specular highlights are. - * - * **Default**: `0.5` - * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link glossiness} - */ - specularity?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_er_f2_39?: number -} - -/** - * ### {@link ActionType.Tracer Action 606 - Tracer} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * Creates a trail behind moving effects. - */ -class Tracer extends DataAction { - declare readonly type: ActionType.Tracer - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} - /** - * Texture ID. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - texture: ScalarValue - /** - * Blend mode. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - blendMode: BlendMode | ScalarProperty - /** - * The width of the trail. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - width: ScalarValue - /** - * Multiplier for {@link width}. - * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} - */ - widthMultiplier: ScalarValue - unk_ds3_p1_2: ScalarValue - unk_ds3_p1_3: ScalarValue - /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link color2} - * - {@link color3} - */ - color1: Vector4Value - /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. - * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} - * - * See also: - * - {@link color1} - * - {@link color3} - */ - color2: Vector4Value - /** - * Color multiplier. - * - * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link color1} - * - {@link color2} - */ - color3: Vector4Value - /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. - * - * Values above this threshold will be stretched to fill the alpha range, so values near the threshold will be less visible, creating a smooth transition between the parts that have been hidden by the threshold and the ones that are still visible. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - alphaFadeThreshold: ScalarValue - /** - * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. - * - * Seemingly identical to {@link frameIndexOffset}? The sum of these two properties is the actual frame index that gets used. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - frameIndex: ScalarValue - /** - * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - frameIndexOffset: ScalarValue - /** - * Controls how much of the texture's width is used per segment. If {@link attachedUV} is enabled, this instead controls how much of the texture's width to use for the entire trail. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - textureFraction: ScalarValue - /** - * Controls how fast the UV coordinates should move horizontally. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - speedU: ScalarValue - /** - * Controls how much the UV coordinates should be randomly offset by per segment. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - varianceV: ScalarValue - unk_ds3_p1_13: ScalarValue - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - rgbMultiplier: ScalarValue - /** - * Alpha multiplier. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaMultiplier: ScalarValue - /** - * Controls the intensity of the distortion effect. At 0, there is no distortion at all. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link normalMap} - */ - distortionIntensity: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value - /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. - * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the {@link alphaFadeThreshold}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaThreshold: ScalarValue - /** - * Tracer orientation mode. See {@link TracerOrientationMode} for more information. - */ - orientation: TracerOrientationMode - /** - * Normal map texture ID. - * - * This is used to control the distortion effect of the trail. - * - * See also: - * - {@link distortionIntensity} - */ - normalMap: number - /** - * The trail is made up of multiple quads, or *segments*. This controls how many seconds to wait between new segments being created. Lower values produce a smoother trail. - */ - segmentInterval: number - /** - * The trail is made up of multiple quads, or *segments*. This controls how long each segment should last in seconds. - */ - segmentDuration: number - /** - * The trail is made up of multiple quads, or *segments*. This controls how many segments may exist at the same time. - */ - concurrentSegments: number - unk_ds3_f1_7: number - unk_ds3_f1_8: number - unk_ds3_f1_9: number - /** - * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. - * - * See also: - * - {@link totalFrames} - */ - columns: number - /** - * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. - * - * See also: - * - {@link columns} - */ - totalFrames: number - /** - * Controls whether or not the UV of the trail should be attached to the node or not. If it is attached, the texture will slide along the segments to follow the source wherever it moves, as if it was a flag attached to a pole. If it is not attached, the texture will stay where it was when the segment was created, like a skid mark on a road where the road is the segments and the mark is the texture, it wouldn't follow the car/node that made it. - */ - attachedUV: boolean - unk_ds3_f1_13: number - unk_ds3_f1_14: number - unk_ds3_f1_15: number - unk_er_f1_14: number - unk_er_f1_15: number - unk_er_f1_16: number - unk_ds3_f2_0: number - unk_ds3_f2_1: boolean - unk_ds3_f2_2: number - unk_ds3_f2_3: number - /** - * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - * - * See also: - * - {@link bloomColor} - */ - bloom: boolean - /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - * - * See also: - * - {@link bloom} - */ - bloomColor: Vector4 - unk_ds3_f2_9: number - unk_ds3_f2_10: number - unk_ds3_f2_11: number - unk_ds3_f2_12: number - unk_ds3_f2_13: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minFadeDistance: number - /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minDistance: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxFadeDistance: number - /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxDistance: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} - */ - minDistanceThreshold: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - */ - maxDistanceThreshold: number - unk_ds3_f2_20: number - unk_ds3_f2_21: number - unk_ds3_f2_22: number - unk_ds3_f2_23: number - unk_ds3_f2_24: number - unkDepthBlend1: number - unkDepthBlend2: number - unk_ds3_f2_27: number - unk_ds3_f2_28: number - /** - * Unknown float. - * - * This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. - */ - unk_ds3_f2_29: number - /** - * Controls how dark shaded parts of the trail are. - */ - shadowDarkness: number - unk_sdt_f2_31: number - /** - * Unknown integer. - * - * When set to 1, it seems to stop {@link unk_ds3_f2_29} from doing whatever it is doing, and it can also cause some ugly "outline" effects on things seen through particles. - */ - unk_sdt_f2_32: number - /** - * Specular texture ID. - * - * See also: - * - {@link lighting} - * - {@link glossiness} - * - {@link specularity} - */ - specular: number - /** - * Controls how sharp the specular highlights are. - * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link specularity} - */ - glossiness: number - /** - * Controls how the trail is lit. See {@link LightingMode} for more information. - */ - lighting: LightingMode - unk_sdt_f2_36: number - unk_sdt_f2_37: number - /** - * Controls how bright the specular highlights are. - * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link glossiness} - */ - specularity: number - unk_er_f2_39: number - constructor(props: TracerParams = {}) { - super(ActionType.Tracer, {isAppearance:true,isParticle:true}) - this.assign(props) - } -} - -export interface DistortionParams { - /** - * Blend mode. - * - * **Default**: {@link BlendMode.Normal} - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - blendMode?: BlendMode | ScalarProperty - /** - * X position offset. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - offsetX?: ScalarValue - /** - * Y position offset. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - offsetY?: ScalarValue - /** - * Z position offset. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - offsetZ?: ScalarValue - /** - * The width of the particle. - * - * If {@link uniformScale} is enabled, this also controls the height and depth. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationX} - * - {@link sizeY} - * - {@link sizeZ} - */ - sizeX?: ScalarValue - /** - * The height of the particle. - * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the height, and this property is ignored. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationY} - * - {@link sizeX} - * - {@link sizeZ} - */ - sizeY?: ScalarValue - /** - * The depth of the particle. - * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the depth, and this property is ignored. - * - * If the distortion {@link shape} is set to {@link DistortionShape.Rectangle Rectangle}, this property won't have any effect since the rectangle is 2-dimensional. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationZ} - * - {@link sizeX} - * - {@link sizeY} - */ - sizeZ?: ScalarValue - /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - color?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p1_7?: Vector4Value - /** - * Controls the intensity of the distortion effect. At 0, there is no distortion at all. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - intensity?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_9?: ScalarValue - /** - * Controls the speed of the stirring effect in degrees per second. Requires {@link mode} to be set to {@link DistortionMode.Stir}. - * - * **Default**: `60` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - stirSpeed?: ScalarValue - /** - * The distortion effect is only applied to an ellipse inside the particle. This property controls how large this ellipse is. At 1, it inscribes the particle's rectangle. At values greater than 1, it is the same size as 1, but there might be strange artifacts around the edges of the distortion. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - radius?: ScalarValue - /** - * Horizontal offset for the {@link normalMap normal map}. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - normalMapOffsetU?: ScalarValue - /** - * Vertical offset for the {@link normalMap normal map}. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - normalMapOffsetV?: ScalarValue - /** - * Horizontal offset speed for the {@link normalMap normal map}. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - normalMapSpeedU?: ScalarValue - /** - * Vertical offset speed for the {@link normalMap normal map}. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - normalMapSpeedV?: ScalarValue - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - rgbMultiplier?: ScalarValue - /** - * Alpha multiplier. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaMultiplier?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p2_2?: ScalarValue - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_3?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_4?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_5?: Vector4Value - /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. - * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the alpha *fade* threshold properties in some similar actions. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaThreshold?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_er_p2_7?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_er_p2_8?: ScalarValue - /** - * Controls what type of distortion to apply. See {@link DistortionMode} for more details. - * - * **Default**: {@link DistortionMode.NormalMap} - */ - mode?: DistortionMode - /** - * Controls the shape of the particle. See {@link DistortionShape} for more information. - * - * **Default**: {@link DistortionShape.Rectangle} - */ - shape?: DistortionShape - /** - * Controls the orientation mode for the particles. See {@link OrientationMode} for more information. - * - * **Default**: {@link OrientationMode.CameraPlane} - */ - orientation?: OrientationMode - /** - * Texture ID. - * - * This texture seems to completely hide the distortion effect. It's probably best to just leave it at 0 unless you are trying to figure out how to use it properly. - * - * **Default**: `0` - */ - texture?: number - /** - * Normal map texture ID. - * - * Only used if the distortion {@link mode} is set to something that uses it. - * - * **Default**: `0` - */ - normalMap?: number - /** - * Mask texture ID. This texture is used to control the color and opacity of the particle. - * - * **Default**: `0` - */ - mask?: number - /** - * Each particle will pick a random number between this value and 1, and the width of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly thinner, down to half width. Setting it to 2 will make them randomly wider, up to double width. - * - * If {@link uniformScale} is enabled, this also affects the height. - * - * **Default**: `1` - * - * See also: - * - {@link scaleVariationY} - * - {@link scaleVariationZ} - */ - scaleVariationX?: number - /** - * Each particle will pick a random number between this value and 1, and the height of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shorter, down to half height. Setting it to 2 will make them randomly taller, up to double height. - * - * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the height, and this field is ignored. - * - * **Default**: `1` - * - * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationZ} - */ - scaleVariationY?: number - /** - * Each particle will pick a random number between this value and 1, and the depth of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shallower, down to half depth. Setting it to 2 will make them randomly deeper, up to double depth. - * - * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the depth, and this field is ignored. - * - * **Default**: `1` - * - * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationY} - */ - scaleVariationZ?: number - /** - * If enabled, the particle X scale-related properties and fields will control the scale in all axes, and the Y and Z counterparts will be ignored. - * - * **Default**: `false` - * - * See also: - * - {@link sizeX} - * - {@link sizeY} - * - {@link sizeZ} - * - {@link scaleVariationX} - * - {@link scaleVariationY} - * - {@link scaleVariationZ} - */ - uniformScale?: boolean - /** - * Unknown integer. - * - * **Default**: `-2` - */ - unk_ds3_f1_11?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_12?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_er_f1_12?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_er_f1_13?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_0?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_1?: number - /** - * Unknown integer. - * - * **Default**: `8` - */ - unk_ds3_f2_2?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f2_3?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_4?: number - /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - * - * **Default**: `[1, 1, 1, 0]` - */ - bloomColor?: Vector4 - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_9?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_10?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_11?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_12?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_13?: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * **Default**: `-1` - * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minFadeDistance?: number - /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minDistance?: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxFadeDistance?: number - /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxDistance?: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} - */ - minDistanceThreshold?: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - */ - maxDistanceThreshold?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f2_20?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_21?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_22?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_23?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_24?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unkDepthBlend1?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unkDepthBlend2?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_ds3_f2_27?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_28?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_29?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_sdt_f2_30?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f2_31?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f2_32?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f2_33?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_sdt_f2_34?: number - /** - * Unknown integer. - * - * **Default**: `-1` - */ - unk_sdt_f2_35?: number - /** - * Unknown integer. - * - * **Default**: `-2` - */ - unk_sdt_f2_36?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f2_37?: number - /** - * Unknown float. - * - * This seems to be something distance or depth-related. It's using the same length units as everything else (meters), and seems to be some sort of threshold or maybe offset for something. When the camera is within this distance from the node, the distortion will also affect other particles seen through it. - * - * **Default**: `0` - */ - unk_sdt_f2_38?: number -} - -/** - * ### {@link ActionType.Distortion Action 607 - Distortion} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * A particle that distorts anything seen through it. - * - * Note: This particle is not visible if the "Effects" setting is set to "Low". - */ -class Distortion extends DataAction { - declare readonly type: ActionType.Distortion - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} - /** - * Blend mode. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - blendMode: BlendMode | ScalarProperty - /** - * X position offset. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - offsetX: ScalarValue - /** - * Y position offset. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - offsetY: ScalarValue - /** - * Z position offset. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - offsetZ: ScalarValue - /** - * The width of the particle. - * - * If {@link uniformScale} is enabled, this also controls the height and depth. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationX} - * - {@link sizeY} - * - {@link sizeZ} - */ - sizeX: ScalarValue - /** - * The height of the particle. - * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the height, and this property is ignored. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationY} - * - {@link sizeX} - * - {@link sizeZ} - */ - sizeY: ScalarValue - /** - * The depth of the particle. - * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the depth, and this property is ignored. - * - * If the distortion {@link shape} is set to {@link DistortionShape.Rectangle Rectangle}, this property won't have any effect since the rectangle is 2-dimensional. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationZ} - * - {@link sizeX} - * - {@link sizeY} - */ - sizeZ: ScalarValue - /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - color: Vector4Value - unk_ds3_p1_7: Vector4Value - /** - * Controls the intensity of the distortion effect. At 0, there is no distortion at all. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - intensity: ScalarValue - unk_ds3_p1_9: ScalarValue - /** - * Controls the speed of the stirring effect in degrees per second. Requires {@link mode} to be set to {@link DistortionMode.Stir}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - stirSpeed: ScalarValue - /** - * The distortion effect is only applied to an ellipse inside the particle. This property controls how large this ellipse is. At 1, it inscribes the particle's rectangle. At values greater than 1, it is the same size as 1, but there might be strange artifacts around the edges of the distortion. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - radius: ScalarValue - /** - * Horizontal offset for the {@link normalMap normal map}. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - normalMapOffsetU: ScalarValue - /** - * Vertical offset for the {@link normalMap normal map}. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - normalMapOffsetV: ScalarValue - /** - * Horizontal offset speed for the {@link normalMap normal map}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - normalMapSpeedU: ScalarValue - /** - * Vertical offset speed for the {@link normalMap normal map}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - normalMapSpeedV: ScalarValue - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - rgbMultiplier: ScalarValue - /** - * Alpha multiplier. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaMultiplier: ScalarValue - unk_ds3_p2_2: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value - /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. - * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the alpha *fade* threshold properties in some similar actions. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaThreshold: ScalarValue - unk_er_p2_7: ScalarValue - unk_er_p2_8: ScalarValue - /** - * Controls what type of distortion to apply. See {@link DistortionMode} for more details. - */ - mode: DistortionMode - /** - * Controls the shape of the particle. See {@link DistortionShape} for more information. - */ - shape: DistortionShape - /** - * Controls the orientation mode for the particles. See {@link OrientationMode} for more information. - */ - orientation: OrientationMode - /** - * Texture ID. - * - * This texture seems to completely hide the distortion effect. It's probably best to just leave it at 0 unless you are trying to figure out how to use it properly. - */ - texture: number - /** - * Normal map texture ID. - * - * Only used if the distortion {@link mode} is set to something that uses it. - */ - normalMap: number - /** - * Mask texture ID. This texture is used to control the color and opacity of the particle. - */ - mask: number - /** - * Each particle will pick a random number between this value and 1, and the width of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly thinner, down to half width. Setting it to 2 will make them randomly wider, up to double width. - * - * If {@link uniformScale} is enabled, this also affects the height. - * - * See also: - * - {@link scaleVariationY} - * - {@link scaleVariationZ} - */ - scaleVariationX: number - /** - * Each particle will pick a random number between this value and 1, and the height of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shorter, down to half height. Setting it to 2 will make them randomly taller, up to double height. - * - * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the height, and this field is ignored. - * - * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationZ} - */ - scaleVariationY: number - /** - * Each particle will pick a random number between this value and 1, and the depth of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shallower, down to half depth. Setting it to 2 will make them randomly deeper, up to double depth. - * - * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the depth, and this field is ignored. - * - * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationY} - */ - scaleVariationZ: number - /** - * If enabled, the particle X scale-related properties and fields will control the scale in all axes, and the Y and Z counterparts will be ignored. - * - * See also: - * - {@link sizeX} - * - {@link sizeY} - * - {@link sizeZ} - * - {@link scaleVariationX} - * - {@link scaleVariationY} - * - {@link scaleVariationZ} - */ - uniformScale: boolean - unk_ds3_f1_11: number - unk_ds3_f1_12: number - unk_er_f1_12: number - unk_er_f1_13: number - unk_ds3_f2_0: number - unk_ds3_f2_1: number - unk_ds3_f2_2: number - unk_ds3_f2_3: number - unk_ds3_f2_4: number - /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - */ - bloomColor: Vector4 - unk_ds3_f2_9: number - unk_ds3_f2_10: number - unk_ds3_f2_11: number - unk_ds3_f2_12: number - unk_ds3_f2_13: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minFadeDistance: number - /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minDistance: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxFadeDistance: number - /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxDistance: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} - */ - minDistanceThreshold: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - */ - maxDistanceThreshold: number - unk_ds3_f2_20: number - unk_ds3_f2_21: number - unk_ds3_f2_22: number - unk_ds3_f2_23: number - unk_ds3_f2_24: number - unkDepthBlend1: number - unkDepthBlend2: number - unk_ds3_f2_27: number - unk_ds3_f2_28: number - unk_ds3_f2_29: number - unk_sdt_f2_30: number - unk_sdt_f2_31: number - unk_sdt_f2_32: number - unk_sdt_f2_33: number - unk_sdt_f2_34: number - unk_sdt_f2_35: number - unk_sdt_f2_36: number - unk_sdt_f2_37: number - /** - * Unknown float. - * - * This seems to be something distance or depth-related. It's using the same length units as everything else (meters), and seems to be some sort of threshold or maybe offset for something. When the camera is within this distance from the node, the distortion will also affect other particles seen through it. - */ - unk_sdt_f2_38: number - constructor(props: DistortionParams = {}) { - super(ActionType.Distortion, {isAppearance:true,isParticle:true}) - this.assign(props) - } -} - -export interface RadialBlurParams { - /** - * Blend mode. - * - * **Default**: {@link BlendMode.Normal} - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - blendMode?: BlendMode | ScalarProperty - /** - * Mask texture ID. This texture is used to control the opacity of the particle. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - mask?: ScalarValue - /** - * X position offset. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link offsetY} - * - {@link offsetZ} - */ - offsetX?: ScalarValue - /** - * Y position offset. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link offsetX} - * - {@link offsetZ} - */ - offsetY?: ScalarValue - /** - * Z position offset. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link offsetX} - * - {@link offsetY} - */ - offsetZ?: ScalarValue - /** - * The width of the particle. - * - * If {@link uniformScale} is enabled, this also controls the height. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link height} - */ - width?: ScalarValue - /** - * The height of the particle. - * - * If {@link uniformScale} is enabled, {@link width} also controls the height, and this property is ignored. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link width} - */ - height?: ScalarValue - /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - color?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p1_6?: Vector4Value - /** - * Controls the amount of blur to apply. Values greater than 1 may appear glitchy. - * - * **Default**: `0.5` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - blurRadius?: ScalarValue - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - rgbMultiplier?: ScalarValue - /** - * Alpha multiplier. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaMultiplier?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p2_2?: ScalarValue - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_3?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_4?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_5?: Vector4Value - /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. - * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the alpha *fade* threshold properties in some similar actions. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaThreshold?: ScalarValue - /** - * If enabled, the particle width-related properties and fields will control both the width and height of the particles, and the height counterparts will be ignored. - * - * **Default**: `false` - * - * See also: - * - {@link width} - * - {@link height} - */ - uniformScale?: boolean - /** - * Controls how many times to apply the effect. Higher values can have a significant impact on performance. - * - * **Default**: `1` - */ - iterations?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_4?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_er_f1_3?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_er_f1_4?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_0?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_1?: number - /** - * Unknown integer. - * - * **Default**: `8` - */ - unk_ds3_f2_2?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f2_3?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_4?: number - /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - * - * **Default**: `[1, 1, 1, 0]` - */ - bloomColor?: Vector4 - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_9?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_10?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_11?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_12?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_13?: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * **Default**: `-1` - * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minFadeDistance?: number - /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minDistance?: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxFadeDistance?: number - /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxDistance?: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} - */ - minDistanceThreshold?: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - */ - maxDistanceThreshold?: number - /** - * Unknown float. - * - * **Default**: `0.5` - */ - unk_ds3_f2_20?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_ds3_f2_21?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f2_22?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_23?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_24?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unkDepthBlend1?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unkDepthBlend2?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_ds3_f2_27?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_28?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f2_29?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_sdt_f2_30?: number -} - -/** - * ### {@link ActionType.RadialBlur Action 608 - RadialBlur} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * A particle that applies a radial blur to anything seen through it. - * - * Note: This particle is not visible if the "Effects" setting is set to "Low". - */ -class RadialBlur extends DataAction { - declare readonly type: ActionType.RadialBlur - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} - /** - * Blend mode. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - blendMode: BlendMode | ScalarProperty - /** - * Mask texture ID. This texture is used to control the opacity of the particle. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - mask: ScalarValue - /** - * X position offset. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link offsetY} - * - {@link offsetZ} - */ - offsetX: ScalarValue - /** - * Y position offset. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link offsetX} - * - {@link offsetZ} - */ - offsetY: ScalarValue - /** - * Z position offset. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link offsetX} - * - {@link offsetY} - */ - offsetZ: ScalarValue - /** - * The width of the particle. - * - * If {@link uniformScale} is enabled, this also controls the height. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link height} - */ - width: ScalarValue - /** - * The height of the particle. - * - * If {@link uniformScale} is enabled, {@link width} also controls the height, and this property is ignored. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link width} - */ - height: ScalarValue - /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. There are no unrestricted color properties in this action, but {@link rgbMultiplier} and {@link alphaMultiplier} can be used to scale the colors. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - color: Vector4Value - unk_ds3_p1_6: Vector4Value - /** - * Controls the amount of blur to apply. Values greater than 1 may appear glitchy. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - blurRadius: ScalarValue - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - rgbMultiplier: ScalarValue - /** - * Alpha multiplier. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaMultiplier: ScalarValue - unk_ds3_p2_2: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value - /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. - * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the alpha *fade* threshold properties in some similar actions. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - alphaThreshold: ScalarValue - /** - * If enabled, the particle width-related properties and fields will control both the width and height of the particles, and the height counterparts will be ignored. - * - * See also: - * - {@link width} - * - {@link height} - */ - uniformScale: boolean - /** - * Controls how many times to apply the effect. Higher values can have a significant impact on performance. - */ - iterations: number - unk_ds3_f1_4: number - unk_er_f1_3: number - unk_er_f1_4: number - unk_ds3_f2_0: number - unk_ds3_f2_1: number - unk_ds3_f2_2: number - unk_ds3_f2_3: number - unk_ds3_f2_4: number - /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - */ - bloomColor: Vector4 - unk_ds3_f2_9: number - unk_ds3_f2_10: number - unk_ds3_f2_11: number - unk_ds3_f2_12: number - unk_ds3_f2_13: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minFadeDistance: number - /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minDistance: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxFadeDistance: number - /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxDistance: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} - */ - minDistanceThreshold: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - */ - maxDistanceThreshold: number - unk_ds3_f2_20: number - unk_ds3_f2_21: number - unk_ds3_f2_22: number - unk_ds3_f2_23: number - unk_ds3_f2_24: number - unkDepthBlend1: number - unkDepthBlend2: number - unk_ds3_f2_27: number - unk_ds3_f2_28: number - unk_ds3_f2_29: number - unk_sdt_f2_30: number - constructor(props: RadialBlurParams = {}) { - super(ActionType.RadialBlur, {isAppearance:true,isParticle:true}) - this.assign(props) - } -} - -export interface PointLightParams { - /** - * Controls the diffuse color of the light. - * - * Values in this are unrestricted and can go above 1. - * - * If {@link separateSpecular} is disabled, this also controls the specular color of the light. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link specularColor} - */ - diffuseColor?: Vector4Value - /** - * Controls the specular color of the light. - * - * Values in this are unrestricted and can go above 1. - * - * If {@link separateSpecular} is disabled, this property is ignored and {@link diffuseColor} controls both the diffuse as well as the specular color. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - specularColor?: Vector4Value - /** - * The maximum distance that the light may travel from the source, and the radius of the sphere in which other effects caused by the light source (for example {@link volumeDensity} and its related fields) may act. - * - * **Default**: `10` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - radius?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_3?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_4?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_5?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_6?: ScalarValue - /** - * Unknown. - * - * **Default**: `10` - */ - unk_ds3_p1_7?: ScalarValue - /** - * Unknown. - * - * **Default**: `10` - */ - unk_ds3_p1_8?: ScalarValue - /** - * Unknown. - * - * **Default**: `10` - */ - unk_ds3_p1_9?: ScalarValue - /** - * Affects the falloff of the light in some way, and how the normal of surfaces affect the intensity of the light. - * - At 0 or negative values, this completely disabled the light. - * - At 1, the light behaves like you would expect. - * - At values between 0 and 1, it seemingly makes the falloff of the light over distance stronger, so the light will sooner fade to nothing. - * - At values greater than 1, it will make the falloff weaker until near the {@link radius maximum distance}, and then it will very quickly fade to nothing. It also makes the normal of the surfaces hit by the light matter less. At very high values, anything within the radius basically becomes full bright. - * - * **Default**: `1` - * - * See also: - * - {@link falloffExponent} - */ - unk_ds3_p2_0?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_ds3_p2_1?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_sdt_p2_2?: ScalarValue - /** - * A scalar multiplier for the {@link diffuseColor diffuse color}. Good for easily adjusting the brightness of the light without changing the color. - * - * If {@link separateSpecular} is disabled, this also affects the specular color of the light. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - diffuseMultiplier?: ScalarValue - /** - * A scalar multiplier for the {@link specularColor specular color}. - * - * If {@link separateSpecular} is disabled, this property is ignored. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - specularMultiplier?: ScalarValue - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_0?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_1?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_0?: number - /** - * Toggles the jitter and flicker animations for the light. - * - * **Default**: `false` - * - * See also: - * - {@link jitterAcceleration} - * - {@link jitterX} - * - {@link jitterY} - * - {@link jitterZ} - * - {@link flickerIntervalMin} - * - {@link flickerIntervalMax} - * - {@link flickerBrightness} - */ - jitterAndFlicker?: boolean - /** - * Controls the acceleration of the jittering. - * - * **Default**: `1` - * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterX} - * - {@link jitterY} - * - {@link jitterZ} - */ - jitterAcceleration?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f2_3?: number - /** - * Controls how much the light should move around randomly on the X-axis. - * - * **Default**: `0` - * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterY} - * - {@link jitterZ} - */ - jitterX?: number - /** - * Controls how much the light should move around randomly on the Y-axis. - * - * **Default**: `0` - * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterX} - * - {@link jitterZ} - */ - jitterY?: number - /** - * Controls how much the light should move around randomly on the Z-axis. - * - * **Default**: `0` - * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterX} - * - {@link jitterY} - */ - jitterZ?: number - /** - * Controls the minimum interval for flickering. - * - * **Default**: `0` - * - * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMax} - * - {@link flickerBrightness} - */ - flickerIntervalMin?: number - /** - * Controls the maximum interval for flickering. - * - * **Default**: `1` - * - * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMin} - * - {@link flickerBrightness} - */ - flickerIntervalMax?: number - /** - * Brightness multiplier for the light when it flickers. - * - * **Default**: `0.5` - * - * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMin} - * - {@link flickerIntervalMax} - */ - flickerBrightness?: number - /** - * Controls if the light should have shadows or not. - * - * Note: Map objects also have a setting for casting shadows, and both must be enabled for an object to cast shadows from the light source. - * - * **Default**: `false` - */ - shadows?: boolean - /** - * When enabled, this allows other properties and fields of the action to control the specular color independently of the diffuse color. When disabled, the diffuse counterpart of the properties or fields will affect both the diffuse and specular color. - * - * **Default**: `false` - * - * See also: - * - {@link diffuseColor} - * - {@link specularColor} - * - {@link diffuseMultiplier} - * - {@link specularMultiplier} - */ - separateSpecular?: boolean - /** - * The number of seconds the light takes to fade to nothing after being destroyed. - * - * Due to how the field this represents works, the time will be rounded to the nearest multiple of 1/30s. - * - * **Default**: `0` - */ - fadeOutTime?: number - /** - * Controls how dark shadows from this light source are. At 0, the shadows will be entirely invisible. - * - * **Default**: `1` - */ - shadowDarkness?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_15?: number - /** - * Unknown integer. - * - * **Default**: `2` - */ - unk_ds3_f2_16?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_ds3_f2_17?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f2_18?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f2_19?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f2_20?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_21?: number - /** - * Unknown integer. - * - * **Default**: `100` - */ - unk_ds3_f2_22?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_23?: number - /** - * Controls the maximum distance for the light source to be active. If the camera is farther away from the light source than this distance, it will stop emitting light. - * - * Setting this to `0` will disable the distance limit. - * - * **Default**: `0` - */ - maxViewDistance?: number - /** - * Controls the density of some sort of fake fog in the volume hit by the light. The fog does not affect the actual light produced by the source and is not affected by shadows. - * - * **Default**: `0` - * - * See also: - * - {@link phaseFunction} - * - {@link asymmetryParam} - */ - volumeDensity?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_sdt_f2_25?: number - /** - * Controls whether or not {@link asymmetryParam} affects the fake fog from {@link volumeDensity}. - * - * **Default**: `true` - */ - phaseFunction?: boolean - /** - * Controls how the fake fog from {@link volumeDensity} scatters the light. This value is ignored if {@link phaseFunction} is disabled, and the fog will scatter the light equally in all directions. - * - * - At 0, the light is scattered equally in every direction. - * - As the value approaches 1, the light is scattered more and more forward, in the same direction as the light was already traveling. This means that the fake fog will be less visible from the side or behind, and more visible from in front of the light. - * - At 1, the fog will not scatter the light at all, so it will be entirely invisible. - * - Values above 1 produce unnatural-looking effects where the light darkens the fog instead. - * - * **Default**: `0.75` - */ - asymmetryParam?: number - /** - * Controls the falloff exponent of the light. - * - * Note: This is possibly something else, but the behavior is pretty similar to a falloff exponent in a few ways. - * - * **Default**: `1` - * - * See also: - * - {@link unk_ds3_p2_0} - */ - falloffExponent?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_er_f2_29?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_er_f2_30?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_er_f2_31?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_er_f2_32?: number - /** - * Unknown. Only used in Dark Souls 3. - * - * **Default**: `1` - */ - unk_ds3_f2_12?: number -} - -/** - * ### {@link ActionType.PointLight Action 609 - PointLight} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * Point light source. - */ -class PointLight extends DataAction { - declare readonly type: ActionType.PointLight - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} - /** - * Controls the diffuse color of the light. - * - * Values in this are unrestricted and can go above 1. - * - * If {@link separateSpecular} is disabled, this also controls the specular color of the light. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link specularColor} - */ - diffuseColor: Vector4Value - /** - * Controls the specular color of the light. - * - * Values in this are unrestricted and can go above 1. - * - * If {@link separateSpecular} is disabled, this property is ignored and {@link diffuseColor} controls both the diffuse as well as the specular color. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - specularColor: Vector4Value - /** - * The maximum distance that the light may travel from the source, and the radius of the sphere in which other effects caused by the light source (for example {@link volumeDensity} and its related fields) may act. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - radius: ScalarValue - unk_ds3_p1_3: ScalarValue - unk_ds3_p1_4: ScalarValue - unk_ds3_p1_5: ScalarValue - unk_ds3_p1_6: ScalarValue - unk_ds3_p1_7: ScalarValue - unk_ds3_p1_8: ScalarValue - unk_ds3_p1_9: ScalarValue - /** - * Affects the falloff of the light in some way, and how the normal of surfaces affect the intensity of the light. - * - At 0 or negative values, this completely disabled the light. - * - At 1, the light behaves like you would expect. - * - At values between 0 and 1, it seemingly makes the falloff of the light over distance stronger, so the light will sooner fade to nothing. - * - At values greater than 1, it will make the falloff weaker until near the {@link radius maximum distance}, and then it will very quickly fade to nothing. It also makes the normal of the surfaces hit by the light matter less. At very high values, anything within the radius basically becomes full bright. - * - * See also: - * - {@link falloffExponent} - */ - unk_ds3_p2_0: ScalarValue - unk_ds3_p2_1: ScalarValue - unk_sdt_p2_2: ScalarValue - /** - * A scalar multiplier for the {@link diffuseColor diffuse color}. Good for easily adjusting the brightness of the light without changing the color. - * - * If {@link separateSpecular} is disabled, this also affects the specular color of the light. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - diffuseMultiplier: ScalarValue - /** - * A scalar multiplier for the {@link specularColor specular color}. - * - * If {@link separateSpecular} is disabled, this property is ignored. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - specularMultiplier: ScalarValue - unk_ds3_f1_0: number - unk_ds3_f1_1: number - unk_ds3_f2_0: number - /** - * Toggles the jitter and flicker animations for the light. - * - * See also: - * - {@link jitterAcceleration} - * - {@link jitterX} - * - {@link jitterY} - * - {@link jitterZ} - * - {@link flickerIntervalMin} - * - {@link flickerIntervalMax} - * - {@link flickerBrightness} - */ - jitterAndFlicker: boolean - /** - * Controls the acceleration of the jittering. - * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterX} - * - {@link jitterY} - * - {@link jitterZ} - */ - jitterAcceleration: number - unk_ds3_f2_3: number - /** - * Controls how much the light should move around randomly on the X-axis. - * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterY} - * - {@link jitterZ} - */ - jitterX: number - /** - * Controls how much the light should move around randomly on the Y-axis. - * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterX} - * - {@link jitterZ} - */ - jitterY: number - /** - * Controls how much the light should move around randomly on the Z-axis. - * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterX} - * - {@link jitterY} - */ - jitterZ: number - /** - * Controls the minimum interval for flickering. - * - * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMax} - * - {@link flickerBrightness} - */ - flickerIntervalMin: number - /** - * Controls the maximum interval for flickering. - * - * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMin} - * - {@link flickerBrightness} - */ - flickerIntervalMax: number - /** - * Brightness multiplier for the light when it flickers. - * - * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMin} - * - {@link flickerIntervalMax} - */ - flickerBrightness: number - /** - * Controls if the light should have shadows or not. - * - * Note: Map objects also have a setting for casting shadows, and both must be enabled for an object to cast shadows from the light source. - */ - shadows: boolean - /** - * When enabled, this allows other properties and fields of the action to control the specular color independently of the diffuse color. When disabled, the diffuse counterpart of the properties or fields will affect both the diffuse and specular color. - * - * See also: - * - {@link diffuseColor} - * - {@link specularColor} - * - {@link diffuseMultiplier} - * - {@link specularMultiplier} - */ - separateSpecular: boolean - /** - * The number of seconds the light takes to fade to nothing after being destroyed. - * - * Due to how the field this represents works, the time will be rounded to the nearest multiple of 1/30s. - */ - fadeOutTime: number - /** - * Controls how dark shadows from this light source are. At 0, the shadows will be entirely invisible. - */ - shadowDarkness: number - unk_ds3_f2_15: number - unk_ds3_f2_16: number - unk_ds3_f2_17: number - unk_ds3_f2_18: number - unk_ds3_f2_19: number - unk_ds3_f2_20: number - unk_ds3_f2_21: number - unk_ds3_f2_22: number - unk_ds3_f2_23: number - /** - * Controls the maximum distance for the light source to be active. If the camera is farther away from the light source than this distance, it will stop emitting light. - * - * Setting this to `0` will disable the distance limit. - */ - maxViewDistance: number - /** - * Controls the density of some sort of fake fog in the volume hit by the light. The fog does not affect the actual light produced by the source and is not affected by shadows. - * - * See also: - * - {@link phaseFunction} - * - {@link asymmetryParam} - */ - volumeDensity: number - unk_sdt_f2_25: number - /** - * Controls whether or not {@link asymmetryParam} affects the fake fog from {@link volumeDensity}. - */ - phaseFunction: boolean - /** - * Controls how the fake fog from {@link volumeDensity} scatters the light. This value is ignored if {@link phaseFunction} is disabled, and the fog will scatter the light equally in all directions. - * - * - At 0, the light is scattered equally in every direction. - * - As the value approaches 1, the light is scattered more and more forward, in the same direction as the light was already traveling. This means that the fake fog will be less visible from the side or behind, and more visible from in front of the light. - * - At 1, the fog will not scatter the light at all, so it will be entirely invisible. - * - Values above 1 produce unnatural-looking effects where the light darkens the fog instead. - */ - asymmetryParam: number - /** - * Controls the falloff exponent of the light. - * - * Note: This is possibly something else, but the behavior is pretty similar to a falloff exponent in a few ways. - * - * See also: - * - {@link unk_ds3_p2_0} - */ - falloffExponent: number - unk_er_f2_29: number - unk_er_f2_30: number - unk_er_f2_31: number - unk_er_f2_32: number - /** - * Unknown. Only used in Dark Souls 3. - */ - unk_ds3_f2_12: number - constructor(props: PointLightParams = {}) { - super(ActionType.PointLight, {isAppearance:true,isParticle:false}) - this.assign(props) - } -} - -/** - * ### {@link ActionType.SimulateTermination Action 700 - SimulateTermination} - * **Slot**: {@link ActionSlots.TerminationAction Termination} - * - * Allows the effect to play out once it terminates. Particle emitters will stop emitting new particles, but particles with a limited duration that have already been emitted will stay around for as long as their duration allows them to. - * - * Note: An effect terminates when it reaches {@link State} -1. - */ -class SimulateTermination extends DataAction { - declare readonly type: ActionType.SimulateTermination - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - - constructor() { - super(ActionType.SimulateTermination, {isAppearance:false,isParticle:false}) - } -} - -/** - * ### {@link ActionType.FadeTermination Action 701 - FadeTermination} - * **Slot**: {@link ActionSlots.TerminationAction Termination} - * - * Allows the effect to continue playing normally after it terminates, but its opacity will gradually fade out over a given duration. - * - * Note: An effect terminates when it reaches {@link State} -1. - */ -class FadeTermination extends DataAction { - declare readonly type: ActionType.FadeTermination - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * The duration of the fade out in seconds. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - duration: ScalarValue - /** - * @param duration The duration of the fade out in seconds. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - constructor(duration: ScalarValue = 1) { - super(ActionType.FadeTermination, {isAppearance:false,isParticle:false}) - this.assign({ duration }) - } -} - -/** - * ### {@link ActionType.InstantTermination Action 702 - InstantTermination} - * **Slot**: {@link ActionSlots.TerminationAction Termination} - * - * Makes the effect instantly disappear when it terminates. - * - * Note: An effect terminates when it reaches {@link State} -1. - */ -class InstantTermination extends DataAction { - declare readonly type: ActionType.InstantTermination - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - - constructor() { - super(ActionType.InstantTermination, {isAppearance:false,isParticle:false}) - } -} - -export interface NodeForceSpeedParams { - /** - * The speed in the direction of the force. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - speed?: ScalarValue - /** - * A multiplier for {@link speed}. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - speedMultiplier?: ScalarValue - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_sdt_f1_0?: number -} - -/** - * ### {@link ActionType.NodeForceSpeed Action 731 - NodeForceSpeed} - * **Slot**: {@link ActionSlots.NodeForceMovementAction NodeForceMovement} - * - * Controls how the node is affected by forces. For more information about forces that can affect nodes and particles, see: - * - {@link ActionType.CancelForce CancelForce} - * - {@link ActionType.WindForce WindForce} - * - {@link ActionType.GravityForce GravityForce} - * - {@link ActionType.ForceCollision ForceCollision} - * - {@link ActionType.TurbulenceForce TurbulenceForce} - */ -class NodeForceSpeed extends DataAction { - declare readonly type: ActionType.NodeForceSpeed - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * The speed in the direction of the force. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - speed: ScalarValue - /** - * A multiplier for {@link speed}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - speedMultiplier: ScalarValue - unk_sdt_f1_0: number - constructor(props: NodeForceSpeedParams = {}) { - super(ActionType.NodeForceSpeed, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface ParticleForceSpeedParams { - /** - * The speed in the direction of the force. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - speed?: ScalarValue - /** - * A multiplier for {@link speed}. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - speedMultiplier?: ScalarValue - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_sdt_f1_0?: number - /** - * Unknown. 0 and 1 seems to be valid values, while all other values cause the wind to not affect the particles. - * - * **Default**: `0` - */ - unk_sdt_f1_1?: number -} - -/** - * ### {@link ActionType.ParticleForceSpeed Action 732 - ParticleForceSpeed} - * **Slot**: {@link ActionSlots.ParticleForceMovementAction ParticleForceMovement} - * - * Controls how the particles emitted by the node is affected by forces. For more information about forces that can affect nodes and particles, see: - * - {@link ActionType.CancelForce CancelForce} - * - {@link ActionType.WindForce WindForce} - * - {@link ActionType.GravityForce GravityForce} - * - {@link ActionType.ForceCollision ForceCollision} - * - {@link ActionType.TurbulenceForce TurbulenceForce} - */ -class ParticleForceSpeed extends DataAction { - declare readonly type: ActionType.ParticleForceSpeed - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * The speed in the direction of the force. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - speed: ScalarValue - /** - * A multiplier for {@link speed}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - speedMultiplier: ScalarValue - unk_sdt_f1_0: number - /** - * Unknown. 0 and 1 seems to be valid values, while all other values cause the wind to not affect the particles. - */ - unk_sdt_f1_1: number - constructor(props: ParticleForceSpeedParams = {}) { - super(ActionType.ParticleForceSpeed, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface NodeForceAccelerationParams { - /** - * The acceleration in the direction of the force. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - acceleration?: ScalarValue - /** - * A multiplier for {@link acceleration}. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationMultiplier?: ScalarValue - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_sdt_f1_0?: number -} - -/** - * ### {@link ActionType.NodeForceAcceleration Action 733 - NodeForceAcceleration} - * **Slot**: {@link ActionSlots.NodeForceMovementAction NodeForceMovement} - * - * Controls how the node is affected by forces. For more information about forces that can affect nodes and particles, see: - * - {@link ActionType.CancelForce CancelForce} - * - {@link ActionType.WindForce WindForce} - * - {@link ActionType.GravityForce GravityForce} - * - {@link ActionType.ForceCollision ForceCollision} - * - {@link ActionType.TurbulenceForce TurbulenceForce} - */ -class NodeForceAcceleration extends DataAction { - declare readonly type: ActionType.NodeForceAcceleration - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * The acceleration in the direction of the force. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - acceleration: ScalarValue - /** - * A multiplier for {@link acceleration}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationMultiplier: ScalarValue - unk_sdt_f1_0: number - constructor(props: NodeForceAccelerationParams = {}) { - super(ActionType.NodeForceAcceleration, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface ParticleForceAccelerationParams { - /** - * The acceleration in the direction of the force. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - acceleration?: ScalarValue - /** - * A multiplier for {@link acceleration}. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationMultiplier?: ScalarValue - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_sdt_f1_0?: number - /** - * Unknown. 0 and 1 seems to be valid values, while all other values cause the wind to not affect the particles. - * - * **Default**: `0` - */ - unk_sdt_f1_1?: number -} - -/** - * ### {@link ActionType.ParticleForceAcceleration Action 734 - ParticleForceAcceleration} - * **Slot**: {@link ActionSlots.ParticleForceMovementAction ParticleForceMovement} - * - * Controls how the particles emitted by the node is affected by forces. For more information about forces that can affect nodes and particles, see: - * - {@link ActionType.CancelForce CancelForce} - * - {@link ActionType.WindForce WindForce} - * - {@link ActionType.GravityForce GravityForce} - * - {@link ActionType.ForceCollision ForceCollision} - * - {@link ActionType.TurbulenceForce TurbulenceForce} - */ -class ParticleForceAcceleration extends DataAction { - declare readonly type: ActionType.ParticleForceAcceleration - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * The acceleration in the direction of the force. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - acceleration: ScalarValue - /** - * A multiplier for {@link acceleration}. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationMultiplier: ScalarValue - unk_sdt_f1_0: number - /** - * Unknown. 0 and 1 seems to be valid values, while all other values cause the wind to not affect the particles. - */ - unk_sdt_f1_1: number - constructor(props: ParticleForceAccelerationParams = {}) { - super(ActionType.ParticleForceAcceleration, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface ParticleForceCollisionParams { - /** - * The collision radius of the particles. This controls the maximum distance between the particles and a surface they can collide with for a collision to be detected. - * - * **Default**: `1` - */ - radius?: number - /** - * The friction coefficient of the particles. This controls how quickly particles stop while sliding against a surface. - * | Values | Behavior | - * |-|-| - * | <0 | The particles will accelerate as they slide, going faster and faster over time. | - * | 0 | The particles will not decelerate at all as they slide. They will just keep sliding forever unless something else stops them. | - * | 0-1 | The particles will decelerate as they slide, causing them to eventually come to a stop. | - * | ≥1 | The particles will stop immediately if they contact a surface. They may still {@link bounciness bounce}, but they will never slide along the surface. | - * - * **Default**: `0.5` - */ - friction?: number - /** - * The coefficient of restitution of the particles, or how "bouncy" they are. - * | Values | Behavior | - * |-|-| - * | ≤0 | Completely inelastic collision. The particles will not bounce if they hit something. They will just stop or slide. - * | 0-1 | Partially elastic collision. The particles will bounce, but they will lose some energy from the collision, causing them to bounce back at a reduced speed compared to the speed they had before the collision. | - * | 1 | Perfectly elastic collision. No energy is lost from any collision, causing the particles to bounce off at the same speed they hit the surface. | - * | >1 | Hyper-elastic collision. The particles will gain energy from every collision, causing them to speed up every time they collide with something. Hitting something at an angle may in some cases still cause them to lose some energy. | - * - * **Default**: `0.5` - */ - bounciness?: number -} - -/** - * ### {@link ActionType.ParticleForceCollision Action 800 - ParticleForceCollision} - * **Slot**: {@link ActionSlots.ParticleForceMovementAction ParticleForceMovement} - * - * Enables particles emitted by the node to collide with surfaces, and controls how those collisions affect the movement of the particles. - * - * Note that this works very differently from the collision-related fields in the GPU particle appearance actions. The collision detection for those are entriely based on the distances between the camera and everything in its view, so if a particle is farther away from the camera than an object, the particle will be able to collide with it. The collision detection used in this action is based on the real 3D geometry of the scene, so particles can collide with anything, even while they are out of view. - * - * Also note that this action seems to cause the game to crash very easily. If a particle affected by this action despawns due to its limited duration, the game will crash no matter what. - */ -class ParticleForceCollision extends DataAction { - declare readonly type: ActionType.ParticleForceCollision - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * The collision radius of the particles. This controls the maximum distance between the particles and a surface they can collide with for a collision to be detected. - */ - radius: number - /** - * The friction coefficient of the particles. This controls how quickly particles stop while sliding against a surface. - * | Values | Behavior | - * |-|-| - * | <0 | The particles will accelerate as they slide, going faster and faster over time. | - * | 0 | The particles will not decelerate at all as they slide. They will just keep sliding forever unless something else stops them. | - * | 0-1 | The particles will decelerate as they slide, causing them to eventually come to a stop. | - * | ≥1 | The particles will stop immediately if they contact a surface. They may still {@link bounciness bounce}, but they will never slide along the surface. | - */ - friction: number - /** - * The coefficient of restitution of the particles, or how "bouncy" they are. - * | Values | Behavior | - * |-|-| - * | ≤0 | Completely inelastic collision. The particles will not bounce if they hit something. They will just stop or slide. - * | 0-1 | Partially elastic collision. The particles will bounce, but they will lose some energy from the collision, causing them to bounce back at a reduced speed compared to the speed they had before the collision. | - * | 1 | Perfectly elastic collision. No energy is lost from any collision, causing the particles to bounce off at the same speed they hit the surface. | - * | >1 | Hyper-elastic collision. The particles will gain energy from every collision, causing them to speed up every time they collide with something. Hitting something at an angle may in some cases still cause them to lose some energy. | - */ - bounciness: number - constructor(props: ParticleForceCollisionParams = {}) { - super(ActionType.ParticleForceCollision, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface GPUStandardParticleParams { - /** - * Controls how well the particles follow the node if it moves. - * - * **Default**: `0` - */ - particleFollowFactor?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_1?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_2?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_3?: ScalarValue - /** - * Particle acceleration along the X-axis. - * - * **Default**: `0` - * - * See also: - * - {@link particleAccelerationMin} - * - {@link particleAccelerationMax} - */ - particleAccelerationX?: ScalarValue - /** - * Particle acceleration along the Y-axis. - * - * **Default**: `0` - * - * See also: - * - {@link particleAccelerationMin} - * - {@link particleAccelerationMax} - */ - particleAccelerationY?: ScalarValue - /** - * Particle acceleration along the Z-axis. - * - * **Default**: `0` - * - * See also: - * - {@link particleAccelerationMin} - * - {@link particleAccelerationMax} - */ - particleAccelerationZ?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_7?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_8?: ScalarValue - /** - * Angular acceleration for particles around the Z-axis in degrees per second squared. - * - * **Default**: `0` - * - * See also: - * - {@link particleAngularAccelerationMin} - * - {@link particleAngularAccelerationMax} - */ - particleAngularAccelerationZ?: ScalarValue - /** - * The rate of change for the width of the particles. - * - * **Default**: `0` - * - * See also: - * - {@link particleGrowthRateXStatic} - */ - particleGrowthRateX?: ScalarValue - /** - * The rate of change for the height of the particles. - * - * **Default**: `0` - * - * See also: - * - {@link particleGrowthRateYStatic} - */ - particleGrowthRateY?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_12?: ScalarValue - /** - * Color multiplier. - * - * Values in this are unrestricted and can go above 1. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - color?: Vector4Value - /** - * Unknown. - * - * **Default**: `1` - */ - unk_ds3_p1_14?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_15?: ScalarValue - /** - * Seemingly identical to {@link particleAccelerationZ}? - * - * **Default**: `0` - */ - unkParticleAcceleration?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_17?: ScalarValue - /** - * Downwards acceleration for particles. - * - * **Default**: `0` - */ - particleGravity?: ScalarValue - /** - * Maximum random turn angle for particles. Requires {@link particleRandomTurns} to be enabled. - * - * **Default**: `0` - * - * See also: - * - {@link particleRandomTurns} - * - {@link particleRandomTurnIntervalMax} - */ - particleRandomTurnAngle?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_20?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_ds3_p2_0?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_ds3_p2_1?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p2_2?: ScalarValue - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_3?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_4?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_5?: Vector4Value - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p2_6?: ScalarValue - /** - * Unknown integer. - * - * **Default**: `1005` - */ - unk_ds3_f1_0?: number - /** - * The ID of the texture of the particles. - * - * **Default**: `1` - */ - texture?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_2?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - normalMap?: number - /** - * Controls the shape of the particle emitter. See {@link EmitterShape} for more details. - * - * **Default**: {@link EmitterShape.Box} - */ - emitterShape?: EmitterShape - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_5?: number - /** - * The size of the emitter. - * - * **Default**: `[1, 1, 1]` - */ - emitterSize?: Vector3 - /** - * The rotation of the emitter. - * - * **Default**: `[0, 0, 0]` - */ - emitterRotation?: Vector3 - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_12?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_13?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_14?: number - /** - * Controls how the random emission points are distributed within the {@link emitterShape shape of the emitter}. How this works depend on the emitter shape: - * | Shape | Behavior | - * |-|-| - * | {@link EmitterShape.Line Line} | A fraction of the line where particles can not be emitted from.
At 0, particles can be emitted from any point on the line.
At 1, they can only be emitted from the far end of the line. | - * | {@link EmitterShape.Box Box} | A fraction of the box's size where the particles can not be emitted from. Basically an inner box that blocks emission. | - * | {@link EmitterShape.Box2 Box2} | At 1, any point within the box is equally likely to be picked.
At 0, particles are more likely to be emitted near the center, but it's not a 100% chance. | - * | {@link EmitterShape.Unk3 Unk3} | Exactly the same as {@link EmitterShape.Line Line}? | - * | {@link EmitterShape.Cylinder Cylinder} | A fraction of the radius of the cylinder where the particles can not be emitted from. Basically an inner cylinder that blocks emission. | - * - * **Default**: `0` - */ - emitterDistribution?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_16?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_17?: number - /** - * Unknown integer. - * - * **Default**: `-1` - */ - unk_ds3_f1_18?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_19?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_20?: number - /** - * Unknown integer. - * - * **Default**: `100` - */ - unk_ds3_f1_21?: number - /** - * The number of particles to emit per emission. - * - * **Default**: `10` - * - * See also: - * - {@link emissionParticleCountMin} - * - {@link emissionParticleCountMax} - */ - emissionParticleCount?: number - /** - * The minimum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. - * - * **Default**: `0` - * - * See also: - * - {@link emissionParticleCount} - * - {@link emissionParticleCountMax} - */ - emissionParticleCountMin?: number - /** - * The maximum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. - * - * **Default**: `0` - * - * See also: - * - {@link emissionParticleCount} - * - {@link emissionParticleCountMin} - */ - emissionParticleCountMax?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_25?: number - /** - * The minimum time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - * - * **Default**: `1` - * - * See also: - * - {@link emissionIntervalMax} - */ - emissionIntervalMin?: number - /** - * The maximum time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - * - * **Default**: `1` - * - * See also: - * - {@link emissionIntervalMin} - */ - emissionIntervalMax?: number - /** - * If enabled, the number of emissions will be limited by {@link emissionCountLimit}. - * - * **Default**: `false` - */ - limitEmissionCount?: boolean - /** - * The total number of emissions. This limit is only applied if {@link limitEmissionCount} is enabled. - * - * **Default**: `0` - */ - emissionCountLimit?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_30?: number - /** - * The duration of each particle in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - * - * **Default**: `1` - */ - particleDuration?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_32?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_33?: number - /** - * Particle position offset. - * - * **Default**: `[0, 0, 0]` - * - * See also: - * - {@link particleOffsetMin} - * - {@link particleOffsetMax} - */ - particleOffset?: Vector3 - /** - * Minimum particle position offset. A random value between this and {@link particleOffsetMax} will be added to {@link particleOffset} to get the final position offset. - * - * **Default**: `[0, 0, 0]` - */ - particleOffsetMin?: Vector3 - /** - * Maximum particle position offset. A random value between this and {@link particleOffsetMin} will be added to {@link particleOffset} to get the final position offset. - * - * **Default**: `[0, 0, 0]` - */ - particleOffsetMax?: Vector3 - /** - * Particle speed. - * - * **Default**: `[0, 0, 0]` - * - * See also: - * - {@link particleSpeedMin} - * - {@link particleSpeedMax} - */ - particleSpeed?: Vector3 - /** - * Minimum particle speed. A random value between this and {@link particleSpeedMax} will be added to {@link particleSpeed} to get the final speed. - * - * **Default**: `[0, 0, 0]` - */ - particleSpeedMin?: Vector3 - /** - * Maximum particle speed. A random value between this and {@link particleSpeedMin} will be added to {@link particleSpeed} to get the final speed. - * - * **Default**: `[0, 0, 0]` - */ - particleSpeedMax?: Vector3 - /** - * Minimum particle acceleration. A random value between this and {@link particleAccelerationMax} will be added to the three acceleration properties to get the final acceleration. - * - * **Default**: `[0, 0, 0]` - * - * See also: - * - {@link particleAccelerationX} - * - {@link particleAccelerationY} - * - {@link particleAccelerationZ} - */ - particleAccelerationMin?: Vector3 - /** - * Maximum particle acceleration. A random value between this and {@link particleAccelerationMin} will be added to the three acceleration properties to get the final acceleration. - * - * **Default**: `[0, 0, 0]` - * - * See also: - * - {@link particleAccelerationX} - * - {@link particleAccelerationY} - * - {@link particleAccelerationZ} - */ - particleAccelerationMax?: Vector3 - /** - * Maximum amount of random rotation for each particle in degrees. - * - * **Default**: `[0, 0, 0]` - */ - particleRotationVariance?: Vector3 - /** - * Maximum amount of random angular speed for each particle in degrees per second. - * - * **Default**: `[0, 0, 0]` - */ - particleAngularSpeedVariance?: Vector3 - /** - * Minimum amount of random angular acceleration for each particle in degrees per second squared. - * - * **Default**: `[0, 0, 0]` - * - * See also: - * - {@link particleAngularAccelerationMax} - */ - particleAngularAccelerationMin?: Vector3 - /** - * Maximum amount of random angular acceleration for each particle in degrees per second squared. - * - * **Default**: `[0, 0, 0]` - * - * See also: - * - {@link particleAngularAccelerationMin} - */ - particleAngularAccelerationMax?: Vector3 - /** - * When enabled, the height of the particles will be based on the {@link particleSizeX width} instead of the {@link particleSizeY height field}, and the height field is ignored. - * - * **Default**: `false` - * - * See also: - * - {@link particleSizeX} - * - {@link particleSizeY} - * - {@link particleSizeXMin} - * - {@link particleSizeYMin} - * - {@link particleSizeXMax} - * - {@link particleSizeYMax} - * - {@link particleGrowthRateX} - * - {@link particleGrowthRateY} - * - {@link particleGrowthRateXStatic} - * - {@link particleGrowthRateYStatic} - * - {@link particleGrowthAccelerationXMin} - * - {@link particleGrowthAccelerationYMin} - * - {@link particleGrowthAccelerationXMax} - * - {@link particleGrowthAccelerationYMax} - */ - particleUniformScale?: boolean - /** - * The width of the particle. - * - * **Default**: `1` - */ - particleSizeX?: number - /** - * The height of the particle. - * - * **Default**: `1` - */ - particleSizeY?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_73?: number - /** - * The minimum width of the particle. A random value between this and {@link particleSizeXMin} will be added to {@link particleSizeX} to get the final width. - * - * **Default**: `0` - */ - particleSizeXMin?: number - /** - * The minimum height of the particle. A random value between this and {@link particleSizeYMin} will be added to {@link particleSizeY} to get the final height. - * - * **Default**: `0` - */ - particleSizeYMin?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_76?: number - /** - * The maximum width of the particle. A random value between this and {@link particleSizeXMax} will be added to {@link particleSizeX} to get the final width. - * - * **Default**: `0` - */ - particleSizeXMax?: number - /** - * The maximum height of the particle. A random value between this and {@link particleSizeYMax} will be added to {@link particleSizeY} to get the final height. - * - * **Default**: `0` - */ - particleSizeYMax?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_79?: number - /** - * The rate of change for the width of the particles. - * - * **Default**: `0` - * - * See also: - * - {@link particleGrowthRateX} - */ - particleGrowthRateXStatic?: number - /** - * The rate of change for the height of the particles. - * - * **Default**: `0` - * - * See also: - * - {@link particleGrowthRateY} - */ - particleGrowthRateYStatic?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_82?: number - /** - * Minimum rate of change for the width of the particles. A random value between this and {@link particleGrowthRateXMax} will be added to {@link particleGrowthRateX} and {@link particleGrowthRateXStatic} to get the final growth rate. - * - * **Default**: `0` - */ - particleGrowthRateXMin?: number - /** - * Minimum rate of change for the height of the particles. A random value between this and {@link particleGrowthRateYMax} will be added to {@link particleGrowthRateY} and {@link particleGrowthRateYStatic} to get the final growth rate. - * - * **Default**: `0` - */ - particleGrowthRateYMin?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_85?: number - /** - * Maximum rate of change for the width of the particles. A random value between this and {@link particleGrowthRateXMax} will be added to {@link particleGrowthRateX} and {@link particleGrowthRateXStatic} to get the final growth rate. - * - * **Default**: `0` - */ - particleGrowthRateXMax?: number - /** - * Maximum rate of change for the height of the particles. A random value between this and {@link particleGrowthRateYMax} will be added to {@link particleGrowthRateY} and {@link particleGrowthRateYStatic} to get the final growth rate. - * - * **Default**: `0` - */ - particleGrowthRateYMax?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_88?: number - /** - * Minimum acceleration of change for the width of the particles. A random value between this and {@link particleGrowthAccelerationXMax} will be the final growth acceleration. - * - * **Default**: `0` - */ - particleGrowthAccelerationXMin?: number - /** - * Minimum acceleration of change for the height of the particles. A random value between this and {@link particleGrowthAccelerationYMax} will be the final growth acceleration. - * - * **Default**: `0` - */ - particleGrowthAccelerationYMin?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_91?: number - /** - * Minimum acceleration of change for the width of the particles. A random value between this and {@link particleGrowthAccelerationXMin} will be the final growth acceleration. - * - * **Default**: `0` - */ - particleGrowthAccelerationXMax?: number - /** - * Minimum acceleration of change for the height of the particles. A random value between this and {@link particleGrowthAccelerationYMin} will be the final growth acceleration. - * - * **Default**: `0` - */ - particleGrowthAccelerationYMax?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_94?: number - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - * - * **Default**: `1` - */ - rgbMultiplier?: number - /** - * Alpha multiplier. - * - * **Default**: `1` - */ - alphaMultiplier?: number - /** - * Minimum random variation for the particle color. A random value between this and {@link colorMax} will be added to the base {@link color}, but it fades out over the life of the particle. - * - * **Default**: `[0, 0, 0, 0]` - */ - colorMin?: Vector4 - /** - * Maximum random variation for the particle color. A random value between this and {@link colorMin} will be added to the base {@link color}, but it fades out over the life of the particle. - * - * **Default**: `[0, 0, 0, 0]` - */ - colorMax?: Vector4 - /** - * Blend mode. - * - * **Default**: {@link BlendMode.Normal} - */ - blendMode?: BlendMode - /** - * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. - * - * **Default**: `1` - * - * See also: - * - {@link totalFrames} - */ - columns?: number - /** - * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. - * - * **Default**: `1` - * - * See also: - * - {@link columns} - */ - totalFrames?: number - /** - * When enabled, this makes each particle pick a random frame from the animation and only display that one frame. - * - * **Default**: `false` - * - * See also: - * - {@link columns} - * - {@link totalFrames} - * - {@link maxFrameIndex} - */ - randomTextureFrame?: boolean - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_109?: number - /** - * Controls the maximum frame index when {@link randomTextureFrame picking a random frame to display}. - * - * **Default**: `0` - * - * See also: - * - {@link randomTextureFrame} - */ - maxFrameIndex?: number - /** - * Unknown integer. - * - * **Default**: `-1` - */ - unk_ds3_f1_111?: number - /** - * Unknown integer. - * - * **Default**: `-1` - */ - unk_ds3_f1_112?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_113?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_ds3_f1_114?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_115?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_116?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_117?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_118?: number - /** - * Multiplier for {@link particleDuration}. - * - * **Default**: `1` - */ - particleDurationMultiplier?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_120?: number - /** - * Scalar multiplier for the size of the particles. - * - * **Default**: `1` - */ - particleSizeMultiplier?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_122?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_123?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_124?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_125?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_126?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_127?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_128?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_129?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_130?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_131?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_132?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_133?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_134?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_135?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_136?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_137?: number - /** - * Unknown integer. - * - * **Default**: `8` - */ - unk_ds3_f1_138?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_139?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_140?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_141?: number - /** - * If enabled, the particle system stops updating if the camera is beyond the distance specified by {@link updateDistance} from the node. - * - * It will not stop updating immediately after the action becomes active. Instead, it will wait for a little while before stopping if the camera is too far away. - * - * **Default**: `0` - */ - limitUpdateDistance?: boolean - /** - * Controls how close the camera needs to be to the node for the particle system to update. Requires {@link limitUpdateDistance} to be enabled. - * - * **Default**: `0` - */ - updateDistance?: number - /** - * When enabled, this makes the particles bounce off of any surface they hit. This collision detection is just based on the depth buffer, not the full 3D scene, so it is not always perfect. - * - * **Default**: `false` - * - * See also: - * - {@link particleBounciness} - */ - particleCollision?: boolean - /** - * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. - * - * **Default**: `0` - * - * See also: - * - {@link particleCollision} - */ - particleBounciness?: number - /** - * If enabled, particles will randomly make sharp turns that affect the direction of various speed and acceleration properties. Both the time between turns and the turn angle are randomized for each turn and for each particle, and they are based on {@link particleRandomTurnIntervalMax} and {@link particleRandomTurnAngle} respectively. - * - * **Default**: `false` - * - * See also: - * - {@link particleRandomTurnIntervalMax} - * - {@link particleRandomTurnAngle} - */ - particleRandomTurns?: boolean - /** - * The maximum amount of time in seconds to wait between making random turns. Requires {@link particleRandomTurns} to be enabled. - * - * **Default**: `1` - * - * See also: - * - {@link particleRandomTurns} - * - {@link particleRandomTurnAngle} - */ - particleRandomTurnIntervalMax?: number - /** - * If enabled, this causes the particles to orient themselves and stretch in the direction they are moving on the screen, making them almost resemble {@link ActionType.Tracer Tracer} particles. - * - * **Default**: `false` - * - * See also: - * - {@link particleTraceLength} - */ - traceParticles?: boolean - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_149?: number - /** - * Controls how much the particles are stretched when {@link traceParticles} is enabled. - * - * **Default**: `1` - */ - particleTraceLength?: number - /** - * A central fraction of the emitter volume where the particles will not be trace particles. In this volume, the particles act as if {@link traceParticles} is disabled. - * - * **Default**: `0` - */ - traceParticlesThreshold?: number - /** - * If enabled, this will add a billboarding sprite to the leading end of trace particles. - * - * **Default**: `false` - * - * See also: - * - {@link traceParticles} - */ - traceParticleHead?: boolean - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_153?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_154?: number - /** - * Controls whether or not the particles have a bloom effect. - * - * **Default**: `false` - * - * See also: - * - {@link bloomColor} - */ - bloom?: boolean - /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - * - * **Default**: `[1, 1, 1, 0]` - * - * See also: - * - {@link bloom} - */ - bloomColor?: Vector4 - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_sdt_f1_160?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f1_161?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_sdt_f1_162?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_sdt_f1_163?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_sdt_f1_164?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f1_165?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_sdt_f1_166?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_er_f1_167?: number - /** - * Desaturates the particles, making them more grayscale. At 0, the particles will have their regular colors. At 1, they will be entirely grayscale. - * - * **Default**: `0` - */ - desaturate?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_0?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_1?: number - /** - * Unknown integer. - * - * **Default**: `8` - */ - unk_ds3_f2_2?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_3?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_4?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f2_5?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f2_6?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f2_7?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f2_8?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_9?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_10?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_11?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_12?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_13?: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * **Default**: `-1` - * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minFadeDistance?: number - /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minDistance?: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxFadeDistance?: number - /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxDistance?: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} - */ - minDistanceThreshold?: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - */ - maxDistanceThreshold?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_20?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_21?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_22?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_23?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_24?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unkDepthBlend1?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unkDepthBlend2?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_ds3_f2_27?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_28?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_sdt_f2_29?: number - /** - * Controls how dark shaded parts of the particle are. - * - * **Default**: `0` - */ - shadowDarkness?: number - /** - * When set to 1, this stops the particles from being shown indoors. - * - * Other values are used in AC6, but what they do is unknown. - * - * **Default**: `0` - */ - unkHideIndoors?: number - /** - * Unknown integer. - * - * Like in most other actions with this field, when set to 1, it may stop {@link unk_sdt_f2_29} from doing whatever it is doing, but that field may also not work exactly the same in this action, so it's tricky to confirm. It can also cause some ugly "outline" effects on things seen through particles. - * - * **Default**: `0` - */ - unk_sdt_f2_32?: number - /** - * Specular texture ID. - * - * **Default**: `0` - * - * See also: - * - {@link lighting} - * - {@link glossiness} - * - {@link specularity} - */ - specular?: number - /** - * Controls how sharp the specular highlights are. - * - * **Default**: `0.25` - * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link specularity} - */ - glossiness?: number - /** - * Unknown integer. - * - * **Default**: {@link LightingMode.Unlit} - */ - lighting?: LightingMode - /** - * Unknown integer. - * - * **Default**: `-2` - */ - unk_sdt_f2_36?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f2_37?: number - /** - * Controls how bright the specular highlights are. - * - * **Default**: `0.5` - * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link glossiness} - */ - specularity?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_er_f2_39?: number -} - -/** - * ### {@link ActionType.GPUStandardParticle Action 10000 - GPUStandardParticle} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * An entire particle system in a single action. This emits GPU particles, which means thousands of particles can be rendered without much impact on performance. - * - * Note that while this emits particles, it is itself not a particle, and the particles emitted by this action are not affected by everything that affects regular particles. - * - * The name of this action is from Elden Ring's RTTI, where it's called "StandardParticle". - */ -class GPUStandardParticle extends DataAction { - declare readonly type: ActionType.GPUStandardParticle - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} - /** - * Controls how well the particles follow the node if it moves. - */ - particleFollowFactor: ScalarValue - unk_ds3_p1_1: ScalarValue - unk_ds3_p1_2: ScalarValue - unk_ds3_p1_3: ScalarValue - /** - * Particle acceleration along the X-axis. - * - * See also: - * - {@link particleAccelerationMin} - * - {@link particleAccelerationMax} - */ - particleAccelerationX: ScalarValue - /** - * Particle acceleration along the Y-axis. - * - * See also: - * - {@link particleAccelerationMin} - * - {@link particleAccelerationMax} - */ - particleAccelerationY: ScalarValue - /** - * Particle acceleration along the Z-axis. - * - * See also: - * - {@link particleAccelerationMin} - * - {@link particleAccelerationMax} - */ - particleAccelerationZ: ScalarValue - unk_ds3_p1_7: ScalarValue - unk_ds3_p1_8: ScalarValue - /** - * Angular acceleration for particles around the Z-axis in degrees per second squared. - * - * See also: - * - {@link particleAngularAccelerationMin} - * - {@link particleAngularAccelerationMax} - */ - particleAngularAccelerationZ: ScalarValue - /** - * The rate of change for the width of the particles. - * - * See also: - * - {@link particleGrowthRateXStatic} - */ - particleGrowthRateX: ScalarValue - /** - * The rate of change for the height of the particles. - * - * See also: - * - {@link particleGrowthRateYStatic} - */ - particleGrowthRateY: ScalarValue - unk_ds3_p1_12: ScalarValue - /** - * Color multiplier. - * - * Values in this are unrestricted and can go above 1. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - color: Vector4Value - unk_ds3_p1_14: ScalarValue - unk_ds3_p1_15: ScalarValue - /** - * Seemingly identical to {@link particleAccelerationZ}? - */ - unkParticleAcceleration: ScalarValue - unk_ds3_p1_17: ScalarValue - /** - * Downwards acceleration for particles. - */ - particleGravity: ScalarValue - /** - * Maximum random turn angle for particles. Requires {@link particleRandomTurns} to be enabled. - * - * See also: - * - {@link particleRandomTurns} - * - {@link particleRandomTurnIntervalMax} - */ - particleRandomTurnAngle: ScalarValue - unk_ds3_p1_20: ScalarValue - unk_ds3_p2_0: ScalarValue - unk_ds3_p2_1: ScalarValue - unk_ds3_p2_2: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value - unk_ds3_p2_6: ScalarValue - unk_ds3_f1_0: number - /** - * The ID of the texture of the particles. - */ - texture: number - unk_ds3_f1_2: number - normalMap: number - /** - * Controls the shape of the particle emitter. See {@link EmitterShape} for more details. - */ - emitterShape: EmitterShape - unk_ds3_f1_5: number - /** - * The size of the emitter. - */ - emitterSize: Vector3 - /** - * The rotation of the emitter. - */ - emitterRotation: Vector3 - unk_ds3_f1_12: number - unk_ds3_f1_13: number - unk_ds3_f1_14: number - /** - * Controls how the random emission points are distributed within the {@link emitterShape shape of the emitter}. How this works depend on the emitter shape: - * | Shape | Behavior | - * |-|-| - * | {@link EmitterShape.Line Line} | A fraction of the line where particles can not be emitted from.
At 0, particles can be emitted from any point on the line.
At 1, they can only be emitted from the far end of the line. | - * | {@link EmitterShape.Box Box} | A fraction of the box's size where the particles can not be emitted from. Basically an inner box that blocks emission. | - * | {@link EmitterShape.Box2 Box2} | At 1, any point within the box is equally likely to be picked.
At 0, particles are more likely to be emitted near the center, but it's not a 100% chance. | - * | {@link EmitterShape.Unk3 Unk3} | Exactly the same as {@link EmitterShape.Line Line}? | - * | {@link EmitterShape.Cylinder Cylinder} | A fraction of the radius of the cylinder where the particles can not be emitted from. Basically an inner cylinder that blocks emission. | - */ - emitterDistribution: number - unk_ds3_f1_16: number - unk_ds3_f1_17: number - unk_ds3_f1_18: number - unk_ds3_f1_19: number - unk_ds3_f1_20: number - unk_ds3_f1_21: number - /** - * The number of particles to emit per emission. - * - * See also: - * - {@link emissionParticleCountMin} - * - {@link emissionParticleCountMax} - */ - emissionParticleCount: number - /** - * The minimum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. - * - * See also: - * - {@link emissionParticleCount} - * - {@link emissionParticleCountMax} - */ - emissionParticleCountMin: number - /** - * The maximum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. - * - * See also: - * - {@link emissionParticleCount} - * - {@link emissionParticleCountMin} - */ - emissionParticleCountMax: number - unk_ds3_f1_25: number - /** - * The minimum time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - * - * See also: - * - {@link emissionIntervalMax} - */ - emissionIntervalMin: number - /** - * The maximum time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - * - * See also: - * - {@link emissionIntervalMin} - */ - emissionIntervalMax: number - /** - * If enabled, the number of emissions will be limited by {@link emissionCountLimit}. - */ - limitEmissionCount: boolean - /** - * The total number of emissions. This limit is only applied if {@link limitEmissionCount} is enabled. - */ - emissionCountLimit: number - unk_ds3_f1_30: number - /** - * The duration of each particle in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - */ - particleDuration: number - unk_ds3_f1_32: number - unk_ds3_f1_33: number - /** - * Particle position offset. - * - * See also: - * - {@link particleOffsetMin} - * - {@link particleOffsetMax} - */ - particleOffset: Vector3 - /** - * Minimum particle position offset. A random value between this and {@link particleOffsetMax} will be added to {@link particleOffset} to get the final position offset. - */ - particleOffsetMin: Vector3 - /** - * Maximum particle position offset. A random value between this and {@link particleOffsetMin} will be added to {@link particleOffset} to get the final position offset. - */ - particleOffsetMax: Vector3 - /** - * Particle speed. - * - * See also: - * - {@link particleSpeedMin} - * - {@link particleSpeedMax} - */ - particleSpeed: Vector3 - /** - * Minimum particle speed. A random value between this and {@link particleSpeedMax} will be added to {@link particleSpeed} to get the final speed. - */ - particleSpeedMin: Vector3 - /** - * Maximum particle speed. A random value between this and {@link particleSpeedMin} will be added to {@link particleSpeed} to get the final speed. - */ - particleSpeedMax: Vector3 - /** - * Minimum particle acceleration. A random value between this and {@link particleAccelerationMax} will be added to the three acceleration properties to get the final acceleration. - * - * See also: - * - {@link particleAccelerationX} - * - {@link particleAccelerationY} - * - {@link particleAccelerationZ} - */ - particleAccelerationMin: Vector3 - /** - * Maximum particle acceleration. A random value between this and {@link particleAccelerationMin} will be added to the three acceleration properties to get the final acceleration. - * - * See also: - * - {@link particleAccelerationX} - * - {@link particleAccelerationY} - * - {@link particleAccelerationZ} - */ - particleAccelerationMax: Vector3 - /** - * Maximum amount of random rotation for each particle in degrees. - */ - particleRotationVariance: Vector3 - /** - * Maximum amount of random angular speed for each particle in degrees per second. - */ - particleAngularSpeedVariance: Vector3 - /** - * Minimum amount of random angular acceleration for each particle in degrees per second squared. - * - * See also: - * - {@link particleAngularAccelerationMax} - */ - particleAngularAccelerationMin: Vector3 - /** - * Maximum amount of random angular acceleration for each particle in degrees per second squared. - * - * See also: - * - {@link particleAngularAccelerationMin} - */ - particleAngularAccelerationMax: Vector3 - /** - * When enabled, the height of the particles will be based on the {@link particleSizeX width} instead of the {@link particleSizeY height field}, and the height field is ignored. - * - * See also: - * - {@link particleSizeX} - * - {@link particleSizeY} - * - {@link particleSizeXMin} - * - {@link particleSizeYMin} - * - {@link particleSizeXMax} - * - {@link particleSizeYMax} - * - {@link particleGrowthRateX} - * - {@link particleGrowthRateY} - * - {@link particleGrowthRateXStatic} - * - {@link particleGrowthRateYStatic} - * - {@link particleGrowthAccelerationXMin} - * - {@link particleGrowthAccelerationYMin} - * - {@link particleGrowthAccelerationXMax} - * - {@link particleGrowthAccelerationYMax} - */ - particleUniformScale: boolean - /** - * The width of the particle. - */ - particleSizeX: number - /** - * The height of the particle. - */ - particleSizeY: number - unk_ds3_f1_73: number - /** - * The minimum width of the particle. A random value between this and {@link particleSizeXMin} will be added to {@link particleSizeX} to get the final width. - */ - particleSizeXMin: number - /** - * The minimum height of the particle. A random value between this and {@link particleSizeYMin} will be added to {@link particleSizeY} to get the final height. - */ - particleSizeYMin: number - unk_ds3_f1_76: number - /** - * The maximum width of the particle. A random value between this and {@link particleSizeXMax} will be added to {@link particleSizeX} to get the final width. - */ - particleSizeXMax: number - /** - * The maximum height of the particle. A random value between this and {@link particleSizeYMax} will be added to {@link particleSizeY} to get the final height. - */ - particleSizeYMax: number - unk_ds3_f1_79: number - /** - * The rate of change for the width of the particles. - * - * See also: - * - {@link particleGrowthRateX} - */ - particleGrowthRateXStatic: number - /** - * The rate of change for the height of the particles. - * - * See also: - * - {@link particleGrowthRateY} - */ - particleGrowthRateYStatic: number - unk_ds3_f1_82: number - /** - * Minimum rate of change for the width of the particles. A random value between this and {@link particleGrowthRateXMax} will be added to {@link particleGrowthRateX} and {@link particleGrowthRateXStatic} to get the final growth rate. - */ - particleGrowthRateXMin: number - /** - * Minimum rate of change for the height of the particles. A random value between this and {@link particleGrowthRateYMax} will be added to {@link particleGrowthRateY} and {@link particleGrowthRateYStatic} to get the final growth rate. - */ - particleGrowthRateYMin: number - unk_ds3_f1_85: number - /** - * Maximum rate of change for the width of the particles. A random value between this and {@link particleGrowthRateXMax} will be added to {@link particleGrowthRateX} and {@link particleGrowthRateXStatic} to get the final growth rate. - */ - particleGrowthRateXMax: number - /** - * Maximum rate of change for the height of the particles. A random value between this and {@link particleGrowthRateYMax} will be added to {@link particleGrowthRateY} and {@link particleGrowthRateYStatic} to get the final growth rate. - */ - particleGrowthRateYMax: number - unk_ds3_f1_88: number - /** - * Minimum acceleration of change for the width of the particles. A random value between this and {@link particleGrowthAccelerationXMax} will be the final growth acceleration. - */ - particleGrowthAccelerationXMin: number - /** - * Minimum acceleration of change for the height of the particles. A random value between this and {@link particleGrowthAccelerationYMax} will be the final growth acceleration. - */ - particleGrowthAccelerationYMin: number - unk_ds3_f1_91: number - /** - * Minimum acceleration of change for the width of the particles. A random value between this and {@link particleGrowthAccelerationXMin} will be the final growth acceleration. - */ - particleGrowthAccelerationXMax: number - /** - * Minimum acceleration of change for the height of the particles. A random value between this and {@link particleGrowthAccelerationYMin} will be the final growth acceleration. - */ - particleGrowthAccelerationYMax: number - unk_ds3_f1_94: number - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - */ - rgbMultiplier: number - /** - * Alpha multiplier. - */ - alphaMultiplier: number - /** - * Minimum random variation for the particle color. A random value between this and {@link colorMax} will be added to the base {@link color}, but it fades out over the life of the particle. - */ - colorMin: Vector4 - /** - * Maximum random variation for the particle color. A random value between this and {@link colorMin} will be added to the base {@link color}, but it fades out over the life of the particle. - */ - colorMax: Vector4 - /** - * Blend mode. - */ - blendMode: BlendMode - /** - * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. - * - * See also: - * - {@link totalFrames} - */ - columns: number - /** - * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. - * - * See also: - * - {@link columns} - */ - totalFrames: number - /** - * When enabled, this makes each particle pick a random frame from the animation and only display that one frame. - * - * See also: - * - {@link columns} - * - {@link totalFrames} - * - {@link maxFrameIndex} - */ - randomTextureFrame: boolean - unk_ds3_f1_109: number - /** - * Controls the maximum frame index when {@link randomTextureFrame picking a random frame to display}. - * - * See also: - * - {@link randomTextureFrame} - */ - maxFrameIndex: number - unk_ds3_f1_111: number - unk_ds3_f1_112: number - unk_ds3_f1_113: number - unk_ds3_f1_114: number - unk_ds3_f1_115: number - unk_ds3_f1_116: number - unk_ds3_f1_117: number - unk_ds3_f1_118: number - /** - * Multiplier for {@link particleDuration}. - */ - particleDurationMultiplier: number - unk_ds3_f1_120: number - /** - * Scalar multiplier for the size of the particles. - */ - particleSizeMultiplier: number - unk_ds3_f1_122: number - unk_ds3_f1_123: number - unk_ds3_f1_124: number - unk_ds3_f1_125: number - unk_ds3_f1_126: number - unk_ds3_f1_127: number - unk_ds3_f1_128: number - unk_ds3_f1_129: number - unk_ds3_f1_130: number - unk_ds3_f1_131: number - unk_ds3_f1_132: number - unk_ds3_f1_133: number - unk_ds3_f1_134: number - unk_ds3_f1_135: number - unk_ds3_f1_136: number - unk_ds3_f1_137: number - unk_ds3_f1_138: number - unk_ds3_f1_139: number - unk_ds3_f1_140: number - unk_ds3_f1_141: number - /** - * If enabled, the particle system stops updating if the camera is beyond the distance specified by {@link updateDistance} from the node. - * - * It will not stop updating immediately after the action becomes active. Instead, it will wait for a little while before stopping if the camera is too far away. - */ - limitUpdateDistance: boolean - /** - * Controls how close the camera needs to be to the node for the particle system to update. Requires {@link limitUpdateDistance} to be enabled. - */ - updateDistance: number - /** - * When enabled, this makes the particles bounce off of any surface they hit. This collision detection is just based on the depth buffer, not the full 3D scene, so it is not always perfect. - * - * See also: - * - {@link particleBounciness} - */ - particleCollision: boolean - /** - * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. - * - * See also: - * - {@link particleCollision} - */ - particleBounciness: number - /** - * If enabled, particles will randomly make sharp turns that affect the direction of various speed and acceleration properties. Both the time between turns and the turn angle are randomized for each turn and for each particle, and they are based on {@link particleRandomTurnIntervalMax} and {@link particleRandomTurnAngle} respectively. - * - * See also: - * - {@link particleRandomTurnIntervalMax} - * - {@link particleRandomTurnAngle} - */ - particleRandomTurns: boolean - /** - * The maximum amount of time in seconds to wait between making random turns. Requires {@link particleRandomTurns} to be enabled. - * - * See also: - * - {@link particleRandomTurns} - * - {@link particleRandomTurnAngle} - */ - particleRandomTurnIntervalMax: number - /** - * If enabled, this causes the particles to orient themselves and stretch in the direction they are moving on the screen, making them almost resemble {@link ActionType.Tracer Tracer} particles. - * - * See also: - * - {@link particleTraceLength} - */ - traceParticles: boolean - unk_ds3_f1_149: number - /** - * Controls how much the particles are stretched when {@link traceParticles} is enabled. - */ - particleTraceLength: number - /** - * A central fraction of the emitter volume where the particles will not be trace particles. In this volume, the particles act as if {@link traceParticles} is disabled. - */ - traceParticlesThreshold: number - /** - * If enabled, this will add a billboarding sprite to the leading end of trace particles. - * - * See also: - * - {@link traceParticles} - */ - traceParticleHead: boolean - unk_ds3_f1_153: number - unk_ds3_f1_154: number - /** - * Controls whether or not the particles have a bloom effect. - * - * See also: - * - {@link bloomColor} - */ - bloom: boolean - /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - * - * See also: - * - {@link bloom} - */ - bloomColor: Vector4 - unk_sdt_f1_160: number - unk_sdt_f1_161: number - unk_sdt_f1_162: number - unk_sdt_f1_163: number - unk_sdt_f1_164: number - unk_sdt_f1_165: number - unk_sdt_f1_166: number - unk_er_f1_167: number - /** - * Desaturates the particles, making them more grayscale. At 0, the particles will have their regular colors. At 1, they will be entirely grayscale. - */ - desaturate: number - unk_ds3_f2_0: number - unk_ds3_f2_1: number - unk_ds3_f2_2: number - unk_ds3_f2_3: number - unk_ds3_f2_4: number - unk_ds3_f2_5: number - unk_ds3_f2_6: number - unk_ds3_f2_7: number - unk_ds3_f2_8: number - unk_ds3_f2_9: number - unk_ds3_f2_10: number - unk_ds3_f2_11: number - unk_ds3_f2_12: number - unk_ds3_f2_13: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minFadeDistance: number - /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minDistance: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxFadeDistance: number - /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxDistance: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} - */ - minDistanceThreshold: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - */ - maxDistanceThreshold: number - unk_ds3_f2_20: number - unk_ds3_f2_21: number - unk_ds3_f2_22: number - unk_ds3_f2_23: number - unk_ds3_f2_24: number - unkDepthBlend1: number - unkDepthBlend2: number - unk_ds3_f2_27: number - unk_ds3_f2_28: number - unk_sdt_f2_29: number - /** - * Controls how dark shaded parts of the particle are. - */ - shadowDarkness: number - /** - * When set to 1, this stops the particles from being shown indoors. - * - * Other values are used in AC6, but what they do is unknown. - */ - unkHideIndoors: number - /** - * Unknown integer. - * - * Like in most other actions with this field, when set to 1, it may stop {@link unk_sdt_f2_29} from doing whatever it is doing, but that field may also not work exactly the same in this action, so it's tricky to confirm. It can also cause some ugly "outline" effects on things seen through particles. - */ - unk_sdt_f2_32: number - /** - * Specular texture ID. - * - * See also: - * - {@link lighting} - * - {@link glossiness} - * - {@link specularity} - */ - specular: number - /** - * Controls how sharp the specular highlights are. - * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link specularity} - */ - glossiness: number - lighting: LightingMode - unk_sdt_f2_36: number - unk_sdt_f2_37: number - /** - * Controls how bright the specular highlights are. - * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link glossiness} - */ - specularity: number - unk_er_f2_39: number - constructor(props: GPUStandardParticleParams = {}) { - super(ActionType.GPUStandardParticle, {isAppearance:true,isParticle:false}) - this.assign(props) - } -} - -export interface GPUStandardCorrectParticleParams { - /** - * Controls how well the particles follow the node if it moves. - * - * **Default**: `0` - */ - particleFollowFactor?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_1?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_2?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_3?: ScalarValue - /** - * Particle acceleration along the X-axis. - * - * **Default**: `0` - * - * See also: - * - {@link particleAccelerationMin} - * - {@link particleAccelerationMax} - */ - particleAccelerationX?: ScalarValue - /** - * Particle acceleration along the Y-axis. - * - * **Default**: `0` - * - * See also: - * - {@link particleAccelerationMin} - * - {@link particleAccelerationMax} - */ - particleAccelerationY?: ScalarValue - /** - * Particle acceleration along the Z-axis. - * - * **Default**: `0` - * - * See also: - * - {@link particleAccelerationMin} - * - {@link particleAccelerationMax} - */ - particleAccelerationZ?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_7?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_8?: ScalarValue - /** - * Angular acceleration for particles around the Z-axis in degrees per second squared. - * - * **Default**: `0` - * - * See also: - * - {@link particleAngularAccelerationMin} - * - {@link particleAngularAccelerationMax} - */ - particleAngularAccelerationZ?: ScalarValue - /** - * The rate of change for the width of the particles. - * - * **Default**: `0` - * - * See also: - * - {@link particleGrowthRateXStatic} - */ - particleGrowthRateX?: ScalarValue - /** - * The rate of change for the height of the particles. - * - * **Default**: `0` - * - * See also: - * - {@link particleGrowthRateYStatic} - */ - particleGrowthRateY?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_12?: ScalarValue - /** - * Color multiplier. - * - * Values in this are unrestricted and can go above 1. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - color?: Vector4Value - /** - * Unknown. - * - * **Default**: `1` - */ - unk_ds3_p1_14?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_15?: ScalarValue - /** - * Seemingly identical to {@link particleAccelerationZ}? - * - * **Default**: `0` - */ - unkParticleAcceleration?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_17?: ScalarValue - /** - * Downwards acceleration for particles. - * - * **Default**: `0` - */ - particleGravity?: ScalarValue - /** - * Maximum random turn angle for particles. Requires {@link particleRandomTurns} to be enabled. - * - * **Default**: `0` - * - * See also: - * - {@link particleRandomTurns} - * - {@link particleRandomTurnIntervalMax} - */ - particleRandomTurnAngle?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_20?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_ds3_p2_0?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_ds3_p2_1?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p2_2?: ScalarValue - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_3?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_4?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ds3_p2_5?: Vector4Value - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p2_6?: ScalarValue - /** - * Unknown integer. - * - * **Default**: `1005` - */ - unk_ds3_f1_0?: number - /** - * The ID of the texture of the particles. - * - * **Default**: `1` - */ - texture?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_2?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - normalMap?: number - /** - * Controls the shape of the particle emitter. See {@link EmitterShape} for more details. - * - * **Default**: {@link EmitterShape.Box} - */ - emitterShape?: EmitterShape - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_5?: number - /** - * The size of the emitter. - * - * **Default**: `[1, 1, 1]` - */ - emitterSize?: Vector3 - /** - * The rotation of the emitter. - * - * **Default**: `[0, 0, 0]` - */ - emitterRotation?: Vector3 - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_12?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_13?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_14?: number - /** - * Controls how the random emission points are distributed within the {@link emitterShape shape of the emitter}. How this works depend on the emitter shape: - * | Shape | Behavior | - * |-|-| - * | {@link EmitterShape.Line Line} | A fraction of the line where particles can not be emitted from.
At 0, particles can be emitted from any point on the line.
At 1, they can only be emitted from the far end of the line. | - * | {@link EmitterShape.Box Box} | A fraction of the box's size where the particles can not be emitted from. Basically an inner box that blocks emission. | - * | {@link EmitterShape.Box2 Box2} | At 1, any point within the box is equally likely to be picked.
At 0, particles are more likely to be emitted near the center, but it's not a 100% chance. | - * | {@link EmitterShape.Unk3 Unk3} | Exactly the same as {@link EmitterShape.Line Line}? | - * | {@link EmitterShape.Cylinder Cylinder} | A fraction of the radius of the cylinder where the particles can not be emitted from. Basically an inner cylinder that blocks emission. | - * - * **Default**: `0` - */ - emitterDistribution?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_16?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_17?: number - /** - * Unknown integer. - * - * **Default**: `-1` - */ - unk_ds3_f1_18?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_19?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_20?: number - /** - * Unknown integer. - * - * **Default**: `100` - */ - unk_ds3_f1_21?: number - /** - * The number of particles to emit per emission. - * - * **Default**: `10` - * - * See also: - * - {@link emissionParticleCountMin} - * - {@link emissionParticleCountMax} - */ - emissionParticleCount?: number - /** - * The minimum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. - * - * **Default**: `0` - * - * See also: - * - {@link emissionParticleCount} - * - {@link emissionParticleCountMax} - */ - emissionParticleCountMin?: number - /** - * The maximum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. - * - * **Default**: `0` - * - * See also: - * - {@link emissionParticleCount} - * - {@link emissionParticleCountMin} - */ - emissionParticleCountMax?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_25?: number - /** - * The minimum time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - * - * **Default**: `1` - * - * See also: - * - {@link emissionIntervalMax} - */ - emissionIntervalMin?: number - /** - * The maximum time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - * - * **Default**: `1` - * - * See also: - * - {@link emissionIntervalMin} - */ - emissionIntervalMax?: number - /** - * If enabled, the number of emissions will be limited by {@link emissionCountLimit}. - * - * **Default**: `false` - */ - limitEmissionCount?: boolean - /** - * The total number of emissions. This limit is only applied if {@link limitEmissionCount} is enabled. - * - * **Default**: `0` - */ - emissionCountLimit?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_30?: number - /** - * The duration of each particle in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - * - * **Default**: `1` - */ - particleDuration?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_32?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_33?: number - /** - * Particle position offset. - * - * **Default**: `[0, 0, 0]` - * - * See also: - * - {@link particleOffsetMin} - * - {@link particleOffsetMax} - */ - particleOffset?: Vector3 - /** - * Minimum particle position offset. A random value between this and {@link particleOffsetMax} will be added to {@link particleOffset} to get the final position offset. - * - * **Default**: `[0, 0, 0]` - */ - particleOffsetMin?: Vector3 - /** - * Maximum particle position offset. A random value between this and {@link particleOffsetMin} will be added to {@link particleOffset} to get the final position offset. - * - * **Default**: `[0, 0, 0]` - */ - particleOffsetMax?: Vector3 - /** - * Particle speed. - * - * **Default**: `[0, 0, 0]` - * - * See also: - * - {@link particleSpeedMin} - * - {@link particleSpeedMax} - */ - particleSpeed?: Vector3 - /** - * Minimum particle speed. A random value between this and {@link particleSpeedMax} will be added to {@link particleSpeed} to get the final speed. - * - * **Default**: `[0, 0, 0]` - */ - particleSpeedMin?: Vector3 - /** - * Maximum particle speed. A random value between this and {@link particleSpeedMin} will be added to {@link particleSpeed} to get the final speed. - * - * **Default**: `[0, 0, 0]` - */ - particleSpeedMax?: Vector3 - /** - * Minimum particle acceleration. A random value between this and {@link particleAccelerationMax} will be added to the three acceleration properties to get the final acceleration. - * - * **Default**: `[0, 0, 0]` - * - * See also: - * - {@link particleAccelerationX} - * - {@link particleAccelerationY} - * - {@link particleAccelerationZ} - */ - particleAccelerationMin?: Vector3 - /** - * Maximum particle acceleration. A random value between this and {@link particleAccelerationMin} will be added to the three acceleration properties to get the final acceleration. - * - * **Default**: `[0, 0, 0]` - * - * See also: - * - {@link particleAccelerationX} - * - {@link particleAccelerationY} - * - {@link particleAccelerationZ} - */ - particleAccelerationMax?: Vector3 - /** - * Maximum amount of random rotation for each particle in degrees. - * - * **Default**: `[0, 0, 0]` - */ - particleRotationVariance?: Vector3 - /** - * Maximum amount of random angular speed for each particle in degrees per second. - * - * **Default**: `[0, 0, 0]` - */ - particleAngularSpeedVariance?: Vector3 - /** - * Minimum amount of random angular acceleration for each particle in degrees per second squared. - * - * **Default**: `[0, 0, 0]` - * - * See also: - * - {@link particleAngularAccelerationMax} - */ - particleAngularAccelerationMin?: Vector3 - /** - * Maximum amount of random angular acceleration for each particle in degrees per second squared. - * - * **Default**: `[0, 0, 0]` - * - * See also: - * - {@link particleAngularAccelerationMin} - */ - particleAngularAccelerationMax?: Vector3 - /** - * When enabled, the height of the particles will be based on the {@link particleSizeX width} instead of the {@link particleSizeY height field}, and the height field is ignored. - * - * **Default**: `false` - * - * See also: - * - {@link particleSizeX} - * - {@link particleSizeY} - * - {@link particleSizeXMin} - * - {@link particleSizeYMin} - * - {@link particleSizeXMax} - * - {@link particleSizeYMax} - * - {@link particleGrowthRateX} - * - {@link particleGrowthRateY} - * - {@link particleGrowthRateXStatic} - * - {@link particleGrowthRateYStatic} - * - {@link particleGrowthAccelerationXMin} - * - {@link particleGrowthAccelerationYMin} - * - {@link particleGrowthAccelerationXMax} - * - {@link particleGrowthAccelerationYMax} - */ - particleUniformScale?: boolean - /** - * The width of the particle. - * - * **Default**: `1` - */ - particleSizeX?: number - /** - * The height of the particle. - * - * **Default**: `1` - */ - particleSizeY?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_73?: number - /** - * The minimum width of the particle. A random value between this and {@link particleSizeXMin} will be added to {@link particleSizeX} to get the final width. - * - * **Default**: `0` - */ - particleSizeXMin?: number - /** - * The minimum height of the particle. A random value between this and {@link particleSizeYMin} will be added to {@link particleSizeY} to get the final height. - * - * **Default**: `0` - */ - particleSizeYMin?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_76?: number - /** - * The maximum width of the particle. A random value between this and {@link particleSizeXMax} will be added to {@link particleSizeX} to get the final width. - * - * **Default**: `0` - */ - particleSizeXMax?: number - /** - * The maximum height of the particle. A random value between this and {@link particleSizeYMax} will be added to {@link particleSizeY} to get the final height. - * - * **Default**: `0` - */ - particleSizeYMax?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_79?: number - /** - * The rate of change for the width of the particles. - * - * **Default**: `0` - * - * See also: - * - {@link particleGrowthRateX} - */ - particleGrowthRateXStatic?: number - /** - * The rate of change for the height of the particles. - * - * **Default**: `0` - * - * See also: - * - {@link particleGrowthRateY} - */ - particleGrowthRateYStatic?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_82?: number - /** - * Minimum rate of change for the width of the particles. A random value between this and {@link particleGrowthRateXMax} will be added to {@link particleGrowthRateX} and {@link particleGrowthRateXStatic} to get the final growth rate. - * - * **Default**: `0` - */ - particleGrowthRateXMin?: number - /** - * Minimum rate of change for the height of the particles. A random value between this and {@link particleGrowthRateYMax} will be added to {@link particleGrowthRateY} and {@link particleGrowthRateYStatic} to get the final growth rate. - * - * **Default**: `0` - */ - particleGrowthRateYMin?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_85?: number - /** - * Maximum rate of change for the width of the particles. A random value between this and {@link particleGrowthRateXMax} will be added to {@link particleGrowthRateX} and {@link particleGrowthRateXStatic} to get the final growth rate. - * - * **Default**: `0` - */ - particleGrowthRateXMax?: number - /** - * Maximum rate of change for the height of the particles. A random value between this and {@link particleGrowthRateYMax} will be added to {@link particleGrowthRateY} and {@link particleGrowthRateYStatic} to get the final growth rate. - * - * **Default**: `0` - */ - particleGrowthRateYMax?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_88?: number - /** - * Minimum acceleration of change for the width of the particles. A random value between this and {@link particleGrowthAccelerationXMax} will be the final growth acceleration. - * - * **Default**: `0` - */ - particleGrowthAccelerationXMin?: number - /** - * Minimum acceleration of change for the height of the particles. A random value between this and {@link particleGrowthAccelerationYMax} will be the final growth acceleration. - * - * **Default**: `0` - */ - particleGrowthAccelerationYMin?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_91?: number - /** - * Minimum acceleration of change for the width of the particles. A random value between this and {@link particleGrowthAccelerationXMin} will be the final growth acceleration. - * - * **Default**: `0` - */ - particleGrowthAccelerationXMax?: number - /** - * Minimum acceleration of change for the height of the particles. A random value between this and {@link particleGrowthAccelerationYMin} will be the final growth acceleration. - * - * **Default**: `0` - */ - particleGrowthAccelerationYMax?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_94?: number - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - * - * **Default**: `1` - */ - rgbMultiplier?: number - /** - * Alpha multiplier. - * - * **Default**: `1` - */ - alphaMultiplier?: number - /** - * Minimum random variation for the particle color. A random value between this and {@link colorMax} will be added to the base {@link color}, but it fades out over the life of the particle. - * - * **Default**: `[0, 0, 0, 0]` - */ - colorMin?: Vector4 - /** - * Maximum random variation for the particle color. A random value between this and {@link colorMin} will be added to the base {@link color}, but it fades out over the life of the particle. - * - * **Default**: `[0, 0, 0, 0]` - */ - colorMax?: Vector4 - /** - * Blend mode. - * - * **Default**: {@link BlendMode.Normal} - */ - blendMode?: BlendMode - /** - * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. - * - * **Default**: `1` - * - * See also: - * - {@link totalFrames} - */ - columns?: number - /** - * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. - * - * **Default**: `1` - * - * See also: - * - {@link columns} - */ - totalFrames?: number - /** - * When enabled, this makes each particle pick a random frame from the animation and only display that one frame. - * - * **Default**: `false` - * - * See also: - * - {@link columns} - * - {@link totalFrames} - * - {@link maxFrameIndex} - */ - randomTextureFrame?: boolean - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_109?: number - /** - * Controls the maximum frame index when {@link randomTextureFrame picking a random frame to display}. - * - * **Default**: `0` - * - * See also: - * - {@link randomTextureFrame} - */ - maxFrameIndex?: number - /** - * Unknown integer. - * - * **Default**: `-1` - */ - unk_ds3_f1_111?: number - /** - * Unknown integer. - * - * **Default**: `-1` - */ - unk_ds3_f1_112?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_113?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_ds3_f1_114?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_115?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_116?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_117?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_118?: number - /** - * Multiplier for {@link particleDuration}. - * - * **Default**: `1` - */ - particleDurationMultiplier?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_120?: number - /** - * Scalar multiplier for the size of the particles. - * - * **Default**: `1` - */ - particleSizeMultiplier?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_122?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_123?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_124?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_125?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_126?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_127?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_128?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_129?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_130?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_131?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_132?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_133?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_134?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_135?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_136?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_137?: number - /** - * Unknown integer. - * - * **Default**: `8` - */ - unk_ds3_f1_138?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_139?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ds3_f1_140?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_141?: number - /** - * If enabled, the particle system stops updating if the camera is beyond the distance specified by {@link updateDistance} from the node. - * - * It will not stop updating immediately after the action becomes active. Instead, it will wait for a little while before stopping if the camera is too far away. - * - * **Default**: `0` - */ - limitUpdateDistance?: boolean - /** - * Controls how close the camera needs to be to the node for the particle system to update. Requires {@link limitUpdateDistance} to be enabled. - * - * **Default**: `0` - */ - updateDistance?: number - /** - * When enabled, this makes the particles bounce off of any surface they hit. This collision detection is just based on the depth buffer, not the full 3D scene, so it is not always perfect. - * - * **Default**: `false` - * - * See also: - * - {@link particleBounciness} - */ - particleCollision?: boolean - /** - * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. - * - * **Default**: `0` - * - * See also: - * - {@link particleCollision} - */ - particleBounciness?: number - /** - * If enabled, particles will randomly make sharp turns that affect the direction of various speed and acceleration properties. Both the time between turns and the turn angle are randomized for each turn and for each particle, and they are based on {@link particleRandomTurnIntervalMax} and {@link particleRandomTurnAngle} respectively. - * - * **Default**: `false` - * - * See also: - * - {@link particleRandomTurnIntervalMax} - * - {@link particleRandomTurnAngle} - */ - particleRandomTurns?: boolean - /** - * The maximum amount of time in seconds to wait between making random turns. Requires {@link particleRandomTurns} to be enabled. - * - * **Default**: `1` - * - * See also: - * - {@link particleRandomTurns} - * - {@link particleRandomTurnAngle} - */ - particleRandomTurnIntervalMax?: number - /** - * If enabled, this causes the particles to orient themselves and stretch in the direction they are moving on the screen, making them almost resemble {@link ActionType.Tracer Tracer} particles. - * - * **Default**: `false` - * - * See also: - * - {@link particleTraceLength} - */ - traceParticles?: boolean - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_149?: number - /** - * Controls how much the particles are stretched when {@link traceParticles} is enabled. - * - * **Default**: `1` - */ - particleTraceLength?: number - /** - * A central fraction of the emitter volume where the particles will not be trace particles. In this volume, the particles act as if {@link traceParticles} is disabled. - * - * **Default**: `0` - */ - traceParticlesThreshold?: number - /** - * If enabled, this will add a billboarding sprite to the leading end of trace particles. - * - * **Default**: `false` - * - * See also: - * - {@link traceParticles} - */ - traceParticleHead?: boolean - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_153?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_154?: number - /** - * Controls whether or not the particles have a bloom effect. - * - * **Default**: `false` - * - * See also: - * - {@link bloomColor} - */ - bloom?: boolean - /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - * - * **Default**: `[1, 1, 1, 0]` - * - * See also: - * - {@link bloom} - */ - bloomColor?: Vector4 - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_sdt_f1_160?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f1_161?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_sdt_f1_162?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_sdt_f1_163?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_sdt_f1_164?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f1_165?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_sdt_f1_166?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_er_f1_167?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_0?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_1?: number - /** - * Unknown integer. - * - * **Default**: `8` - */ - unk_ds3_f2_2?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_3?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_4?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f2_5?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f2_6?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f2_7?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f2_8?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_9?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_10?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_11?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_12?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_13?: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * **Default**: `-1` - * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minFadeDistance?: number - /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minDistance?: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxFadeDistance?: number - /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxDistance?: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} - */ - minDistanceThreshold?: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - */ - maxDistanceThreshold?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_20?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_21?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_22?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_23?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_24?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unkDepthBlend1?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unkDepthBlend2?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_ds3_f2_27?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_28?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_sdt_f2_29?: number - /** - * Controls how dark shaded parts of the particle are. - * - * **Default**: `0` - */ - shadowDarkness?: number - /** - * When set to 1, this stops the particles from being shown indoors. - * - * Other values are used in AC6, but what they do is unknown. - * - * **Default**: `0` - */ - unkHideIndoors?: number - /** - * Unknown integer. - * - * Like in most other actions with this field, when set to 1, it may stop {@link unk_sdt_f2_29} from doing whatever it is doing, but that field may also not work exactly the same in this action, so it's tricky to confirm. It can also cause some ugly "outline" effects on things seen through particles. - * - * **Default**: `0` - */ - unk_sdt_f2_32?: number - /** - * Specular texture ID. - * - * **Default**: `0` - * - * See also: - * - {@link lighting} - * - {@link glossiness} - * - {@link specularity} - */ - specular?: number - /** - * Controls how sharp the specular highlights are. - * - * **Default**: `0.25` - * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link specularity} - */ - glossiness?: number - /** - * Unknown integer. - * - * **Default**: {@link LightingMode.Unlit} - */ - lighting?: LightingMode - /** - * Unknown integer. - * - * **Default**: `-2` - */ - unk_sdt_f2_36?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_sdt_f2_37?: number - /** - * Controls how bright the specular highlights are. - * - * **Default**: `0.5` - * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link glossiness} - */ - specularity?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_er_f2_39?: number -} - -/** - * ### {@link ActionType.GPUStandardCorrectParticle Action 10001 - GPUStandardCorrectParticle} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * Very similar to {@link ActionType.GPUStandardParticle GPUStandardParticle}, with no known differences. - * - * The name of this action is from Elden Ring's RTTI, where it's called "StandardCorrectParticle". An action with the same ID had the name "WanderingVision" in Dark Souls 3, and that action could still exist in DS3, but it is not found in the vanilla game, so testing it is difficult. - * - * Note: This action does not exist in Dark Souls 3 or Sekiro, but it still has unknown fields and properties named after those games. This is because it makes the conversion between this action and {@link ActionType.GPUStandardParticle GPUStandardParticle} much simpler. When written for those two games, this action will be converted to the other action automatically. - */ -class GPUStandardCorrectParticle extends DataAction { - declare readonly type: ActionType.GPUStandardCorrectParticle - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} - /** - * Controls how well the particles follow the node if it moves. - */ - particleFollowFactor: ScalarValue - unk_ds3_p1_1: ScalarValue - unk_ds3_p1_2: ScalarValue - unk_ds3_p1_3: ScalarValue - /** - * Particle acceleration along the X-axis. - * - * See also: - * - {@link particleAccelerationMin} - * - {@link particleAccelerationMax} - */ - particleAccelerationX: ScalarValue - /** - * Particle acceleration along the Y-axis. - * - * See also: - * - {@link particleAccelerationMin} - * - {@link particleAccelerationMax} - */ - particleAccelerationY: ScalarValue - /** - * Particle acceleration along the Z-axis. - * - * See also: - * - {@link particleAccelerationMin} - * - {@link particleAccelerationMax} - */ - particleAccelerationZ: ScalarValue - unk_ds3_p1_7: ScalarValue - unk_ds3_p1_8: ScalarValue - /** - * Angular acceleration for particles around the Z-axis in degrees per second squared. - * - * See also: - * - {@link particleAngularAccelerationMin} - * - {@link particleAngularAccelerationMax} - */ - particleAngularAccelerationZ: ScalarValue - /** - * The rate of change for the width of the particles. - * - * See also: - * - {@link particleGrowthRateXStatic} - */ - particleGrowthRateX: ScalarValue - /** - * The rate of change for the height of the particles. - * - * See also: - * - {@link particleGrowthRateYStatic} - */ - particleGrowthRateY: ScalarValue - unk_ds3_p1_12: ScalarValue - /** - * Color multiplier. - * - * Values in this are unrestricted and can go above 1. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - color: Vector4Value - unk_ds3_p1_14: ScalarValue - unk_ds3_p1_15: ScalarValue - /** - * Seemingly identical to {@link particleAccelerationZ}? - */ - unkParticleAcceleration: ScalarValue - unk_ds3_p1_17: ScalarValue - /** - * Downwards acceleration for particles. - */ - particleGravity: ScalarValue - /** - * Maximum random turn angle for particles. Requires {@link particleRandomTurns} to be enabled. - * - * See also: - * - {@link particleRandomTurns} - * - {@link particleRandomTurnIntervalMax} - */ - particleRandomTurnAngle: ScalarValue - unk_ds3_p1_20: ScalarValue - unk_ds3_p2_0: ScalarValue - unk_ds3_p2_1: ScalarValue - unk_ds3_p2_2: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value - unk_ds3_p2_6: ScalarValue - unk_ds3_f1_0: number - /** - * The ID of the texture of the particles. - */ - texture: number - unk_ds3_f1_2: number - normalMap: number - /** - * Controls the shape of the particle emitter. See {@link EmitterShape} for more details. - */ - emitterShape: EmitterShape - unk_ds3_f1_5: number - /** - * The size of the emitter. - */ - emitterSize: Vector3 - /** - * The rotation of the emitter. - */ - emitterRotation: Vector3 - unk_ds3_f1_12: number - unk_ds3_f1_13: number - unk_ds3_f1_14: number - /** - * Controls how the random emission points are distributed within the {@link emitterShape shape of the emitter}. How this works depend on the emitter shape: - * | Shape | Behavior | - * |-|-| - * | {@link EmitterShape.Line Line} | A fraction of the line where particles can not be emitted from.
At 0, particles can be emitted from any point on the line.
At 1, they can only be emitted from the far end of the line. | - * | {@link EmitterShape.Box Box} | A fraction of the box's size where the particles can not be emitted from. Basically an inner box that blocks emission. | - * | {@link EmitterShape.Box2 Box2} | At 1, any point within the box is equally likely to be picked.
At 0, particles are more likely to be emitted near the center, but it's not a 100% chance. | - * | {@link EmitterShape.Unk3 Unk3} | Exactly the same as {@link EmitterShape.Line Line}? | - * | {@link EmitterShape.Cylinder Cylinder} | A fraction of the radius of the cylinder where the particles can not be emitted from. Basically an inner cylinder that blocks emission. | - */ - emitterDistribution: number - unk_ds3_f1_16: number - unk_ds3_f1_17: number - unk_ds3_f1_18: number - unk_ds3_f1_19: number - unk_ds3_f1_20: number - unk_ds3_f1_21: number - /** - * The number of particles to emit per emission. - * - * See also: - * - {@link emissionParticleCountMin} - * - {@link emissionParticleCountMax} - */ - emissionParticleCount: number - /** - * The minimum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. - * - * See also: - * - {@link emissionParticleCount} - * - {@link emissionParticleCountMax} - */ - emissionParticleCountMin: number - /** - * The maximum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. - * - * See also: - * - {@link emissionParticleCount} - * - {@link emissionParticleCountMin} - */ - emissionParticleCountMax: number - unk_ds3_f1_25: number - /** - * The minimum time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - * - * See also: - * - {@link emissionIntervalMax} - */ - emissionIntervalMin: number - /** - * The maximum time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - * - * See also: - * - {@link emissionIntervalMin} - */ - emissionIntervalMax: number - /** - * If enabled, the number of emissions will be limited by {@link emissionCountLimit}. - */ - limitEmissionCount: boolean - /** - * The total number of emissions. This limit is only applied if {@link limitEmissionCount} is enabled. - */ - emissionCountLimit: number - unk_ds3_f1_30: number - /** - * The duration of each particle in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - */ - particleDuration: number - unk_ds3_f1_32: number - unk_ds3_f1_33: number - /** - * Particle position offset. - * - * See also: - * - {@link particleOffsetMin} - * - {@link particleOffsetMax} - */ - particleOffset: Vector3 - /** - * Minimum particle position offset. A random value between this and {@link particleOffsetMax} will be added to {@link particleOffset} to get the final position offset. - */ - particleOffsetMin: Vector3 - /** - * Maximum particle position offset. A random value between this and {@link particleOffsetMin} will be added to {@link particleOffset} to get the final position offset. - */ - particleOffsetMax: Vector3 - /** - * Particle speed. - * - * See also: - * - {@link particleSpeedMin} - * - {@link particleSpeedMax} - */ - particleSpeed: Vector3 - /** - * Minimum particle speed. A random value between this and {@link particleSpeedMax} will be added to {@link particleSpeed} to get the final speed. - */ - particleSpeedMin: Vector3 - /** - * Maximum particle speed. A random value between this and {@link particleSpeedMin} will be added to {@link particleSpeed} to get the final speed. - */ - particleSpeedMax: Vector3 - /** - * Minimum particle acceleration. A random value between this and {@link particleAccelerationMax} will be added to the three acceleration properties to get the final acceleration. - * - * See also: - * - {@link particleAccelerationX} - * - {@link particleAccelerationY} - * - {@link particleAccelerationZ} - */ - particleAccelerationMin: Vector3 - /** - * Maximum particle acceleration. A random value between this and {@link particleAccelerationMin} will be added to the three acceleration properties to get the final acceleration. - * - * See also: - * - {@link particleAccelerationX} - * - {@link particleAccelerationY} - * - {@link particleAccelerationZ} - */ - particleAccelerationMax: Vector3 - /** - * Maximum amount of random rotation for each particle in degrees. - */ - particleRotationVariance: Vector3 - /** - * Maximum amount of random angular speed for each particle in degrees per second. - */ - particleAngularSpeedVariance: Vector3 - /** - * Minimum amount of random angular acceleration for each particle in degrees per second squared. - * - * See also: - * - {@link particleAngularAccelerationMax} - */ - particleAngularAccelerationMin: Vector3 - /** - * Maximum amount of random angular acceleration for each particle in degrees per second squared. - * - * See also: - * - {@link particleAngularAccelerationMin} - */ - particleAngularAccelerationMax: Vector3 - /** - * When enabled, the height of the particles will be based on the {@link particleSizeX width} instead of the {@link particleSizeY height field}, and the height field is ignored. - * - * See also: - * - {@link particleSizeX} - * - {@link particleSizeY} - * - {@link particleSizeXMin} - * - {@link particleSizeYMin} - * - {@link particleSizeXMax} - * - {@link particleSizeYMax} - * - {@link particleGrowthRateX} - * - {@link particleGrowthRateY} - * - {@link particleGrowthRateXStatic} - * - {@link particleGrowthRateYStatic} - * - {@link particleGrowthAccelerationXMin} - * - {@link particleGrowthAccelerationYMin} - * - {@link particleGrowthAccelerationXMax} - * - {@link particleGrowthAccelerationYMax} - */ - particleUniformScale: boolean - /** - * The width of the particle. - */ - particleSizeX: number - /** - * The height of the particle. - */ - particleSizeY: number - unk_ds3_f1_73: number - /** - * The minimum width of the particle. A random value between this and {@link particleSizeXMin} will be added to {@link particleSizeX} to get the final width. - */ - particleSizeXMin: number - /** - * The minimum height of the particle. A random value between this and {@link particleSizeYMin} will be added to {@link particleSizeY} to get the final height. - */ - particleSizeYMin: number - unk_ds3_f1_76: number - /** - * The maximum width of the particle. A random value between this and {@link particleSizeXMax} will be added to {@link particleSizeX} to get the final width. - */ - particleSizeXMax: number - /** - * The maximum height of the particle. A random value between this and {@link particleSizeYMax} will be added to {@link particleSizeY} to get the final height. - */ - particleSizeYMax: number - unk_ds3_f1_79: number - /** - * The rate of change for the width of the particles. - * - * See also: - * - {@link particleGrowthRateX} + * **Default**: `1` */ - particleGrowthRateXStatic: number + unk_sdt_p2_2: ScalarValue /** - * The rate of change for the height of the particles. + * A scalar multiplier for the {@link diffuseColor diffuse color}. Good for easily adjusting the brightness of the light without changing the color. * - * See also: - * - {@link particleGrowthRateY} - */ - particleGrowthRateYStatic: number - unk_ds3_f1_82: number - /** - * Minimum rate of change for the width of the particles. A random value between this and {@link particleGrowthRateXMax} will be added to {@link particleGrowthRateX} and {@link particleGrowthRateXStatic} to get the final growth rate. - */ - particleGrowthRateXMin: number - /** - * Minimum rate of change for the height of the particles. A random value between this and {@link particleGrowthRateYMax} will be added to {@link particleGrowthRateY} and {@link particleGrowthRateYStatic} to get the final growth rate. - */ - particleGrowthRateYMin: number - unk_ds3_f1_85: number - /** - * Maximum rate of change for the width of the particles. A random value between this and {@link particleGrowthRateXMax} will be added to {@link particleGrowthRateX} and {@link particleGrowthRateXStatic} to get the final growth rate. - */ - particleGrowthRateXMax: number - /** - * Maximum rate of change for the height of the particles. A random value between this and {@link particleGrowthRateYMax} will be added to {@link particleGrowthRateY} and {@link particleGrowthRateYStatic} to get the final growth rate. - */ - particleGrowthRateYMax: number - unk_ds3_f1_88: number - /** - * Minimum acceleration of change for the width of the particles. A random value between this and {@link particleGrowthAccelerationXMax} will be the final growth acceleration. - */ - particleGrowthAccelerationXMin: number - /** - * Minimum acceleration of change for the height of the particles. A random value between this and {@link particleGrowthAccelerationYMax} will be the final growth acceleration. - */ - particleGrowthAccelerationYMin: number - unk_ds3_f1_91: number - /** - * Minimum acceleration of change for the width of the particles. A random value between this and {@link particleGrowthAccelerationXMin} will be the final growth acceleration. - */ - particleGrowthAccelerationXMax: number - /** - * Minimum acceleration of change for the height of the particles. A random value between this and {@link particleGrowthAccelerationYMin} will be the final growth acceleration. - */ - particleGrowthAccelerationYMax: number - unk_ds3_f1_94: number - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - */ - rgbMultiplier: number - /** - * Alpha multiplier. - */ - alphaMultiplier: number - /** - * Minimum random variation for the particle color. A random value between this and {@link colorMax} will be added to the base {@link color}, but it fades out over the life of the particle. - */ - colorMin: Vector4 - /** - * Maximum random variation for the particle color. A random value between this and {@link colorMin} will be added to the base {@link color}, but it fades out over the life of the particle. - */ - colorMax: Vector4 - /** - * Blend mode. - */ - blendMode: BlendMode - /** - * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. + * If {@link separateSpecular} is disabled, this also affects the specular color of the light. * - * See also: - * - {@link totalFrames} - */ - columns: number - /** - * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. + * **Default**: `1` * - * See also: - * - {@link columns} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - totalFrames: number + diffuseMultiplier: ScalarValue /** - * When enabled, this makes each particle pick a random frame from the animation and only display that one frame. + * A scalar multiplier for the {@link specularColor specular color}. * - * See also: - * - {@link columns} - * - {@link totalFrames} - * - {@link maxFrameIndex} - */ - randomTextureFrame: boolean - unk_ds3_f1_109: number - /** - * Controls the maximum frame index when {@link randomTextureFrame picking a random frame to display}. + * If {@link separateSpecular} is disabled, this property is ignored. * - * See also: - * - {@link randomTextureFrame} - */ - maxFrameIndex: number - unk_ds3_f1_111: number - unk_ds3_f1_112: number - unk_ds3_f1_113: number - unk_ds3_f1_114: number - unk_ds3_f1_115: number - unk_ds3_f1_116: number - unk_ds3_f1_117: number - unk_ds3_f1_118: number - /** - * Multiplier for {@link particleDuration}. - */ - particleDurationMultiplier: number - unk_ds3_f1_120: number - /** - * Scalar multiplier for the size of the particles. - */ - particleSizeMultiplier: number - unk_ds3_f1_122: number - unk_ds3_f1_123: number - unk_ds3_f1_124: number - unk_ds3_f1_125: number - unk_ds3_f1_126: number - unk_ds3_f1_127: number - unk_ds3_f1_128: number - unk_ds3_f1_129: number - unk_ds3_f1_130: number - unk_ds3_f1_131: number - unk_ds3_f1_132: number - unk_ds3_f1_133: number - unk_ds3_f1_134: number - unk_ds3_f1_135: number - unk_ds3_f1_136: number - unk_ds3_f1_137: number - unk_ds3_f1_138: number - unk_ds3_f1_139: number - unk_ds3_f1_140: number - unk_ds3_f1_141: number - /** - * If enabled, the particle system stops updating if the camera is beyond the distance specified by {@link updateDistance} from the node. + * **Default**: `1` * - * It will not stop updating immediately after the action becomes active. Instead, it will wait for a little while before stopping if the camera is too far away. - */ - limitUpdateDistance: boolean - /** - * Controls how close the camera needs to be to the node for the particle system to update. Requires {@link limitUpdateDistance} to be enabled. + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - updateDistance: number + specularMultiplier: ScalarValue /** - * When enabled, this makes the particles bounce off of any surface they hit. This collision detection is just based on the depth buffer, not the full 3D scene, so it is not always perfect. + * Unknown integer. * - * See also: - * - {@link particleBounciness} + * **Default**: `0` */ - particleCollision: boolean + unk_ds3_f1_0: number /** - * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. + * Unknown float. * - * See also: - * - {@link particleCollision} + * **Default**: `0` */ - particleBounciness: number + unk_ds3_f1_1: number /** - * If enabled, particles will randomly make sharp turns that affect the direction of various speed and acceleration properties. Both the time between turns and the turn angle are randomized for each turn and for each particle, and they are based on {@link particleRandomTurnIntervalMax} and {@link particleRandomTurnAngle} respectively. + * Unknown integer. * - * See also: - * - {@link particleRandomTurnIntervalMax} - * - {@link particleRandomTurnAngle} + * **Default**: `0` */ - particleRandomTurns: boolean + unk_ds3_f2_0: number /** - * The maximum amount of time in seconds to wait between making random turns. Requires {@link particleRandomTurns} to be enabled. + * Toggles the jitter and flicker animations for the light. * - * See also: - * - {@link particleRandomTurns} - * - {@link particleRandomTurnAngle} - */ - particleRandomTurnIntervalMax: number - /** - * If enabled, this causes the particles to orient themselves and stretch in the direction they are moving on the screen, making them almost resemble {@link ActionType.Tracer Tracer} particles. + * **Default**: `false` * * See also: - * - {@link particleTraceLength} - */ - traceParticles: boolean - unk_ds3_f1_149: number - /** - * Controls how much the particles are stretched when {@link traceParticles} is enabled. - */ - particleTraceLength: number - /** - * A central fraction of the emitter volume where the particles will not be trace particles. In this volume, the particles act as if {@link traceParticles} is disabled. + * - {@link jitterAcceleration} + * - {@link jitterX} + * - {@link jitterY} + * - {@link jitterZ} + * - {@link flickerIntervalMin} + * - {@link flickerIntervalMax} + * - {@link flickerBrightness} */ - traceParticlesThreshold: number + jitterAndFlicker: boolean /** - * If enabled, this will add a billboarding sprite to the leading end of trace particles. + * Controls the acceleration of the jittering. * - * See also: - * - {@link traceParticles} - */ - traceParticleHead: boolean - unk_ds3_f1_153: number - unk_ds3_f1_154: number - /** - * Controls whether or not the particles have a bloom effect. + * **Default**: `1` * * See also: - * - {@link bloomColor} + * - {@link jitterAndFlicker} + * - {@link jitterX} + * - {@link jitterY} + * - {@link jitterZ} */ - bloom: boolean + jitterAcceleration: number /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. + * Unknown float. * - * See also: - * - {@link bloom} + * **Default**: `0` */ - bloomColor: Vector4 - unk_sdt_f1_160: number - unk_sdt_f1_161: number - unk_sdt_f1_162: number - unk_sdt_f1_163: number - unk_sdt_f1_164: number - unk_sdt_f1_165: number - unk_sdt_f1_166: number - unk_er_f1_167: number - unk_ds3_f2_0: number - unk_ds3_f2_1: number - unk_ds3_f2_2: number unk_ds3_f2_3: number - unk_ds3_f2_4: number - unk_ds3_f2_5: number - unk_ds3_f2_6: number - unk_ds3_f2_7: number - unk_ds3_f2_8: number - unk_ds3_f2_9: number - unk_ds3_f2_10: number - unk_ds3_f2_11: number - unk_ds3_f2_12: number - unk_ds3_f2_13: number /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. + * Controls how much the light should move around randomly on the X-axis. * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * **Default**: `0` * * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link jitterAndFlicker} + * - {@link jitterAcceleration} + * - {@link jitterY} + * - {@link jitterZ} */ - minFadeDistance: number + jitterX: number /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. + * Controls how much the light should move around randomly on the Y-axis. * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * **Default**: `0` * * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link jitterAndFlicker} + * - {@link jitterAcceleration} + * - {@link jitterX} + * - {@link jitterZ} */ - minDistance: number + jitterY: number /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. + * Controls how much the light should move around randomly on the Z-axis. * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * **Default**: `0` * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link jitterAndFlicker} + * - {@link jitterAcceleration} + * - {@link jitterX} + * - {@link jitterY} */ - maxFadeDistance: number + jitterZ: number /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. + * Controls the minimum interval for flickering. * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * **Default**: `0` * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link jitterAndFlicker} + * - {@link flickerIntervalMax} + * - {@link flickerBrightness} */ - maxDistance: number + flickerIntervalMin: number /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * Controls the maximum interval for flickering. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} - */ - minDistanceThreshold: number - /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * **Default**: `1` * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - */ - maxDistanceThreshold: number - unk_ds3_f2_20: number - unk_ds3_f2_21: number - unk_ds3_f2_22: number - unk_ds3_f2_23: number - unk_ds3_f2_24: number - unkDepthBlend1: number - unkDepthBlend2: number - unk_ds3_f2_27: number - unk_ds3_f2_28: number - unk_sdt_f2_29: number - /** - * Controls how dark shaded parts of the particle are. - */ - shadowDarkness: number - /** - * When set to 1, this stops the particles from being shown indoors. - * - * Other values are used in AC6, but what they do is unknown. + * - {@link jitterAndFlicker} + * - {@link flickerIntervalMin} + * - {@link flickerBrightness} */ - unkHideIndoors: number + flickerIntervalMax: number /** - * Unknown integer. + * Brightness multiplier for the light when it flickers. * - * Like in most other actions with this field, when set to 1, it may stop {@link unk_sdt_f2_29} from doing whatever it is doing, but that field may also not work exactly the same in this action, so it's tricky to confirm. It can also cause some ugly "outline" effects on things seen through particles. - */ - unk_sdt_f2_32: number - /** - * Specular texture ID. + * **Default**: `0.5` * * See also: - * - {@link lighting} - * - {@link glossiness} - * - {@link specularity} + * - {@link jitterAndFlicker} + * - {@link flickerIntervalMin} + * - {@link flickerIntervalMax} */ - specular: number + flickerBrightness: number /** - * Controls how sharp the specular highlights are. - * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link specularity} + * Controls if the light should have shadows or not. + * + * Note: Map objects also have a setting for casting shadows, and both must be enabled for an object to cast shadows from the light source. + * + * **Default**: `false` */ - glossiness: number - lighting: LightingMode - unk_sdt_f2_36: number - unk_sdt_f2_37: number + shadows: boolean /** - * Controls how bright the specular highlights are. + * When enabled, this allows other properties and fields of the action to control the specular color independently of the diffuse color. When disabled, the diffuse counterpart of the properties or fields will affect both the diffuse and specular color. + * + * **Default**: `false` * * See also: - * - {@link lighting} - * - {@link specular} - * - {@link glossiness} + * - {@link diffuseColor} + * - {@link specularColor} + * - {@link diffuseMultiplier} + * - {@link specularMultiplier} */ - specularity: number - unk_er_f2_39: number - constructor(props: GPUStandardCorrectParticleParams = {}) { - super(ActionType.GPUStandardCorrectParticle, {isAppearance:true,isParticle:false}) - this.assign(props) - } -} - -export interface LightShaftParams { + separateSpecular: boolean /** - * Unknown. + * The number of seconds the light takes to fade to nothing after being destroyed. * - * **Default**: `1` + * Due to how the field this represents works, the time will be rounded to the nearest multiple of 1/30s. + * + * **Default**: `0` */ - width?: ScalarValue + fadeOutTime: number /** - * Unknown. + * Controls how dark shadows from this light source are. At 0, the shadows will be entirely invisible. * * **Default**: `1` */ - height?: ScalarValue + shadowDarkness: number /** - * Unknown. + * Unknown integer. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` */ - color1?: Vector4Value + unk_ds3_f2_15: number /** - * Unknown. + * Unknown integer. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `2` */ - color2?: Vector4Value + unk_ds3_f2_16: number /** - * Unknown. + * Unknown integer. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `1` */ - color3?: Vector4Value + unk_ds3_f2_17: number /** - * Unknown. + * Unknown float. * * **Default**: `0` */ - unk_ds3_p1_5?: ScalarValue + unk_ds3_f2_18: number /** - * Unknown. + * Unknown float. * * **Default**: `0` */ - unk_ds3_p1_6?: ScalarValue + unk_ds3_f2_19: number /** - * Unknown. + * Unknown float. * * **Default**: `0` */ - unk_ds3_p1_7?: ScalarValue + unk_ds3_f2_20: number /** - * Unknown. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_ds3_p1_8?: ScalarValue + unk_ds3_f2_21: number /** - * Unknown. + * Unknown integer. * - * **Default**: `1` + * **Default**: `100` */ - unk_ds3_p1_9?: ScalarValue + unk_ds3_f2_22: number /** - * Texture ID. + * Unknown integer. * * **Default**: `0` */ - texture?: number + unk_ds3_f2_23: number /** - * Blend mode. + * Controls the maximum distance for the light source to be active. If the camera is farther away from the light source than this distance, it will stop emitting light. * - * **Default**: {@link BlendMode.Add} - */ - blendMode?: BlendMode - /** - * Unknown float. + * Setting this to `0` will disable the distance limit. * - * **Default**: `0.75` + * **Default**: `0` */ - unk_ds3_f1_2?: number + maxViewDistance: number /** - * Unknown float. + * Controls the density of some sort of fake fog in the volume hit by the light. The fog does not affect the actual light produced by the source and is not affected by shadows. * - * **Default**: `0.75` - */ - unk_ds3_f1_3?: number - /** - * Unknown float. + * **Default**: `0` * - * **Default**: `2` + * See also: + * - {@link phaseFunction} + * - {@link asymmetryParam} */ - unk_ds3_f1_4?: number + volumeDensity: number /** * Unknown float. * - * **Default**: `0.1` + * **Default**: `0` */ - unk_ds3_f1_5?: number + unk_sdt_f2_25: number /** - * Unknown float. + * Controls whether or not {@link asymmetryParam} affects the fake fog from {@link volumeDensity}. * - * **Default**: `1` + * **Default**: `true` */ - unk_ds3_f1_6?: number + phaseFunction: boolean /** - * Unknown float. + * Controls how the fake fog from {@link volumeDensity} scatters the light. This value is ignored if {@link phaseFunction} is disabled, and the fog will scatter the light equally in all directions. * - * **Default**: `1` - */ - unk_ds3_f1_7?: number - /** - * The number of layers to use for the light shaft effect. Higher values will look better, but will probably perform worse. + * - At 0, the light is scattered equally in every direction. + * - As the value approaches 1, the light is scattered more and more forward, in the same direction as the light was already traveling. This means that the fake fog will be less visible from the side or behind, and more visible from in front of the light. + * - At 1, the fog will not scatter the light at all, so it will be entirely invisible. + * - Values above 1 produce unnatural-looking effects where the light darkens the fog instead. * - * **Default**: `30` + * **Default**: `0.75` */ - layers?: number + asymmetryParam: number /** - * Unknown float. + * Controls the falloff exponent of the light. + * + * Note: This is possibly something else, but the behavior is pretty similar to a falloff exponent in a few ways. * * **Default**: `1` + * + * See also: + * - {@link unk_ds3_p2_0} */ - unk_ds3_f1_9?: number + falloffExponent: number /** - * Unknown float. + * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_10?: number + unk_er_f2_29: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_11?: number + unk_er_f2_30: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f1_12?: number + unk_er_f2_31: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_13?: number + unk_er_f2_32: number /** - * Unknown integer. + * Unknown. Only used in Dark Souls 3. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f1_14?: number + unk_ds3_f2_12: number + constructor(props: Partial> = {}) { + super(ActionType.PointLight, {isAppearance:true,isParticle:false}) + this.assign(props) + } +} + +/** + * ### {@link ActionType.SimulateTermination Action 700 - SimulateTermination} + * **Slot**: {@link ActionSlots.TerminationAction Termination} + * + * Allows the effect to play out once it terminates. Particle emitters will stop emitting new particles, but particles with a limited duration that have already been emitted will stay around for as long as their duration allows them to. + * + * Note: An effect terminates when it reaches {@link State} -1. + */ +class SimulateTermination extends DataAction { + declare readonly type: ActionType.SimulateTermination + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} + + constructor() { + super(ActionType.SimulateTermination, {isAppearance:false,isParticle:false}) + } +} + +/** + * ### {@link ActionType.FadeTermination Action 701 - FadeTermination} + * **Slot**: {@link ActionSlots.TerminationAction Termination} + * + * Allows the effect to continue playing normally after it terminates, but its opacity will gradually fade out over a given duration. + * + * Note: An effect terminates when it reaches {@link State} -1. + */ +class FadeTermination extends DataAction { + declare readonly type: ActionType.FadeTermination + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** - * Unknown float. + * The duration of the fade out in seconds. * * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - unk_ds3_f1_15?: number + duration: ScalarValue /** - * Unknown integer. - * + * @param duration The duration of the fade out in seconds. + * * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - unk_ds3_f1_16?: number + constructor(duration: ScalarValue = 1) { + super(ActionType.FadeTermination, {isAppearance:false,isParticle:false}) + this.assign({ duration }) + } +} + +/** + * ### {@link ActionType.InstantTermination Action 702 - InstantTermination} + * **Slot**: {@link ActionSlots.TerminationAction Termination} + * + * Makes the effect instantly disappear when it terminates. + * + * Note: An effect terminates when it reaches {@link State} -1. + */ +class InstantTermination extends DataAction { + declare readonly type: ActionType.InstantTermination + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} + + constructor() { + super(ActionType.InstantTermination, {isAppearance:false,isParticle:false}) + } +} + +/** + * ### {@link ActionType.NodeForceSpeed Action 731 - NodeForceSpeed} + * **Slot**: {@link ActionSlots.NodeForceMovementAction NodeForceMovement} + * + * Controls how the node is affected by forces. For more information about forces that can affect nodes and particles, see: + * - {@link ActionType.CancelForce CancelForce} + * - {@link ActionType.WindForce WindForce} + * - {@link ActionType.GravityForce GravityForce} + * - {@link ActionType.ForceCollision ForceCollision} + * - {@link ActionType.TurbulenceForce TurbulenceForce} + */ +class NodeForceSpeed extends DataAction { + declare readonly type: ActionType.NodeForceSpeed + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** - * Unknown integer. + * The speed in the direction of the force. * * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - unk_ds3_f1_17?: number + speed: ScalarValue /** - * Unknown float. + * A multiplier for {@link speed}. * * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - unk_ds3_f1_18?: number + speedMultiplier: ScalarValue /** - * Unknown float. + * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_19?: number + unk_sdt_f1_0: number + constructor(props: Partial> = {}) { + super(ActionType.NodeForceSpeed, {isAppearance:false,isParticle:false}) + this.assign(props) + } +} + +/** + * ### {@link ActionType.ParticleForceSpeed Action 732 - ParticleForceSpeed} + * **Slot**: {@link ActionSlots.ParticleForceMovementAction ParticleForceMovement} + * + * Controls how the particles emitted by the node is affected by forces. For more information about forces that can affect nodes and particles, see: + * - {@link ActionType.CancelForce CancelForce} + * - {@link ActionType.WindForce WindForce} + * - {@link ActionType.GravityForce GravityForce} + * - {@link ActionType.ForceCollision ForceCollision} + * - {@link ActionType.TurbulenceForce TurbulenceForce} + */ +class ParticleForceSpeed extends DataAction { + declare readonly type: ActionType.ParticleForceSpeed + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** - * Unknown float. + * The speed in the direction of the force. * - * **Default**: `1` + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - unk_ds3_f1_20?: number + speed: ScalarValue /** - * Unknown float. + * A multiplier for {@link speed}. * * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - unk_ds3_f1_21?: number + speedMultiplier: ScalarValue /** - * Unknown float. + * Unknown integer. * - * **Default**: `-1` + * **Default**: `1` */ - unk_ds3_f1_22?: number + unk_sdt_f1_0: number /** - * Unknown float. + * Unknown. 0 and 1 seems to be valid values, while all other values cause the wind to not affect the particles. * - * **Default**: `-1` + * **Default**: `0` */ - unk_ds3_f1_23?: number + unk_sdt_f1_1: number + constructor(props: Partial> = {}) { + super(ActionType.ParticleForceSpeed, {isAppearance:false,isParticle:false}) + this.assign(props) + } +} + +/** + * ### {@link ActionType.NodeForceAcceleration Action 733 - NodeForceAcceleration} + * **Slot**: {@link ActionSlots.NodeForceMovementAction NodeForceMovement} + * + * Controls how the node is affected by forces. For more information about forces that can affect nodes and particles, see: + * - {@link ActionType.CancelForce CancelForce} + * - {@link ActionType.WindForce WindForce} + * - {@link ActionType.GravityForce GravityForce} + * - {@link ActionType.ForceCollision ForceCollision} + * - {@link ActionType.TurbulenceForce TurbulenceForce} + */ +class NodeForceAcceleration extends DataAction { + declare readonly type: ActionType.NodeForceAcceleration + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** - * Unknown integer. + * The acceleration in the direction of the force. * * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - unk_ds3_f1_24?: number + acceleration: ScalarValue /** - * Unknown float. + * A multiplier for {@link acceleration}. * * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - unk_ds3_f1_25?: number + accelerationMultiplier: ScalarValue /** - * Unknown float. + * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_26?: number + unk_sdt_f1_0: number + constructor(props: Partial> = {}) { + super(ActionType.NodeForceAcceleration, {isAppearance:false,isParticle:false}) + this.assign(props) + } +} + +/** + * ### {@link ActionType.ParticleForceAcceleration Action 734 - ParticleForceAcceleration} + * **Slot**: {@link ActionSlots.ParticleForceMovementAction ParticleForceMovement} + * + * Controls how the particles emitted by the node is affected by forces. For more information about forces that can affect nodes and particles, see: + * - {@link ActionType.CancelForce CancelForce} + * - {@link ActionType.WindForce WindForce} + * - {@link ActionType.GravityForce GravityForce} + * - {@link ActionType.ForceCollision ForceCollision} + * - {@link ActionType.TurbulenceForce TurbulenceForce} + */ +class ParticleForceAcceleration extends DataAction { + declare readonly type: ActionType.ParticleForceAcceleration + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** - * Unknown float. + * The acceleration in the direction of the force. * - * **Default**: `1` + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - unk_ds3_f1_27?: number + acceleration: ScalarValue /** - * Unknown float. + * A multiplier for {@link acceleration}. * - * **Default**: `-1` + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - unk_ds3_f1_28?: number + accelerationMultiplier: ScalarValue /** * Unknown integer. * + * **Default**: `1` + */ + unk_sdt_f1_0: number + /** + * Unknown. 0 and 1 seems to be valid values, while all other values cause the wind to not affect the particles. + * * **Default**: `0` */ - unk_ds3_f1_29?: number + unk_sdt_f1_1: number + constructor(props: Partial> = {}) { + super(ActionType.ParticleForceAcceleration, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** - * ### {@link ActionType.LightShaft Action 10003 - LightShaft} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * ### {@link ActionType.ParticleForceCollision Action 800 - ParticleForceCollision} + * **Slot**: {@link ActionSlots.ParticleForceMovementAction ParticleForceMovement} * - * A pretty simple light shafts effect only used in Dark Souls 3. It shows up if converted for Sekiro, but it doesn't seem to work correctly in that game. It does not seem to work at all in Elden Ring or Armored Core 6. + * Enables particles emitted by the node to collide with surfaces, and controls how those collisions affect the movement of the particles. + * + * Note that this works very differently from the collision-related fields in the GPU particle appearance actions. The collision detection for those are entriely based on the distances between the camera and everything in its view, so if a particle is farther away from the camera than an object, the particle will be able to collide with it. The collision detection used in this action is based on the real 3D geometry of the scene, so particles can collide with anything, even while they are out of view. + * + * Also note that this action seems to cause the game to crash very easily. If a particle affected by this action despawns due to its limited duration, the game will crash no matter what. */ -class LightShaft extends DataAction { - declare readonly type: ActionType.LightShaft - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} - width: ScalarValue - height: ScalarValue - color1: Vector4Value - color2: Vector4Value - color3: Vector4Value - unk_ds3_p1_5: ScalarValue - unk_ds3_p1_6: ScalarValue - unk_ds3_p1_7: ScalarValue - unk_ds3_p1_8: ScalarValue - unk_ds3_p1_9: ScalarValue +class ParticleForceCollision extends DataAction { + declare readonly type: ActionType.ParticleForceCollision + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** - * Texture ID. + * The collision radius of the particles. This controls the maximum distance between the particles and a surface they can collide with for a collision to be detected. + * + * **Default**: `1` */ - texture: number + radius: number /** - * Blend mode. + * The friction coefficient of the particles. This controls how quickly particles stop while sliding against a surface. + * | Values | Behavior | + * |-|-| + * | <0 | The particles will accelerate as they slide, going faster and faster over time. | + * | 0 | The particles will not decelerate at all as they slide. They will just keep sliding forever unless something else stops them. | + * | 0-1 | The particles will decelerate as they slide, causing them to eventually come to a stop. | + * | ≥1 | The particles will stop immediately if they contact a surface. They may still {@link bounciness bounce}, but they will never slide along the surface. | + * + * **Default**: `0.5` */ - blendMode: BlendMode - unk_ds3_f1_2: number - unk_ds3_f1_3: number - unk_ds3_f1_4: number - unk_ds3_f1_5: number - unk_ds3_f1_6: number - unk_ds3_f1_7: number + friction: number /** - * The number of layers to use for the light shaft effect. Higher values will look better, but will probably perform worse. + * The coefficient of restitution of the particles, or how "bouncy" they are. + * | Values | Behavior | + * |-|-| + * | ≤0 | Completely inelastic collision. The particles will not bounce if they hit something. They will just stop or slide. + * | 0-1 | Partially elastic collision. The particles will bounce, but they will lose some energy from the collision, causing them to bounce back at a reduced speed compared to the speed they had before the collision. | + * | 1 | Perfectly elastic collision. No energy is lost from any collision, causing the particles to bounce off at the same speed they hit the surface. | + * | >1 | Hyper-elastic collision. The particles will gain energy from every collision, causing them to speed up every time they collide with something. Hitting something at an angle may in some cases still cause them to lose some energy. | + * + * **Default**: `0.5` */ - layers: number - unk_ds3_f1_9: number - unk_ds3_f1_10: number - unk_ds3_f1_11: number - unk_ds3_f1_12: number - unk_ds3_f1_13: number - unk_ds3_f1_14: number - unk_ds3_f1_15: number - unk_ds3_f1_16: number - unk_ds3_f1_17: number - unk_ds3_f1_18: number - unk_ds3_f1_19: number - unk_ds3_f1_20: number - unk_ds3_f1_21: number - unk_ds3_f1_22: number - unk_ds3_f1_23: number - unk_ds3_f1_24: number - unk_ds3_f1_25: number - unk_ds3_f1_26: number - unk_ds3_f1_27: number - unk_ds3_f1_28: number - unk_ds3_f1_29: number - constructor(props: LightShaftParams = {}) { - super(ActionType.LightShaft, {isAppearance:true,isParticle:false}) + bounciness: number + constructor(props: Partial> = {}) { + super(ActionType.ParticleForceCollision, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface GPUSparkParticleParams { +/** + * ### {@link ActionType.GPUStandardParticle Action 10000 - GPUStandardParticle} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * An entire particle system in a single action. This emits GPU particles, which means thousands of particles can be rendered without much impact on performance. + * + * Note that while this emits particles, it is itself not a particle, and the particles emitted by this action are not affected by everything that affects regular particles. + * + * The name of this action is from Elden Ring's RTTI, where it's called "StandardParticle". + */ +class GPUStandardParticle extends DataAction { + declare readonly type: ActionType.GPUStandardParticle + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * Controls how well the particles follow the node if it moves. * * **Default**: `0` */ - particleFollowFactor?: ScalarValue + particleFollowFactor: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_p1_1?: ScalarValue + unk_ds3_p1_1: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_p1_2?: ScalarValue + unk_ds3_p1_2: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_p1_3?: ScalarValue + unk_ds3_p1_3: ScalarValue /** * Particle acceleration along the X-axis. * * **Default**: `0` + * + * See also: + * - {@link particleAccelerationMin} + * - {@link particleAccelerationMax} */ - particleAccelerationX?: ScalarValue + particleAccelerationX: ScalarValue /** * Particle acceleration along the Y-axis. * * **Default**: `0` + * + * See also: + * - {@link particleAccelerationMin} + * - {@link particleAccelerationMax} */ - particleAccelerationY?: ScalarValue + particleAccelerationY: ScalarValue /** * Particle acceleration along the Z-axis. * * **Default**: `0` + * + * See also: + * - {@link particleAccelerationMin} + * - {@link particleAccelerationMax} + */ + particleAccelerationZ: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ + unk_ds3_p1_7: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ + unk_ds3_p1_8: ScalarValue + /** + * Angular acceleration for particles around the Z-axis in degrees per second squared. + * + * **Default**: `0` + * + * See also: + * - {@link particleAngularAccelerationMin} + * - {@link particleAngularAccelerationMax} + */ + particleAngularAccelerationZ: ScalarValue + /** + * The rate of change for the width of the particles. + * + * **Default**: `0` + * + * See also: + * - {@link particleGrowthRateXStatic} + */ + particleGrowthRateX: ScalarValue + /** + * The rate of change for the height of the particles. + * + * **Default**: `0` + * + * See also: + * - {@link particleGrowthRateYStatic} + */ + particleGrowthRateY: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` */ - particleAccelerationZ?: ScalarValue + unk_ds3_p1_12: ScalarValue /** * Color multiplier. * @@ -30524,141 +21295,161 @@ export interface GPUSparkParticleParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - color?: Vector4Value + color: Vector4Value /** - * The length of the particles. + * Unknown scalar. * * **Default**: `1` */ - particleLength?: ScalarValue + unk_ds3_p1_14: ScalarValue /** - * The width of the particles. + * Unknown scalar. * - * **Default**: `0.1` + * **Default**: `0` */ - particleWidth?: ScalarValue + unk_ds3_p1_15: ScalarValue /** - * Similar to {@link particleAccelerationZ}, but this does not go exactly north? - * - * This requires any of the following fields to have a non-zero value: - * - {@link particleSpeedMin} - * - {@link particleSpeedMax} + * Seemingly identical to {@link particleAccelerationZ}? * * **Default**: `0` */ - unkParticleAcceleration?: ScalarValue + unkParticleAcceleration: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_p1_11?: ScalarValue + unk_ds3_p1_17: ScalarValue /** * Downwards acceleration for particles. * - * This requires any of the following fields to have a non-zero value: - * - {@link particleSpeedMin} - * - {@link particleSpeedMax} + * **Default**: `0` + */ + particleGravity: ScalarValue + /** + * Maximum random turn angle for particles. Requires {@link particleRandomTurns} to be enabled. * - * **Default**: `1` + * **Default**: `0` + * + * See also: + * - {@link particleRandomTurns} + * - {@link particleRandomTurnIntervalMax} */ - particleGravity?: ScalarValue + particleRandomTurnAngle: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_p1_13?: ScalarValue + unk_ds3_p1_20: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `1` */ - unk_ac6_p2_0?: ScalarValue + unk_ds3_p2_0: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `1` */ - unk_ac6_p2_1?: ScalarValue + unk_ds3_p2_1: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_p2_2?: ScalarValue + unk_ds3_p2_2: ScalarValue /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ac6_p2_3?: Vector4Value + unk_ds3_p2_3: Vector4Value /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ac6_p2_4?: Vector4Value + unk_ds3_p2_4: Vector4Value /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ac6_p2_5?: Vector4Value + unk_ds3_p2_5: Vector4Value /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_p2_6?: ScalarValue + unk_ds3_p2_6: ScalarValue + /** + * Unknown integer. + * + * **Default**: `1005` + */ + unk_ds3_f1_0: number /** * The ID of the texture of the particles. * * **Default**: `1` */ - texture?: number + texture: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ds3_f1_2: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + normalMap: number /** * Controls the shape of the particle emitter. See {@link EmitterShape} for more details. * * **Default**: {@link EmitterShape.Box} */ - emitterShape?: EmitterShape + emitterShape: EmitterShape /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_2?: number + unk_ds3_f1_5: number /** * The size of the emitter. * * **Default**: `[1, 1, 1]` */ - emitterSize?: Vector3 + emitterSize: Vector3 /** * The rotation of the emitter. * * **Default**: `[0, 0, 0]` */ - emitterRotation?: Vector3 + emitterRotation: Vector3 /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_9?: number + unk_ds3_f1_12: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_10?: number + unk_ds3_f1_13: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_11?: number + unk_ds3_f1_14: number /** * Controls how the random emission points are distributed within the {@link emitterShape shape of the emitter}. How this works depend on the emitter shape: * | Shape | Behavior | @@ -30671,37 +21462,43 @@ export interface GPUSparkParticleParams { * * **Default**: `0` */ - emitterDistribution?: number + emitterDistribution: number /** * Unknown float. * * **Default**: `0` */ - unk_ac6_f1_13?: number + unk_ds3_f1_16: number /** * Unknown float. * * **Default**: `0` */ - unk_ac6_f1_14?: number + unk_ds3_f1_17: number /** * Unknown integer. * * **Default**: `-1` */ - unk_ac6_f1_15?: number + unk_ds3_f1_18: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_16?: number + unk_ds3_f1_19: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_17?: number + unk_ds3_f1_20: number + /** + * Unknown integer. + * + * **Default**: `100` + */ + unk_ds3_f1_21: number /** * The number of particles to emit per emission. * @@ -30711,7 +21508,7 @@ export interface GPUSparkParticleParams { * - {@link emissionParticleCountMin} * - {@link emissionParticleCountMax} */ - emissionParticleCount?: number + emissionParticleCount: number /** * The minimum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. * @@ -30721,7 +21518,7 @@ export interface GPUSparkParticleParams { * - {@link emissionParticleCount} * - {@link emissionParticleCountMax} */ - emissionParticleCountMin?: number + emissionParticleCountMin: number /** * The maximum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. * @@ -30731,73 +21528,67 @@ export interface GPUSparkParticleParams { * - {@link emissionParticleCount} * - {@link emissionParticleCountMin} */ - emissionParticleCountMax?: number + emissionParticleCountMax: number /** - * The time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. + * Unknown integer. * * **Default**: `0` - * - * See also: - * - {@link emissionIntervalMin} - * - {@link emissionIntervalMax} */ - emissionInterval?: number + unk_ds3_f1_25: number /** - * The minimum time between emissions in seconds. A random value between this and {@link emissionIntervalMax} will be added to {@link emissionInterval} to get the final emission interval. Due to the way this field works, the value will be rounded to the nearest 1/30s. + * The minimum time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. * - * **Default**: `0` + * **Default**: `1` * * See also: - * - {@link emissionInterval} * - {@link emissionIntervalMax} */ - emissionIntervalMin?: number + emissionIntervalMin: number /** - * The maximum time between emissions in seconds. A random value between this and {@link emissionIntervalMin} will be added to {@link emissionInterval} to get the final emission interval. Due to the way this field works, the value will be rounded to the nearest 1/30s. + * The maximum time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. * - * **Default**: `0` + * **Default**: `1` * * See also: - * - {@link emissionInterval} * - {@link emissionIntervalMin} */ - emissionIntervalMax?: number + emissionIntervalMax: number /** - * If enabled, the number of emissions will be limited by {@link concurrentEmissionsLimit}. + * If enabled, the number of emissions will be limited by {@link emissionCountLimit}. * * **Default**: `false` */ - limitConcurrentEmissions?: boolean + limitEmissionCount: boolean /** - * The total number of emissions. This limit is only applied if {@link limitConcurrentEmissions} is enabled. + * The total number of emissions. This limit is only applied if {@link limitEmissionCount} is enabled. * * **Default**: `0` */ - concurrentEmissionsLimit?: number + emissionCountLimit: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_26?: number + unk_ds3_f1_30: number /** * The duration of each particle in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. * * **Default**: `1` */ - particleDuration?: number + particleDuration: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_28?: number + unk_ds3_f1_32: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_29?: number + unk_ds3_f1_33: number /** * Particle position offset. * @@ -30807,271 +21598,525 @@ export interface GPUSparkParticleParams { * - {@link particleOffsetMin} * - {@link particleOffsetMax} */ - particleOffset?: Vector3 + particleOffset: Vector3 /** * Minimum particle position offset. A random value between this and {@link particleOffsetMax} will be added to {@link particleOffset} to get the final position offset. * * **Default**: `[0, 0, 0]` */ - particleOffsetMin?: Vector3 + particleOffsetMin: Vector3 /** * Maximum particle position offset. A random value between this and {@link particleOffsetMin} will be added to {@link particleOffset} to get the final position offset. * * **Default**: `[0, 0, 0]` */ - particleOffsetMax?: Vector3 + particleOffsetMax: Vector3 /** - * Unknown integer. + * Particle speed. + * + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleSpeedMin} + * - {@link particleSpeedMax} + */ + particleSpeed: Vector3 + /** + * Minimum particle speed. A random value between this and {@link particleSpeedMax} will be added to {@link particleSpeed} to get the final speed. + * + * **Default**: `[0, 0, 0]` + */ + particleSpeedMin: Vector3 + /** + * Maximum particle speed. A random value between this and {@link particleSpeedMin} will be added to {@link particleSpeed} to get the final speed. + * + * **Default**: `[0, 0, 0]` + */ + particleSpeedMax: Vector3 + /** + * Minimum particle acceleration. A random value between this and {@link particleAccelerationMax} will be added to the three acceleration properties to get the final acceleration. + * + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleAccelerationX} + * - {@link particleAccelerationY} + * - {@link particleAccelerationZ} + */ + particleAccelerationMin: Vector3 + /** + * Maximum particle acceleration. A random value between this and {@link particleAccelerationMin} will be added to the three acceleration properties to get the final acceleration. + * + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleAccelerationX} + * - {@link particleAccelerationY} + * - {@link particleAccelerationZ} + */ + particleAccelerationMax: Vector3 + /** + * Maximum amount of random rotation for each particle in degrees. + * + * **Default**: `[0, 0, 0]` + */ + particleRotationVariance: Vector3 + /** + * Maximum amount of random angular speed for each particle in degrees per second. + * + * **Default**: `[0, 0, 0]` + */ + particleAngularSpeedVariance: Vector3 + /** + * Minimum amount of random angular acceleration for each particle in degrees per second squared. + * + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleAngularAccelerationMax} + */ + particleAngularAccelerationMin: Vector3 + /** + * Maximum amount of random angular acceleration for each particle in degrees per second squared. + * + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleAngularAccelerationMin} + */ + particleAngularAccelerationMax: Vector3 + /** + * When enabled, the height of the particles will be based on the {@link particleSizeX width} instead of the {@link particleSizeY height field}, and the height field is ignored. + * + * **Default**: `false` + * + * See also: + * - {@link particleSizeX} + * - {@link particleSizeY} + * - {@link particleSizeXMin} + * - {@link particleSizeYMin} + * - {@link particleSizeXMax} + * - {@link particleSizeYMax} + * - {@link particleGrowthRateX} + * - {@link particleGrowthRateY} + * - {@link particleGrowthRateXStatic} + * - {@link particleGrowthRateYStatic} + * - {@link particleGrowthAccelerationXMin} + * - {@link particleGrowthAccelerationYMin} + * - {@link particleGrowthAccelerationXMax} + * - {@link particleGrowthAccelerationYMax} + */ + particleUniformScale: boolean + /** + * The width of the particle. + * + * **Default**: `1` + */ + particleSizeX: number + /** + * The height of the particle. + * + * **Default**: `1` + */ + particleSizeY: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_ds3_f1_73: number + /** + * The minimum width of the particle. A random value between this and {@link particleSizeXMin} will be added to {@link particleSizeX} to get the final width. * * **Default**: `0` */ - unk_ac6_f1_39?: number + particleSizeXMin: number /** - * Minimum particle speed. + * The minimum height of the particle. A random value between this and {@link particleSizeYMin} will be added to {@link particleSizeY} to get the final height. * - * **Default**: `[-0.01, -0.01, -0.01]` + * **Default**: `0` + */ + particleSizeYMin: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_ds3_f1_76: number + /** + * The maximum width of the particle. A random value between this and {@link particleSizeXMax} will be added to {@link particleSizeX} to get the final width. + * + * **Default**: `0` + */ + particleSizeXMax: number + /** + * The maximum height of the particle. A random value between this and {@link particleSizeYMax} will be added to {@link particleSizeY} to get the final height. + * + * **Default**: `0` + */ + particleSizeYMax: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_ds3_f1_79: number + /** + * The rate of change for the width of the particles. + * + * **Default**: `0` * * See also: - * - {@link particleSpeedMax} + * - {@link particleGrowthRateX} */ - particleSpeedMin?: Vector3 + particleGrowthRateXStatic: number /** - * Maximum particle speed. + * The rate of change for the height of the particles. * - * **Default**: `[0.01, 0.01, 0.01]` + * **Default**: `0` * * See also: - * - {@link particleSpeedMin} + * - {@link particleGrowthRateY} + */ + particleGrowthRateYStatic: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_ds3_f1_82: number + /** + * Minimum rate of change for the width of the particles. A random value between this and {@link particleGrowthRateXMax} will be added to {@link particleGrowthRateX} and {@link particleGrowthRateXStatic} to get the final growth rate. + * + * **Default**: `0` + */ + particleGrowthRateXMin: number + /** + * Minimum rate of change for the height of the particles. A random value between this and {@link particleGrowthRateYMax} will be added to {@link particleGrowthRateY} and {@link particleGrowthRateYStatic} to get the final growth rate. + * + * **Default**: `0` + */ + particleGrowthRateYMin: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_ds3_f1_85: number + /** + * Maximum rate of change for the width of the particles. A random value between this and {@link particleGrowthRateXMax} will be added to {@link particleGrowthRateX} and {@link particleGrowthRateXStatic} to get the final growth rate. + * + * **Default**: `0` + */ + particleGrowthRateXMax: number + /** + * Maximum rate of change for the height of the particles. A random value between this and {@link particleGrowthRateYMax} will be added to {@link particleGrowthRateY} and {@link particleGrowthRateYStatic} to get the final growth rate. + * + * **Default**: `0` + */ + particleGrowthRateYMax: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_ds3_f1_88: number + /** + * Minimum acceleration of change for the width of the particles. A random value between this and {@link particleGrowthAccelerationXMax} will be the final growth acceleration. + * + * **Default**: `0` + */ + particleGrowthAccelerationXMin: number + /** + * Minimum acceleration of change for the height of the particles. A random value between this and {@link particleGrowthAccelerationYMax} will be the final growth acceleration. + * + * **Default**: `0` + */ + particleGrowthAccelerationYMin: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_ds3_f1_91: number + /** + * Minimum acceleration of change for the width of the particles. A random value between this and {@link particleGrowthAccelerationXMin} will be the final growth acceleration. + * + * **Default**: `0` + */ + particleGrowthAccelerationXMax: number + /** + * Minimum acceleration of change for the height of the particles. A random value between this and {@link particleGrowthAccelerationYMin} will be the final growth acceleration. + * + * **Default**: `0` + */ + particleGrowthAccelerationYMax: number + /** + * Unknown float. + * + * **Default**: `0` */ - particleSpeedMax?: Vector3 + unk_ds3_f1_94: number /** * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * * **Default**: `1` */ - rgbMultiplier?: number + rgbMultiplier: number /** * Alpha multiplier. * * **Default**: `1` */ - alphaMultiplier?: number + alphaMultiplier: number /** * Minimum random variation for the particle color. A random value between this and {@link colorMax} will be added to the base {@link color}, but it fades out over the life of the particle. * * **Default**: `[0, 0, 0, 0]` */ - colorMin?: Vector4 + colorMin: Vector4 /** * Maximum random variation for the particle color. A random value between this and {@link colorMin} will be added to the base {@link color}, but it fades out over the life of the particle. * * **Default**: `[0, 0, 0, 0]` */ - colorMax?: Vector4 + colorMax: Vector4 /** * Blend mode. * - * **Default**: {@link BlendMode.Add} + * **Default**: {@link BlendMode.Normal} */ - blendMode?: BlendMode + blendMode: BlendMode /** - * Unknown integer. + * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. * - * **Default**: `-1` + * **Default**: `1` + * + * See also: + * - {@link totalFrames} + */ + columns: number + /** + * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. + * + * **Default**: `1` + * + * See also: + * - {@link columns} */ - unk_ac6_f1_57?: number + totalFrames: number /** - * Unknown integer. + * When enabled, this makes each particle pick a random frame from the animation and only display that one frame. * - * **Default**: `-1` + * **Default**: `false` + * + * See also: + * - {@link columns} + * - {@link totalFrames} + * - {@link maxFrameIndex} */ - unk_ac6_f1_58?: number + randomTextureFrame: boolean /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_59?: number + unk_ds3_f1_109: number /** - * Unknown integer. + * Controls the maximum frame index when {@link randomTextureFrame picking a random frame to display}. * * **Default**: `0` + * + * See also: + * - {@link randomTextureFrame} */ - unk_ac6_f1_60?: number + maxFrameIndex: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `-1` */ - unk_ac6_f1_61?: number + unk_ds3_f1_111: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `-1` */ - unk_ac6_f1_62?: number + unk_ds3_f1_112: number /** - * Minimum particle length. A random value between this and {@link particleLengthMax} will be **multiplied** by {@link particleLength} to get the final particle length. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - particleLengthMin?: number + unk_ds3_f1_113: number /** - * Maximum particle length. A random value between this and {@link particleLengthMin} will be **multiplied** by {@link particleLength} to get the final particle length. + * Unknown integer. * * **Default**: `1` */ - particleLengthMax?: number + unk_ds3_f1_114: number /** - * Minimum particle width. A random value between this and {@link particleWidthMax} will be **multiplied** by {@link particleWidth} to get the final particle width. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - particleWidthMin?: number + unk_ds3_f1_115: number /** - * Maximum particle width. A random value between this and {@link particleWidthMin} will be **multiplied** by {@link particleWidth} to get the final particle width. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - particleWidthMax?: number + unk_ds3_f1_116: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_67?: number + unk_ds3_f1_117: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_68?: number + unk_ds3_f1_118: number /** * Multiplier for {@link particleDuration}. * * **Default**: `1` */ - particleDurationMultiplier?: number + particleDurationMultiplier: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_70?: number + unk_ds3_f1_120: number /** - * Unknown float. + * Scalar multiplier for the size of the particles. * * **Default**: `1` */ - unk_ac6_f1_71?: number + particleSizeMultiplier: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_72?: number + unk_ds3_f1_122: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_73?: number + unk_ds3_f1_123: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_74?: number + unk_ds3_f1_124: number /** * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_ac6_f1_75?: number + unk_ds3_f1_125: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_76?: number + unk_ds3_f1_126: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ds3_f1_127: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_77?: number + unk_ds3_f1_128: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_78?: number + unk_ds3_f1_129: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_79?: number + unk_ds3_f1_130: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_80?: number + unk_ds3_f1_131: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_81?: number + unk_ds3_f1_132: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_82?: number + unk_ds3_f1_133: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_83?: number + unk_ds3_f1_134: number /** - * Unknown float. Seems to make the particles fly around somewhat randomly, but with a specific average direction. {@link unk_ac6_f1_85} works in a similar way, but has the opposite average direction. + * Unknown float. * * **Default**: `0` */ - unk_ac6_f1_84?: number + unk_ds3_f1_135: number /** - * Unknown float. Seems to make the particles fly around somewhat randomly, but with a specific average direction. {@link unk_ac6_f1_84} works in a similar way, but has the opposite average direction. + * Unknown float. * * **Default**: `0` */ - unk_ac6_f1_85?: number + unk_ds3_f1_136: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_86?: number + unk_ds3_f1_137: number /** * Unknown integer. * * **Default**: `8` */ - unk_ac6_f1_87?: number + unk_ds3_f1_138: number /** - * Unknown integer. + * Unknown float. + * + * **Default**: `0` + */ + unk_ds3_f1_139: number + /** + * Unknown float. * * **Default**: `0` */ - unk_ac6_f1_88?: number + unk_ds3_f1_140: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_89?: number + unk_ds3_f1_141: number /** * If enabled, the particle system stops updating if the camera is beyond the distance specified by {@link updateDistance} from the node. * @@ -31079,43 +22124,99 @@ export interface GPUSparkParticleParams { * * **Default**: `0` */ - limitUpdateDistance?: boolean + limitUpdateDistance: boolean + /** + * Controls how close the camera needs to be to the node for the particle system to update. Requires {@link limitUpdateDistance} to be enabled. + * + * **Default**: `0` + */ + updateDistance: number + /** + * When enabled, this makes the particles bounce off of any surface they hit. This collision detection is just based on the depth buffer, not the full 3D scene, so it is not always perfect. + * + * **Default**: `false` + * + * See also: + * - {@link particleBounciness} + */ + particleCollision: boolean + /** + * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. + * + * **Default**: `0` + * + * See also: + * - {@link particleCollision} + */ + particleBounciness: number + /** + * If enabled, particles will randomly make sharp turns that affect the direction of various speed and acceleration properties. Both the time between turns and the turn angle are randomized for each turn and for each particle, and they are based on {@link particleRandomTurnIntervalMax} and {@link particleRandomTurnAngle} respectively. + * + * **Default**: `false` + * + * See also: + * - {@link particleRandomTurnIntervalMax} + * - {@link particleRandomTurnAngle} + */ + particleRandomTurns: boolean + /** + * The maximum amount of time in seconds to wait between making random turns. Requires {@link particleRandomTurns} to be enabled. + * + * **Default**: `1` + * + * See also: + * - {@link particleRandomTurns} + * - {@link particleRandomTurnAngle} + */ + particleRandomTurnIntervalMax: number + /** + * If enabled, this causes the particles to orient themselves and stretch in the direction they are moving on the screen, making them almost resemble {@link ActionType.Tracer Tracer} particles. + * + * **Default**: `false` + * + * See also: + * - {@link particleTraceLength} + */ + traceParticles: boolean + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_ds3_f1_149: number + /** + * Controls how much the particles are stretched when {@link traceParticles} is enabled. + * + * **Default**: `1` + */ + particleTraceLength: number /** - * Controls how close the camera needs to be to the node for the particle system to update. Requires {@link limitUpdateDistance} to be enabled. + * A central fraction of the emitter volume where the particles will not be trace particles. In this volume, the particles act as if {@link traceParticles} is disabled. * * **Default**: `0` */ - updateDistance?: number + traceParticlesThreshold: number /** - * When enabled, this makes the particles bounce off of any surface they hit. This collision detection is just based on the depth buffer, not the full 3D scene, so it is not always perfect. + * If enabled, this will add a billboarding sprite to the leading end of trace particles. * * **Default**: `false` * * See also: - * - {@link particleBounciness} - */ - particleCollision?: boolean - /** - * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. - * - * **Default**: `0` - * - * See also: - * - {@link particleCollision} + * - {@link traceParticles} */ - particleBounciness?: number + traceParticleHead: boolean /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_94?: number + unk_ds3_f1_153: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_95?: number + unk_ds3_f1_154: number /** * Controls whether or not the particles have a bloom effect. * @@ -31124,7 +22225,7 @@ export interface GPUSparkParticleParams { * See also: * - {@link bloomColor} */ - bloom?: boolean + bloom: boolean /** * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. * @@ -31137,141 +22238,177 @@ export interface GPUSparkParticleParams { * See also: * - {@link bloom} */ - bloomColor?: Vector4 + bloomColor: Vector4 + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_sdt_f1_160: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_sdt_f1_161: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_sdt_f1_162: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_sdt_f1_163: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_101?: number + unk_sdt_f1_164: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_102?: number + unk_sdt_f1_165: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_sdt_f1_166: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_103?: number + unk_er_f1_167: number + /** + * Desaturates the particles, making them more grayscale. At 0, the particles will have their regular colors. At 1, they will be entirely grayscale. + * + * **Default**: `0` + */ + desaturate: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_0?: number + unk_ds3_f2_0: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_1?: number + unk_ds3_f2_1: number /** * Unknown integer. * * **Default**: `8` */ - unk_ac6_f2_2?: number + unk_ds3_f2_2: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_3?: number + unk_ds3_f2_3: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_4?: number + unk_ds3_f2_4: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f2_5?: number + unk_ds3_f2_5: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f2_6?: number + unk_ds3_f2_6: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f2_7?: number + unk_ds3_f2_7: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f2_8?: number + unk_ds3_f2_8: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_9?: number + unk_ds3_f2_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_10?: number + unk_ds3_f2_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_11?: number + unk_ds3_f2_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_12?: number + unk_ds3_f2_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_13?: number + unk_ds3_f2_13: number /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. + * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. * * **Default**: `-1` * * See also: - * - {@link minFadeDistance} + * - {@link minDistance} * - {@link maxFadeDistance} * - {@link maxDistance} * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minFadeDistance?: number + minFadeDistance: number /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. + * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * This requires {@link minFadeDistance} to be set to a positive value or 0. + * + * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. * * **Default**: `-1` * * See also: - * - {@link minDistance} + * - {@link minFadeDistance} * - {@link maxFadeDistance} * - {@link maxDistance} * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minDistance?: number + minDistance: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -31286,7 +22423,7 @@ export interface GPUSparkParticleParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxFadeDistance?: number + maxFadeDistance: number /** * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -31303,7 +22440,7 @@ export interface GPUSparkParticleParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxDistance?: number + maxDistance: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -31316,7 +22453,7 @@ export interface GPUSparkParticleParams { * - {@link maxDistance} * - {@link maxDistanceThreshold} */ - minDistanceThreshold?: number + minDistanceThreshold: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -31329,73 +22466,73 @@ export interface GPUSparkParticleParams { * - {@link maxDistance} * - {@link minDistanceThreshold} */ - maxDistanceThreshold?: number + maxDistanceThreshold: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_20?: number + unk_ds3_f2_20: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_21?: number + unk_ds3_f2_21: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_22?: number + unk_ds3_f2_22: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_23?: number + unk_ds3_f2_23: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_24?: number + unk_ds3_f2_24: number /** * Unknown float. * * **Default**: `1` */ - unkDepthBlend1?: number + unkDepthBlend1: number /** * Unknown float. * * **Default**: `0` */ - unkDepthBlend2?: number + unkDepthBlend2: number /** * Unknown integer. * * **Default**: `1` */ - unk_ac6_f2_27?: number + unk_ds3_f2_27: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_28?: number + unk_ds3_f2_28: number /** * Unknown float. * * **Default**: `0` */ - unk_ac6_f2_29?: number + unk_sdt_f2_29: number /** * Controls how dark shaded parts of the particle are. * - * **Default**: `1` + * **Default**: `0` */ - shadowDarkness?: number + shadowDarkness: number /** * When set to 1, this stops the particles from being shown indoors. * @@ -31403,552 +22540,191 @@ export interface GPUSparkParticleParams { * * **Default**: `0` */ - unkHideIndoors?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f2_32?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f2_33?: number - /** - * Unknown float. - * - * **Default**: `0.5` - */ - unk_ac6_f2_34?: number - /** - * Unknown integer. - * - * **Default**: {@link LightingMode.Unlit} - */ - lighting?: LightingMode - /** - * Unknown integer. - * - * **Default**: `-2` - */ - unk_ac6_f2_36?: number + unkHideIndoors: number /** * Unknown integer. * - * **Default**: `0` - */ - unk_ac6_f2_37?: number - /** - * Unknown float. + * Like in most other actions with this field, when set to 1, it may stop {@link unk_sdt_f2_29} from doing whatever it is doing, but that field may also not work exactly the same in this action, so it's tricky to confirm. It can also cause some ugly "outline" effects on things seen through particles. * * **Default**: `0` */ - unk_ac6_f2_38?: number + unk_sdt_f2_32: number /** - * Unknown integer. + * Specular texture ID. * * **Default**: `0` - */ - unk_ac6_f2_39?: number -} - -/** - * ### {@link ActionType.GPUSparkParticle Action 10008 - GPUSparkParticle} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * Similar to {@link ActionType.GPUStandardParticle GPUStandardParticle}, this is essentially an entire particle system in a single action. It defines everything about an emitter as well as the particles it emits. The particles emitted by this action are GPU particles, which means that a lot of them can be rendered at the same time without much impact on performance. The particles are also not affected by most things that affect regular particles, like {@link ActionSlots.ParticleMovementAction ParticleMovement actions}. - * - * What makes this different from {@link ActionType.GPUStandardParticle GPUStandardParticle} is that this actions seems to be designed specifically for effects that create sparks. While the other action's particles is more like billboard particles from, for example, {@link ActionType.BillboardEx BillboardEx}, this action's particles are more like {@link ActionType.QuadLine QuadLine} or {@link ActionType.Tracer Tracer} particles. They bend and rotate to align with the direction they are traveling, and they stretch based on how fast they're moving. - * - * The name of this action is from Elden Ring's RTTI, where it's called "SparkParticle". - * - * This action was first used in Armored Core 6, but definitely also works in Sekiro and Elden Ring. It might work in Dark Souls 3, but its structure is at least somewhat different there, and what that structure looks like is unknown. AC6's structure is compatible with Sekiro and ER, but some features may not work due to having been added in later versions. - */ -class GPUSparkParticle extends DataAction { - declare readonly type: ActionType.GPUSparkParticle - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} - /** - * Controls how well the particles follow the node if it moves. - */ - particleFollowFactor: ScalarValue - unk_ac6_p1_1: ScalarValue - unk_ac6_p1_2: ScalarValue - unk_ac6_p1_3: ScalarValue - /** - * Particle acceleration along the X-axis. - */ - particleAccelerationX: ScalarValue - /** - * Particle acceleration along the Y-axis. - */ - particleAccelerationY: ScalarValue - /** - * Particle acceleration along the Z-axis. - */ - particleAccelerationZ: ScalarValue - /** - * Color multiplier. - * - * Values in this are unrestricted and can go above 1. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - color: Vector4Value - /** - * The length of the particles. - */ - particleLength: ScalarValue - /** - * The width of the particles. - */ - particleWidth: ScalarValue - /** - * Similar to {@link particleAccelerationZ}, but this does not go exactly north? - * - * This requires any of the following fields to have a non-zero value: - * - {@link particleSpeedMin} - * - {@link particleSpeedMax} - */ - unkParticleAcceleration: ScalarValue - unk_ac6_p1_11: ScalarValue - /** - * Downwards acceleration for particles. - * - * This requires any of the following fields to have a non-zero value: - * - {@link particleSpeedMin} - * - {@link particleSpeedMax} - */ - particleGravity: ScalarValue - unk_ac6_p1_13: ScalarValue - unk_ac6_p2_0: ScalarValue - unk_ac6_p2_1: ScalarValue - unk_ac6_p2_2: ScalarValue - unk_ac6_p2_3: Vector4Value - unk_ac6_p2_4: Vector4Value - unk_ac6_p2_5: Vector4Value - unk_ac6_p2_6: ScalarValue - /** - * The ID of the texture of the particles. - */ - texture: number - /** - * Controls the shape of the particle emitter. See {@link EmitterShape} for more details. - */ - emitterShape: EmitterShape - unk_ac6_f1_2: number - /** - * The size of the emitter. - */ - emitterSize: Vector3 - /** - * The rotation of the emitter. - */ - emitterRotation: Vector3 - unk_ac6_f1_9: number - unk_ac6_f1_10: number - unk_ac6_f1_11: number - /** - * Controls how the random emission points are distributed within the {@link emitterShape shape of the emitter}. How this works depend on the emitter shape: - * | Shape | Behavior | - * |-|-| - * | {@link EmitterShape.Line Line} | A fraction of the line where particles can not be emitted from.
At 0, particles can be emitted from any point on the line.
At 1, they can only be emitted from the far end of the line. | - * | {@link EmitterShape.Box Box} | A fraction of the box's size where the particles can not be emitted from. Basically an inner box that blocks emission. | - * | {@link EmitterShape.Box2 Box2} | At 1, any point within the box is equally likely to be picked.
At 0, particles are more likely to be emitted near the center, but it's not a 100% chance. | - * | {@link EmitterShape.Unk3 Unk3} | Exactly the same as {@link EmitterShape.Line Line}? | - * | {@link EmitterShape.Cylinder Cylinder} | A fraction of the radius of the cylinder where the particles can not be emitted from. Basically an inner cylinder that blocks emission. | - */ - emitterDistribution: number - unk_ac6_f1_13: number - unk_ac6_f1_14: number - unk_ac6_f1_15: number - unk_ac6_f1_16: number - unk_ac6_f1_17: number - /** - * The number of particles to emit per emission. - * - * See also: - * - {@link emissionParticleCountMin} - * - {@link emissionParticleCountMax} - */ - emissionParticleCount: number - /** - * The minimum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. - * - * See also: - * - {@link emissionParticleCount} - * - {@link emissionParticleCountMax} - */ - emissionParticleCountMin: number - /** - * The maximum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. - * - * See also: - * - {@link emissionParticleCount} - * - {@link emissionParticleCountMin} - */ - emissionParticleCountMax: number - /** - * The time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - * - * See also: - * - {@link emissionIntervalMin} - * - {@link emissionIntervalMax} - */ - emissionInterval: number - /** - * The minimum time between emissions in seconds. A random value between this and {@link emissionIntervalMax} will be added to {@link emissionInterval} to get the final emission interval. Due to the way this field works, the value will be rounded to the nearest 1/30s. - * - * See also: - * - {@link emissionInterval} - * - {@link emissionIntervalMax} - */ - emissionIntervalMin: number - /** - * The maximum time between emissions in seconds. A random value between this and {@link emissionIntervalMin} will be added to {@link emissionInterval} to get the final emission interval. Due to the way this field works, the value will be rounded to the nearest 1/30s. - * - * See also: - * - {@link emissionInterval} - * - {@link emissionIntervalMin} - */ - emissionIntervalMax: number - /** - * If enabled, the number of emissions will be limited by {@link concurrentEmissionsLimit}. - */ - limitConcurrentEmissions: boolean - /** - * The total number of emissions. This limit is only applied if {@link limitConcurrentEmissions} is enabled. - */ - concurrentEmissionsLimit: number - unk_ac6_f1_26: number - /** - * The duration of each particle in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - */ - particleDuration: number - unk_ac6_f1_28: number - unk_ac6_f1_29: number - /** - * Particle position offset. - * - * See also: - * - {@link particleOffsetMin} - * - {@link particleOffsetMax} - */ - particleOffset: Vector3 - /** - * Minimum particle position offset. A random value between this and {@link particleOffsetMax} will be added to {@link particleOffset} to get the final position offset. - */ - particleOffsetMin: Vector3 - /** - * Maximum particle position offset. A random value between this and {@link particleOffsetMin} will be added to {@link particleOffset} to get the final position offset. - */ - particleOffsetMax: Vector3 - unk_ac6_f1_39: number - /** - * Minimum particle speed. - * - * See also: - * - {@link particleSpeedMax} - */ - particleSpeedMin: Vector3 - /** - * Maximum particle speed. - * - * See also: - * - {@link particleSpeedMin} - */ - particleSpeedMax: Vector3 - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - */ - rgbMultiplier: number - /** - * Alpha multiplier. - */ - alphaMultiplier: number - /** - * Minimum random variation for the particle color. A random value between this and {@link colorMax} will be added to the base {@link color}, but it fades out over the life of the particle. - */ - colorMin: Vector4 - /** - * Maximum random variation for the particle color. A random value between this and {@link colorMin} will be added to the base {@link color}, but it fades out over the life of the particle. - */ - colorMax: Vector4 - /** - * Blend mode. - */ - blendMode: BlendMode - unk_ac6_f1_57: number - unk_ac6_f1_58: number - unk_ac6_f1_59: number - unk_ac6_f1_60: number - unk_ac6_f1_61: number - unk_ac6_f1_62: number - /** - * Minimum particle length. A random value between this and {@link particleLengthMax} will be **multiplied** by {@link particleLength} to get the final particle length. - */ - particleLengthMin: number - /** - * Maximum particle length. A random value between this and {@link particleLengthMin} will be **multiplied** by {@link particleLength} to get the final particle length. - */ - particleLengthMax: number - /** - * Minimum particle width. A random value between this and {@link particleWidthMax} will be **multiplied** by {@link particleWidth} to get the final particle width. - */ - particleWidthMin: number - /** - * Maximum particle width. A random value between this and {@link particleWidthMin} will be **multiplied** by {@link particleWidth} to get the final particle width. - */ - particleWidthMax: number - unk_ac6_f1_67: number - unk_ac6_f1_68: number - /** - * Multiplier for {@link particleDuration}. - */ - particleDurationMultiplier: number - unk_ac6_f1_70: number - unk_ac6_f1_71: number - unk_ac6_f1_72: number - unk_ac6_f1_73: number - unk_ac6_f1_74: number - unk_ac6_f1_75: number - unk_ac6_f1_76: number - unk_ac6_f1_77: number - unk_ac6_f1_78: number - unk_ac6_f1_79: number - unk_ac6_f1_80: number - unk_ac6_f1_81: number - unk_ac6_f1_82: number - unk_ac6_f1_83: number - /** - * Unknown float. Seems to make the particles fly around somewhat randomly, but with a specific average direction. {@link unk_ac6_f1_85} works in a similar way, but has the opposite average direction. - */ - unk_ac6_f1_84: number - /** - * Unknown float. Seems to make the particles fly around somewhat randomly, but with a specific average direction. {@link unk_ac6_f1_84} works in a similar way, but has the opposite average direction. - */ - unk_ac6_f1_85: number - unk_ac6_f1_86: number - unk_ac6_f1_87: number - unk_ac6_f1_88: number - unk_ac6_f1_89: number - /** - * If enabled, the particle system stops updating if the camera is beyond the distance specified by {@link updateDistance} from the node. - * - * It will not stop updating immediately after the action becomes active. Instead, it will wait for a little while before stopping if the camera is too far away. - */ - limitUpdateDistance: boolean - /** - * Controls how close the camera needs to be to the node for the particle system to update. Requires {@link limitUpdateDistance} to be enabled. - */ - updateDistance: number - /** - * When enabled, this makes the particles bounce off of any surface they hit. This collision detection is just based on the depth buffer, not the full 3D scene, so it is not always perfect. - * - * See also: - * - {@link particleBounciness} - */ - particleCollision: boolean - /** - * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. - * - * See also: - * - {@link particleCollision} - */ - particleBounciness: number - unk_ac6_f1_94: number - unk_ac6_f1_95: number - /** - * Controls whether or not the particles have a bloom effect. - * - * See also: - * - {@link bloomColor} - */ - bloom: boolean - /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - * - * See also: - * - {@link bloom} - */ - bloomColor: Vector4 - unk_ac6_f1_101: number - unk_ac6_f1_102: number - unk_ac6_f1_103: number - unk_ac6_f2_0: number - unk_ac6_f2_1: number - unk_ac6_f2_2: number - unk_ac6_f2_3: number - unk_ac6_f2_4: number - unk_ac6_f2_5: number - unk_ac6_f2_6: number - unk_ac6_f2_7: number - unk_ac6_f2_8: number - unk_ac6_f2_9: number - unk_ac6_f2_10: number - unk_ac6_f2_11: number - unk_ac6_f2_12: number - unk_ac6_f2_13: number - /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minFadeDistance: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. * * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link lighting} + * - {@link glossiness} + * - {@link specularity} */ - minDistance: number + specular: number /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. + * Controls how sharp the specular highlights are. * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * **Default**: `0.25` * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link lighting} + * - {@link specular} + * - {@link specularity} */ - maxFadeDistance: number + glossiness: number /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * Unknown integer. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: {@link LightingMode.Unlit} */ - maxDistance: number + lighting: LightingMode /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * Unknown integer. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} + * **Default**: `-2` */ - minDistanceThreshold: number + unk_sdt_f2_36: number /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * Unknown integer. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} + * **Default**: `0` */ - maxDistanceThreshold: number - unk_ac6_f2_20: number - unk_ac6_f2_21: number - unk_ac6_f2_22: number - unk_ac6_f2_23: number - unk_ac6_f2_24: number - unkDepthBlend1: number - unkDepthBlend2: number - unk_ac6_f2_27: number - unk_ac6_f2_28: number - unk_ac6_f2_29: number + unk_sdt_f2_37: number /** - * Controls how dark shaded parts of the particle are. + * Controls how bright the specular highlights are. + * + * **Default**: `0.5` + * + * See also: + * - {@link lighting} + * - {@link specular} + * - {@link glossiness} */ - shadowDarkness: number + specularity: number /** - * When set to 1, this stops the particles from being shown indoors. + * Unknown integer. * - * Other values are used in AC6, but what they do is unknown. + * **Default**: `0` */ - unkHideIndoors: number - unk_ac6_f2_32: number - unk_ac6_f2_33: number - unk_ac6_f2_34: number - lighting: LightingMode - unk_ac6_f2_36: number - unk_ac6_f2_37: number - unk_ac6_f2_38: number - unk_ac6_f2_39: number - constructor(props: GPUSparkParticleParams = {}) { - super(ActionType.GPUSparkParticle, {isAppearance:true,isParticle:false}) + unk_er_f2_39: number + constructor(props: Partial> = {}) { + super(ActionType.GPUStandardParticle, {isAppearance:true,isParticle:false}) this.assign(props) } } -export interface GPUSparkCorrectParticleParams { +/** + * ### {@link ActionType.GPUStandardCorrectParticle Action 10001 - GPUStandardCorrectParticle} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * Very similar to {@link ActionType.GPUStandardParticle GPUStandardParticle}, with no known differences. + * + * The name of this action is from Elden Ring's RTTI, where it's called "StandardCorrectParticle". An action with the same ID had the name "WanderingVision" in Dark Souls 3, and that action could still exist in DS3, but it is not found in the vanilla game, so testing it is difficult. + * + * Note: This action does not exist in Dark Souls 3 or Sekiro, but it still has unknown fields and properties named after those games. This is because it makes the conversion between this action and {@link ActionType.GPUStandardParticle GPUStandardParticle} much simpler. When written for those two games, this action will be converted to the other action automatically. + */ +class GPUStandardCorrectParticle extends DataAction { + declare readonly type: ActionType.GPUStandardCorrectParticle + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * Controls how well the particles follow the node if it moves. * * **Default**: `0` */ - particleFollowFactor?: ScalarValue + particleFollowFactor: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_p1_1?: ScalarValue + unk_ds3_p1_1: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_p1_2?: ScalarValue + unk_ds3_p1_2: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_p1_3?: ScalarValue + unk_ds3_p1_3: ScalarValue /** * Particle acceleration along the X-axis. * * **Default**: `0` + * + * See also: + * - {@link particleAccelerationMin} + * - {@link particleAccelerationMax} */ - particleAccelerationX?: ScalarValue + particleAccelerationX: ScalarValue /** * Particle acceleration along the Y-axis. * * **Default**: `0` + * + * See also: + * - {@link particleAccelerationMin} + * - {@link particleAccelerationMax} */ - particleAccelerationY?: ScalarValue + particleAccelerationY: ScalarValue /** * Particle acceleration along the Z-axis. * * **Default**: `0` + * + * See also: + * - {@link particleAccelerationMin} + * - {@link particleAccelerationMax} + */ + particleAccelerationZ: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ + unk_ds3_p1_7: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ + unk_ds3_p1_8: ScalarValue + /** + * Angular acceleration for particles around the Z-axis in degrees per second squared. + * + * **Default**: `0` + * + * See also: + * - {@link particleAngularAccelerationMin} + * - {@link particleAngularAccelerationMax} + */ + particleAngularAccelerationZ: ScalarValue + /** + * The rate of change for the width of the particles. + * + * **Default**: `0` + * + * See also: + * - {@link particleGrowthRateXStatic} + */ + particleGrowthRateX: ScalarValue + /** + * The rate of change for the height of the particles. + * + * **Default**: `0` + * + * See also: + * - {@link particleGrowthRateYStatic} + */ + particleGrowthRateY: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` */ - particleAccelerationZ?: ScalarValue + unk_ds3_p1_12: ScalarValue /** * Color multiplier. * @@ -31958,141 +22734,161 @@ export interface GPUSparkCorrectParticleParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - color?: Vector4Value + color: Vector4Value /** - * The length of the particles. + * Unknown scalar. * * **Default**: `1` */ - particleLength?: ScalarValue + unk_ds3_p1_14: ScalarValue /** - * The width of the particles. + * Unknown scalar. * - * **Default**: `0.1` + * **Default**: `0` */ - particleWidth?: ScalarValue + unk_ds3_p1_15: ScalarValue /** - * Similar to {@link particleAccelerationZ}, but this does not go exactly north? - * - * This requires any of the following fields to have a non-zero value: - * - {@link particleSpeedMin} - * - {@link particleSpeedMax} + * Seemingly identical to {@link particleAccelerationZ}? * * **Default**: `0` */ - unkParticleAcceleration?: ScalarValue + unkParticleAcceleration: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_p1_11?: ScalarValue + unk_ds3_p1_17: ScalarValue /** * Downwards acceleration for particles. * - * This requires any of the following fields to have a non-zero value: - * - {@link particleSpeedMin} - * - {@link particleSpeedMax} + * **Default**: `0` + */ + particleGravity: ScalarValue + /** + * Maximum random turn angle for particles. Requires {@link particleRandomTurns} to be enabled. * - * **Default**: `1` + * **Default**: `0` + * + * See also: + * - {@link particleRandomTurns} + * - {@link particleRandomTurnIntervalMax} */ - particleGravity?: ScalarValue + particleRandomTurnAngle: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_p1_13?: ScalarValue + unk_ds3_p1_20: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `1` */ - unk_ac6_p2_0?: ScalarValue + unk_ds3_p2_0: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `1` */ - unk_ac6_p2_1?: ScalarValue + unk_ds3_p2_1: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_p2_2?: ScalarValue + unk_ds3_p2_2: ScalarValue /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ac6_p2_3?: Vector4Value + unk_ds3_p2_3: Vector4Value /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ac6_p2_4?: Vector4Value + unk_ds3_p2_4: Vector4Value /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ac6_p2_5?: Vector4Value + unk_ds3_p2_5: Vector4Value /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_p2_6?: ScalarValue + unk_ds3_p2_6: ScalarValue + /** + * Unknown integer. + * + * **Default**: `1005` + */ + unk_ds3_f1_0: number /** * The ID of the texture of the particles. * * **Default**: `1` */ - texture?: number + texture: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ds3_f1_2: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + normalMap: number /** * Controls the shape of the particle emitter. See {@link EmitterShape} for more details. * * **Default**: {@link EmitterShape.Box} */ - emitterShape?: EmitterShape + emitterShape: EmitterShape /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_2?: number + unk_ds3_f1_5: number /** * The size of the emitter. * * **Default**: `[1, 1, 1]` */ - emitterSize?: Vector3 + emitterSize: Vector3 /** * The rotation of the emitter. * * **Default**: `[0, 0, 0]` */ - emitterRotation?: Vector3 + emitterRotation: Vector3 /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_9?: number + unk_ds3_f1_12: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_10?: number + unk_ds3_f1_13: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_11?: number + unk_ds3_f1_14: number /** * Controls how the random emission points are distributed within the {@link emitterShape shape of the emitter}. How this works depend on the emitter shape: * | Shape | Behavior | @@ -32105,37 +22901,43 @@ export interface GPUSparkCorrectParticleParams { * * **Default**: `0` */ - emitterDistribution?: number + emitterDistribution: number /** * Unknown float. * * **Default**: `0` */ - unk_ac6_f1_13?: number + unk_ds3_f1_16: number /** * Unknown float. * * **Default**: `0` */ - unk_ac6_f1_14?: number + unk_ds3_f1_17: number /** * Unknown integer. * * **Default**: `-1` */ - unk_ac6_f1_15?: number + unk_ds3_f1_18: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_16?: number + unk_ds3_f1_19: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_17?: number + unk_ds3_f1_20: number + /** + * Unknown integer. + * + * **Default**: `100` + */ + unk_ds3_f1_21: number /** * The number of particles to emit per emission. * @@ -32145,7 +22947,7 @@ export interface GPUSparkCorrectParticleParams { * - {@link emissionParticleCountMin} * - {@link emissionParticleCountMax} */ - emissionParticleCount?: number + emissionParticleCount: number /** * The minimum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. * @@ -32155,7 +22957,7 @@ export interface GPUSparkCorrectParticleParams { * - {@link emissionParticleCount} * - {@link emissionParticleCountMax} */ - emissionParticleCountMin?: number + emissionParticleCountMin: number /** * The maximum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. * @@ -32165,73 +22967,67 @@ export interface GPUSparkCorrectParticleParams { * - {@link emissionParticleCount} * - {@link emissionParticleCountMin} */ - emissionParticleCountMax?: number + emissionParticleCountMax: number /** - * The time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. + * Unknown integer. * * **Default**: `0` - * - * See also: - * - {@link emissionIntervalMin} - * - {@link emissionIntervalMax} */ - emissionInterval?: number + unk_ds3_f1_25: number /** - * The minimum time between emissions in seconds. A random value between this and {@link emissionIntervalMax} will be added to {@link emissionInterval} to get the final emission interval. Due to the way this field works, the value will be rounded to the nearest 1/30s. + * The minimum time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. * - * **Default**: `0` + * **Default**: `1` * * See also: - * - {@link emissionInterval} * - {@link emissionIntervalMax} */ - emissionIntervalMin?: number + emissionIntervalMin: number /** - * The maximum time between emissions in seconds. A random value between this and {@link emissionIntervalMin} will be added to {@link emissionInterval} to get the final emission interval. Due to the way this field works, the value will be rounded to the nearest 1/30s. + * The maximum time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. * - * **Default**: `0` + * **Default**: `1` * * See also: - * - {@link emissionInterval} * - {@link emissionIntervalMin} */ - emissionIntervalMax?: number + emissionIntervalMax: number /** - * If enabled, the number of emissions will be limited by {@link concurrentEmissionsLimit}. + * If enabled, the number of emissions will be limited by {@link emissionCountLimit}. * * **Default**: `false` */ - limitConcurrentEmissions?: boolean + limitEmissionCount: boolean /** - * The total number of emissions. This limit is only applied if {@link limitConcurrentEmissions} is enabled. + * The total number of emissions. This limit is only applied if {@link limitEmissionCount} is enabled. * * **Default**: `0` */ - concurrentEmissionsLimit?: number + emissionCountLimit: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_26?: number + unk_ds3_f1_30: number /** * The duration of each particle in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. * * **Default**: `1` */ - particleDuration?: number + particleDuration: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_28?: number + unk_ds3_f1_32: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_29?: number + unk_ds3_f1_33: number /** * Particle position offset. * @@ -32241,271 +23037,525 @@ export interface GPUSparkCorrectParticleParams { * - {@link particleOffsetMin} * - {@link particleOffsetMax} */ - particleOffset?: Vector3 + particleOffset: Vector3 /** * Minimum particle position offset. A random value between this and {@link particleOffsetMax} will be added to {@link particleOffset} to get the final position offset. * * **Default**: `[0, 0, 0]` */ - particleOffsetMin?: Vector3 + particleOffsetMin: Vector3 /** * Maximum particle position offset. A random value between this and {@link particleOffsetMin} will be added to {@link particleOffset} to get the final position offset. * * **Default**: `[0, 0, 0]` */ - particleOffsetMax?: Vector3 + particleOffsetMax: Vector3 /** - * Unknown integer. + * Particle speed. + * + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleSpeedMin} + * - {@link particleSpeedMax} + */ + particleSpeed: Vector3 + /** + * Minimum particle speed. A random value between this and {@link particleSpeedMax} will be added to {@link particleSpeed} to get the final speed. + * + * **Default**: `[0, 0, 0]` + */ + particleSpeedMin: Vector3 + /** + * Maximum particle speed. A random value between this and {@link particleSpeedMin} will be added to {@link particleSpeed} to get the final speed. + * + * **Default**: `[0, 0, 0]` + */ + particleSpeedMax: Vector3 + /** + * Minimum particle acceleration. A random value between this and {@link particleAccelerationMax} will be added to the three acceleration properties to get the final acceleration. + * + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleAccelerationX} + * - {@link particleAccelerationY} + * - {@link particleAccelerationZ} + */ + particleAccelerationMin: Vector3 + /** + * Maximum particle acceleration. A random value between this and {@link particleAccelerationMin} will be added to the three acceleration properties to get the final acceleration. + * + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleAccelerationX} + * - {@link particleAccelerationY} + * - {@link particleAccelerationZ} + */ + particleAccelerationMax: Vector3 + /** + * Maximum amount of random rotation for each particle in degrees. + * + * **Default**: `[0, 0, 0]` + */ + particleRotationVariance: Vector3 + /** + * Maximum amount of random angular speed for each particle in degrees per second. + * + * **Default**: `[0, 0, 0]` + */ + particleAngularSpeedVariance: Vector3 + /** + * Minimum amount of random angular acceleration for each particle in degrees per second squared. + * + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleAngularAccelerationMax} + */ + particleAngularAccelerationMin: Vector3 + /** + * Maximum amount of random angular acceleration for each particle in degrees per second squared. + * + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleAngularAccelerationMin} + */ + particleAngularAccelerationMax: Vector3 + /** + * When enabled, the height of the particles will be based on the {@link particleSizeX width} instead of the {@link particleSizeY height field}, and the height field is ignored. + * + * **Default**: `false` + * + * See also: + * - {@link particleSizeX} + * - {@link particleSizeY} + * - {@link particleSizeXMin} + * - {@link particleSizeYMin} + * - {@link particleSizeXMax} + * - {@link particleSizeYMax} + * - {@link particleGrowthRateX} + * - {@link particleGrowthRateY} + * - {@link particleGrowthRateXStatic} + * - {@link particleGrowthRateYStatic} + * - {@link particleGrowthAccelerationXMin} + * - {@link particleGrowthAccelerationYMin} + * - {@link particleGrowthAccelerationXMax} + * - {@link particleGrowthAccelerationYMax} + */ + particleUniformScale: boolean + /** + * The width of the particle. + * + * **Default**: `1` + */ + particleSizeX: number + /** + * The height of the particle. + * + * **Default**: `1` + */ + particleSizeY: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_ds3_f1_73: number + /** + * The minimum width of the particle. A random value between this and {@link particleSizeXMin} will be added to {@link particleSizeX} to get the final width. * * **Default**: `0` */ - unk_ac6_f1_39?: number + particleSizeXMin: number /** - * Minimum particle speed. + * The minimum height of the particle. A random value between this and {@link particleSizeYMin} will be added to {@link particleSizeY} to get the final height. * - * **Default**: `[-0.01, -0.01, -0.01]` + * **Default**: `0` + */ + particleSizeYMin: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_ds3_f1_76: number + /** + * The maximum width of the particle. A random value between this and {@link particleSizeXMax} will be added to {@link particleSizeX} to get the final width. + * + * **Default**: `0` + */ + particleSizeXMax: number + /** + * The maximum height of the particle. A random value between this and {@link particleSizeYMax} will be added to {@link particleSizeY} to get the final height. + * + * **Default**: `0` + */ + particleSizeYMax: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_ds3_f1_79: number + /** + * The rate of change for the width of the particles. + * + * **Default**: `0` * * See also: - * - {@link particleSpeedMax} + * - {@link particleGrowthRateX} */ - particleSpeedMin?: Vector3 + particleGrowthRateXStatic: number /** - * Maximum particle speed. + * The rate of change for the height of the particles. * - * **Default**: `[0.01, 0.01, 0.01]` + * **Default**: `0` + * + * See also: + * - {@link particleGrowthRateY} + */ + particleGrowthRateYStatic: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_ds3_f1_82: number + /** + * Minimum rate of change for the width of the particles. A random value between this and {@link particleGrowthRateXMax} will be added to {@link particleGrowthRateX} and {@link particleGrowthRateXStatic} to get the final growth rate. + * + * **Default**: `0` + */ + particleGrowthRateXMin: number + /** + * Minimum rate of change for the height of the particles. A random value between this and {@link particleGrowthRateYMax} will be added to {@link particleGrowthRateY} and {@link particleGrowthRateYStatic} to get the final growth rate. + * + * **Default**: `0` + */ + particleGrowthRateYMin: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_ds3_f1_85: number + /** + * Maximum rate of change for the width of the particles. A random value between this and {@link particleGrowthRateXMax} will be added to {@link particleGrowthRateX} and {@link particleGrowthRateXStatic} to get the final growth rate. + * + * **Default**: `0` + */ + particleGrowthRateXMax: number + /** + * Maximum rate of change for the height of the particles. A random value between this and {@link particleGrowthRateYMax} will be added to {@link particleGrowthRateY} and {@link particleGrowthRateYStatic} to get the final growth rate. + * + * **Default**: `0` + */ + particleGrowthRateYMax: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_ds3_f1_88: number + /** + * Minimum acceleration of change for the width of the particles. A random value between this and {@link particleGrowthAccelerationXMax} will be the final growth acceleration. + * + * **Default**: `0` + */ + particleGrowthAccelerationXMin: number + /** + * Minimum acceleration of change for the height of the particles. A random value between this and {@link particleGrowthAccelerationYMax} will be the final growth acceleration. + * + * **Default**: `0` + */ + particleGrowthAccelerationYMin: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_ds3_f1_91: number + /** + * Minimum acceleration of change for the width of the particles. A random value between this and {@link particleGrowthAccelerationXMin} will be the final growth acceleration. + * + * **Default**: `0` + */ + particleGrowthAccelerationXMax: number + /** + * Minimum acceleration of change for the height of the particles. A random value between this and {@link particleGrowthAccelerationYMin} will be the final growth acceleration. + * + * **Default**: `0` + */ + particleGrowthAccelerationYMax: number + /** + * Unknown float. * - * See also: - * - {@link particleSpeedMin} + * **Default**: `0` */ - particleSpeedMax?: Vector3 + unk_ds3_f1_94: number /** * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * * **Default**: `1` */ - rgbMultiplier?: number + rgbMultiplier: number /** * Alpha multiplier. * * **Default**: `1` */ - alphaMultiplier?: number + alphaMultiplier: number /** * Minimum random variation for the particle color. A random value between this and {@link colorMax} will be added to the base {@link color}, but it fades out over the life of the particle. * * **Default**: `[0, 0, 0, 0]` */ - colorMin?: Vector4 + colorMin: Vector4 /** * Maximum random variation for the particle color. A random value between this and {@link colorMin} will be added to the base {@link color}, but it fades out over the life of the particle. * * **Default**: `[0, 0, 0, 0]` */ - colorMax?: Vector4 + colorMax: Vector4 /** * Blend mode. * - * **Default**: {@link BlendMode.Add} + * **Default**: {@link BlendMode.Normal} */ - blendMode?: BlendMode + blendMode: BlendMode /** - * Unknown integer. + * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. * - * **Default**: `-1` + * **Default**: `1` + * + * See also: + * - {@link totalFrames} */ - unk_ac6_f1_57?: number + columns: number /** - * Unknown integer. + * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. * - * **Default**: `-1` + * **Default**: `1` + * + * See also: + * - {@link columns} + */ + totalFrames: number + /** + * When enabled, this makes each particle pick a random frame from the animation and only display that one frame. + * + * **Default**: `false` + * + * See also: + * - {@link columns} + * - {@link totalFrames} + * - {@link maxFrameIndex} */ - unk_ac6_f1_58?: number + randomTextureFrame: boolean /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_59?: number + unk_ds3_f1_109: number /** - * Unknown integer. + * Controls the maximum frame index when {@link randomTextureFrame picking a random frame to display}. * * **Default**: `0` + * + * See also: + * - {@link randomTextureFrame} */ - unk_ac6_f1_60?: number + maxFrameIndex: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `-1` */ - unk_ac6_f1_61?: number + unk_ds3_f1_111: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `-1` */ - unk_ac6_f1_62?: number + unk_ds3_f1_112: number /** - * Minimum particle length. A random value between this and {@link particleLengthMax} will be **multiplied** by {@link particleLength} to get the final particle length. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - particleLengthMin?: number + unk_ds3_f1_113: number /** - * Maximum particle length. A random value between this and {@link particleLengthMin} will be **multiplied** by {@link particleLength} to get the final particle length. + * Unknown integer. * * **Default**: `1` */ - particleLengthMax?: number + unk_ds3_f1_114: number /** - * Minimum particle width. A random value between this and {@link particleWidthMax} will be **multiplied** by {@link particleWidth} to get the final particle width. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - particleWidthMin?: number + unk_ds3_f1_115: number /** - * Maximum particle width. A random value between this and {@link particleWidthMin} will be **multiplied** by {@link particleWidth} to get the final particle width. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - particleWidthMax?: number + unk_ds3_f1_116: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_67?: number + unk_ds3_f1_117: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_68?: number + unk_ds3_f1_118: number /** * Multiplier for {@link particleDuration}. * * **Default**: `1` */ - particleDurationMultiplier?: number + particleDurationMultiplier: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_70?: number + unk_ds3_f1_120: number /** - * Unknown float. + * Scalar multiplier for the size of the particles. * * **Default**: `1` */ - unk_ac6_f1_71?: number + particleSizeMultiplier: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_72?: number + unk_ds3_f1_122: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_73?: number + unk_ds3_f1_123: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_74?: number + unk_ds3_f1_124: number /** * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_ac6_f1_75?: number + unk_ds3_f1_125: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_76?: number + unk_ds3_f1_126: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ds3_f1_127: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_77?: number + unk_ds3_f1_128: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_78?: number + unk_ds3_f1_129: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_79?: number + unk_ds3_f1_130: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_80?: number + unk_ds3_f1_131: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_81?: number + unk_ds3_f1_132: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_82?: number + unk_ds3_f1_133: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_83?: number + unk_ds3_f1_134: number /** - * Unknown float. Seems to make the particles fly around somewhat randomly, but with a specific average direction. {@link unk_ac6_f1_85} works in a similar way, but has the opposite average direction. + * Unknown float. * * **Default**: `0` */ - unk_ac6_f1_84?: number + unk_ds3_f1_135: number /** - * Unknown float. Seems to make the particles fly around somewhat randomly, but with a specific average direction. {@link unk_ac6_f1_84} works in a similar way, but has the opposite average direction. + * Unknown float. * * **Default**: `0` */ - unk_ac6_f1_85?: number + unk_ds3_f1_136: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_86?: number + unk_ds3_f1_137: number /** * Unknown integer. * * **Default**: `8` */ - unk_ac6_f1_87?: number + unk_ds3_f1_138: number /** - * Unknown integer. + * Unknown float. + * + * **Default**: `0` + */ + unk_ds3_f1_139: number + /** + * Unknown float. * * **Default**: `0` */ - unk_ac6_f1_88?: number + unk_ds3_f1_140: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_89?: number + unk_ds3_f1_141: number /** * If enabled, the particle system stops updating if the camera is beyond the distance specified by {@link updateDistance} from the node. * @@ -32513,13 +23563,13 @@ export interface GPUSparkCorrectParticleParams { * * **Default**: `0` */ - limitUpdateDistance?: boolean + limitUpdateDistance: boolean /** * Controls how close the camera needs to be to the node for the particle system to update. Requires {@link limitUpdateDistance} to be enabled. * * **Default**: `0` */ - updateDistance?: number + updateDistance: number /** * When enabled, this makes the particles bounce off of any surface they hit. This collision detection is just based on the depth buffer, not the full 3D scene, so it is not always perfect. * @@ -32528,7 +23578,7 @@ export interface GPUSparkCorrectParticleParams { * See also: * - {@link particleBounciness} */ - particleCollision?: boolean + particleCollision: boolean /** * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. * @@ -32537,19 +23587,75 @@ export interface GPUSparkCorrectParticleParams { * See also: * - {@link particleCollision} */ - particleBounciness?: number + particleBounciness: number + /** + * If enabled, particles will randomly make sharp turns that affect the direction of various speed and acceleration properties. Both the time between turns and the turn angle are randomized for each turn and for each particle, and they are based on {@link particleRandomTurnIntervalMax} and {@link particleRandomTurnAngle} respectively. + * + * **Default**: `false` + * + * See also: + * - {@link particleRandomTurnIntervalMax} + * - {@link particleRandomTurnAngle} + */ + particleRandomTurns: boolean + /** + * The maximum amount of time in seconds to wait between making random turns. Requires {@link particleRandomTurns} to be enabled. + * + * **Default**: `1` + * + * See also: + * - {@link particleRandomTurns} + * - {@link particleRandomTurnAngle} + */ + particleRandomTurnIntervalMax: number + /** + * If enabled, this causes the particles to orient themselves and stretch in the direction they are moving on the screen, making them almost resemble {@link ActionType.Tracer Tracer} particles. + * + * **Default**: `false` + * + * See also: + * - {@link particleTraceLength} + */ + traceParticles: boolean + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_ds3_f1_149: number + /** + * Controls how much the particles are stretched when {@link traceParticles} is enabled. + * + * **Default**: `1` + */ + particleTraceLength: number + /** + * A central fraction of the emitter volume where the particles will not be trace particles. In this volume, the particles act as if {@link traceParticles} is disabled. + * + * **Default**: `0` + */ + traceParticlesThreshold: number + /** + * If enabled, this will add a billboarding sprite to the leading end of trace particles. + * + * **Default**: `false` + * + * See also: + * - {@link traceParticles} + */ + traceParticleHead: boolean /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_94?: number + unk_ds3_f1_153: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_95?: number + unk_ds3_f1_154: number /** * Controls whether or not the particles have a bloom effect. * @@ -32558,7 +23664,7 @@ export interface GPUSparkCorrectParticleParams { * See also: * - {@link bloomColor} */ - bloom?: boolean + bloom: boolean /** * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. * @@ -32571,141 +23677,171 @@ export interface GPUSparkCorrectParticleParams { * See also: * - {@link bloom} */ - bloomColor?: Vector4 + bloomColor: Vector4 + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_sdt_f1_160: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_sdt_f1_161: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_sdt_f1_162: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_sdt_f1_163: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_101?: number + unk_sdt_f1_164: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_102?: number + unk_sdt_f1_165: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_sdt_f1_166: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f1_103?: number + unk_er_f1_167: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_0?: number + unk_ds3_f2_0: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_1?: number + unk_ds3_f2_1: number /** * Unknown integer. * * **Default**: `8` */ - unk_ac6_f2_2?: number + unk_ds3_f2_2: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_3?: number + unk_ds3_f2_3: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_4?: number + unk_ds3_f2_4: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f2_5?: number + unk_ds3_f2_5: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f2_6?: number + unk_ds3_f2_6: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f2_7?: number + unk_ds3_f2_7: number /** * Unknown float. * * **Default**: `1` */ - unk_ac6_f2_8?: number + unk_ds3_f2_8: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_9?: number + unk_ds3_f2_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_10?: number + unk_ds3_f2_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_11?: number + unk_ds3_f2_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_12?: number + unk_ds3_f2_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_13?: number + unk_ds3_f2_13: number /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. + * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. * * **Default**: `-1` * * See also: - * - {@link minFadeDistance} + * - {@link minDistance} * - {@link maxFadeDistance} * - {@link maxDistance} * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minFadeDistance?: number + minFadeDistance: number /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. + * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * This requires {@link minFadeDistance} to be set to a positive value or 0. + * + * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. * * **Default**: `-1` * * See also: - * - {@link minDistance} + * - {@link minFadeDistance} * - {@link maxFadeDistance} * - {@link maxDistance} * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minDistance?: number + minDistance: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -32720,7 +23856,7 @@ export interface GPUSparkCorrectParticleParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxFadeDistance?: number + maxFadeDistance: number /** * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -32737,7 +23873,7 @@ export interface GPUSparkCorrectParticleParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxDistance?: number + maxDistance: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -32750,7 +23886,7 @@ export interface GPUSparkCorrectParticleParams { * - {@link maxDistance} * - {@link maxDistanceThreshold} */ - minDistanceThreshold?: number + minDistanceThreshold: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -32763,164 +23899,462 @@ export interface GPUSparkCorrectParticleParams { * - {@link maxDistance} * - {@link minDistanceThreshold} */ - maxDistanceThreshold?: number + maxDistanceThreshold: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ds3_f2_20: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ds3_f2_21: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ds3_f2_22: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ds3_f2_23: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ds3_f2_24: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unkDepthBlend1: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unkDepthBlend2: number + /** + * Unknown integer. + * + * **Default**: `1` + */ + unk_ds3_f2_27: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ds3_f2_28: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_sdt_f2_29: number + /** + * Controls how dark shaded parts of the particle are. + * + * **Default**: `0` + */ + shadowDarkness: number + /** + * When set to 1, this stops the particles from being shown indoors. + * + * Other values are used in AC6, but what they do is unknown. + * + * **Default**: `0` + */ + unkHideIndoors: number + /** + * Unknown integer. + * + * Like in most other actions with this field, when set to 1, it may stop {@link unk_sdt_f2_29} from doing whatever it is doing, but that field may also not work exactly the same in this action, so it's tricky to confirm. It can also cause some ugly "outline" effects on things seen through particles. + * + * **Default**: `0` + */ + unk_sdt_f2_32: number + /** + * Specular texture ID. + * + * **Default**: `0` + * + * See also: + * - {@link lighting} + * - {@link glossiness} + * - {@link specularity} + */ + specular: number + /** + * Controls how sharp the specular highlights are. + * + * **Default**: `0.25` + * + * See also: + * - {@link lighting} + * - {@link specular} + * - {@link specularity} + */ + glossiness: number + /** + * Unknown integer. + * + * **Default**: {@link LightingMode.Unlit} + */ + lighting: LightingMode + /** + * Unknown integer. + * + * **Default**: `-2` + */ + unk_sdt_f2_36: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_sdt_f2_37: number + /** + * Controls how bright the specular highlights are. + * + * **Default**: `0.5` + * + * See also: + * - {@link lighting} + * - {@link specular} + * - {@link glossiness} + */ + specularity: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `0` + */ + unk_er_f2_39: number + constructor(props: Partial> = {}) { + super(ActionType.GPUStandardCorrectParticle, {isAppearance:true,isParticle:false}) + this.assign(props) + } +} + +/** + * ### {@link ActionType.LightShaft Action 10003 - LightShaft} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * A pretty simple light shafts effect only used in Dark Souls 3. It shows up if converted for Sekiro, but it doesn't seem to work correctly in that game. It does not seem to work at all in Elden Ring or Armored Core 6. + */ +class LightShaft extends DataAction { + declare readonly type: ActionType.LightShaft + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} + /** + * Unknown scalar. + * + * **Default**: `1` + */ + width: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `1` + */ + height: ScalarValue + /** + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` + */ + color1: Vector4Value + /** + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` + */ + color2: Vector4Value + /** + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` + */ + color3: Vector4Value + /** + * Unknown scalar. + * + * **Default**: `0` + */ + unk_ds3_p1_5: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ + unk_ds3_p1_6: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ + unk_ds3_p1_7: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `1` + */ + unk_ds3_p1_8: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `1` + */ + unk_ds3_p1_9: ScalarValue + /** + * Texture ID. + * + * **Default**: `0` + */ + texture: number + /** + * Blend mode. + * + * **Default**: {@link BlendMode.Add} + */ + blendMode: BlendMode + /** + * Unknown float. + * + * **Default**: `0.75` + */ + unk_ds3_f1_2: number + /** + * Unknown float. + * + * **Default**: `0.75` + */ + unk_ds3_f1_3: number + /** + * Unknown float. + * + * **Default**: `2` + */ + unk_ds3_f1_4: number + /** + * Unknown float. + * + * **Default**: `0.1` + */ + unk_ds3_f1_5: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_ds3_f1_6: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_ds3_f1_7: number + /** + * The number of layers to use for the light shaft effect. Higher values will look better, but will probably perform worse. + * + * **Default**: `30` + */ + layers: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_ds3_f1_9: number + /** + * Unknown float. + * + * **Default**: `1` */ - unk_ac6_f2_20?: number + unk_ds3_f1_10: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_ac6_f2_21?: number + unk_ds3_f1_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_22?: number + unk_ds3_f1_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_23?: number + unk_ds3_f1_13: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_24?: number + unk_ds3_f1_14: number /** * Unknown float. * * **Default**: `1` */ - unkDepthBlend1?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unkDepthBlend2?: number + unk_ds3_f1_15: number /** * Unknown integer. * * **Default**: `1` */ - unk_ac6_f2_27?: number + unk_ds3_f1_16: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_28?: number + unk_ds3_f1_17: number /** * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_ac6_f2_29?: number + unk_ds3_f1_18: number /** - * Controls how dark shaded parts of the particle are. + * Unknown float. * * **Default**: `1` */ - shadowDarkness?: number + unk_ds3_f1_19: number /** - * When set to 1, this stops the particles from being shown indoors. - * - * Other values are used in AC6, but what they do is unknown. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unkHideIndoors?: number + unk_ds3_f1_20: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_ac6_f2_32?: number + unk_ds3_f1_21: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `0` + * **Default**: `-1` */ - unk_ac6_f2_33?: number + unk_ds3_f1_22: number /** * Unknown float. * - * **Default**: `0.5` + * **Default**: `-1` */ - unk_ac6_f2_34?: number + unk_ds3_f1_23: number /** * Unknown integer. * - * **Default**: {@link LightingMode.Unlit} + * **Default**: `0` */ - lighting?: LightingMode + unk_ds3_f1_24: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `-2` + * **Default**: `1` */ - unk_ac6_f2_36?: number + unk_ds3_f1_25: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_ac6_f2_37?: number + unk_ds3_f1_26: number /** * Unknown float. * - * **Default**: `0` + * **Default**: `1` + */ + unk_ds3_f1_27: number + /** + * Unknown float. + * + * **Default**: `-1` */ - unk_ac6_f2_38?: number + unk_ds3_f1_28: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f2_39?: number + unk_ds3_f1_29: number + constructor(props: Partial> = {}) { + super(ActionType.LightShaft, {isAppearance:true,isParticle:false}) + this.assign(props) + } } /** - * ### {@link ActionType.GPUSparkCorrectParticle Action 10009 - GPUSparkCorrectParticle} + * ### {@link ActionType.GPUSparkParticle Action 10008 - GPUSparkParticle} * **Slot**: {@link ActionSlots.AppearanceAction Appearance} * - * Very similar to {@link ActionType.GPUSparkParticle GPUSparkParticle}, just like how {@link ActionType.GPUStandardCorrectParticle GPUStandardCorrectParticle} is similar to {@link ActionType.GPUStandardParticle GPUStandardParticle}, except these two spark actions have some known differences. + * Similar to {@link ActionType.GPUStandardParticle GPUStandardParticle}, this is essentially an entire particle system in a single action. It defines everything about an emitter as well as the particles it emits. The particles emitted by this action are GPU particles, which means that a lot of them can be rendered at the same time without much impact on performance. The particles are also not affected by most things that affect regular particles, like {@link ActionSlots.ParticleMovementAction ParticleMovement actions}. * - * Not all of the differences have been documented yet, but here are some: - * - This action seems to have swapped some axes of rotation, causing some confusing things to happen when the node is spinning. - * - The particles from this action are smaller. - * - The particles from this action move slower. It's possible that this action uses a different unit of distance, since that would explain both the slower movement and the smaller particles. + * What makes this different from {@link ActionType.GPUStandardParticle GPUStandardParticle} is that this actions seems to be designed specifically for effects that create sparks. While the other action's particles is more like billboard particles from, for example, {@link ActionType.BillboardEx BillboardEx}, this action's particles are more like {@link ActionType.QuadLine QuadLine} or {@link ActionType.Tracer Tracer} particles. They bend and rotate to align with the direction they are traveling, and they stretch based on how fast they're moving. * - * The name of this action is from Elden Ring's RTTI, where it's called "SparkCorrectParticle". + * The name of this action is from Elden Ring's RTTI, where it's called "SparkParticle". + * + * This action was first used in Armored Core 6, but definitely also works in Sekiro and Elden Ring. It might work in Dark Souls 3, but its structure is at least somewhat different there, and what that structure looks like is unknown. AC6's structure is compatible with Sekiro and ER, but some features may not work due to having been added in later versions. */ -class GPUSparkCorrectParticle extends DataAction { - declare readonly type: ActionType.GPUSparkCorrectParticle +class GPUSparkParticle extends DataAction { + declare readonly type: ActionType.GPUSparkParticle declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * Controls how well the particles follow the node if it moves. + * + * **Default**: `0` */ particleFollowFactor: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_ac6_p1_1: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_ac6_p1_2: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_ac6_p1_3: ScalarValue /** * Particle acceleration along the X-axis. + * + * **Default**: `0` */ particleAccelerationX: ScalarValue /** * Particle acceleration along the Y-axis. + * + * **Default**: `0` */ particleAccelerationY: ScalarValue /** * Particle acceleration along the Z-axis. + * + * **Default**: `0` */ particleAccelerationZ: ScalarValue /** @@ -32928,15 +24362,21 @@ class GPUSparkCorrectParticle extends DataAction { * * Values in this are unrestricted and can go above 1. * + * **Default**: `[1, 1, 1, 1]` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ color: Vector4Value /** * The length of the particles. + * + * **Default**: `1` */ particleLength: ScalarValue /** * The width of the particles. + * + * **Default**: `0.1` */ particleWidth: ScalarValue /** @@ -32945,8 +24385,15 @@ class GPUSparkCorrectParticle extends DataAction { * This requires any of the following fields to have a non-zero value: * - {@link particleSpeedMin} * - {@link particleSpeedMax} + * + * **Default**: `0` */ unkParticleAcceleration: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_ac6_p1_11: ScalarValue /** * Downwards acceleration for particles. @@ -32954,35 +24401,105 @@ class GPUSparkCorrectParticle extends DataAction { * This requires any of the following fields to have a non-zero value: * - {@link particleSpeedMin} * - {@link particleSpeedMax} + * + * **Default**: `1` */ particleGravity: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_ac6_p1_13: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `1` + */ unk_ac6_p2_0: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `1` + */ unk_ac6_p2_1: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_ac6_p2_2: ScalarValue + /** + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` + */ unk_ac6_p2_3: Vector4Value + /** + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` + */ unk_ac6_p2_4: Vector4Value + /** + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` + */ unk_ac6_p2_5: Vector4Value + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_ac6_p2_6: ScalarValue /** * The ID of the texture of the particles. + * + * **Default**: `1` */ texture: number /** * Controls the shape of the particle emitter. See {@link EmitterShape} for more details. + * + * **Default**: {@link EmitterShape.Box} */ emitterShape: EmitterShape + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ac6_f1_2: number /** * The size of the emitter. + * + * **Default**: `[1, 1, 1]` */ emitterSize: Vector3 /** * The rotation of the emitter. + * + * **Default**: `[0, 0, 0]` */ emitterRotation: Vector3 + /** + * Unknown float. + * + * **Default**: `1` + */ unk_ac6_f1_9: number + /** + * Unknown float. + * + * **Default**: `1` + */ unk_ac6_f1_10: number + /** + * Unknown float. + * + * **Default**: `1` + */ unk_ac6_f1_11: number /** * Controls how the random emission points are distributed within the {@link emitterShape shape of the emitter}. How this works depend on the emitter shape: @@ -32993,16 +24510,45 @@ class GPUSparkCorrectParticle extends DataAction { * | {@link EmitterShape.Box2 Box2} | At 1, any point within the box is equally likely to be picked.
At 0, particles are more likely to be emitted near the center, but it's not a 100% chance. | * | {@link EmitterShape.Unk3 Unk3} | Exactly the same as {@link EmitterShape.Line Line}? | * | {@link EmitterShape.Cylinder Cylinder} | A fraction of the radius of the cylinder where the particles can not be emitted from. Basically an inner cylinder that blocks emission. | + * + * **Default**: `0` */ emitterDistribution: number + /** + * Unknown float. + * + * **Default**: `0` + */ unk_ac6_f1_13: number + /** + * Unknown float. + * + * **Default**: `0` + */ unk_ac6_f1_14: number + /** + * Unknown integer. + * + * **Default**: `-1` + */ unk_ac6_f1_15: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ac6_f1_16: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ac6_f1_17: number /** * The number of particles to emit per emission. * + * **Default**: `10` + * * See also: * - {@link emissionParticleCountMin} * - {@link emissionParticleCountMax} @@ -33011,6 +24557,8 @@ class GPUSparkCorrectParticle extends DataAction { /** * The minimum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. * + * **Default**: `0` + * * See also: * - {@link emissionParticleCount} * - {@link emissionParticleCountMax} @@ -33019,6 +24567,8 @@ class GPUSparkCorrectParticle extends DataAction { /** * The maximum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. * + * **Default**: `0` + * * See also: * - {@link emissionParticleCount} * - {@link emissionParticleCountMin} @@ -33027,6 +24577,8 @@ class GPUSparkCorrectParticle extends DataAction { /** * The time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. * + * **Default**: `0` + * * See also: * - {@link emissionIntervalMin} * - {@link emissionIntervalMax} @@ -33035,6 +24587,8 @@ class GPUSparkCorrectParticle extends DataAction { /** * The minimum time between emissions in seconds. A random value between this and {@link emissionIntervalMax} will be added to {@link emissionInterval} to get the final emission interval. Due to the way this field works, the value will be rounded to the nearest 1/30s. * + * **Default**: `0` + * * See also: * - {@link emissionInterval} * - {@link emissionIntervalMax} @@ -33043,6 +24597,8 @@ class GPUSparkCorrectParticle extends DataAction { /** * The maximum time between emissions in seconds. A random value between this and {@link emissionIntervalMin} will be added to {@link emissionInterval} to get the final emission interval. Due to the way this field works, the value will be rounded to the nearest 1/30s. * + * **Default**: `0` + * * See also: * - {@link emissionInterval} * - {@link emissionIntervalMin} @@ -33050,752 +24606,514 @@ class GPUSparkCorrectParticle extends DataAction { emissionIntervalMax: number /** * If enabled, the number of emissions will be limited by {@link concurrentEmissionsLimit}. + * + * **Default**: `false` */ limitConcurrentEmissions: boolean /** * The total number of emissions. This limit is only applied if {@link limitConcurrentEmissions} is enabled. - */ - concurrentEmissionsLimit: number - unk_ac6_f1_26: number - /** - * The duration of each particle in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. - */ - particleDuration: number - unk_ac6_f1_28: number - unk_ac6_f1_29: number - /** - * Particle position offset. - * - * See also: - * - {@link particleOffsetMin} - * - {@link particleOffsetMax} - */ - particleOffset: Vector3 - /** - * Minimum particle position offset. A random value between this and {@link particleOffsetMax} will be added to {@link particleOffset} to get the final position offset. - */ - particleOffsetMin: Vector3 - /** - * Maximum particle position offset. A random value between this and {@link particleOffsetMin} will be added to {@link particleOffset} to get the final position offset. - */ - particleOffsetMax: Vector3 - unk_ac6_f1_39: number - /** - * Minimum particle speed. - * - * See also: - * - {@link particleSpeedMax} - */ - particleSpeedMin: Vector3 - /** - * Maximum particle speed. - * - * See also: - * - {@link particleSpeedMin} - */ - particleSpeedMax: Vector3 - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - */ - rgbMultiplier: number - /** - * Alpha multiplier. - */ - alphaMultiplier: number - /** - * Minimum random variation for the particle color. A random value between this and {@link colorMax} will be added to the base {@link color}, but it fades out over the life of the particle. - */ - colorMin: Vector4 - /** - * Maximum random variation for the particle color. A random value between this and {@link colorMin} will be added to the base {@link color}, but it fades out over the life of the particle. - */ - colorMax: Vector4 - /** - * Blend mode. - */ - blendMode: BlendMode - unk_ac6_f1_57: number - unk_ac6_f1_58: number - unk_ac6_f1_59: number - unk_ac6_f1_60: number - unk_ac6_f1_61: number - unk_ac6_f1_62: number - /** - * Minimum particle length. A random value between this and {@link particleLengthMax} will be **multiplied** by {@link particleLength} to get the final particle length. - */ - particleLengthMin: number - /** - * Maximum particle length. A random value between this and {@link particleLengthMin} will be **multiplied** by {@link particleLength} to get the final particle length. - */ - particleLengthMax: number - /** - * Minimum particle width. A random value between this and {@link particleWidthMax} will be **multiplied** by {@link particleWidth} to get the final particle width. - */ - particleWidthMin: number - /** - * Maximum particle width. A random value between this and {@link particleWidthMin} will be **multiplied** by {@link particleWidth} to get the final particle width. - */ - particleWidthMax: number - unk_ac6_f1_67: number - unk_ac6_f1_68: number - /** - * Multiplier for {@link particleDuration}. - */ - particleDurationMultiplier: number - unk_ac6_f1_70: number - unk_ac6_f1_71: number - unk_ac6_f1_72: number - unk_ac6_f1_73: number - unk_ac6_f1_74: number - unk_ac6_f1_75: number - unk_ac6_f1_76: number - unk_ac6_f1_77: number - unk_ac6_f1_78: number - unk_ac6_f1_79: number - unk_ac6_f1_80: number - unk_ac6_f1_81: number - unk_ac6_f1_82: number - unk_ac6_f1_83: number - /** - * Unknown float. Seems to make the particles fly around somewhat randomly, but with a specific average direction. {@link unk_ac6_f1_85} works in a similar way, but has the opposite average direction. - */ - unk_ac6_f1_84: number - /** - * Unknown float. Seems to make the particles fly around somewhat randomly, but with a specific average direction. {@link unk_ac6_f1_84} works in a similar way, but has the opposite average direction. - */ - unk_ac6_f1_85: number - unk_ac6_f1_86: number - unk_ac6_f1_87: number - unk_ac6_f1_88: number - unk_ac6_f1_89: number - /** - * If enabled, the particle system stops updating if the camera is beyond the distance specified by {@link updateDistance} from the node. - * - * It will not stop updating immediately after the action becomes active. Instead, it will wait for a little while before stopping if the camera is too far away. - */ - limitUpdateDistance: boolean - /** - * Controls how close the camera needs to be to the node for the particle system to update. Requires {@link limitUpdateDistance} to be enabled. - */ - updateDistance: number - /** - * When enabled, this makes the particles bounce off of any surface they hit. This collision detection is just based on the depth buffer, not the full 3D scene, so it is not always perfect. - * - * See also: - * - {@link particleBounciness} - */ - particleCollision: boolean - /** - * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. - * - * See also: - * - {@link particleCollision} - */ - particleBounciness: number - unk_ac6_f1_94: number - unk_ac6_f1_95: number - /** - * Controls whether or not the particles have a bloom effect. * - * See also: - * - {@link bloomColor} + * **Default**: `0` */ - bloom: boolean + concurrentEmissionsLimit: number /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. + * Unknown integer. * - * See also: - * - {@link bloom} + * **Default**: `0` */ - bloomColor: Vector4 - unk_ac6_f1_101: number - unk_ac6_f1_102: number - unk_ac6_f1_103: number - unk_ac6_f2_0: number - unk_ac6_f2_1: number - unk_ac6_f2_2: number - unk_ac6_f2_3: number - unk_ac6_f2_4: number - unk_ac6_f2_5: number - unk_ac6_f2_6: number - unk_ac6_f2_7: number - unk_ac6_f2_8: number - unk_ac6_f2_9: number - unk_ac6_f2_10: number - unk_ac6_f2_11: number - unk_ac6_f2_12: number - unk_ac6_f2_13: number + unk_ac6_f1_26: number /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * The duration of each particle in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - minFadeDistance: number + particleDuration: number /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * Unknown integer. * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `0` */ - minDistance: number + unk_ac6_f1_28: number /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * Unknown integer. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `0` */ - maxFadeDistance: number + unk_ac6_f1_29: number /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. + * Particle position offset. * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * **Default**: `[0, 0, 0]` * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link particleOffsetMin} + * - {@link particleOffsetMax} */ - maxDistance: number + particleOffset: Vector3 /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * Minimum particle position offset. A random value between this and {@link particleOffsetMax} will be added to {@link particleOffset} to get the final position offset. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} + * **Default**: `[0, 0, 0]` */ - minDistanceThreshold: number + particleOffsetMin: Vector3 /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * Maximum particle position offset. A random value between this and {@link particleOffsetMin} will be added to {@link particleOffset} to get the final position offset. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - */ - maxDistanceThreshold: number - unk_ac6_f2_20: number - unk_ac6_f2_21: number - unk_ac6_f2_22: number - unk_ac6_f2_23: number - unk_ac6_f2_24: number - unkDepthBlend1: number - unkDepthBlend2: number - unk_ac6_f2_27: number - unk_ac6_f2_28: number - unk_ac6_f2_29: number - /** - * Controls how dark shaded parts of the particle are. + * **Default**: `[0, 0, 0]` */ - shadowDarkness: number + particleOffsetMax: Vector3 /** - * When set to 1, this stops the particles from being shown indoors. + * Unknown integer. * - * Other values are used in AC6, but what they do is unknown. + * **Default**: `0` */ - unkHideIndoors: number - unk_ac6_f2_32: number - unk_ac6_f2_33: number - unk_ac6_f2_34: number - lighting: LightingMode - unk_ac6_f2_36: number - unk_ac6_f2_37: number - unk_ac6_f2_38: number - unk_ac6_f2_39: number - constructor(props: GPUSparkCorrectParticleParams = {}) { - super(ActionType.GPUSparkCorrectParticle, {isAppearance:true,isParticle:false}) - this.assign(props) - } -} - -export interface DynamicTracerParams { + unk_ac6_f1_39: number /** - * Texture ID. + * Minimum particle speed. * - * **Default**: `1` + * **Default**: `[-0.01, -0.01, -0.01]` * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * See also: + * - {@link particleSpeedMax} */ - texture?: ScalarValue + particleSpeedMin: Vector3 /** - * Blend mode. + * Maximum particle speed. * - * **Default**: {@link BlendMode.Normal} + * **Default**: `[0.01, 0.01, 0.01]` * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * See also: + * - {@link particleSpeedMin} */ - blendMode?: BlendMode | ScalarProperty + particleSpeedMax: Vector3 /** - * The width of the trail. + * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - width?: ScalarValue + rgbMultiplier: number /** - * Multiplier for {@link width}. + * Alpha multiplier. * * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} */ - widthMultiplier?: ScalarValue + alphaMultiplier: number /** - * Unknown. + * Minimum random variation for the particle color. A random value between this and {@link colorMax} will be added to the base {@link color}, but it fades out over the life of the particle. * - * **Default**: `0` + * **Default**: `[0, 0, 0, 0]` */ - unk_ds3_p1_2?: ScalarValue + colorMin: Vector4 /** - * Unknown. + * Maximum random variation for the particle color. A random value between this and {@link colorMin} will be added to the base {@link color}, but it fades out over the life of the particle. * - * **Default**: `0` + * **Default**: `[0, 0, 0, 0]` */ - unk_ds3_p1_3?: ScalarValue + colorMax: Vector4 /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Blend mode. * - * See also: - * - {@link color2} - * - {@link color3} + * **Default**: {@link BlendMode.Add} */ - color1?: Vector4Value + blendMode: BlendMode /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * Unknown integer. * - * See also: - * - {@link color1} - * - {@link color3} + * **Default**: `-1` */ - color2?: Vector4Value + unk_ac6_f1_57: number /** - * Color multiplier. - * - * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Unknown integer. * - * See also: - * - {@link color1} - * - {@link color2} + * **Default**: `-1` */ - color3?: Vector4Value + unk_ac6_f1_58: number /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. - * - * Values above this threshold will be stretched to fill the alpha range, so values near the threshold will be less visible, creating a smooth transition between the parts that have been hidden by the threshold and the ones that are still visible. + * Unknown integer. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - alphaFadeThreshold?: ScalarValue + unk_ac6_f1_59: number /** - * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. - * - * Seemingly identical to {@link frameIndexOffset}? The sum of these two properties is the actual frame index that gets used. + * Unknown integer. * * **Default**: `0` + */ + unk_ac6_f1_60: number + /** + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - frameIndex?: ScalarValue + unk_ac6_f1_61: number /** - * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. + * Unknown integer. * * **Default**: `0` + */ + unk_ac6_f1_62: number + /** + * Minimum particle length. A random value between this and {@link particleLengthMax} will be **multiplied** by {@link particleLength} to get the final particle length. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - frameIndexOffset?: ScalarValue + particleLengthMin: number /** - * Controls how much of the texture's width is used per segment. If {@link attachedUV} is enabled, this instead controls how much of the texture's width to use for the entire trail. + * Maximum particle length. A random value between this and {@link particleLengthMin} will be **multiplied** by {@link particleLength} to get the final particle length. * - * **Default**: `0.1` + * **Default**: `1` + */ + particleLengthMax: number + /** + * Minimum particle width. A random value between this and {@link particleWidthMax} will be **multiplied** by {@link particleWidth} to get the final particle width. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - textureFraction?: ScalarValue + particleWidthMin: number /** - * Controls how fast the UV coordinates should move horizontally. + * Maximum particle width. A random value between this and {@link particleWidthMin} will be **multiplied** by {@link particleWidth} to get the final particle width. * - * **Default**: `0` + * **Default**: `1` + */ + particleWidthMax: number + /** + * Unknown float. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - speedU?: ScalarValue + unk_ac6_f1_67: number /** - * Controls how much the UV coordinates should be randomly offset by per segment. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` + */ + unk_ac6_f1_68: number + /** + * Multiplier for {@link particleDuration}. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - varianceV?: ScalarValue + particleDurationMultiplier: number /** - * Unknown. + * Unknown float. * - * **Default**: `-1` + * **Default**: `1` */ - unk_ds3_p1_13?: ScalarValue + unk_ac6_f1_70: number /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * Unknown float. * * **Default**: `1` + */ + unk_ac6_f1_71: number + /** + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` */ - rgbMultiplier?: ScalarValue + unk_ac6_f1_72: number /** - * Alpha multiplier. + * Unknown float. * * **Default**: `1` + */ + unk_ac6_f1_73: number + /** + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` */ - alphaMultiplier?: ScalarValue + unk_ac6_f1_74: number /** - * Controls the intensity of the distortion effect. At 0, there is no distortion at all. + * Unknown float. * * **Default**: `0` + */ + unk_ac6_f1_75: number + /** + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link normalMap} + * **Default**: `1` */ - distortionIntensity?: ScalarValue + unk_ac6_f1_76: number /** - * Unknown. + * Unknown float. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `1` */ - unk_ds3_p2_3?: Vector4Value + unk_ac6_f1_77: number /** - * Unknown. + * Unknown float. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `1` */ - unk_ds3_p2_4?: Vector4Value + unk_ac6_f1_78: number /** - * Unknown. + * Unknown float. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `1` */ - unk_ds3_p2_5?: Vector4Value + unk_ac6_f1_79: number /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. + * Unknown float. * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the {@link alphaFadeThreshold}. + * **Default**: `1` + */ + unk_ac6_f1_80: number + /** + * Unknown integer. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - alphaThreshold?: ScalarValue + unk_ac6_f1_81: number /** - * Tracer orientation mode. See {@link TracerOrientationMode} for more information. + * Unknown integer. * - * **Default**: {@link TracerOrientationMode.LocalZ} + * **Default**: `0` */ - orientation?: TracerOrientationMode + unk_ac6_f1_82: number /** - * Normal map texture ID. - * - * This is used to control the distortion effect of the trail. + * Unknown integer. * * **Default**: `0` + */ + unk_ac6_f1_83: number + /** + * Unknown float. Seems to make the particles fly around somewhat randomly, but with a specific average direction. {@link unk_ac6_f1_85} works in a similar way, but has the opposite average direction. * - * See also: - * - {@link distortionIntensity} + * **Default**: `0` */ - normalMap?: number + unk_ac6_f1_84: number /** - * The trail is made up of multiple quads, or *segments*. This controls how many seconds to wait between new segments being created. Lower values produce a smoother trail. + * Unknown float. Seems to make the particles fly around somewhat randomly, but with a specific average direction. {@link unk_ac6_f1_84} works in a similar way, but has the opposite average direction. * * **Default**: `0` */ - segmentInterval?: number + unk_ac6_f1_85: number /** - * The trail is made up of multiple quads, or *segments*. This controls how long each segment should last in seconds. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - segmentDuration?: number + unk_ac6_f1_86: number /** - * The trail is made up of multiple quads, or *segments*. This controls how many segments may exist at the same time. + * Unknown integer. * - * **Default**: `100` + * **Default**: `8` */ - concurrentSegments?: number + unk_ac6_f1_87: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_7?: number + unk_ac6_f1_88: number /** - * Unknown float. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_8?: number + unk_ac6_f1_89: number /** - * Unknown float. + * If enabled, the particle system stops updating if the camera is beyond the distance specified by {@link updateDistance} from the node. + * + * It will not stop updating immediately after the action becomes active. Instead, it will wait for a little while before stopping if the camera is too far away. * * **Default**: `0` */ - unk_ds3_f1_9?: number + limitUpdateDistance: boolean /** - * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. - * - * **Default**: `1` + * Controls how close the camera needs to be to the node for the particle system to update. Requires {@link limitUpdateDistance} to be enabled. * - * See also: - * - {@link totalFrames} + * **Default**: `0` */ - columns?: number + updateDistance: number /** - * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. + * When enabled, this makes the particles bounce off of any surface they hit. This collision detection is just based on the depth buffer, not the full 3D scene, so it is not always perfect. * - * **Default**: `1` + * **Default**: `false` * * See also: - * - {@link columns} + * - {@link particleBounciness} */ - totalFrames?: number + particleCollision: boolean /** - * Controls whether or not the UV of the trail should be attached to the node or not. If it is attached, the texture will slide along the segments to follow the source wherever it moves, as if it was a flag attached to a pole. If it is not attached, the texture will stay where it was when the segment was created, like a skid mark on a road where the road is the segments and the mark is the texture, it wouldn't follow the car/node that made it. + * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. * - * **Default**: `true` - */ - attachedUV?: boolean - /** - * Unknown integer. + * **Default**: `0` * - * **Default**: `-1` + * See also: + * - {@link particleCollision} */ - unk_ds3_f1_13?: number + particleBounciness: number /** * Unknown integer. * - * **Default**: `-1` + * **Default**: `0` */ - unk_ds3_f1_14?: number + unk_ac6_f1_94: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_15?: number + unk_ac6_f1_95: number /** - * Unknown integer. + * Controls whether or not the particles have a bloom effect. * - * **Default**: `1` - */ - unk_sdt_f1_14?: number - /** - * Unknown float. + * **Default**: `false` * - * **Default**: `1` + * See also: + * - {@link bloomColor} */ - unk_sdt_f1_15?: number + bloom: boolean /** - * Unknown float. + * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. * - * **Default**: `1` + * Note: + * - This has no effect if the "Effects Quality" setting is set to "Low". + * - This does not affect the natural bloom effect from high color values. + * + * **Default**: `[1, 1, 1, 0]` + * + * See also: + * - {@link bloom} */ - unk_sdt_f1_16?: number + bloomColor: Vector4 /** * Unknown float. * * **Default**: `1` */ - unk_sdt_f1_17?: number + unk_ac6_f1_101: number /** * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_er_f1_18?: number + unk_ac6_f1_102: number /** - * Unknown integer. + * Unknown float. * * **Default**: `1` */ - unk_er_f1_19?: number + unk_ac6_f1_103: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f1_20?: number + unk_ac6_f2_0: number /** - * Unknown float. + * Unknown integer. * * **Default**: `0` */ - unk_er_f1_21?: number + unk_ac6_f2_1: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `8` */ - unk_ds3_f2_0?: number + unk_ac6_f2_2: number /** - * Unknown boolean. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_1?: boolean + unk_ac6_f2_3: number /** * Unknown integer. * - * **Default**: `8` + * **Default**: `0` */ - unk_ds3_f2_2?: number + unk_ac6_f2_4: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f2_3?: number + unk_ac6_f2_5: number /** - * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - * - * **Default**: `true` + * Unknown float. * - * See also: - * - {@link bloomColor} + * **Default**: `1` */ - bloom?: boolean + unk_ac6_f2_6: number /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. + * Unknown float. * - * **Default**: `[1, 1, 1, 0]` + * **Default**: `1` + */ + unk_ac6_f2_7: number + /** + * Unknown float. * - * See also: - * - {@link bloom} + * **Default**: `1` */ - bloomColor?: Vector4 + unk_ac6_f2_8: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_9?: number + unk_ac6_f2_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_10?: number + unk_ac6_f2_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_11?: number + unk_ac6_f2_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_12?: number + unk_ac6_f2_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_13?: number + unk_ac6_f2_13: number /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. + * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * This requires {@link minFadeDistance} to be set to a positive value or 0. + * + * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. * * **Default**: `-1` * * See also: - * - {@link minDistance} + * - {@link minFadeDistance} * - {@link maxFadeDistance} * - {@link maxDistance} * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minFadeDistance?: number + minFadeDistance: number /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. + * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. * * **Default**: `-1` * * See also: - * - {@link minFadeDistance} + * - {@link minDistance} * - {@link maxFadeDistance} * - {@link maxDistance} * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - minDistance?: number + minDistance: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * @@ -33810,7 +25128,7 @@ export interface DynamicTracerParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxFadeDistance?: number + maxFadeDistance: number /** * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -33827,7 +25145,7 @@ export interface DynamicTracerParams { * - {@link minDistanceThreshold} * - {@link maxDistanceThreshold} */ - maxDistance?: number + maxDistance: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -33840,7 +25158,7 @@ export interface DynamicTracerParams { * - {@link maxDistance} * - {@link maxDistanceThreshold} */ - minDistanceThreshold?: number + minDistanceThreshold: number /** * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * @@ -33853,2594 +25171,2632 @@ export interface DynamicTracerParams { * - {@link maxDistance} * - {@link minDistanceThreshold} */ - maxDistanceThreshold?: number + maxDistanceThreshold: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_20: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_21: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_22: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_23: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_24: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unkDepthBlend1: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unkDepthBlend2: number + /** + * Unknown integer. + * + * **Default**: `1` + */ + unk_ac6_f2_27: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_28: number + /** + * Unknown float. + * + * **Default**: `0` + */ + unk_ac6_f2_29: number + /** + * Controls how dark shaded parts of the particle are. + * + * **Default**: `1` + */ + shadowDarkness: number + /** + * When set to 1, this stops the particles from being shown indoors. + * + * Other values are used in AC6, but what they do is unknown. + * + * **Default**: `0` + */ + unkHideIndoors: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_32: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_33: number + /** + * Unknown float. + * + * **Default**: `0.5` + */ + unk_ac6_f2_34: number + /** + * Unknown integer. + * + * **Default**: {@link LightingMode.Unlit} + */ + lighting: LightingMode + /** + * Unknown integer. + * + * **Default**: `-2` + */ + unk_ac6_f2_36: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_37: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f2_20?: number + unk_ac6_f2_38: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_39: number + constructor(props: Partial> = {}) { + super(ActionType.GPUSparkParticle, {isAppearance:true,isParticle:false}) + this.assign(props) + } +} + +/** + * ### {@link ActionType.GPUSparkCorrectParticle Action 10009 - GPUSparkCorrectParticle} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * Very similar to {@link ActionType.GPUSparkParticle GPUSparkParticle}, just like how {@link ActionType.GPUStandardCorrectParticle GPUStandardCorrectParticle} is similar to {@link ActionType.GPUStandardParticle GPUStandardParticle}, except these two spark actions have some known differences. + * + * Not all of the differences have been documented yet, but here are some: + * - This action seems to have swapped some axes of rotation, causing some confusing things to happen when the node is spinning. + * - The particles from this action are smaller. + * - The particles from this action move slower. It's possible that this action uses a different unit of distance, since that would explain both the slower movement and the smaller particles. + * + * The name of this action is from Elden Ring's RTTI, where it's called "SparkCorrectParticle". + */ +class GPUSparkCorrectParticle extends DataAction { + declare readonly type: ActionType.GPUSparkCorrectParticle + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} + /** + * Controls how well the particles follow the node if it moves. + * + * **Default**: `0` + */ + particleFollowFactor: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ + unk_ac6_p1_1: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ + unk_ac6_p1_2: ScalarValue /** - * Unknown integer. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_f2_21?: number + unk_ac6_p1_3: ScalarValue /** - * Unknown integer. + * Particle acceleration along the X-axis. * * **Default**: `0` */ - unk_ds3_f2_22?: number + particleAccelerationX: ScalarValue /** - * Unknown integer. + * Particle acceleration along the Y-axis. * * **Default**: `0` */ - unk_ds3_f2_23?: number + particleAccelerationY: ScalarValue /** - * Unknown integer. + * Particle acceleration along the Z-axis. * * **Default**: `0` */ - unk_ds3_f2_24?: number + particleAccelerationZ: ScalarValue /** - * Unknown float. + * Color multiplier. * - * **Default**: `1` - */ - unkDepthBlend1?: number - /** - * Unknown float. + * Values in this are unrestricted and can go above 1. * - * **Default**: `0` + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - unkDepthBlend2?: number + color: Vector4Value /** - * Unknown integer. + * The length of the particles. * * **Default**: `1` */ - unk_ds3_f2_27?: number + particleLength: ScalarValue /** - * Unknown integer. + * The width of the particles. * - * **Default**: `0` + * **Default**: `0.1` */ - unk_ds3_f2_28?: number + particleWidth: ScalarValue /** - * Unknown float. + * Similar to {@link particleAccelerationZ}, but this does not go exactly north? * - * This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. + * This requires any of the following fields to have a non-zero value: + * - {@link particleSpeedMin} + * - {@link particleSpeedMax} * * **Default**: `0` */ - unk_ds3_f2_29?: number + unkParticleAcceleration: ScalarValue /** - * Controls how dark shaded parts of the trail are. + * Unknown scalar. * * **Default**: `0` */ - shadowDarkness?: number + unk_ac6_p1_11: ScalarValue /** - * Unknown integer. + * Downwards acceleration for particles. * - * **Default**: `0` + * This requires any of the following fields to have a non-zero value: + * - {@link particleSpeedMin} + * - {@link particleSpeedMax} + * + * **Default**: `1` */ - unk_sdt_f2_31?: number + particleGravity: ScalarValue /** - * Unknown integer. - * - * When set to 1, it seems to stop {@link unk_ds3_f2_29} from doing whatever it is doing, and it can also cause some ugly "outline" effects on things seen through particles. + * Unknown scalar. * * **Default**: `0` */ - unk_sdt_f2_32?: number + unk_ac6_p1_13: ScalarValue /** - * Specular texture ID. - * - * **Default**: `0` + * Unknown scalar. * - * See also: - * - {@link lighting} - * - {@link glossiness} - * - {@link specularity} + * **Default**: `1` */ - specular?: number + unk_ac6_p2_0: ScalarValue /** - * Controls how sharp the specular highlights are. + * Unknown scalar. * - * **Default**: `0.25` - * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link specularity} + * **Default**: `1` */ - glossiness?: number + unk_ac6_p2_1: ScalarValue /** - * Controls how the trail is lit. See {@link LightingMode} for more information. + * Unknown scalar. * - * **Default**: {@link LightingMode.Unlit} + * **Default**: `0` */ - lighting?: LightingMode + unk_ac6_p2_2: ScalarValue /** - * Unknown integer. + * Unknown vector4. * - * **Default**: `-2` + * **Default**: `[1, 1, 1, 1]` */ - unk_sdt_f2_36?: number + unk_ac6_p2_3: Vector4Value /** - * Unknown integer. + * Unknown vector4. * - * **Default**: `0` + * **Default**: `[1, 1, 1, 1]` */ - unk_sdt_f2_37?: number + unk_ac6_p2_4: Vector4Value /** - * Controls how bright the specular highlights are. - * - * **Default**: `0.5` + * Unknown vector4. * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link glossiness} + * **Default**: `[1, 1, 1, 1]` */ - specularity?: number + unk_ac6_p2_5: Vector4Value /** - * Unknown integer. + * Unknown scalar. * * **Default**: `0` */ - unk_er_f2_39?: number + unk_ac6_p2_6: ScalarValue /** - * Unknown float. + * The ID of the texture of the particles. * * **Default**: `1` */ - unk_er_f2_40?: number + texture: number /** - * Unknown float. + * Controls the shape of the particle emitter. See {@link EmitterShape} for more details. * - * **Default**: `0` + * **Default**: {@link EmitterShape.Box} */ - unk_ac6_f2_41?: number -} - -/** - * ### {@link ActionType.DynamicTracer Action 10012 - DynamicTracer} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * Creates a trail behind moving effects. - * - * This is slightly different from {@link Tracer}, as the trail from this is less visible when it's moving slower. - */ -class DynamicTracer extends DataAction { - declare readonly type: ActionType.DynamicTracer - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} + emitterShape: EmitterShape /** - * Texture ID. + * Unknown integer. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `0` */ - texture: ScalarValue + unk_ac6_f1_2: number /** - * Blend mode. + * The size of the emitter. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `[1, 1, 1]` */ - blendMode: BlendMode | ScalarProperty + emitterSize: Vector3 /** - * The width of the trail. + * The rotation of the emitter. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `[0, 0, 0]` */ - width: ScalarValue + emitterRotation: Vector3 /** - * Multiplier for {@link width}. + * Unknown float. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `1` */ - widthMultiplier: ScalarValue - unk_ds3_p1_2: ScalarValue - unk_ds3_p1_3: ScalarValue + unk_ac6_f1_9: number /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Unknown float. * - * See also: - * - {@link color2} - * - {@link color3} + * **Default**: `1` */ - color1: Vector4Value + unk_ac6_f1_10: number /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. - * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * Unknown float. * - * See also: - * - {@link color1} - * - {@link color3} + * **Default**: `1` */ - color2: Vector4Value + unk_ac6_f1_11: number /** - * Color multiplier. - * - * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Controls how the random emission points are distributed within the {@link emitterShape shape of the emitter}. How this works depend on the emitter shape: + * | Shape | Behavior | + * |-|-| + * | {@link EmitterShape.Line Line} | A fraction of the line where particles can not be emitted from.
At 0, particles can be emitted from any point on the line.
At 1, they can only be emitted from the far end of the line. | + * | {@link EmitterShape.Box Box} | A fraction of the box's size where the particles can not be emitted from. Basically an inner box that blocks emission. | + * | {@link EmitterShape.Box2 Box2} | At 1, any point within the box is equally likely to be picked.
At 0, particles are more likely to be emitted near the center, but it's not a 100% chance. | + * | {@link EmitterShape.Unk3 Unk3} | Exactly the same as {@link EmitterShape.Line Line}? | + * | {@link EmitterShape.Cylinder Cylinder} | A fraction of the radius of the cylinder where the particles can not be emitted from. Basically an inner cylinder that blocks emission. | * - * See also: - * - {@link color1} - * - {@link color2} + * **Default**: `0` */ - color3: Vector4Value + emitterDistribution: number /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. - * - * Values above this threshold will be stretched to fill the alpha range, so values near the threshold will be less visible, creating a smooth transition between the parts that have been hidden by the threshold and the ones that are still visible. + * Unknown float. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - alphaFadeThreshold: ScalarValue + unk_ac6_f1_13: number /** - * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. - * - * Seemingly identical to {@link frameIndexOffset}? The sum of these two properties is the actual frame index that gets used. + * Unknown float. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - frameIndex: ScalarValue + unk_ac6_f1_14: number /** - * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `-1` */ - frameIndexOffset: ScalarValue + unk_ac6_f1_15: number /** - * Controls how much of the texture's width is used per segment. If {@link attachedUV} is enabled, this instead controls how much of the texture's width to use for the entire trail. + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - textureFraction: ScalarValue + unk_ac6_f1_16: number /** - * Controls how fast the UV coordinates should move horizontally. + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - speedU: ScalarValue + unk_ac6_f1_17: number /** - * Controls how much the UV coordinates should be randomly offset by per segment. + * The number of particles to emit per emission. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - varianceV: ScalarValue - unk_ds3_p1_13: ScalarValue - /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * **Default**: `10` * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * See also: + * - {@link emissionParticleCountMin} + * - {@link emissionParticleCountMax} */ - rgbMultiplier: ScalarValue + emissionParticleCount: number /** - * Alpha multiplier. + * The minimum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` + * + * See also: + * - {@link emissionParticleCount} + * - {@link emissionParticleCountMax} */ - alphaMultiplier: ScalarValue + emissionParticleCountMin: number /** - * Controls the intensity of the distortion effect. At 0, there is no distortion at all. + * The maximum number of particles to emit per emission. A new random value is picked for each emission, and the random value is added to the {@link emissionParticleCount base emission particle count}. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` * * See also: - * - {@link normalMap} + * - {@link emissionParticleCount} + * - {@link emissionParticleCountMin} */ - distortionIntensity: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value + emissionParticleCountMax: number /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. + * The time between emissions in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the {@link alphaFadeThreshold}. + * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * See also: + * - {@link emissionIntervalMin} + * - {@link emissionIntervalMax} */ - alphaThreshold: ScalarValue + emissionInterval: number /** - * Tracer orientation mode. See {@link TracerOrientationMode} for more information. + * The minimum time between emissions in seconds. A random value between this and {@link emissionIntervalMax} will be added to {@link emissionInterval} to get the final emission interval. Due to the way this field works, the value will be rounded to the nearest 1/30s. + * + * **Default**: `0` + * + * See also: + * - {@link emissionInterval} + * - {@link emissionIntervalMax} */ - orientation: TracerOrientationMode + emissionIntervalMin: number /** - * Normal map texture ID. + * The maximum time between emissions in seconds. A random value between this and {@link emissionIntervalMin} will be added to {@link emissionInterval} to get the final emission interval. Due to the way this field works, the value will be rounded to the nearest 1/30s. * - * This is used to control the distortion effect of the trail. + * **Default**: `0` * * See also: - * - {@link distortionIntensity} + * - {@link emissionInterval} + * - {@link emissionIntervalMin} */ - normalMap: number + emissionIntervalMax: number /** - * The trail is made up of multiple quads, or *segments*. This controls how many seconds to wait between new segments being created. Lower values produce a smoother trail. + * If enabled, the number of emissions will be limited by {@link concurrentEmissionsLimit}. + * + * **Default**: `false` */ - segmentInterval: number + limitConcurrentEmissions: boolean /** - * The trail is made up of multiple quads, or *segments*. This controls how long each segment should last in seconds. + * The total number of emissions. This limit is only applied if {@link limitConcurrentEmissions} is enabled. + * + * **Default**: `0` */ - segmentDuration: number + concurrentEmissionsLimit: number /** - * The trail is made up of multiple quads, or *segments*. This controls how many segments may exist at the same time. + * Unknown integer. + * + * **Default**: `0` */ - concurrentSegments: number - unk_ds3_f1_7: number - unk_ds3_f1_8: number - unk_ds3_f1_9: number + unk_ac6_f1_26: number /** - * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. + * The duration of each particle in seconds. Due to the way this field works, the value will be rounded to the nearest 1/30s. * - * See also: - * - {@link totalFrames} + * **Default**: `1` */ - columns: number + particleDuration: number /** - * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. + * Unknown integer. * - * See also: - * - {@link columns} + * **Default**: `0` */ - totalFrames: number + unk_ac6_f1_28: number /** - * Controls whether or not the UV of the trail should be attached to the node or not. If it is attached, the texture will slide along the segments to follow the source wherever it moves, as if it was a flag attached to a pole. If it is not attached, the texture will stay where it was when the segment was created, like a skid mark on a road where the road is the segments and the mark is the texture, it wouldn't follow the car/node that made it. + * Unknown integer. + * + * **Default**: `0` */ - attachedUV: boolean - unk_ds3_f1_13: number - unk_ds3_f1_14: number - unk_ds3_f1_15: number - unk_sdt_f1_14: number - unk_sdt_f1_15: number - unk_sdt_f1_16: number - unk_sdt_f1_17: number - unk_er_f1_18: number - unk_er_f1_19: number - unk_er_f1_20: number - unk_er_f1_21: number - unk_ds3_f2_0: number - unk_ds3_f2_1: boolean - unk_ds3_f2_2: number - unk_ds3_f2_3: number + unk_ac6_f1_29: number /** - * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. + * Particle position offset. * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. + * **Default**: `[0, 0, 0]` * * See also: - * - {@link bloomColor} + * - {@link particleOffsetMin} + * - {@link particleOffsetMax} */ - bloom: boolean + particleOffset: Vector3 /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. + * Minimum particle position offset. A random value between this and {@link particleOffsetMax} will be added to {@link particleOffset} to get the final position offset. * - * See also: - * - {@link bloom} + * **Default**: `[0, 0, 0]` */ - bloomColor: Vector4 - unk_ds3_f2_9: number - unk_ds3_f2_10: number - unk_ds3_f2_11: number - unk_ds3_f2_12: number - unk_ds3_f2_13: number + particleOffsetMin: Vector3 /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * Maximum particle position offset. A random value between this and {@link particleOffsetMin} will be added to {@link particleOffset} to get the final position offset. * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `[0, 0, 0]` */ - minFadeDistance: number + particleOffsetMax: Vector3 /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * Unknown integer. * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `0` */ - minDistance: number + unk_ac6_f1_39: number /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. + * Minimum particle speed. * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * **Default**: `[-0.01, -0.01, -0.01]` * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link particleSpeedMax} */ - maxFadeDistance: number + particleSpeedMin: Vector3 /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. + * Maximum particle speed. * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * **Default**: `[0.01, 0.01, 0.01]` * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link particleSpeedMin} */ - maxDistance: number + particleSpeedMax: Vector3 /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - minDistanceThreshold: number + rgbMultiplier: number /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * Alpha multiplier. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} + * **Default**: `1` */ - maxDistanceThreshold: number - unk_ds3_f2_20: number - unk_ds3_f2_21: number - unk_ds3_f2_22: number - unk_ds3_f2_23: number - unk_ds3_f2_24: number - unkDepthBlend1: number - unkDepthBlend2: number - unk_ds3_f2_27: number - unk_ds3_f2_28: number + alphaMultiplier: number /** - * Unknown float. + * Minimum random variation for the particle color. A random value between this and {@link colorMax} will be added to the base {@link color}, but it fades out over the life of the particle. * - * This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. - */ - unk_ds3_f2_29: number - /** - * Controls how dark shaded parts of the trail are. + * **Default**: `[0, 0, 0, 0]` */ - shadowDarkness: number - unk_sdt_f2_31: number + colorMin: Vector4 /** - * Unknown integer. + * Maximum random variation for the particle color. A random value between this and {@link colorMin} will be added to the base {@link color}, but it fades out over the life of the particle. * - * When set to 1, it seems to stop {@link unk_ds3_f2_29} from doing whatever it is doing, and it can also cause some ugly "outline" effects on things seen through particles. + * **Default**: `[0, 0, 0, 0]` */ - unk_sdt_f2_32: number + colorMax: Vector4 /** - * Specular texture ID. + * Blend mode. * - * See also: - * - {@link lighting} - * - {@link glossiness} - * - {@link specularity} + * **Default**: {@link BlendMode.Add} */ - specular: number + blendMode: BlendMode /** - * Controls how sharp the specular highlights are. + * Unknown integer. * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link specularity} + * **Default**: `-1` */ - glossiness: number + unk_ac6_f1_57: number /** - * Controls how the trail is lit. See {@link LightingMode} for more information. + * Unknown integer. + * + * **Default**: `-1` */ - lighting: LightingMode - unk_sdt_f2_36: number - unk_sdt_f2_37: number + unk_ac6_f1_58: number /** - * Controls how bright the specular highlights are. + * Unknown integer. * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link glossiness} + * **Default**: `0` */ - specularity: number - unk_er_f2_39: number - unk_er_f2_40: number - unk_ac6_f2_41: number - constructor(props: DynamicTracerParams = {}) { - super(ActionType.DynamicTracer, {isAppearance:true,isParticle:true}) - this.assign(props) - } -} - -export interface WaterInteractionParams { + unk_ac6_f1_59: number /** - * The ID for a texture that controls the shape of the interaction. + * Unknown integer. * - * **Default**: `50004` + * **Default**: `0` */ - texture?: number + unk_ac6_f1_60: number /** - * Controls how deep to push the water, or how intense the ripples caused by the interaction are. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - depth?: number + unk_ac6_f1_61: number /** - * Controls the size of the interaction area. Ripples caused by the interaction may go outside of the area. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - size?: number + unk_ac6_f1_62: number /** - * The time it takes for the water to be pushed down to the {@link depth} in seconds. + * Minimum particle length. A random value between this and {@link particleLengthMax} will be **multiplied** by {@link particleLength} to get the final particle length. * - * **Default**: `0.15` + * **Default**: `1` */ - descent?: number + particleLengthMin: number /** - * The duration of the interaction in seconds. Basically how long to hold the water pressed down. + * Maximum particle length. A random value between this and {@link particleLengthMin} will be **multiplied** by {@link particleLength} to get the final particle length. * - * **Default**: `0.15` + * **Default**: `1` */ - duration?: number -} - -/** - * ### {@link ActionType.WaterInteraction Action 10013 - WaterInteraction} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * Simulates an interaction with water, allowing effects to create ripples in nearby water. The interaction basically pushes water in a shape controlled by a texture down to a given depth and holds it there for a duration before releasing it. - */ -class WaterInteraction extends DataAction { - declare readonly type: ActionType.WaterInteraction - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} + particleLengthMax: number /** - * The ID for a texture that controls the shape of the interaction. + * Minimum particle width. A random value between this and {@link particleWidthMax} will be **multiplied** by {@link particleWidth} to get the final particle width. + * + * **Default**: `1` */ - texture: number + particleWidthMin: number /** - * Controls how deep to push the water, or how intense the ripples caused by the interaction are. + * Maximum particle width. A random value between this and {@link particleWidthMin} will be **multiplied** by {@link particleWidth} to get the final particle width. + * + * **Default**: `1` */ - depth: number + particleWidthMax: number /** - * Controls the size of the interaction area. Ripples caused by the interaction may go outside of the area. + * Unknown float. + * + * **Default**: `1` */ - size: number + unk_ac6_f1_67: number /** - * The time it takes for the water to be pushed down to the {@link depth} in seconds. + * Unknown float. + * + * **Default**: `1` */ - descent: number + unk_ac6_f1_68: number /** - * The duration of the interaction in seconds. Basically how long to hold the water pressed down. + * Multiplier for {@link particleDuration}. + * + * **Default**: `1` */ - duration: number - constructor(props: WaterInteractionParams = {}) { - super(ActionType.WaterInteraction, {isAppearance:true,isParticle:false}) - this.assign(props) - } -} - -export interface LensFlareParams { + particleDurationMultiplier: number /** - * Layer 1 width. + * Unknown float. * * **Default**: `1` */ - layer1Width?: ScalarValue + unk_ac6_f1_70: number /** - * Layer 1 height. + * Unknown float. * * **Default**: `1` */ - layer1Height?: ScalarValue + unk_ac6_f1_71: number /** - * Layer 1 color. + * Unknown float. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `1` */ - layer1Color?: Vector4Value + unk_ac6_f1_72: number /** - * Layer 2 width. + * Unknown float. * * **Default**: `1` */ - layer2Width?: ScalarValue + unk_ac6_f1_73: number /** - * Layer 2 height. + * Unknown float. * * **Default**: `1` */ - layer2Height?: ScalarValue + unk_ac6_f1_74: number /** - * Layer 2 color. + * Unknown float. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` */ - layer2Color?: Vector4Value + unk_ac6_f1_75: number /** - * Layer 3 width. + * Unknown float. * * **Default**: `1` */ - layer3Width?: ScalarValue + unk_ac6_f1_76: number /** - * Layer 3 height. + * Unknown float. * * **Default**: `1` */ - layer3Height?: ScalarValue + unk_ac6_f1_77: number /** - * Layer 3 color. + * Unknown float. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `1` */ - layer3Color?: Vector4Value + unk_ac6_f1_78: number /** - * Layer 4 width. + * Unknown float. * * **Default**: `1` */ - layer4Width?: ScalarValue + unk_ac6_f1_79: number /** - * Layer 4 height. + * Unknown float. * * **Default**: `1` */ - layer4Height?: ScalarValue + unk_ac6_f1_80: number /** - * Layer 4 color. + * Unknown integer. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` */ - layer4Color?: Vector4Value + unk_ac6_f1_81: number /** - * Layer 1 texture ID. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - layer1?: number + unk_ac6_f1_82: number /** - * Layer 2 texture ID. + * Unknown integer. * * **Default**: `0` */ - layer2?: number + unk_ac6_f1_83: number /** - * Layer 3 texture ID. + * Unknown float. Seems to make the particles fly around somewhat randomly, but with a specific average direction. {@link unk_ac6_f1_85} works in a similar way, but has the opposite average direction. * * **Default**: `0` */ - layer3?: number + unk_ac6_f1_84: number /** - * Layer 4 texture ID. + * Unknown float. Seems to make the particles fly around somewhat randomly, but with a specific average direction. {@link unk_ac6_f1_84} works in a similar way, but has the opposite average direction. * - * This layer seems to work a bit differently from the others in Sekiro. + * **Default**: `0` + */ + unk_ac6_f1_85: number + /** + * Unknown integer. * * **Default**: `0` */ - layer4?: number + unk_ac6_f1_86: number /** - * Blend mode. + * Unknown integer. * - * **Default**: {@link BlendMode.Add} + * **Default**: `8` */ - blendMode?: BlendMode + unk_ac6_f1_87: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f1_4?: number + unk_ac6_f1_88: number /** - * Diameter of the lens flare source sphere. - * - * The opacity of the lens flare depends on how much of the source is in view. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - sourceSize?: number + unk_ac6_f1_89: number /** - * The time in seconds it takes for the opacity of the lens flare to transition when the source comes more into or goes more out of view. + * If enabled, the particle system stops updating if the camera is beyond the distance specified by {@link updateDistance} from the node. * - * **Default**: `1` + * It will not stop updating immediately after the action becomes active. Instead, it will wait for a little while before stopping if the camera is too far away. + * + * **Default**: `0` */ - opacityTransitionDuration?: number + limitUpdateDistance: boolean /** - * Unknown integer. + * Controls how close the camera needs to be to the node for the particle system to update. Requires {@link limitUpdateDistance} to be enabled. * * **Default**: `0` */ - unk_er_f1_8?: number + updateDistance: number /** - * Number of copies of layer 1. Why this exists is unknown, they all just stack on top of each other. - * - * Each copy will pick its own random values for the scale variation. + * When enabled, this makes the particles bounce off of any surface they hit. This collision detection is just based on the depth buffer, not the full 3D scene, so it is not always perfect. * - * **Default**: `1` + * **Default**: `false` * * See also: - * - {@link layer1ScaleVariationX} - * - {@link layer1ScaleVariationY} + * - {@link particleBounciness} */ - layer1Count?: number + particleCollision: boolean /** - * The {@link layer1Width layer's width} is multiplied by a random value between this and 1. + * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. * - * **Default**: `1` + * **Default**: `0` * * See also: - * - {@link layer1Count} - * - {@link layer1UniformScale} - * - {@link layer1ScaleVariationY} + * - {@link particleCollision} */ - layer1ScaleVariationX?: number + particleBounciness: number /** - * The {@link layer1Height layer's height} is multiplied by a random value between this and 1. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` + */ + unk_ac6_f1_94: number + /** + * Unknown integer. * - * See also: - * - {@link layer1Count} - * - {@link layer1UniformScale} - * - {@link layer1ScaleVariationX} + * **Default**: `0` */ - layer1ScaleVariationY?: number + unk_ac6_f1_95: number /** - * When enabled, the {@link layer1Width layer's width} also controls the {@link layer1Height height}, and the height property is ignored. The same is also true for the scale variation fields. + * Controls whether or not the particles have a bloom effect. * * **Default**: `false` * * See also: - * - {@link layer1Width} - * - {@link layer1Height} - * - {@link layer1ScaleVariationX} - * - {@link layer1ScaleVariationX} + * - {@link bloomColor} */ - layer1UniformScale?: boolean + bloom: boolean /** - * Multiplier for the {@link layer1Color layer's color}. + * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. * - * **Default**: `[1, 1, 1, 1]` + * Note: + * - This has no effect if the "Effects Quality" setting is set to "Low". + * - This does not affect the natural bloom effect from high color values. + * + * **Default**: `[1, 1, 1, 0]` * * See also: - * - {@link layer1Color} + * - {@link bloom} + */ + bloomColor: Vector4 + /** + * Unknown float. + * + * **Default**: `1` */ - layer1ColorMultiplier?: Vector4 + unk_ac6_f1_101: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f1_17?: number + unk_ac6_f1_102: number /** * Unknown float. * + * **Default**: `1` + */ + unk_ac6_f1_103: number + /** + * Unknown integer. + * * **Default**: `0` */ - unk_er_f1_18?: number + unk_ac6_f2_0: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_1: number + /** + * Unknown integer. + * + * **Default**: `8` + */ + unk_ac6_f2_2: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_3: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_4: number /** * Unknown float. * * **Default**: `1` */ - unk_er_f1_19?: number + unk_ac6_f2_5: number /** * Unknown float. * - * **Default**: `-1` + * **Default**: `1` */ - unk_er_f1_20?: number + unk_ac6_f2_6: number /** - * Number of copies of layer 2. Why this exists is unknown, they all just stack on top of each other. + * Unknown float. * - * Each copy will pick its own random values for the scale variation. + * **Default**: `1` + */ + unk_ac6_f2_7: number + /** + * Unknown float. * * **Default**: `1` + */ + unk_ac6_f2_8: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_9: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_10: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_11: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_12: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_13: number + /** + * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * + * This requires {@link minFadeDistance} to be set to a positive value or 0. + * + * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * + * **Default**: `-1` * * See also: - * - {@link layer2ScaleVariationX} - * - {@link layer2ScaleVariationY} + * - {@link minFadeDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - layer2Count?: number + minFadeDistance: number /** - * The {@link layer2Width layer's width} is multiplied by a random value between this and 1. + * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * - * **Default**: `1` + * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * + * **Default**: `-1` * * See also: - * - {@link layer2Count} - * - {@link layer2UniformScale} - * - {@link layer2ScaleVariationY} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - layer2ScaleVariationX?: number + minDistance: number /** - * The {@link layer2Height layer's height} is multiplied by a random value between this and 1. + * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * - * **Default**: `1` + * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * + * **Default**: `-1` * * See also: - * - {@link layer2Count} - * - {@link layer2UniformScale} - * - {@link layer2ScaleVariationX} + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - layer2ScaleVariationY?: number + maxFadeDistance: number /** - * When enabled, the {@link layer2Width layer's width} also controls the {@link layer2Height height}, and the height property is ignored. The same is also true for the scale variation fields. + * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * - * **Default**: `false` + * This requires {@link maxFadeDistance} to be set to a positive value or 0. + * + * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * + * **Default**: `-1` * * See also: - * - {@link layer2Width} - * - {@link layer2Height} - * - {@link layer2ScaleVariationX} - * - {@link layer2ScaleVariationX} + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - layer2UniformScale?: boolean + maxDistance: number /** - * Multiplier for the {@link layer2Color layer's color}. + * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `-1` * * See also: - * - {@link layer2Color} + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link maxDistanceThreshold} + */ + minDistanceThreshold: number + /** + * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * + * **Default**: `-1` + * + * See also: + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} */ - layer2ColorMultiplier?: Vector4 + maxDistanceThreshold: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f1_29?: number + unk_ac6_f2_20: number /** - * Unknown float. + * Unknown integer. * * **Default**: `0` */ - unk_er_f1_30?: number + unk_ac6_f2_21: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_er_f1_31?: number + unk_ac6_f2_22: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `-1` + * **Default**: `0` */ - unk_er_f1_32?: number + unk_ac6_f2_23: number /** - * Number of copies of layer 3. Why this exists is unknown, they all just stack on top of each other. + * Unknown integer. * - * Each copy will pick its own random values for the scale variation. + * **Default**: `0` + */ + unk_ac6_f2_24: number + /** + * Unknown float. * * **Default**: `1` + */ + unkDepthBlend1: number + /** + * Unknown float. * - * See also: - * - {@link layer3ScaleVariationX} - * - {@link layer3ScaleVariationY} + * **Default**: `0` */ - layer3Count?: number + unkDepthBlend2: number /** - * The {@link layer3Width layer's width} is multiplied by a random value between this and 1. + * Unknown integer. * * **Default**: `1` + */ + unk_ac6_f2_27: number + /** + * Unknown integer. * - * See also: - * - {@link layer3Count} - * - {@link layer3UniformScale} - * - {@link layer3ScaleVariationY} + * **Default**: `0` + */ + unk_ac6_f2_28: number + /** + * Unknown float. + * + * **Default**: `0` */ - layer3ScaleVariationX?: number + unk_ac6_f2_29: number /** - * The {@link layer3Height layer's height} is multiplied by a random value between this and 1. + * Controls how dark shaded parts of the particle are. * * **Default**: `1` + */ + shadowDarkness: number + /** + * When set to 1, this stops the particles from being shown indoors. * - * See also: - * - {@link layer3Count} - * - {@link layer3UniformScale} - * - {@link layer3ScaleVariationX} + * Other values are used in AC6, but what they do is unknown. + * + * **Default**: `0` */ - layer3ScaleVariationY?: number + unkHideIndoors: number /** - * When enabled, the {@link layer3Width layer's width} also controls the {@link layer3Height height}, and the height property is ignored. The same is also true for the scale variation fields. + * Unknown integer. * - * **Default**: `false` + * **Default**: `0` + */ + unk_ac6_f2_32: number + /** + * Unknown integer. * - * See also: - * - {@link layer3Width} - * - {@link layer3Height} - * - {@link layer3ScaleVariationX} - * - {@link layer3ScaleVariationX} + * **Default**: `0` */ - layer3UniformScale?: boolean + unk_ac6_f2_33: number /** - * Multiplier for the {@link layer3Color layer's color}. + * Unknown float. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0.5` + */ + unk_ac6_f2_34: number + /** + * Unknown integer. * - * See also: - * - {@link layer3Color} + * **Default**: {@link LightingMode.Unlit} + */ + lighting: LightingMode + /** + * Unknown integer. + * + * **Default**: `-2` */ - layer3ColorMultiplier?: Vector4 + unk_ac6_f2_36: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f1_41?: number + unk_ac6_f2_37: number /** * Unknown float. * * **Default**: `0` */ - unk_er_f1_42?: number + unk_ac6_f2_38: number /** - * Unknown float. + * Unknown integer. + * + * **Default**: `0` + */ + unk_ac6_f2_39: number + constructor(props: Partial> = {}) { + super(ActionType.GPUSparkCorrectParticle, {isAppearance:true,isParticle:false}) + this.assign(props) + } +} + +/** + * ### {@link ActionType.DynamicTracer Action 10012 - DynamicTracer} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * Creates a trail behind moving effects. + * + * This is slightly different from {@link Tracer}, as the trail from this is less visible when it's moving slower. + */ +class DynamicTracer extends DataAction { + declare readonly type: ActionType.DynamicTracer + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} + /** + * Texture ID. * * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - unk_er_f1_43?: number + texture: ScalarValue /** - * Unknown float. + * Blend mode. * - * **Default**: `-1` + * **Default**: {@link BlendMode.Normal} + * + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - unk_er_f1_44?: number + blendMode: BlendMode | ScalarProperty /** - * Number of copies of layer 4. Why this exists is unknown, they all just stack on top of each other. - * - * Each copy will pick its own random values for the scale variation. + * The width of the trail. * * **Default**: `1` * - * See also: - * - {@link layer4ScaleVariationX} - * - {@link layer4ScaleVariationY} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - layer4Count?: number + width: ScalarValue /** - * The {@link layer4Width layer's width} is multiplied by a random value between this and 1. + * Multiplier for {@link width}. * * **Default**: `1` * - * See also: - * - {@link layer4Count} - * - {@link layer4UniformScale} - * - {@link layer4ScaleVariationY} + * **Argument**: {@link PropertyArgument.EmissionTime Emission time} */ - layer4ScaleVariationX?: number + widthMultiplier: ScalarValue /** - * The {@link layer4Height layer's height} is multiplied by a random value between this and 1. + * Unknown scalar. * - * **Default**: `1` + * **Default**: `0` + */ + unk_ds3_p1_2: ScalarValue + /** + * Unknown scalar. * - * See also: - * - {@link layer4Count} - * - {@link layer4UniformScale} - * - {@link layer4ScaleVariationX} + * **Default**: `0` */ - layer4ScaleVariationY?: number + unk_ds3_p1_3: ScalarValue /** - * When enabled, the {@link layer4Width layer's width} also controls the {@link layer4Height height}, and the height property is ignored. The same is also true for the scale variation fields. + * Color multiplier. * - * **Default**: `false` + * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. + * + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link layer4Width} - * - {@link layer4Height} - * - {@link layer4ScaleVariationX} - * - {@link layer4ScaleVariationX} + * - {@link color2} + * - {@link color3} */ - layer4UniformScale?: boolean + color1: Vector4Value /** - * Multiplier for the {@link layer4Color layer's color}. + * Color multiplier. + * + * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. * * **Default**: `[1, 1, 1, 1]` * + * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * * See also: - * - {@link layer4Color} + * - {@link color1} + * - {@link color3} */ - layer4ColorMultiplier?: Vector4 + color2: Vector4Value /** - * Unknown integer. + * Color multiplier. * - * **Default**: `0` - */ - unk_er_f1_53?: number - /** - * Unknown float. + * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. * - * **Default**: `0` - */ - unk_er_f1_54?: number - /** - * Unknown float. + * **Default**: `[1, 1, 1, 1]` * - * **Default**: `1` - */ - unk_er_f1_55?: number - /** - * Unknown float. + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * - * **Default**: `-1` + * See also: + * - {@link color1} + * - {@link color2} */ - unk_er_f1_56?: number + color3: Vector4Value /** - * Unknown integer. + * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. + * + * Values above this threshold will be stretched to fill the alpha range, so values near the threshold will be less visible, creating a smooth transition between the parts that have been hidden by the threshold and the ones that are still visible. * * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - unk_er_f1_57?: number + alphaFadeThreshold: ScalarValue /** - * When enabled, this allows the lens flare to have a bloom effect. + * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. * - * Does not seem to work in Sekiro. + * Seemingly identical to {@link frameIndexOffset}? The sum of these two properties is the actual frame index that gets used. * - * **Default**: `false` + * **Default**: `0` * - * See also: - * - {@link layer1BloomColor} - * - {@link layer2BloomColor} - * - {@link layer3BloomColor} - * - {@link layer4BloomColor} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - bloom?: boolean + frameIndex: ScalarValue /** - * The bloom color for layer 1. This is multiplied with the {@link layer1Color layer's color} to get the final color for the bloom. + * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` * - * See also: - * - {@link bloom} - * - {@link layer1Color} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - layer1BloomColor?: Vector4 + frameIndexOffset: ScalarValue /** - * The bloom color for layer 2. This is multiplied with the {@link layer2Color layer's color} to get the final color for the bloom. + * Controls how much of the texture's width is used per segment. If {@link attachedUV} is enabled, this instead controls how much of the texture's width to use for the entire trail. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0.1` * - * See also: - * - {@link bloom} - * - {@link layer2Color} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - layer2BloomColor?: Vector4 + textureFraction: ScalarValue /** - * The bloom color for layer 3. This is multiplied with the {@link layer3Color layer's color} to get the final color for the bloom. + * Controls how fast the UV coordinates should move horizontally. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` * - * See also: - * - {@link bloom} - * - {@link layer3Color} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - layer3BloomColor?: Vector4 + speedU: ScalarValue /** - * The bloom color for layer 4. This is multiplied with the {@link layer4Color layer's color} to get the final color for the bloom. + * Controls how much the UV coordinates should be randomly offset by per segment. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` * - * See also: - * - {@link bloom} - * - {@link layer4Color} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - layer4BloomColor?: Vector4 + varianceV: ScalarValue /** - * Unknown float. + * Unknown scalar. * * **Default**: `-1` */ - unk_ac6_f1_75?: number + unk_ds3_p1_13: ScalarValue /** - * Unknown float. + * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * - * **Default**: `-1` + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - unk_ac6_f1_76?: number + rgbMultiplier: ScalarValue /** - * Unknown float. + * Alpha multiplier. * - * **Default**: `-1` + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - unk_ac6_f1_77?: number + alphaMultiplier: ScalarValue /** - * Unknown float. + * Controls the intensity of the distortion effect. At 0, there is no distortion at all. * - * **Default**: `-1` + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * + * See also: + * - {@link normalMap} */ - unk_ac6_f1_78?: number + distortionIntensity: ScalarValue /** - * Unknown float. + * Unknown vector4. * - * **Default**: `-1` + * **Default**: `[1, 1, 1, 1]` */ - unk_ac6_f1_79?: number + unk_ds3_p2_3: Vector4Value /** - * Unknown float. + * Unknown vector4. * - * **Default**: `-1` + * **Default**: `[1, 1, 1, 1]` */ - unk_ac6_f1_80?: number + unk_ds3_p2_4: Vector4Value /** - * Unknown integer. + * Unknown vector4. * - * **Default**: `0` + * **Default**: `[1, 1, 1, 1]` */ - unk_er_f2_0?: number + unk_ds3_p2_5: Vector4Value /** - * Unknown integer. + * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. + * + * This threshold creates a hard cut-off between visible and not visible, which is unlike the {@link alphaFadeThreshold}. * * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - unk_er_f2_1?: number + alphaThreshold: ScalarValue /** - * Unknown integer. + * Tracer orientation mode. See {@link TracerOrientationMode} for more information. * - * **Default**: `0` + * **Default**: {@link TracerOrientationMode.LocalZ} */ - unk_er_f2_2?: number + orientation: TracerOrientationMode /** - * Unknown integer. + * Normal map texture ID. + * + * This is used to control the distortion effect of the trail. * * **Default**: `0` + * + * See also: + * - {@link distortionIntensity} */ - unk_er_f2_3?: number + normalMap: number /** - * Unknown integer. + * The trail is made up of multiple quads, or *segments*. This controls how many seconds to wait between new segments being created. Lower values produce a smoother trail. * * **Default**: `0` */ - unk_er_f2_4?: number + segmentInterval: number /** - * Unknown integer. + * The trail is made up of multiple quads, or *segments*. This controls how long each segment should last in seconds. * - * **Default**: `0` + * **Default**: `1` */ - unk_er_f2_5?: number + segmentDuration: number /** - * Unknown integer. + * The trail is made up of multiple quads, or *segments*. This controls how many segments may exist at the same time. * - * **Default**: `0` + * **Default**: `100` */ - unk_er_f2_6?: number + concurrentSegments: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_7?: number + unk_ds3_f1_7: number /** - * Unknown integer. + * Unknown float. * * **Default**: `0` */ - unk_er_f2_8?: number + unk_ds3_f1_8: number /** - * Unknown integer. + * Unknown float. * * **Default**: `0` */ - unk_er_f2_9?: number + unk_ds3_f1_9: number /** - * Unknown integer. + * To split the texture into multiple animation frames, this value must be set to the number of columns in the texture. It should equal `textureWidth / frameWidth`. * - * **Default**: `0` + * **Default**: `1` + * + * See also: + * - {@link totalFrames} */ - unk_er_f2_10?: number + columns: number /** - * Unknown integer. + * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. * - * **Default**: `0` + * **Default**: `1` + * + * See also: + * - {@link columns} */ - unk_er_f2_11?: number + totalFrames: number /** - * Unknown integer. + * Controls whether or not the UV of the trail should be attached to the node or not. If it is attached, the texture will slide along the segments to follow the source wherever it moves, as if it was a flag attached to a pole. If it is not attached, the texture will stay where it was when the segment was created, like a skid mark on a road where the road is the segments and the mark is the texture, it wouldn't follow the car/node that made it. * - * **Default**: `0` + * **Default**: `true` */ - unk_er_f2_12?: number + attachedUV: boolean /** * Unknown integer. * - * **Default**: `0` + * **Default**: `-1` */ - unk_er_f2_13?: number + unk_ds3_f1_13: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `-1` */ - unk_er_f2_14?: number + unk_ds3_f1_14: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_15?: number + unk_ds3_f1_15: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `1` */ - unk_er_f2_16?: number + unk_sdt_f1_14: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_er_f2_17?: number + unk_sdt_f1_15: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_er_f2_18?: number + unk_sdt_f1_16: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_er_f2_19?: number + unk_sdt_f1_17: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `1` */ - unk_er_f2_20?: number + unk_er_f1_18: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `1` */ - unk_er_f2_21?: number + unk_er_f1_19: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_22?: number + unk_er_f1_20: number /** - * Unknown integer. + * Unknown float. * * **Default**: `0` */ - unk_er_f2_23?: number + unk_er_f1_21: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_24?: number + unk_ds3_f2_0: number /** - * Unknown integer. + * Unknown boolean. * * **Default**: `0` */ - unk_er_f2_25?: number + unk_ds3_f2_1: boolean /** * Unknown integer. * - * **Default**: `0` + * **Default**: `8` */ - unk_er_f2_26?: number + unk_ds3_f2_2: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_27?: number + unk_ds3_f2_3: number /** - * Unknown integer. + * Controls whether or not the particles have an additional bloom effect controlled by {@link bloomColor}. * - * **Default**: `0` + * Note: + * - This has no effect if the "Effects Quality" setting is set to "Low". + * - This does not affect the natural bloom effect from high color values. + * + * **Default**: `true` + * + * See also: + * - {@link bloomColor} */ - unk_er_f2_28?: number + bloom: boolean /** - * Unknown integer. + * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. * - * **Default**: `0` + * Note: + * - This has no effect if the "Effects Quality" setting is set to "Low". + * - This does not affect the natural bloom effect from high color values. + * + * **Default**: `[1, 1, 1, 0]` + * + * See also: + * - {@link bloom} */ - unk_er_f2_29?: number + bloomColor: Vector4 /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_31?: number + unk_ds3_f2_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_32?: number + unk_ds3_f2_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_33?: number + unk_ds3_f2_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_34?: number + unk_ds3_f2_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_35?: number + unk_ds3_f2_13: number /** - * Unknown integer. + * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * - * **Default**: `-2` - */ - unk_er_f2_36?: number -} - -/** - * ### {@link ActionType.LensFlare Action 10014 - LensFlare} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * Creates lens flares with up to 4 textured layers with different colors and sizes. - */ -class LensFlare extends DataAction { - declare readonly type: ActionType.LensFlare - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} - /** - * Layer 1 width. - */ - layer1Width: ScalarValue - /** - * Layer 1 height. - */ - layer1Height: ScalarValue - /** - * Layer 1 color. - */ - layer1Color: Vector4Value - /** - * Layer 2 width. - */ - layer2Width: ScalarValue - /** - * Layer 2 height. - */ - layer2Height: ScalarValue - /** - * Layer 2 color. - */ - layer2Color: Vector4Value - /** - * Layer 3 width. - */ - layer3Width: ScalarValue - /** - * Layer 3 height. - */ - layer3Height: ScalarValue - /** - * Layer 3 color. - */ - layer3Color: Vector4Value - /** - * Layer 4 width. - */ - layer4Width: ScalarValue - /** - * Layer 4 height. - */ - layer4Height: ScalarValue - /** - * Layer 4 color. - */ - layer4Color: Vector4Value - /** - * Layer 1 texture ID. + * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * + * **Default**: `-1` + * + * See also: + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - layer1: number + minFadeDistance: number /** - * Layer 2 texture ID. + * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * + * This requires {@link minFadeDistance} to be set to a positive value or 0. + * + * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * + * **Default**: `-1` + * + * See also: + * - {@link minFadeDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - layer2: number + minDistance: number /** - * Layer 3 texture ID. + * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. + * + * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. + * + * **Default**: `-1` + * + * See also: + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - layer3: number + maxFadeDistance: number /** - * Layer 4 texture ID. + * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * - * This layer seems to work a bit differently from the others in Sekiro. + * This requires {@link maxFadeDistance} to be set to a positive value or 0. + * + * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. + * + * **Default**: `-1` + * + * See also: + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - layer4: number + maxDistance: number /** - * Blend mode. + * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. + * + * **Default**: `-1` + * + * See also: + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link maxDistanceThreshold} */ - blendMode: BlendMode - unk_er_f1_4: number + minDistanceThreshold: number /** - * Diameter of the lens flare source sphere. + * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * - * The opacity of the lens flare depends on how much of the source is in view. + * **Default**: `-1` + * + * See also: + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} */ - sourceSize: number + maxDistanceThreshold: number /** - * The time in seconds it takes for the opacity of the lens flare to transition when the source comes more into or goes more out of view. + * Unknown float. + * + * **Default**: `0` */ - opacityTransitionDuration: number - unk_er_f1_8: number + unk_ds3_f2_20: number /** - * Number of copies of layer 1. Why this exists is unknown, they all just stack on top of each other. - * - * Each copy will pick its own random values for the scale variation. + * Unknown integer. * - * See also: - * - {@link layer1ScaleVariationX} - * - {@link layer1ScaleVariationY} + * **Default**: `0` */ - layer1Count: number + unk_ds3_f2_21: number /** - * The {@link layer1Width layer's width} is multiplied by a random value between this and 1. + * Unknown integer. * - * See also: - * - {@link layer1Count} - * - {@link layer1UniformScale} - * - {@link layer1ScaleVariationY} + * **Default**: `0` */ - layer1ScaleVariationX: number + unk_ds3_f2_22: number /** - * The {@link layer1Height layer's height} is multiplied by a random value between this and 1. + * Unknown integer. * - * See also: - * - {@link layer1Count} - * - {@link layer1UniformScale} - * - {@link layer1ScaleVariationX} + * **Default**: `0` */ - layer1ScaleVariationY: number + unk_ds3_f2_23: number /** - * When enabled, the {@link layer1Width layer's width} also controls the {@link layer1Height height}, and the height property is ignored. The same is also true for the scale variation fields. + * Unknown integer. * - * See also: - * - {@link layer1Width} - * - {@link layer1Height} - * - {@link layer1ScaleVariationX} - * - {@link layer1ScaleVariationX} + * **Default**: `0` */ - layer1UniformScale: boolean + unk_ds3_f2_24: number /** - * Multiplier for the {@link layer1Color layer's color}. + * Unknown float. * - * See also: - * - {@link layer1Color} + * **Default**: `1` */ - layer1ColorMultiplier: Vector4 - unk_er_f1_17: number - unk_er_f1_18: number - unk_er_f1_19: number - unk_er_f1_20: number + unkDepthBlend1: number /** - * Number of copies of layer 2. Why this exists is unknown, they all just stack on top of each other. + * Unknown float. * - * Each copy will pick its own random values for the scale variation. + * **Default**: `0` + */ + unkDepthBlend2: number + /** + * Unknown integer. * - * See also: - * - {@link layer2ScaleVariationX} - * - {@link layer2ScaleVariationY} + * **Default**: `1` */ - layer2Count: number + unk_ds3_f2_27: number /** - * The {@link layer2Width layer's width} is multiplied by a random value between this and 1. + * Unknown integer. * - * See also: - * - {@link layer2Count} - * - {@link layer2UniformScale} - * - {@link layer2ScaleVariationY} + * **Default**: `0` */ - layer2ScaleVariationX: number + unk_ds3_f2_28: number /** - * The {@link layer2Height layer's height} is multiplied by a random value between this and 1. + * Unknown float. * - * See also: - * - {@link layer2Count} - * - {@link layer2UniformScale} - * - {@link layer2ScaleVariationX} + * This seems to be some sort of distance threshold. When the camera is within this distance, some things will look different in some ways. For example, when within the distance and the {@link blendMode blend mode} is set to {@link BlendMode.Subtract}, the opacity doesn't work the way it normally does. Other effects have been found as well, but what exactly this threshold is for is unknown. + * + * **Default**: `0` */ - layer2ScaleVariationY: number + unk_ds3_f2_29: number /** - * When enabled, the {@link layer2Width layer's width} also controls the {@link layer2Height height}, and the height property is ignored. The same is also true for the scale variation fields. + * Controls how dark shaded parts of the trail are. * - * See also: - * - {@link layer2Width} - * - {@link layer2Height} - * - {@link layer2ScaleVariationX} - * - {@link layer2ScaleVariationX} + * **Default**: `0` */ - layer2UniformScale: boolean + shadowDarkness: number /** - * Multiplier for the {@link layer2Color layer's color}. + * Unknown integer. * - * See also: - * - {@link layer2Color} + * **Default**: `0` */ - layer2ColorMultiplier: Vector4 - unk_er_f1_29: number - unk_er_f1_30: number - unk_er_f1_31: number - unk_er_f1_32: number + unk_sdt_f2_31: number /** - * Number of copies of layer 3. Why this exists is unknown, they all just stack on top of each other. + * Unknown integer. * - * Each copy will pick its own random values for the scale variation. + * When set to 1, it seems to stop {@link unk_ds3_f2_29} from doing whatever it is doing, and it can also cause some ugly "outline" effects on things seen through particles. * - * See also: - * - {@link layer3ScaleVariationX} - * - {@link layer3ScaleVariationY} + * **Default**: `0` */ - layer3Count: number + unk_sdt_f2_32: number /** - * The {@link layer3Width layer's width} is multiplied by a random value between this and 1. + * Specular texture ID. + * + * **Default**: `0` * * See also: - * - {@link layer3Count} - * - {@link layer3UniformScale} - * - {@link layer3ScaleVariationY} + * - {@link lighting} + * - {@link glossiness} + * - {@link specularity} */ - layer3ScaleVariationX: number + specular: number /** - * The {@link layer3Height layer's height} is multiplied by a random value between this and 1. + * Controls how sharp the specular highlights are. + * + * **Default**: `0.25` * * See also: - * - {@link layer3Count} - * - {@link layer3UniformScale} - * - {@link layer3ScaleVariationX} + * - {@link lighting} + * - {@link specular} + * - {@link specularity} */ - layer3ScaleVariationY: number + glossiness: number /** - * When enabled, the {@link layer3Width layer's width} also controls the {@link layer3Height height}, and the height property is ignored. The same is also true for the scale variation fields. + * Controls how the trail is lit. See {@link LightingMode} for more information. * - * See also: - * - {@link layer3Width} - * - {@link layer3Height} - * - {@link layer3ScaleVariationX} - * - {@link layer3ScaleVariationX} + * **Default**: {@link LightingMode.Unlit} */ - layer3UniformScale: boolean + lighting: LightingMode /** - * Multiplier for the {@link layer3Color layer's color}. + * Unknown integer. * - * See also: - * - {@link layer3Color} + * **Default**: `-2` */ - layer3ColorMultiplier: Vector4 - unk_er_f1_41: number - unk_er_f1_42: number - unk_er_f1_43: number - unk_er_f1_44: number + unk_sdt_f2_36: number /** - * Number of copies of layer 4. Why this exists is unknown, they all just stack on top of each other. - * - * Each copy will pick its own random values for the scale variation. + * Unknown integer. * - * See also: - * - {@link layer4ScaleVariationX} - * - {@link layer4ScaleVariationY} + * **Default**: `0` */ - layer4Count: number + unk_sdt_f2_37: number /** - * The {@link layer4Width layer's width} is multiplied by a random value between this and 1. + * Controls how bright the specular highlights are. + * + * **Default**: `0.5` * * See also: - * - {@link layer4Count} - * - {@link layer4UniformScale} - * - {@link layer4ScaleVariationY} + * - {@link lighting} + * - {@link specular} + * - {@link glossiness} */ - layer4ScaleVariationX: number + specularity: number /** - * The {@link layer4Height layer's height} is multiplied by a random value between this and 1. + * Unknown integer. * - * See also: - * - {@link layer4Count} - * - {@link layer4UniformScale} - * - {@link layer4ScaleVariationX} + * **Default**: `0` */ - layer4ScaleVariationY: number + unk_er_f2_39: number /** - * When enabled, the {@link layer4Width layer's width} also controls the {@link layer4Height height}, and the height property is ignored. The same is also true for the scale variation fields. + * Unknown float. * - * See also: - * - {@link layer4Width} - * - {@link layer4Height} - * - {@link layer4ScaleVariationX} - * - {@link layer4ScaleVariationX} + * **Default**: `1` */ - layer4UniformScale: boolean + unk_er_f2_40: number /** - * Multiplier for the {@link layer4Color layer's color}. + * Unknown float. * - * See also: - * - {@link layer4Color} + * **Default**: `0` */ - layer4ColorMultiplier: Vector4 - unk_er_f1_53: number - unk_er_f1_54: number - unk_er_f1_55: number - unk_er_f1_56: number - unk_er_f1_57: number + unk_ac6_f2_41: number + constructor(props: Partial> = {}) { + super(ActionType.DynamicTracer, {isAppearance:true,isParticle:true}) + this.assign(props) + } +} + +/** + * ### {@link ActionType.WaterInteraction Action 10013 - WaterInteraction} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * Simulates an interaction with water, allowing effects to create ripples in nearby water. The interaction basically pushes water in a shape controlled by a texture down to a given depth and holds it there for a duration before releasing it. + */ +class WaterInteraction extends DataAction { + declare readonly type: ActionType.WaterInteraction + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** - * When enabled, this allows the lens flare to have a bloom effect. - * - * Does not seem to work in Sekiro. + * The ID for a texture that controls the shape of the interaction. * - * See also: - * - {@link layer1BloomColor} - * - {@link layer2BloomColor} - * - {@link layer3BloomColor} - * - {@link layer4BloomColor} + * **Default**: `50004` */ - bloom: boolean + texture: number /** - * The bloom color for layer 1. This is multiplied with the {@link layer1Color layer's color} to get the final color for the bloom. + * Controls how deep to push the water, or how intense the ripples caused by the interaction are. * - * See also: - * - {@link bloom} - * - {@link layer1Color} + * **Default**: `1` */ - layer1BloomColor: Vector4 + depth: number /** - * The bloom color for layer 2. This is multiplied with the {@link layer2Color layer's color} to get the final color for the bloom. + * Controls the size of the interaction area. Ripples caused by the interaction may go outside of the area. * - * See also: - * - {@link bloom} - * - {@link layer2Color} + * **Default**: `1` */ - layer2BloomColor: Vector4 + size: number /** - * The bloom color for layer 3. This is multiplied with the {@link layer3Color layer's color} to get the final color for the bloom. + * The time it takes for the water to be pushed down to the {@link depth} in seconds. * - * See also: - * - {@link bloom} - * - {@link layer3Color} + * **Default**: `0.15` */ - layer3BloomColor: Vector4 + descent: number /** - * The bloom color for layer 4. This is multiplied with the {@link layer4Color layer's color} to get the final color for the bloom. + * The duration of the interaction in seconds. Basically how long to hold the water pressed down. * - * See also: - * - {@link bloom} - * - {@link layer4Color} + * **Default**: `0.15` */ - layer4BloomColor: Vector4 - unk_ac6_f1_75: number - unk_ac6_f1_76: number - unk_ac6_f1_77: number - unk_ac6_f1_78: number - unk_ac6_f1_79: number - unk_ac6_f1_80: number - unk_er_f2_0: number - unk_er_f2_1: number - unk_er_f2_2: number - unk_er_f2_3: number - unk_er_f2_4: number - unk_er_f2_5: number - unk_er_f2_6: number - unk_er_f2_7: number - unk_er_f2_8: number - unk_er_f2_9: number - unk_er_f2_10: number - unk_er_f2_11: number - unk_er_f2_12: number - unk_er_f2_13: number - unk_er_f2_14: number - unk_er_f2_15: number - unk_er_f2_16: number - unk_er_f2_17: number - unk_er_f2_18: number - unk_er_f2_19: number - unk_er_f2_20: number - unk_er_f2_21: number - unk_er_f2_22: number - unk_er_f2_23: number - unk_er_f2_24: number - unk_er_f2_25: number - unk_er_f2_26: number - unk_er_f2_27: number - unk_er_f2_28: number - unk_er_f2_29: number - unk_er_f2_31: number - unk_er_f2_32: number - unk_er_f2_33: number - unk_er_f2_34: number - unk_er_f2_35: number - unk_er_f2_36: number - constructor(props: LensFlareParams = {}) { - super(ActionType.LensFlare, {isAppearance:true,isParticle:false}) + duration: number + constructor(props: Partial> = {}) { + super(ActionType.WaterInteraction, {isAppearance:true,isParticle:false}) this.assign(props) } } -export interface RichModelParams { +/** + * ### {@link ActionType.LensFlare Action 10014 - LensFlare} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * Creates lens flares with up to 4 textured layers with different colors and sizes. + */ +class LensFlare extends DataAction { + declare readonly type: ActionType.LensFlare + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** - * Model ID. - * - * **Default**: `80201` + * Layer 1 width. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `1` */ - model?: ScalarValue + layer1Width: ScalarValue /** - * The width of the particle. - * - * If {@link uniformScale} is enabled, this also controls the height and depth. + * Layer 1 height. * * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationX} - * - {@link sizeY} - * - {@link sizeZ} */ - sizeX?: ScalarValue + layer1Height: ScalarValue /** - * The height of the particle. + * Layer 1 color. * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the height, and this property is ignored. + * **Default**: `[1, 1, 1, 1]` + */ + layer1Color: Vector4Value + /** + * Layer 2 width. * * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationY} - * - {@link sizeX} - * - {@link sizeZ} */ - sizeY?: ScalarValue + layer2Width: ScalarValue /** - * The depth of the particle. - * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the depth, and this property is ignored. + * Layer 2 height. * * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationZ} - * - {@link sizeX} - * - {@link sizeY} */ - sizeZ?: ScalarValue + layer2Height: ScalarValue /** - * Rotation around the X-axis in degrees. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * Layer 2 color. * - * See also: - * - {@link angularSpeedX} - * - {@link angularSpeedMultiplierX} + * **Default**: `[1, 1, 1, 1]` */ - rotationX?: ScalarValue + layer2Color: Vector4Value /** - * Rotation around the Y-axis in degrees. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * Layer 3 width. * - * See also: - * - {@link angularSpeedY} - * - {@link angularSpeedMultiplierY} + * **Default**: `1` */ - rotationY?: ScalarValue + layer3Width: ScalarValue /** - * Rotation around the Z-axis in degrees. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * Layer 3 height. * - * See also: - * - {@link angularSpeedZ} - * - {@link angularSpeedMultiplierZ} + * **Default**: `1` */ - rotationZ?: ScalarValue + layer3Height: ScalarValue /** - * Angular speed around the X-axis in degrees per second. - * - * **Default**: `0` + * Layer 3 color. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `[1, 1, 1, 1]` + */ + layer3Color: Vector4Value + /** + * Layer 4 width. * - * See also: - * - {@link rotationX} - * - {@link angularSpeedMultiplierX} + * **Default**: `1` */ - angularSpeedX?: ScalarValue + layer4Width: ScalarValue /** - * Multiplier for {@link angularSpeedX}. + * Layer 4 height. * * **Default**: `1` + */ + layer4Height: ScalarValue + /** + * Layer 4 color. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `[1, 1, 1, 1]` + */ + layer4Color: Vector4Value + /** + * Layer 1 texture ID. * - * See also: - * - {@link rotationX} + * **Default**: `1` */ - angularSpeedMultiplierX?: ScalarValue + layer1: number /** - * Angular speed around the Y-axis in degrees per second. + * Layer 2 texture ID. * * **Default**: `0` + */ + layer2: number + /** + * Layer 3 texture ID. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationY} - * - {@link angularSpeedMultiplierY} + * **Default**: `0` */ - angularSpeedY?: ScalarValue + layer3: number /** - * Multiplier for {@link angularSpeedY}. + * Layer 4 texture ID. * - * **Default**: `1` + * This layer seems to work a bit differently from the others in Sekiro. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` + */ + layer4: number + /** + * Blend mode. * - * See also: - * - {@link rotationY} + * **Default**: {@link BlendMode.Add} */ - angularSpeedMultiplierY?: ScalarValue + blendMode: BlendMode /** - * Angular speed around the Z-axis in degrees per second. + * Unknown integer. * * **Default**: `0` + */ + unk_er_f1_4: number + /** + * Diameter of the lens flare source sphere. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * The opacity of the lens flare depends on how much of the source is in view. * - * See also: - * - {@link rotationZ} - * - {@link angularSpeedMultiplierZ} + * **Default**: `1` */ - angularSpeedZ?: ScalarValue + sourceSize: number /** - * Multiplier for {@link angularSpeedZ}. + * The time in seconds it takes for the opacity of the lens flare to transition when the source comes more into or goes more out of view. * * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationZ} */ - angularSpeedMultiplierZ?: ScalarValue + opacityTransitionDuration: number /** - * Color multiplier. + * Unknown integer. * - * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. + * **Default**: `0` + */ + unk_er_f1_8: number + /** + * Number of copies of layer 1. Why this exists is unknown, they all just stack on top of each other. * - * **Default**: `[1, 1, 1, 1]` + * Each copy will pick its own random values for the scale variation. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` * * See also: - * - {@link color2} - * - {@link color3} + * - {@link layer1ScaleVariationX} + * - {@link layer1ScaleVariationY} */ - color1?: Vector4Value + layer1Count: number /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. - * - * **Default**: `[1, 1, 1, 1]` + * The {@link layer1Width layer's width} is multiplied by a random value between this and 1. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `1` * * See also: - * - {@link color1} - * - {@link color3} + * - {@link layer1Count} + * - {@link layer1UniformScale} + * - {@link layer1ScaleVariationY} */ - color2?: Vector4Value + layer1ScaleVariationX: number /** - * Color multiplier. - * - * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. - * - * **Default**: `[1, 1, 1, 1]` + * The {@link layer1Height layer's height} is multiplied by a random value between this and 1. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` * * See also: - * - {@link color1} - * - {@link color2} + * - {@link layer1Count} + * - {@link layer1UniformScale} + * - {@link layer1ScaleVariationX} */ - color3?: Vector4Value + layer1ScaleVariationY: number /** - * Unknown. + * When enabled, the {@link layer1Width layer's width} also controls the {@link layer1Height height}, and the height property is ignored. The same is also true for the scale variation fields. * - * **Default**: `0` - */ - unk_er_p1_16?: ScalarValue - /** - * Unknown. + * **Default**: `false` * - * **Default**: `0` + * See also: + * - {@link layer1Width} + * - {@link layer1Height} + * - {@link layer1ScaleVariationX} + * - {@link layer1ScaleVariationX} */ - unk_er_p1_17?: ScalarValue + layer1UniformScale: boolean /** - * Seemingly identical to {@link rgbMultiplier}? + * Multiplier for the {@link layer1Color layer's color}. * - * **Default**: `1` + * **Default**: `[1, 1, 1, 1]` * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * See also: + * - {@link layer1Color} */ - rgbMultiplier2?: ScalarValue + layer1ColorMultiplier: Vector4 /** - * Unknown. + * Unknown integer. * * **Default**: `0` */ - unk_er_p1_19?: ScalarValue + unk_er_f1_17: number /** - * Unknown. + * Unknown float. * * **Default**: `0` */ - unk_er_p1_20?: ScalarValue - /** - * Offset for the UV coordinates of the model. - * - * **Default**: `[0, 0]` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link uvSpeed} - */ - uvOffset?: Vector2Value + unk_er_f1_18: number /** - * Scroll speed for the model's texture. - * - * **Default**: `[0, 0]` + * Unknown float. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` + */ + unk_er_f1_19: number + /** + * Unknown float. * - * See also: - * - {@link uvSpeedMultiplier} + * **Default**: `-1` */ - uvSpeed?: Vector2Value + unk_er_f1_20: number /** - * Multiplier for {@link uvSpeed} + * Number of copies of layer 2. Why this exists is unknown, they all just stack on top of each other. * - * **Default**: `[1, 1]` + * Each copy will pick its own random values for the scale variation. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` + * + * See also: + * - {@link layer2ScaleVariationX} + * - {@link layer2ScaleVariationY} */ - uvSpeedMultiplier?: Vector2Value + layer2Count: number /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * The {@link layer2Width layer's width} is multiplied by a random value between this and 1. * * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * See also: + * - {@link layer2Count} + * - {@link layer2UniformScale} + * - {@link layer2ScaleVariationY} */ - rgbMultiplier?: ScalarValue + layer2ScaleVariationX: number /** - * Alpha multiplier. + * The {@link layer2Height layer's height} is multiplied by a random value between this and 1. * * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * See also: + * - {@link layer2Count} + * - {@link layer2UniformScale} + * - {@link layer2ScaleVariationX} */ - alphaMultiplier?: ScalarValue + layer2ScaleVariationY: number /** - * Unknown. + * When enabled, the {@link layer2Width layer's width} also controls the {@link layer2Height height}, and the height property is ignored. The same is also true for the scale variation fields. * - * **Default**: `0` + * **Default**: `false` + * + * See also: + * - {@link layer2Width} + * - {@link layer2Height} + * - {@link layer2ScaleVariationX} + * - {@link layer2ScaleVariationX} */ - unk_er_p2_2?: ScalarValue + layer2UniformScale: boolean /** - * Unknown. + * Multiplier for the {@link layer2Color layer's color}. * * **Default**: `[1, 1, 1, 1]` + * + * See also: + * - {@link layer2Color} */ - unk_er_p2_3?: Vector4Value + layer2ColorMultiplier: Vector4 /** - * Unknown. + * Unknown integer. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` */ - unk_er_p2_4?: Vector4Value + unk_er_f1_29: number /** - * Unknown. + * Unknown float. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` */ - unk_er_p2_5?: Vector4Value + unk_er_f1_30: number /** - * Unknown. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_er_p2_6?: ScalarValue + unk_er_f1_31: number /** - * Rich model orientation mode. See {@link RichModelOrientationMode} for more information. + * Unknown float. * - * **Default**: {@link RichModelOrientationMode.ParticleDirection} + * **Default**: `-1` */ - orientation?: RichModelOrientationMode + unk_er_f1_32: number /** - * Each particle will pick a random number between this value and 1, and the width of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly thinner, down to half width. Setting it to 2 will make them randomly wider, up to double width. + * Number of copies of layer 3. Why this exists is unknown, they all just stack on top of each other. * - * If {@link uniformScale} is enabled, this also affects the height. + * Each copy will pick its own random values for the scale variation. * * **Default**: `1` * * See also: - * - {@link scaleVariationY} - * - {@link scaleVariationZ} + * - {@link layer3ScaleVariationX} + * - {@link layer3ScaleVariationY} */ - scaleVariationX?: number + layer3Count: number /** - * Each particle will pick a random number between this value and 1, and the height of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shorter, down to half height. Setting it to 2 will make them randomly taller, up to double height. - * - * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the height, and this field is ignored. + * The {@link layer3Width layer's width} is multiplied by a random value between this and 1. * * **Default**: `1` * * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationZ} + * - {@link layer3Count} + * - {@link layer3UniformScale} + * - {@link layer3ScaleVariationY} */ - scaleVariationY?: number + layer3ScaleVariationX: number /** - * Each particle will pick a random number between this value and 1, and the depth of the particle will be multiplied by this number. For example, setting this to 0.5 will make the particles randomly shallower, down to half depth. Setting it to 2 will make them randomly deeper, up to double depth. - * - * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the depth, and this field is ignored. + * The {@link layer3Height layer's height} is multiplied by a random value between this and 1. * * **Default**: `1` * * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationY} + * - {@link layer3Count} + * - {@link layer3UniformScale} + * - {@link layer3ScaleVariationX} */ - scaleVariationZ?: number + layer3ScaleVariationY: number /** - * If enabled, the particle X scale-related properties and fields will control the scale in all axes, and the Y and Z counterparts will be ignored. + * When enabled, the {@link layer3Width layer's width} also controls the {@link layer3Height height}, and the height property is ignored. The same is also true for the scale variation fields. * * **Default**: `false` * * See also: - * - {@link sizeX} - * - {@link sizeY} - * - {@link sizeZ} - * - {@link scaleVariationX} - * - {@link scaleVariationY} - * - {@link scaleVariationZ} + * - {@link layer3Width} + * - {@link layer3Height} + * - {@link layer3ScaleVariationX} + * - {@link layer3ScaleVariationX} */ - uniformScale?: boolean + layer3UniformScale: boolean /** - * Unknown integer. + * Multiplier for the {@link layer3Color layer's color}. * - * **Default**: `1` + * **Default**: `[1, 1, 1, 1]` + * + * See also: + * - {@link layer3Color} */ - unk_er_f1_5?: number + layer3ColorMultiplier: Vector4 /** * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_er_f1_6?: number + unk_er_f1_41: number /** - * If enabled, this allows control of the model's opacity regardless of its material by using dithered transparency. If disabled, changes to the alpha values that affect the particle will not have any effect unless the material allows it, but it will look better than the dithered transparency. + * Unknown float. * * **Default**: `0` */ - dither?: boolean + unk_er_f1_42: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `-2` + * **Default**: `1` */ - unk_er_f1_8?: number + unk_er_f1_43: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `-2` + * **Default**: `-1` */ - unk_er_f1_9?: number + unk_er_f1_44: number /** - * Anibnd ID. + * Number of copies of layer 4. Why this exists is unknown, they all just stack on top of each other. * - * **Default**: `0` + * Each copy will pick its own random values for the scale variation. + * + * **Default**: `1` * * See also: - * - {@link animation} - * - {@link loopAnimation} - * - {@link animationSpeed} + * - {@link layer4ScaleVariationX} + * - {@link layer4ScaleVariationY} */ - anibnd?: number + layer4Count: number /** - * Controls which animation in the {@link anibnd} to play. + * The {@link layer4Width layer's width} is multiplied by a random value between this and 1. * - * **Default**: `0` + * **Default**: `1` * * See also: - * - {@link anibnd} - * - {@link loopAnimation} - * - {@link animationSpeed} + * - {@link layer4Count} + * - {@link layer4UniformScale} + * - {@link layer4ScaleVariationY} */ - animation?: number + layer4ScaleVariationX: number /** - * If disabled, the {@link animation} will only play once and then freeze on the last frame. If enabled, the animation will loop. + * The {@link layer4Height layer's height} is multiplied by a random value between this and 1. * - * **Default**: `true` + * **Default**: `1` * * See also: - * - {@link anibnd} - * - {@link animation} - * - {@link animationSpeed} + * - {@link layer4Count} + * - {@link layer4UniformScale} + * - {@link layer4ScaleVariationX} */ - loopAnimation?: boolean + layer4ScaleVariationY: number /** - * Controls the speed at which the {@link animation} plays. + * When enabled, the {@link layer4Width layer's width} also controls the {@link layer4Height height}, and the height property is ignored. The same is also true for the scale variation fields. * - * **Default**: `1` + * **Default**: `false` * * See also: - * - {@link anibnd} - * - {@link animation} - * - {@link loopAnimation} + * - {@link layer4Width} + * - {@link layer4Height} + * - {@link layer4ScaleVariationX} + * - {@link layer4ScaleVariationX} */ - animationSpeed?: number + layer4UniformScale: boolean /** - * Unknown float. + * Multiplier for the {@link layer4Color layer's color}. * - * **Default**: `0` + * **Default**: `[1, 1, 1, 1]` + * + * See also: + * - {@link layer4Color} */ - unk_er_f1_14?: number + layer4ColorMultiplier: Vector4 /** * Unknown integer. * * **Default**: `0` */ - unk_er_f1_15?: number + unk_er_f1_53: number /** - * Unknown integer. + * Unknown float. * * **Default**: `0` */ - unk_er_f1_16?: number + unk_er_f1_54: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_er_f1_17?: number + unk_er_f1_55: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `0` + * **Default**: `-1` */ - unk_er_f1_18?: number + unk_er_f1_56: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f1_19?: number + unk_er_f1_57: number /** - * Unknown integer. + * When enabled, this allows the lens flare to have a bloom effect. * - * **Default**: `0` + * Does not seem to work in Sekiro. + * + * **Default**: `false` + * + * See also: + * - {@link layer1BloomColor} + * - {@link layer2BloomColor} + * - {@link layer3BloomColor} + * - {@link layer4BloomColor} */ - unk_er_f1_20?: number + bloom: boolean /** - * Unknown integer. + * The bloom color for layer 1. This is multiplied with the {@link layer1Color layer's color} to get the final color for the bloom. * - * **Default**: `0` + * **Default**: `[1, 1, 1, 1]` + * + * See also: + * - {@link bloom} + * - {@link layer1Color} */ - unk_er_f1_21?: number + layer1BloomColor: Vector4 /** - * Unknown integer. + * The bloom color for layer 2. This is multiplied with the {@link layer2Color layer's color} to get the final color for the bloom. * - * **Default**: `0` + * **Default**: `[1, 1, 1, 1]` + * + * See also: + * - {@link bloom} + * - {@link layer2Color} */ - unk_er_f1_22?: number + layer2BloomColor: Vector4 /** - * Unknown integer. + * The bloom color for layer 3. This is multiplied with the {@link layer3Color layer's color} to get the final color for the bloom. * - * **Default**: `0` + * **Default**: `[1, 1, 1, 1]` + * + * See also: + * - {@link bloom} + * - {@link layer3Color} */ - unk_er_f1_23?: number + layer3BloomColor: Vector4 /** - * Unknown float. + * The bloom color for layer 4. This is multiplied with the {@link layer4Color layer's color} to get the final color for the bloom. * - * **Default**: `0` + * **Default**: `[1, 1, 1, 1]` + * + * See also: + * - {@link bloom} + * - {@link layer4Color} */ - unk_ac6_f1_24?: number + layer4BloomColor: Vector4 /** * Unknown float. * * **Default**: `-1` */ - unk_ac6_f1_25?: number + unk_ac6_f1_75: number /** * Unknown float. * * **Default**: `-1` */ - unk_ac6_f1_26?: number + unk_ac6_f1_76: number /** * Unknown float. * * **Default**: `-1` */ - unk_ac6_f1_27?: number + unk_ac6_f1_77: number /** * Unknown float. * * **Default**: `-1` */ - unk_ac6_f1_28?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_29?: number + unk_ac6_f1_78: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `0` + * **Default**: `-1` */ - unk_ac6_f1_30?: number + unk_ac6_f1_79: number /** * Unknown float. * - * **Default**: `0` + * **Default**: `-1` */ - unk_ac6_f1_31?: number + unk_ac6_f1_80: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_32?: number + unk_er_f2_0: number /** * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_ac6_f1_33?: number + unk_er_f2_1: number /** * Unknown integer. * * **Default**: `0` */ - unk_ac6_f1_34?: number + unk_er_f2_2: number /** - * Unknown float. + * Unknown integer. * * **Default**: `0` */ - unk_er_f1_24?: number + unk_er_f2_3: number /** * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_er_f1_25?: number + unk_er_f2_4: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_0?: number + unk_er_f2_5: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_1?: number + unk_er_f2_6: number /** * Unknown integer. * - * **Default**: `8` + * **Default**: `0` */ - unk_er_f2_2?: number + unk_er_f2_7: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_3?: number - /** - * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. - * - * Note: - * - This has no effect if the "Effects Quality" setting is set to "Low". - * - This does not affect the natural bloom effect from high color values. - * - * **Default**: `[1, 1, 1, 0]` - */ - bloomColor?: Vector4 + unk_er_f2_8: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_8?: number + unk_er_f2_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_9?: number + unk_er_f2_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_10?: number + unk_er_f2_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_11?: number + unk_er_f2_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_12?: number + unk_er_f2_13: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_13?: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * **Default**: `-1` - * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minFadeDistance?: number - /** - * Minimum view distance. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link minFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - minDistance?: number - /** - * This controls a point where the opacity of a particle will start to fade to 0 near the {@link maxDistance maximum view distance}. At {@link maxDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. - * - * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. - * - * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} - */ - maxFadeDistance?: number + unk_er_f2_14: number /** - * Minimum view distance. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. - * - * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. - * - * **Default**: `-1` + * Unknown integer. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `0` */ - maxDistance?: number + unk_er_f2_15: number /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * **Default**: `-1` + * Unknown integer. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} + * **Default**: `0` */ - minDistanceThreshold?: number + unk_er_f2_16: number /** - * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. - * - * **Default**: `-1` + * Unknown integer. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} + * **Default**: `0` */ - maxDistanceThreshold?: number + unk_er_f2_17: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_20?: number + unk_er_f2_18: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_21?: number + unk_er_f2_19: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_22?: number + unk_er_f2_20: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_23?: number + unk_er_f2_21: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_24?: number + unk_er_f2_22: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unkDepthBlend1?: number + unk_er_f2_23: number /** - * Unknown float. + * Unknown integer. * * **Default**: `0` */ - unkDepthBlend2?: number + unk_er_f2_24: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_27?: number + unk_er_f2_25: number /** * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_er_f2_28?: number + unk_er_f2_26: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_29?: number + unk_er_f2_27: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_30?: number + unk_er_f2_28: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_er_f2_31?: number + unk_er_f2_29: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_32?: number + unk_er_f2_31: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_33?: number + unk_er_f2_32: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `0.5` + * **Default**: `0` */ - unk_er_f2_34?: number + unk_er_f2_33: number /** * Unknown integer. * - * **Default**: `-2` + * **Default**: `0` */ - unk_er_f2_35?: number + unk_er_f2_34: number /** * Unknown integer. * - * **Default**: `-2` + * **Default**: `0` */ - unk_er_f2_36?: number + unk_er_f2_35: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `-2` */ - unk_er_f2_37?: number + unk_er_f2_36: number + constructor(props: Partial> = {}) { + super(ActionType.LensFlare, {isAppearance:true,isParticle:false}) + this.assign(props) + } } /** @@ -36457,6 +27813,8 @@ class RichModel extends DataAction { /** * Model ID. * + * **Default**: `80201` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ model: ScalarValue @@ -36465,6 +27823,8 @@ class RichModel extends DataAction { * * If {@link uniformScale} is enabled, this also controls the height and depth. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36478,6 +27838,8 @@ class RichModel extends DataAction { * * If {@link uniformScale} is enabled, {@link sizeX} also controls the height, and this property is ignored. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36491,6 +27853,8 @@ class RichModel extends DataAction { * * If {@link uniformScale} is enabled, {@link sizeX} also controls the depth, and this property is ignored. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36502,6 +27866,8 @@ class RichModel extends DataAction { /** * Rotation around the X-axis in degrees. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: @@ -36512,6 +27878,8 @@ class RichModel extends DataAction { /** * Rotation around the Y-axis in degrees. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: @@ -36522,6 +27890,8 @@ class RichModel extends DataAction { /** * Rotation around the Z-axis in degrees. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: @@ -36532,6 +27902,8 @@ class RichModel extends DataAction { /** * Angular speed around the X-axis in degrees per second. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36542,6 +27914,8 @@ class RichModel extends DataAction { /** * Multiplier for {@link angularSpeedX}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36551,6 +27925,8 @@ class RichModel extends DataAction { /** * Angular speed around the Y-axis in degrees per second. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36561,6 +27937,8 @@ class RichModel extends DataAction { /** * Multiplier for {@link angularSpeedY}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36570,6 +27948,8 @@ class RichModel extends DataAction { /** * Angular speed around the Z-axis in degrees per second. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36580,6 +27960,8 @@ class RichModel extends DataAction { /** * Multiplier for {@link angularSpeedZ}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36591,6 +27973,8 @@ class RichModel extends DataAction { * * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. * + * **Default**: `[1, 1, 1, 1]` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36603,6 +27987,8 @@ class RichModel extends DataAction { * * Values in this will be clamped to the 0-1 range. There is no equivalent property with unrestricted values based on the emission time of the particle, but {@link color3} is still multiplicative with this and can be used to scale the values indirectly. * + * **Default**: `[1, 1, 1, 1]` + * * **Argument**: {@link PropertyArgument.EmissionTime Emission time} * * See also: @@ -36615,6 +28001,8 @@ class RichModel extends DataAction { * * Values in this are unrestricted and can go above 1. If you want values to be clamped to the 0-1 range, see {@link color1}. * + * **Default**: `[1, 1, 1, 1]` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36622,19 +28010,43 @@ class RichModel extends DataAction { * - {@link color2} */ color3: Vector4Value + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_er_p1_16: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_er_p1_17: ScalarValue /** * Seemingly identical to {@link rgbMultiplier}? * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ rgbMultiplier2: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_er_p1_19: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_er_p1_20: ScalarValue /** * Offset for the UV coordinates of the model. * + * **Default**: `[0, 0]` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: @@ -36644,6 +28056,8 @@ class RichModel extends DataAction { /** * Scroll speed for the model's texture. * + * **Default**: `[0, 0]` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36653,28 +28067,61 @@ class RichModel extends DataAction { /** * Multiplier for {@link uvSpeed} * + * **Default**: `[1, 1]` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ uvSpeedMultiplier: Vector2Value /** * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ rgbMultiplier: ScalarValue /** * Alpha multiplier. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ alphaMultiplier: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_er_p2_2: ScalarValue + /** + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` + */ unk_er_p2_3: Vector4Value + /** + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` + */ unk_er_p2_4: Vector4Value + /** + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` + */ unk_er_p2_5: Vector4Value + /** + * Unknown scalar. + * + * **Default**: `0` + */ unk_er_p2_6: ScalarValue /** * Rich model orientation mode. See {@link RichModelOrientationMode} for more information. + * + * **Default**: {@link RichModelOrientationMode.ParticleDirection} */ orientation: RichModelOrientationMode /** @@ -36682,6 +28129,8 @@ class RichModel extends DataAction { * * If {@link uniformScale} is enabled, this also affects the height. * + * **Default**: `1` + * * See also: * - {@link scaleVariationY} * - {@link scaleVariationZ} @@ -36692,6 +28141,8 @@ class RichModel extends DataAction { * * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the height, and this field is ignored. * + * **Default**: `1` + * * See also: * - {@link scaleVariationX} * - {@link scaleVariationZ} @@ -36702,6 +28153,8 @@ class RichModel extends DataAction { * * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the depth, and this field is ignored. * + * **Default**: `1` + * * See also: * - {@link scaleVariationX} * - {@link scaleVariationY} @@ -36710,6 +28163,8 @@ class RichModel extends DataAction { /** * If enabled, the particle X scale-related properties and fields will control the scale in all axes, and the Y and Z counterparts will be ignored. * + * **Default**: `false` + * * See also: * - {@link sizeX} * - {@link sizeY} @@ -36719,17 +28174,41 @@ class RichModel extends DataAction { * - {@link scaleVariationZ} */ uniformScale: boolean + /** + * Unknown integer. + * + * **Default**: `1` + */ unk_er_f1_5: number + /** + * Unknown integer. + * + * **Default**: `1` + */ unk_er_f1_6: number /** * If enabled, this allows control of the model's opacity regardless of its material by using dithered transparency. If disabled, changes to the alpha values that affect the particle will not have any effect unless the material allows it, but it will look better than the dithered transparency. + * + * **Default**: `0` */ dither: boolean + /** + * Unknown integer. + * + * **Default**: `-2` + */ unk_er_f1_8: number + /** + * Unknown integer. + * + * **Default**: `-2` + */ unk_er_f1_9: number /** * Anibnd ID. * + * **Default**: `0` + * * See also: * - {@link animation} * - {@link loopAnimation} @@ -36739,6 +28218,8 @@ class RichModel extends DataAction { /** * Controls which animation in the {@link anibnd} to play. * + * **Default**: `0` + * * See also: * - {@link anibnd} * - {@link loopAnimation} @@ -36748,6 +28229,8 @@ class RichModel extends DataAction { /** * If disabled, the {@link animation} will only play once and then freeze on the last frame. If enabled, the animation will loop. * + * **Default**: `true` + * * See also: * - {@link anibnd} * - {@link animation} @@ -36757,38 +28240,175 @@ class RichModel extends DataAction { /** * Controls the speed at which the {@link animation} plays. * + * **Default**: `1` + * * See also: * - {@link anibnd} * - {@link animation} * - {@link loopAnimation} */ animationSpeed: number + /** + * Unknown float. + * + * **Default**: `0` + */ unk_er_f1_14: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f1_15: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f1_16: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f1_17: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f1_18: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f1_19: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f1_20: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f1_21: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f1_22: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f1_23: number + /** + * Unknown float. + * + * **Default**: `0` + */ unk_ac6_f1_24: number + /** + * Unknown float. + * + * **Default**: `-1` + */ unk_ac6_f1_25: number + /** + * Unknown float. + * + * **Default**: `-1` + */ unk_ac6_f1_26: number + /** + * Unknown float. + * + * **Default**: `-1` + */ unk_ac6_f1_27: number + /** + * Unknown float. + * + * **Default**: `-1` + */ unk_ac6_f1_28: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ac6_f1_29: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ac6_f1_30: number + /** + * Unknown float. + * + * **Default**: `0` + */ unk_ac6_f1_31: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ac6_f1_32: number + /** + * Unknown integer. + * + * **Default**: `1` + */ unk_ac6_f1_33: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_ac6_f1_34: number + /** + * Unknown float. + * + * **Default**: `0` + */ unk_er_f1_24: number + /** + * Unknown integer. + * + * **Default**: `1` + */ unk_er_f1_25: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f2_0: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f2_1: number + /** + * Unknown integer. + * + * **Default**: `8` + */ unk_er_f2_2: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f2_3: number /** * Controls the color of the additional bloom effect. The colors of the particle will be multiplied with this color to get the final color of the bloom effect. @@ -36796,19 +28416,53 @@ class RichModel extends DataAction { * Note: * - This has no effect if the "Effects Quality" setting is set to "Low". * - This does not affect the natural bloom effect from high color values. + * + * **Default**: `[1, 1, 1, 0]` */ bloomColor: Vector4 + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f2_8: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f2_9: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f2_10: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f2_11: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f2_12: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f2_13: number /** * This controls a point where the opacity of a particle will start to fade to 0 near the {@link minDistance minimum view distance}. At {@link minDistance}, the opacity will be 0, and it will linearly approach 1 as the distance between the camera and the particle approaches this distance. * * This requires {@link minDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. * + * **Default**: `-1` + * * See also: * - {@link minDistance} * - {@link maxFadeDistance} @@ -36824,6 +28478,8 @@ class RichModel extends DataAction { * * This is different from {@link minDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link maxFadeDistance} @@ -36837,6 +28493,8 @@ class RichModel extends DataAction { * * This requires {@link maxDistance} to be set to a positive value or 0. This distance limit can be disabled by setting this and minDistance to -1. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -36852,6 +28510,8 @@ class RichModel extends DataAction { * * This is different from {@link maxDistanceThreshold}, as this controls the start of a distance range that has smooth transitions at each end, while the threshold value is a hard cut-off. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -36863,6 +28523,8 @@ class RichModel extends DataAction { /** * A hard cut-off point for the distance between the camera and the particle. If a particle is closer than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -36874,6 +28536,8 @@ class RichModel extends DataAction { /** * A hard cut-off point for the distance between the camera and the particle. If a particle is farther away than this distance from the camera, it will be hidden. Can be set to -1 to disable the limit. * + * **Default**: `-1` + * * See also: * - {@link minFadeDistance} * - {@link minDistance} @@ -36882,517 +28546,469 @@ class RichModel extends DataAction { * - {@link minDistanceThreshold} */ maxDistanceThreshold: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f2_20: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f2_21: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f2_22: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f2_23: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_er_f2_24: number + /** + * Unknown float. + * + * **Default**: `1` + */ unkDepthBlend1: number + /** + * Unknown float. + * + * **Default**: `0` + */ unkDepthBlend2: number - unk_er_f2_27: number - unk_er_f2_28: number - unk_er_f2_29: number - unk_er_f2_30: number - unk_er_f2_31: number - unk_er_f2_32: number - unk_er_f2_33: number - unk_er_f2_34: number - unk_er_f2_35: number - unk_er_f2_36: number - unk_er_f2_37: number - constructor(props: RichModelParams = {}) { - super(ActionType.RichModel, {isAppearance:true,isParticle:true}) - this.assign(props) - } -} - -export interface Unk10100Params { /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_0?: number + unk_er_f2_27: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_1?: number + unk_er_f2_28: number /** * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_ds3_f1_2?: number + unk_er_f2_29: number /** - * Unknown integer. The only known thing about this field is that setting it to 0 stops action 10300 from doing anything. + * Unknown integer. + * + * **Default**: `0` + */ + unk_er_f2_30: number + /** + * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_3?: number + unk_er_f2_31: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_4?: number + unk_er_f2_32: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_5?: number + unk_er_f2_33: number + /** + * Unknown float. + * + * **Default**: `0.5` + */ + unk_er_f2_34: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `-2` */ - unk_ds3_f1_6?: number + unk_er_f2_35: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `-2` */ - unk_ds3_f1_7?: number + unk_er_f2_36: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_8?: number + unk_er_f2_37: number + constructor(props: Partial> = {}) { + super(ActionType.RichModel, {isAppearance:true,isParticle:true}) + this.assign(props) + } +} + +/** + * ### {@link ActionType.Unk10100 Action 10100 - Unk10100} + * **Slot**: {@link ActionSlots.Unknown10100Action Unknown10100} + * + * Unknown root node action. + */ +class Unk10100 extends DataAction { + declare readonly type: ActionType.Unk10100 + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_9?: number + unk_ds3_f1_0: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f1_10?: number + unk_ds3_f1_1: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `1` + */ + unk_ds3_f1_2: number + /** + * Unknown integer. The only known thing about this field is that setting it to 0 stops action 10300 from doing anything. + * + * **Default**: `1` */ - unk_ds3_f1_11?: number + unk_ds3_f1_3: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_12?: number + unk_ds3_f1_4: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_13?: number + unk_ds3_f1_5: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_14?: number + unk_ds3_f1_6: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_15?: number + unk_ds3_f1_7: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_16?: number + unk_ds3_f1_8: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_17?: number + unk_ds3_f1_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_18?: number + unk_ds3_f1_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_19?: number + unk_ds3_f1_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_20?: number + unk_ds3_f1_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_21?: number + unk_ds3_f1_13: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_22?: number + unk_ds3_f1_14: number /** * Unknown integer. * - * **Default**: `-1` + * **Default**: `0` */ - unk_ds3_f1_23?: number + unk_ds3_f1_15: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_24?: number + unk_ds3_f1_16: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_25?: number + unk_ds3_f1_17: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_26?: number + unk_ds3_f1_18: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_27?: number + unk_ds3_f1_19: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_28?: number + unk_ds3_f1_20: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_29?: number + unk_ds3_f1_21: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_30?: number + unk_ds3_f1_22: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `-1` */ - unk_ds3_f1_31?: number + unk_ds3_f1_23: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_32?: number + unk_ds3_f1_24: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_33?: number + unk_ds3_f1_25: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_34?: number + unk_ds3_f1_26: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_35?: number + unk_ds3_f1_27: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_36?: number + unk_ds3_f1_28: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_37?: number + unk_ds3_f1_29: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_38?: number + unk_ds3_f1_30: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_39?: number + unk_ds3_f1_31: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_40?: number + unk_ds3_f1_32: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_41?: number + unk_ds3_f1_33: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_42?: number + unk_ds3_f1_34: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_43?: number + unk_ds3_f1_35: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_44?: number + unk_ds3_f1_36: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_45?: number + unk_ds3_f1_37: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_46?: number + unk_ds3_f1_38: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_47?: number + unk_ds3_f1_39: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_48?: number + unk_ds3_f1_40: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_49?: number + unk_ds3_f1_41: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_50?: number + unk_ds3_f1_42: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_51?: number + unk_ds3_f1_43: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_52?: number + unk_ds3_f1_44: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_53?: number + unk_ds3_f1_45: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_54?: number + unk_ds3_f1_46: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_55?: number -} - -/** - * ### {@link ActionType.Unk10100 Action 10100 - Unk10100} - * **Slot**: {@link ActionSlots.Unknown10100Action Unknown10100} - * - * Unknown root node action. - */ -class Unk10100 extends DataAction { - declare readonly type: ActionType.Unk10100 - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - unk_ds3_f1_0: number - unk_ds3_f1_1: number - unk_ds3_f1_2: number + unk_ds3_f1_47: number /** - * Unknown integer. The only known thing about this field is that setting it to 0 stops action 10300 from doing anything. + * Unknown integer. + * + * **Default**: `0` */ - unk_ds3_f1_3: number - unk_ds3_f1_4: number - unk_ds3_f1_5: number - unk_ds3_f1_6: number - unk_ds3_f1_7: number - unk_ds3_f1_8: number - unk_ds3_f1_9: number - unk_ds3_f1_10: number - unk_ds3_f1_11: number - unk_ds3_f1_12: number - unk_ds3_f1_13: number - unk_ds3_f1_14: number - unk_ds3_f1_15: number - unk_ds3_f1_16: number - unk_ds3_f1_17: number - unk_ds3_f1_18: number - unk_ds3_f1_19: number - unk_ds3_f1_20: number - unk_ds3_f1_21: number - unk_ds3_f1_22: number - unk_ds3_f1_23: number - unk_ds3_f1_24: number - unk_ds3_f1_25: number - unk_ds3_f1_26: number - unk_ds3_f1_27: number - unk_ds3_f1_28: number - unk_ds3_f1_29: number - unk_ds3_f1_30: number - unk_ds3_f1_31: number - unk_ds3_f1_32: number - unk_ds3_f1_33: number - unk_ds3_f1_34: number - unk_ds3_f1_35: number - unk_ds3_f1_36: number - unk_ds3_f1_37: number - unk_ds3_f1_38: number - unk_ds3_f1_39: number - unk_ds3_f1_40: number - unk_ds3_f1_41: number - unk_ds3_f1_42: number - unk_ds3_f1_43: number - unk_ds3_f1_44: number - unk_ds3_f1_45: number - unk_ds3_f1_46: number - unk_ds3_f1_47: number unk_ds3_f1_48: number - unk_ds3_f1_49: number - unk_ds3_f1_50: number - unk_ds3_f1_51: number - unk_ds3_f1_52: number - unk_ds3_f1_53: number - unk_ds3_f1_54: number - unk_ds3_f1_55: number - constructor(props: Unk10100Params = {}) { - super(ActionType.Unk10100, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface CancelForceParams { /** - * The shape of the volume. - * - * Each shape has different fields controlling the size of the volume: - * | Shape | Fields | Origin | - * |-|-|-| - * | {@link ForceVolumeShape.Boundless Boundless} | *n/a* | *n/a* | - * | {@link ForceVolumeShape.Sphere Sphere} | {@link sphereRadius} | Center of the sphere | - * | {@link ForceVolumeShape.Box Box} | {@link boxSize} | Center of the box | - * | {@link ForceVolumeShape.Cylinder Cylinder} | {@link cylinderHeight}, {@link cylinderRadius} | Center of the cylinder | - * | {@link ForceVolumeShape.SquarePrism SquarePrism} | {@link squarePrismHeight}, {@link squarePrismApothem} | Center of the base of the prism | + * Unknown integer. * - * **Default**: {@link ForceVolumeShape.Sphere} + * **Default**: `0` */ - shape?: ForceVolumeShape + unk_ds3_f1_49: number /** - * The radius of the {@link ForceVolumeShape.Sphere sphere} volume. - * - * **Default**: `10` + * Unknown integer. * - * See also: - * - {@link shape} + * **Default**: `0` */ - sphereRadius?: number + unk_ds3_f1_50: number /** - * The size of the {@link ForceVolumeShape.Box box} volume. - * - * **Default**: `[0, 0, 0]` + * Unknown integer. * - * See also: - * - {@link shape} + * **Default**: `0` */ - boxSize?: Vector3 + unk_ds3_f1_51: number /** - * The height of the {@link ForceVolumeShape.Cylinder cylinder} volume. + * Unknown integer. * * **Default**: `0` - * - * See also: - * - {@link shape} - * - {@link cylinderRadius} */ - cylinderHeight?: number + unk_ds3_f1_52: number /** - * The radius of the {@link ForceVolumeShape.Cylinder cylinder} volume. + * Unknown integer. * * **Default**: `0` - * - * See also: - * - {@link shape} - * - {@link cylinderHeight} */ - cylinderRadius?: number + unk_ds3_f1_53: number /** - * The height of the {@link ForceVolumeShape.SquarePrism square prism} volume. + * Unknown integer. * * **Default**: `0` - * - * See also: - * - {@link shape} - * - {@link squarePrismApothem} */ - squarePrismHeight?: number + unk_ds3_f1_54: number /** - * The apothem of the {@link ForceVolumeShape.SquarePrism square prism} volume. + * Unknown integer. * * **Default**: `0` - * - * See also: - * - {@link shape} - * - {@link squarePrismHeight} */ - squarePrismApothem?: number + unk_ds3_f1_55: number + constructor(props: Partial> = {}) { + super(ActionType.Unk10100, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** @@ -37420,11 +29036,15 @@ class CancelForce extends DataAction { * | {@link ForceVolumeShape.Box Box} | {@link boxSize} | Center of the box | * | {@link ForceVolumeShape.Cylinder Cylinder} | {@link cylinderHeight}, {@link cylinderRadius} | Center of the cylinder | * | {@link ForceVolumeShape.SquarePrism SquarePrism} | {@link squarePrismHeight}, {@link squarePrismApothem} | Center of the base of the prism | + * + * **Default**: {@link ForceVolumeShape.Sphere} */ shape: ForceVolumeShape /** * The radius of the {@link ForceVolumeShape.Sphere sphere} volume. * + * **Default**: `10` + * * See also: * - {@link shape} */ @@ -37432,6 +29052,8 @@ class CancelForce extends DataAction { /** * The size of the {@link ForceVolumeShape.Box box} volume. * + * **Default**: `[0, 0, 0]` + * * See also: * - {@link shape} */ @@ -37439,6 +29061,8 @@ class CancelForce extends DataAction { /** * The height of the {@link ForceVolumeShape.Cylinder cylinder} volume. * + * **Default**: `0` + * * See also: * - {@link shape} * - {@link cylinderRadius} @@ -37447,6 +29071,8 @@ class CancelForce extends DataAction { /** * The radius of the {@link ForceVolumeShape.Cylinder cylinder} volume. * + * **Default**: `0` + * * See also: * - {@link shape} * - {@link cylinderHeight} @@ -37455,6 +29081,8 @@ class CancelForce extends DataAction { /** * The height of the {@link ForceVolumeShape.SquarePrism square prism} volume. * + * **Default**: `0` + * * See also: * - {@link shape} * - {@link squarePrismApothem} @@ -37463,18 +29091,30 @@ class CancelForce extends DataAction { /** * The apothem of the {@link ForceVolumeShape.SquarePrism square prism} volume. * + * **Default**: `0` + * * See also: * - {@link shape} * - {@link squarePrismHeight} */ squarePrismApothem: number - constructor(props: CancelForceParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.CancelForce, {isAppearance:true,isParticle:false}) this.assign(props) } } -export interface WindForceParams { +/** + * ### {@link ActionType.WindForce Action 10300 - WindForce} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * Creates a directional force in a volume, which is most often useful for creating wind effects. The direction of the force is based on the direction of the node. + * + * The name of this action is based on Elden Ring's RTTI, where it's called "ForceFieldWindArea". + */ +class WindForce extends DataAction { + declare readonly type: ActionType.WindForce + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * The strength of the force applied in the volume. * @@ -37487,7 +29127,7 @@ export interface WindForceParams { * - {@link forceRandomMultiplierMax} * - {@link forceMultiplier} */ - force?: ScalarValue + force: ScalarValue /** * The shape of the volume. * @@ -37502,7 +29142,7 @@ export interface WindForceParams { * * **Default**: {@link ForceVolumeShape.Sphere} */ - shape?: ForceVolumeShape + shape: ForceVolumeShape /** * The radius of the {@link ForceVolumeShape.Sphere sphere} where the force is active. * @@ -37511,7 +29151,7 @@ export interface WindForceParams { * See also: * - {@link shape} */ - sphereRadius?: number + sphereRadius: number /** * The size of the {@link ForceVolumeShape.Box box} where the force is active. * @@ -37520,7 +29160,7 @@ export interface WindForceParams { * See also: * - {@link shape} */ - boxSize?: Vector3 + boxSize: Vector3 /** * The height of the {@link ForceVolumeShape.Cylinder cylinder} where the force is active. * @@ -37530,7 +29170,7 @@ export interface WindForceParams { * - {@link shape} * - {@link cylinderRadius} */ - cylinderHeight?: number + cylinderHeight: number /** * The radius of the {@link ForceVolumeShape.Cylinder cylinder} where the force is active. * @@ -37540,7 +29180,7 @@ export interface WindForceParams { * - {@link shape} * - {@link cylinderHeight} */ - cylinderRadius?: number + cylinderRadius: number /** * The height of the {@link ForceVolumeShape.SquarePrism square prism} where the force is active. * @@ -37550,7 +29190,7 @@ export interface WindForceParams { * - {@link shape} * - {@link squarePrismApothem} */ - squarePrismHeight?: number + squarePrismHeight: number /** * The apothem of the {@link ForceVolumeShape.SquarePrism square prism} where the force is active. * @@ -37560,139 +29200,139 @@ export interface WindForceParams { * - {@link shape} * - {@link squarePrismHeight} */ - squarePrismApothem?: number + squarePrismApothem: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_9?: number + unk_ds3_f1_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_10?: number + unk_ds3_f1_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_11?: number + unk_ds3_f1_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_12?: number + unk_ds3_f1_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_13?: number + unk_ds3_f1_13: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_14?: number + unk_ds3_f1_14: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_15?: number + unk_ds3_f1_15: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_16?: number + unk_ds3_f1_16: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_17?: number + unk_ds3_f1_17: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_18?: number + unk_ds3_f1_18: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_19?: number + unk_ds3_f1_19: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_20?: number + unk_ds3_f1_20: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_21?: number + unk_ds3_f1_21: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_22?: number + unk_ds3_f1_22: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_23?: number + unk_ds3_f1_23: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_24?: number + unk_ds3_f1_24: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_25?: number + unk_ds3_f1_25: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_26?: number + unk_ds3_f1_26: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_27?: number + unk_ds3_f1_27: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_28?: number + unk_ds3_f1_28: number /** * Unknown integer. * * **Default**: `30` */ - unk_ds3_f1_29?: number + unk_ds3_f1_29: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_30?: number + unk_ds3_f1_30: number /** * When this is set to 0, the wind will be able to affect sfx, including the one with this action. When it's set to 1, it seems to only affect non-sfx things, like plants and trees. * @@ -37702,43 +29342,43 @@ export interface WindForceParams { * * **Default**: `0` */ - unk_ds3_f1_31?: number + unk_ds3_f1_31: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_32?: number + unk_ds3_f1_32: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_33?: number + unk_ds3_f1_33: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_34?: number + unk_ds3_f1_34: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_35?: number + unk_ds3_f1_35: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_36?: number + unk_ds3_f1_36: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_37?: number + unk_ds3_f1_37: number /** * The minimum random multiplier for {@link force}. This multiplier will randomly change to different values in the range defined by this and {@link forceRandomMultiplierMax}. * @@ -37751,7 +29391,7 @@ export interface WindForceParams { * - {@link forceRandomMultiplierMax} * - {@link forceMultiplier} */ - forceRandomMultiplierMin?: number + forceRandomMultiplierMin: number /** * The maximum random multiplier for {@link force}. This multiplier will randomly change to different values in the range defined by this and {@link forceRandomMultiplierMin}. * @@ -37764,37 +29404,37 @@ export interface WindForceParams { * - {@link forceRandomMultiplierMin} * - {@link forceMultiplier} */ - forceRandomMultiplierMax?: number + forceRandomMultiplierMax: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_40?: number + unk_ds3_f1_40: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_41?: number + unk_ds3_f1_41: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_42?: number + unk_ds3_f1_42: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_44?: number + unk_ds3_f1_44: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_45?: number + unk_ds3_f1_45: number /** * A multiplier for {@link force}. * @@ -37807,286 +29447,120 @@ export interface WindForceParams { * - {@link forceRandomMultiplierMin} * - {@link forceRandomMultiplierMax} */ - forceMultiplier?: number + forceMultiplier: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_47?: number + unk_ds3_f1_47: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_48?: number + unk_ds3_f1_48: number /** * Unknown float. * * **Default**: `1` */ - unk_sdt_f1_48?: number + unk_sdt_f1_48: number /** * Unknown float. * * **Default**: `1` */ - unk_sdt_f1_49?: number + unk_sdt_f1_49: number /** * Unknown float. * * **Default**: `1` */ - unk_sdt_f1_50?: number + unk_sdt_f1_50: number /** * Unknown float. * * **Default**: `0` */ - unk_sdt_f1_51?: number + unk_sdt_f1_51: number /** * Unknown float. * * **Default**: `0` */ - unk_sdt_f1_52?: number + unk_sdt_f1_52: number /** * The time it takes for the force to fade out after the action has deactivated in seconds. Due to the way this value is stored, the time will be rounded to the nearest 1/30s. * * **Default**: `0` */ - fadeOutTime?: number + fadeOutTime: number /** * Unknown float. * * **Default**: `0` */ - unk_sdt_f1_54?: number + unk_sdt_f1_54: number /** * Unknown float. * * **Default**: `0` */ - unk_sdt_f1_55?: number + unk_sdt_f1_55: number /** * Unknown float. * * **Default**: `1` */ - unk_sdt_f1_56?: number + unk_sdt_f1_56: number /** * Unknown float. * * **Default**: `1` */ - unk_sdt_f1_57?: number + unk_sdt_f1_57: number /** * Unknown float. * * **Default**: `1` */ - unk_sdt_f1_58?: number + unk_sdt_f1_58: number /** * Unknown float. * * **Default**: `10` */ - unk_ds3_f1_49?: number + unk_ds3_f1_49: number /** * Unknown float. * * **Default**: `60` */ - unk_ds3_f1_50?: number + unk_ds3_f1_50: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_43?: number + unk_ds3_f1_43: number + constructor(props: Partial> = {}) { + super(ActionType.WindForce, {isAppearance:true,isParticle:false}) + this.assign(props) + } } /** - * ### {@link ActionType.WindForce Action 10300 - WindForce} + * ### {@link ActionType.GravityForce Action 10301 - GravityForce} * **Slot**: {@link ActionSlots.AppearanceAction Appearance} * - * Creates a directional force in a volume, which is most often useful for creating wind effects. The direction of the force is based on the direction of the node. + * Creates a radial force in a volume. This pulls things towards itself, or pushes away if the force is negative. * - * The name of this action is based on Elden Ring's RTTI, where it's called "ForceFieldWindArea". + * The name of this action is based on Elden Ring's RTTI, where it's called "ForceFieldGravityArea". */ -class WindForce extends DataAction { - declare readonly type: ActionType.WindForce +class GravityForce extends DataAction { + declare readonly type: ActionType.GravityForce declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} - /** - * The strength of the force applied in the volume. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link forceRandomMultiplierMin} - * - {@link forceRandomMultiplierMax} - * - {@link forceMultiplier} - */ - force: ScalarValue - /** - * The shape of the volume. - * - * Each shape has different fields controlling the size of the volume: - * | Shape | Fields | Origin | - * |-|-|-| - * | {@link ForceVolumeShape.Boundless Boundless} | *n/a* | *n/a* | - * | {@link ForceVolumeShape.Sphere Sphere} | {@link sphereRadius} | Center of the sphere | - * | {@link ForceVolumeShape.Box Box} | {@link boxSize} | Center of the box | - * | {@link ForceVolumeShape.Cylinder Cylinder} | {@link cylinderHeight}, {@link cylinderRadius} | Center of the cylinder | - * | {@link ForceVolumeShape.SquarePrism SquarePrism} | {@link squarePrismHeight}, {@link squarePrismApothem} | Center of the base of the prism | - */ - shape: ForceVolumeShape - /** - * The radius of the {@link ForceVolumeShape.Sphere sphere} where the force is active. - * - * See also: - * - {@link shape} - */ - sphereRadius: number - /** - * The size of the {@link ForceVolumeShape.Box box} where the force is active. - * - * See also: - * - {@link shape} - */ - boxSize: Vector3 - /** - * The height of the {@link ForceVolumeShape.Cylinder cylinder} where the force is active. - * - * See also: - * - {@link shape} - * - {@link cylinderRadius} - */ - cylinderHeight: number - /** - * The radius of the {@link ForceVolumeShape.Cylinder cylinder} where the force is active. - * - * See also: - * - {@link shape} - * - {@link cylinderHeight} - */ - cylinderRadius: number - /** - * The height of the {@link ForceVolumeShape.SquarePrism square prism} where the force is active. - * - * See also: - * - {@link shape} - * - {@link squarePrismApothem} - */ - squarePrismHeight: number - /** - * The apothem of the {@link ForceVolumeShape.SquarePrism square prism} where the force is active. - * - * See also: - * - {@link shape} - * - {@link squarePrismHeight} - */ - squarePrismApothem: number - unk_ds3_f1_9: number - unk_ds3_f1_10: number - unk_ds3_f1_11: number - unk_ds3_f1_12: number - unk_ds3_f1_13: number - unk_ds3_f1_14: number - unk_ds3_f1_15: number - unk_ds3_f1_16: number - unk_ds3_f1_17: number - unk_ds3_f1_18: number - unk_ds3_f1_19: number - unk_ds3_f1_20: number - unk_ds3_f1_21: number - unk_ds3_f1_22: number - unk_ds3_f1_23: number - unk_ds3_f1_24: number - unk_ds3_f1_25: number - unk_ds3_f1_26: number - unk_ds3_f1_27: number - unk_ds3_f1_28: number - unk_ds3_f1_29: number - unk_ds3_f1_30: number - /** - * When this is set to 0, the wind will be able to affect sfx, including the one with this action. When it's set to 1, it seems to only affect non-sfx things, like plants and trees. - * - * The way non-sfx are affected by the wind seems to also change a bit between values 0 and 1, but exactly how is unknown. - * - * In DS3 and Sekiro, some effects have this set to 2, so it is not just a boolean. What 2 does is unknown. - */ - unk_ds3_f1_31: number - unk_ds3_f1_32: number - unk_ds3_f1_33: number - unk_ds3_f1_34: number - unk_ds3_f1_35: number - unk_ds3_f1_36: number - unk_ds3_f1_37: number - /** - * The minimum random multiplier for {@link force}. This multiplier will randomly change to different values in the range defined by this and {@link forceRandomMultiplierMax}. - * - * This is multiplicative with both the base force and the {@link forceMultiplier other multiplier}. - * - * See also: - * - {@link force} - * - {@link forceRandomMultiplierMax} - * - {@link forceMultiplier} - */ - forceRandomMultiplierMin: number - /** - * The maximum random multiplier for {@link force}. This multiplier will randomly change to different values in the range defined by this and {@link forceRandomMultiplierMin}. - * - * This is multiplicative with both the base force and the {@link forceMultiplier other multiplier}. - * - * See also: - * - {@link force} - * - {@link forceRandomMultiplierMin} - * - {@link forceMultiplier} - */ - forceRandomMultiplierMax: number - unk_ds3_f1_40: number - unk_ds3_f1_41: number - unk_ds3_f1_42: number - unk_ds3_f1_44: number - unk_ds3_f1_45: number - /** - * A multiplier for {@link force}. - * - * This is multiplicative with both the base force and the random multiplier. - * - * See also: - * - {@link force} - * - {@link forceRandomMultiplierMin} - * - {@link forceRandomMultiplierMax} - */ - forceMultiplier: number - unk_ds3_f1_47: number - unk_ds3_f1_48: number - unk_sdt_f1_48: number - unk_sdt_f1_49: number - unk_sdt_f1_50: number - unk_sdt_f1_51: number - unk_sdt_f1_52: number - /** - * The time it takes for the force to fade out after the action has deactivated in seconds. Due to the way this value is stored, the time will be rounded to the nearest 1/30s. - */ - fadeOutTime: number - unk_sdt_f1_54: number - unk_sdt_f1_55: number - unk_sdt_f1_56: number - unk_sdt_f1_57: number - unk_sdt_f1_58: number - unk_ds3_f1_49: number - unk_ds3_f1_50: number - unk_ds3_f1_43: number - constructor(props: WindForceParams = {}) { - super(ActionType.WindForce, {isAppearance:true,isParticle:false}) - this.assign(props) - } -} - -export interface GravityForceParams { /** * The strength of the force applied in the volume. * @@ -38099,7 +29573,7 @@ export interface GravityForceParams { * - {@link forceRandomMultiplierMax} * - {@link forceMultiplier} */ - force?: ScalarValue + force: ScalarValue /** * The shape of the volume. * @@ -38114,7 +29588,7 @@ export interface GravityForceParams { * * **Default**: {@link ForceVolumeShape.Sphere} */ - shape?: ForceVolumeShape + shape: ForceVolumeShape /** * The radius of the {@link ForceVolumeShape.Sphere sphere} where the force is active. * @@ -38123,7 +29597,7 @@ export interface GravityForceParams { * See also: * - {@link shape} */ - sphereRadius?: number + sphereRadius: number /** * The size of the {@link ForceVolumeShape.Box box} where the force is active. * @@ -38132,7 +29606,7 @@ export interface GravityForceParams { * See also: * - {@link shape} */ - boxSize?: Vector3 + boxSize: Vector3 /** * The height of the {@link ForceVolumeShape.Cylinder cylinder} where the force is active. * @@ -38142,7 +29616,7 @@ export interface GravityForceParams { * - {@link shape} * - {@link cylinderRadius} */ - cylinderHeight?: number + cylinderHeight: number /** * The radius of the {@link ForceVolumeShape.Cylinder cylinder} where the force is active. * @@ -38152,7 +29626,7 @@ export interface GravityForceParams { * - {@link shape} * - {@link cylinderHeight} */ - cylinderRadius?: number + cylinderRadius: number /** * The height of the {@link ForceVolumeShape.SquarePrism square prism} where the force is active. * @@ -38162,7 +29636,7 @@ export interface GravityForceParams { * - {@link shape} * - {@link squarePrismApothem} */ - squarePrismHeight?: number + squarePrismHeight: number /** * The apothem of the {@link ForceVolumeShape.SquarePrism square prism} where the force is active. * @@ -38172,121 +29646,121 @@ export interface GravityForceParams { * - {@link shape} * - {@link squarePrismHeight} */ - squarePrismApothem?: number + squarePrismApothem: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_9?: number + unk_ds3_f1_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_10?: number + unk_ds3_f1_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_11?: number + unk_ds3_f1_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_12?: number + unk_ds3_f1_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_13?: number + unk_ds3_f1_13: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_14?: number + unk_ds3_f1_14: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_15?: number + unk_ds3_f1_15: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_16?: number + unk_ds3_f1_16: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_17?: number + unk_ds3_f1_17: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_18?: number + unk_ds3_f1_18: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_19?: number + unk_ds3_f1_19: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_20?: number + unk_ds3_f1_20: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_21?: number + unk_ds3_f1_21: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_22?: number + unk_ds3_f1_22: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_23?: number + unk_ds3_f1_23: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_24?: number + unk_ds3_f1_24: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_25?: number + unk_ds3_f1_25: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_26?: number + unk_ds3_f1_26: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_27?: number + unk_ds3_f1_27: number /** * The minimum "random" multiplier for {@link force}. This looks very similar to the same set of fields in the {@link ActionType.WindForce WindForce action}, but this one doesn't seem to actually be random. It seems more like it will always just be the average of this and {@link forceRandomMultiplierMax}. * @@ -38299,7 +29773,7 @@ export interface GravityForceParams { * - {@link forceRandomMultiplierMax} * - {@link forceMultiplier} */ - forceRandomMultiplierMin?: number + forceRandomMultiplierMin: number /** * The maximum "random" multiplier for {@link force}. This looks very similar to the same set of fields in the {@link ActionType.WindForce WindForce action}, but this one doesn't seem to actually be random. It seems more like it will always just be the average of this and {@link forceRandomMultiplierMin}. * @@ -38312,37 +29786,37 @@ export interface GravityForceParams { * - {@link forceRandomMultiplierMin} * - {@link forceMultiplier} */ - forceRandomMultiplierMax?: number + forceRandomMultiplierMax: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_30?: number + unk_ds3_f1_30: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_31?: number + unk_ds3_f1_31: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_32?: number + unk_ds3_f1_32: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_33?: number + unk_ds3_f1_33: number /** * Unknown integer. * * **Default**: `3` */ - unk_ds3_f1_34?: number + unk_ds3_f1_34: number /** * A multiplier for {@link force}. * @@ -38355,234 +29829,31 @@ export interface GravityForceParams { * - {@link forceRandomMultiplierMin} * - {@link forceRandomMultiplierMax} */ - forceMultiplier?: number + forceMultiplier: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_36?: number + unk_ds3_f1_36: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_37?: number + unk_ds3_f1_37: number /** * The time it takes for the force to fade out after the action has deactivated in seconds. Due to the way this value is stored, the time will be rounded to the nearest 1/30s. * * **Default**: `0` */ - fadeOutTime?: number -} - -/** - * ### {@link ActionType.GravityForce Action 10301 - GravityForce} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * Creates a radial force in a volume. This pulls things towards itself, or pushes away if the force is negative. - * - * The name of this action is based on Elden Ring's RTTI, where it's called "ForceFieldGravityArea". - */ -class GravityForce extends DataAction { - declare readonly type: ActionType.GravityForce - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} - /** - * The strength of the force applied in the volume. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link forceRandomMultiplierMin} - * - {@link forceRandomMultiplierMax} - * - {@link forceMultiplier} - */ - force: ScalarValue - /** - * The shape of the volume. - * - * Each shape has different fields controlling the size of the volume, and they also change where it scales from and what point things are being pulled towards: - * | Shape | Fields | Origin | Center of mass | - * |-|-|-|-| - * | {@link ForceVolumeShape.Boundless Boundless} | *n/a* | *n/a* | Node position | - * | {@link ForceVolumeShape.Sphere Sphere} | {@link sphereRadius} | Center of the sphere | Center of the sphere | - * | {@link ForceVolumeShape.Box Box} | {@link boxSize} | Center of the box | Center of the box | - * | {@link ForceVolumeShape.Cylinder Cylinder} | {@link cylinderHeight}, {@link cylinderRadius} | Slightly +Z of the center of the cylinder? | Slightly +Z of the origin? | - * | {@link ForceVolumeShape.SquarePrism SquarePrism} | {@link squarePrismHeight}, {@link squarePrismApothem} | Center of the base of the prism | Center of the prism | - */ - shape: ForceVolumeShape - /** - * The radius of the {@link ForceVolumeShape.Sphere sphere} where the force is active. - * - * See also: - * - {@link shape} - */ - sphereRadius: number - /** - * The size of the {@link ForceVolumeShape.Box box} where the force is active. - * - * See also: - * - {@link shape} - */ - boxSize: Vector3 - /** - * The height of the {@link ForceVolumeShape.Cylinder cylinder} where the force is active. - * - * See also: - * - {@link shape} - * - {@link cylinderRadius} - */ - cylinderHeight: number - /** - * The radius of the {@link ForceVolumeShape.Cylinder cylinder} where the force is active. - * - * See also: - * - {@link shape} - * - {@link cylinderHeight} - */ - cylinderRadius: number - /** - * The height of the {@link ForceVolumeShape.SquarePrism square prism} where the force is active. - * - * See also: - * - {@link shape} - * - {@link squarePrismApothem} - */ - squarePrismHeight: number - /** - * The apothem of the {@link ForceVolumeShape.SquarePrism square prism} where the force is active. - * - * See also: - * - {@link shape} - * - {@link squarePrismHeight} - */ - squarePrismApothem: number - unk_ds3_f1_9: number - unk_ds3_f1_10: number - unk_ds3_f1_11: number - unk_ds3_f1_12: number - unk_ds3_f1_13: number - unk_ds3_f1_14: number - unk_ds3_f1_15: number - unk_ds3_f1_16: number - unk_ds3_f1_17: number - unk_ds3_f1_18: number - unk_ds3_f1_19: number - unk_ds3_f1_20: number - unk_ds3_f1_21: number - unk_ds3_f1_22: number - unk_ds3_f1_23: number - unk_ds3_f1_24: number - unk_ds3_f1_25: number - unk_ds3_f1_26: number - unk_ds3_f1_27: number - /** - * The minimum "random" multiplier for {@link force}. This looks very similar to the same set of fields in the {@link ActionType.WindForce WindForce action}, but this one doesn't seem to actually be random. It seems more like it will always just be the average of this and {@link forceRandomMultiplierMax}. - * - * This is multiplicative with both the base force and the {@link forceMultiplier other multiplier}. - * - * See also: - * - {@link force} - * - {@link forceRandomMultiplierMax} - * - {@link forceMultiplier} - */ - forceRandomMultiplierMin: number - /** - * The maximum "random" multiplier for {@link force}. This looks very similar to the same set of fields in the {@link ActionType.WindForce WindForce action}, but this one doesn't seem to actually be random. It seems more like it will always just be the average of this and {@link forceRandomMultiplierMin}. - * - * This is multiplicative with both the base force and the {@link forceMultiplier other multiplier}. - * - * See also: - * - {@link force} - * - {@link forceRandomMultiplierMin} - * - {@link forceMultiplier} - */ - forceRandomMultiplierMax: number - unk_ds3_f1_30: number - unk_ds3_f1_31: number - unk_ds3_f1_32: number - unk_ds3_f1_33: number - unk_ds3_f1_34: number - /** - * A multiplier for {@link force}. - * - * This is multiplicative with both the base force and the "random" multiplier. - * - * See also: - * - {@link force} - * - {@link forceRandomMultiplierMin} - * - {@link forceRandomMultiplierMax} - */ - forceMultiplier: number - unk_ds3_f1_36: number - unk_ds3_f1_37: number - /** - * The time it takes for the force to fade out after the action has deactivated in seconds. Due to the way this value is stored, the time will be rounded to the nearest 1/30s. - */ fadeOutTime: number - constructor(props: GravityForceParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.GravityForce, {isAppearance:true,isParticle:false}) this.assign(props) } } -export interface ForceCollisionParams { - /** - * The shape of the volume. - * - * Each shape has different fields controlling the size of the volume: - * | Shape | Fields | - * |-|-| - * | {@link ForceVolumeShape.Boundless Boundless} | *n/a* | - * | {@link ForceVolumeShape.Sphere Sphere} | {@link sphereRadius} | - * | {@link ForceVolumeShape.Box Box} | {@link boxSize} | - * | {@link ForceVolumeShape.Cylinder Cylinder} | {@link cylinderHeight}, {@link cylinderRadius} | - * - * **Note**: The {@link ForceVolumeShape.SquarePrism SquarePrism} shape is not valid for this action. - * - * **Default**: {@link ForceVolumeShape.Sphere} - */ - shape?: ForceVolumeShape - /** - * The radius of the {@link ForceVolumeShape.Sphere sphere} volume. - * - * **Default**: `10` - * - * See also: - * - {@link shape} - */ - sphereRadius?: number - /** - * The size of the {@link ForceVolumeShape.Box box} volume. - * - * **Default**: `[0, 0, 0]` - * - * See also: - * - {@link shape} - */ - boxSize?: Vector3 - /** - * The height of the {@link ForceVolumeShape.Cylinder cylinder} volume. - * - * **Default**: `0` - * - * See also: - * - {@link shape} - * - {@link cylinderRadius} - */ - cylinderHeight?: number - /** - * The radius of the {@link ForceVolumeShape.Cylinder cylinder} volume. - * - * **Default**: `0` - * - * See also: - * - {@link shape} - * - {@link cylinderHeight} - */ - cylinderRadius?: number -} - /** * ### {@link ActionType.ForceCollision Action 10302 - ForceCollision} * **Slot**: {@link ActionSlots.AppearanceAction Appearance} @@ -38606,11 +29877,15 @@ class ForceCollision extends DataAction { * | {@link ForceVolumeShape.Cylinder Cylinder} | {@link cylinderHeight}, {@link cylinderRadius} | * * **Note**: The {@link ForceVolumeShape.SquarePrism SquarePrism} shape is not valid for this action. + * + * **Default**: {@link ForceVolumeShape.Sphere} */ shape: ForceVolumeShape /** * The radius of the {@link ForceVolumeShape.Sphere sphere} volume. * + * **Default**: `10` + * * See also: * - {@link shape} */ @@ -38618,6 +29893,8 @@ class ForceCollision extends DataAction { /** * The size of the {@link ForceVolumeShape.Box box} volume. * + * **Default**: `[0, 0, 0]` + * * See also: * - {@link shape} */ @@ -38625,6 +29902,8 @@ class ForceCollision extends DataAction { /** * The height of the {@link ForceVolumeShape.Cylinder cylinder} volume. * + * **Default**: `0` + * * See also: * - {@link shape} * - {@link cylinderRadius} @@ -38633,18 +29912,30 @@ class ForceCollision extends DataAction { /** * The radius of the {@link ForceVolumeShape.Cylinder cylinder} volume. * + * **Default**: `0` + * * See also: * - {@link shape} * - {@link cylinderHeight} */ cylinderRadius: number - constructor(props: ForceCollisionParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.ForceCollision, {isAppearance:true,isParticle:false}) this.assign(props) } } -export interface TurbulenceForceParams { +/** + * ### {@link ActionType.TurbulenceForce Action 10303 - TurbulenceForce} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * Creates a chaotic force in a volume. + * + * The name of this action is based on Elden Ring's RTTI, where it's called "ForceFieldTurbulenceArea". + */ +class TurbulenceForce extends DataAction { + declare readonly type: ActionType.TurbulenceForce + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * Offset along the X-axis for the 3D noise used to control the strength and direction of the force in the volume. * @@ -38656,7 +29947,7 @@ export interface TurbulenceForceParams { * - {@link noiseOffsetY} * - {@link noiseOffsetZ} */ - noiseOffsetX?: ScalarValue + noiseOffsetX: ScalarValue /** * Offset along the Y-axis for the 3D noise used to control the strength and direction of the force in the volume. * @@ -38668,7 +29959,7 @@ export interface TurbulenceForceParams { * - {@link noiseOffsetX} * - {@link noiseOffsetZ} */ - noiseOffsetY?: ScalarValue + noiseOffsetY: ScalarValue /** * Offset along the Z-axis for the 3D noise used to control the strength and direction of the force in the volume. * @@ -38680,7 +29971,7 @@ export interface TurbulenceForceParams { * - {@link noiseOffsetX} * - {@link noiseOffsetY} */ - noiseOffsetZ?: ScalarValue + noiseOffsetZ: ScalarValue /** * The strength of the force applied in the volume. * @@ -38692,7 +29983,7 @@ export interface TurbulenceForceParams { * - {@link forceRandomMultiplierMin} * - {@link forceRandomMultiplierMax} */ - force?: ScalarValue + force: ScalarValue /** * The shape of the volume. * @@ -38707,7 +29998,7 @@ export interface TurbulenceForceParams { * * **Default**: {@link ForceVolumeShape.Sphere} */ - shape?: ForceVolumeShape + shape: ForceVolumeShape /** * The radius of the {@link ForceVolumeShape.Sphere sphere} where the force is active. * @@ -38716,7 +30007,7 @@ export interface TurbulenceForceParams { * See also: * - {@link shape} */ - sphereRadius?: number + sphereRadius: number /** * The size of the {@link ForceVolumeShape.Box box} where the force is active. * @@ -38725,7 +30016,7 @@ export interface TurbulenceForceParams { * See also: * - {@link shape} */ - boxSize?: Vector3 + boxSize: Vector3 /** * The height of the {@link ForceVolumeShape.Cylinder cylinder} where the force is active. * @@ -38735,7 +30026,7 @@ export interface TurbulenceForceParams { * - {@link shape} * - {@link cylinderRadius} */ - cylinderHeight?: number + cylinderHeight: number /** * The radius of the {@link ForceVolumeShape.Cylinder cylinder} where the force is active. * @@ -38745,7 +30036,7 @@ export interface TurbulenceForceParams { * - {@link shape} * - {@link cylinderHeight} */ - cylinderRadius?: number + cylinderRadius: number /** * The height of the {@link ForceVolumeShape.SquarePrism square prism} where the force is active. * @@ -38755,7 +30046,7 @@ export interface TurbulenceForceParams { * - {@link shape} * - {@link squarePrismApothem} */ - squarePrismHeight?: number + squarePrismHeight: number /** * The apothem of the {@link ForceVolumeShape.SquarePrism square prism} where the force is active. * @@ -38765,97 +30056,97 @@ export interface TurbulenceForceParams { * - {@link shape} * - {@link squarePrismHeight} */ - squarePrismApothem?: number + squarePrismApothem: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_9?: number + unk_unk_f1_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_10?: number + unk_unk_f1_10: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_11?: number + unk_unk_f1_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_12?: number + unk_unk_f1_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_13?: number + unk_unk_f1_13: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_14?: number + unk_unk_f1_14: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_15?: number + unk_unk_f1_15: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_16?: number + unk_unk_f1_16: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_17?: number + unk_unk_f1_17: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_18?: number + unk_unk_f1_18: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_19?: number + unk_unk_f1_19: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_20?: number + unk_unk_f1_20: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_21?: number + unk_unk_f1_21: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_22?: number + unk_unk_f1_22: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_23?: number + unk_unk_f1_23: number /** * The minimum random multiplier for {@link force}. This multiplier will randomly change to different values in the range defined by this and {@link forceRandomMultiplierMax}. * @@ -38865,7 +30156,7 @@ export interface TurbulenceForceParams { * - {@link force} * - {@link forceRandomMultiplierMax} */ - forceRandomMultiplierMin?: number + forceRandomMultiplierMin: number /** * The maximum random multiplier for {@link force}. This multiplier will randomly change to different values in the range defined by this and {@link forceRandomMultiplierMin}. * @@ -38875,25 +30166,25 @@ export interface TurbulenceForceParams { * - {@link force} * - {@link forceRandomMultiplierMin} */ - forceRandomMultiplierMax?: number + forceRandomMultiplierMax: number /** * The scale of the 3D noise used to control the strength and direction of the force in the volume. Lower values makes it more noisy, with small vortices forming everywhere. Higher values makes the noise smoother. * * **Default**: `1` */ - noiseScale?: number + noiseScale: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_27?: number + unk_unk_f1_27: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_28?: number + unk_unk_f1_28: number /** * Controls whether or not {@link softRadius} is effective. * @@ -38902,7 +30193,7 @@ export interface TurbulenceForceParams { * See also: * - {@link softRadius} */ - enableSoftRadius?: boolean + enableSoftRadius: boolean /** * The radius of a sphere where the force gets weaker with the distance from the origin. Very similar to the {@link sphereRadius sphere radius} when the {@link shape} of the volume is a sphere, but this has a smooth transition from inside the radius to the outside. * @@ -38913,802 +30204,553 @@ export interface TurbulenceForceParams { * See also: * - {@link enableSoftRadius} */ - softRadius?: number + softRadius: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_31?: number + unk_unk_f1_31: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_32?: number + unk_unk_f1_32: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_33?: number + unk_unk_f1_33: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_34?: number + unk_unk_f1_34: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_35?: number + unk_unk_f1_35: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_36?: number + unk_unk_f1_36: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_37?: number + unk_unk_f1_37: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_38?: number + unk_unk_f1_38: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_39?: number + unk_unk_f1_39: number /** * The time it takes for the force to fade out after the action has deactivated in seconds. Due to the way this value is stored, the time will be rounded to the nearest 1/30s. * * **Default**: `0` */ - fadeOutTime?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_unk_f1_41?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_unk_f1_42?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_unk_f1_43?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_unk_f1_44?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_unk_f1_45?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_unk_f1_46?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_unk_f1_47?: number + fadeOutTime: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_48?: number + unk_unk_f1_41: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_49?: number + unk_unk_f1_42: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_50?: number + unk_unk_f1_43: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_51?: number -} - -/** - * ### {@link ActionType.TurbulenceForce Action 10303 - TurbulenceForce} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * Creates a chaotic force in a volume. - * - * The name of this action is based on Elden Ring's RTTI, where it's called "ForceFieldTurbulenceArea". - */ -class TurbulenceForce extends DataAction { - declare readonly type: ActionType.TurbulenceForce - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} - /** - * Offset along the X-axis for the 3D noise used to control the strength and direction of the force in the volume. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link noiseOffsetY} - * - {@link noiseOffsetZ} - */ - noiseOffsetX: ScalarValue - /** - * Offset along the Y-axis for the 3D noise used to control the strength and direction of the force in the volume. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link noiseOffsetX} - * - {@link noiseOffsetZ} - */ - noiseOffsetY: ScalarValue - /** - * Offset along the Z-axis for the 3D noise used to control the strength and direction of the force in the volume. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link noiseOffsetX} - * - {@link noiseOffsetY} - */ - noiseOffsetZ: ScalarValue - /** - * The strength of the force applied in the volume. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link forceRandomMultiplierMin} - * - {@link forceRandomMultiplierMax} - */ - force: ScalarValue - /** - * The shape of the volume. - * - * Each shape has different fields controlling the size of the volume, and they also change where it scales from and what point things are being pulled towards: - * | Shape | Fields | Origin | - * |-|-|-| - * | {@link ForceVolumeShape.Boundless Boundless} | *n/a* | *n/a* | - * | {@link ForceVolumeShape.Sphere Sphere} | {@link sphereRadius} | Center of the sphere | - * | {@link ForceVolumeShape.Box Box} | {@link boxSize} | Center of the box | - * | {@link ForceVolumeShape.Cylinder Cylinder} | {@link cylinderHeight}, {@link cylinderRadius} | Slightly +Z of the center of the cylinder? | - * | {@link ForceVolumeShape.SquarePrism SquarePrism} | {@link squarePrismHeight}, {@link squarePrismApothem} | Center of the base of the prism | - */ - shape: ForceVolumeShape - /** - * The radius of the {@link ForceVolumeShape.Sphere sphere} where the force is active. - * - * See also: - * - {@link shape} - */ - sphereRadius: number - /** - * The size of the {@link ForceVolumeShape.Box box} where the force is active. - * - * See also: - * - {@link shape} - */ - boxSize: Vector3 - /** - * The height of the {@link ForceVolumeShape.Cylinder cylinder} where the force is active. - * - * See also: - * - {@link shape} - * - {@link cylinderRadius} - */ - cylinderHeight: number - /** - * The radius of the {@link ForceVolumeShape.Cylinder cylinder} where the force is active. - * - * See also: - * - {@link shape} - * - {@link cylinderHeight} - */ - cylinderRadius: number - /** - * The height of the {@link ForceVolumeShape.SquarePrism square prism} where the force is active. - * - * See also: - * - {@link shape} - * - {@link squarePrismApothem} - */ - squarePrismHeight: number - /** - * The apothem of the {@link ForceVolumeShape.SquarePrism square prism} where the force is active. - * - * See also: - * - {@link shape} - * - {@link squarePrismHeight} - */ - squarePrismApothem: number - unk_unk_f1_9: number - unk_unk_f1_10: number - unk_unk_f1_11: number - unk_unk_f1_12: number - unk_unk_f1_13: number - unk_unk_f1_14: number - unk_unk_f1_15: number - unk_unk_f1_16: number - unk_unk_f1_17: number - unk_unk_f1_18: number - unk_unk_f1_19: number - unk_unk_f1_20: number - unk_unk_f1_21: number - unk_unk_f1_22: number - unk_unk_f1_23: number - /** - * The minimum random multiplier for {@link force}. This multiplier will randomly change to different values in the range defined by this and {@link forceRandomMultiplierMax}. - * - * See also: - * - {@link force} - * - {@link forceRandomMultiplierMax} - */ - forceRandomMultiplierMin: number - /** - * The maximum random multiplier for {@link force}. This multiplier will randomly change to different values in the range defined by this and {@link forceRandomMultiplierMin}. - * - * See also: - * - {@link force} - * - {@link forceRandomMultiplierMin} - */ - forceRandomMultiplierMax: number - /** - * The scale of the 3D noise used to control the strength and direction of the force in the volume. Lower values makes it more noisy, with small vortices forming everywhere. Higher values makes the noise smoother. - */ - noiseScale: number - unk_unk_f1_27: number - unk_unk_f1_28: number - /** - * Controls whether or not {@link softRadius} is effective. - * - * See also: - * - {@link softRadius} - */ - enableSoftRadius: boolean - /** - * The radius of a sphere where the force gets weaker with the distance from the origin. Very similar to the {@link sphereRadius sphere radius} when the {@link shape} of the volume is a sphere, but this has a smooth transition from inside the radius to the outside. - * - * This requires {@link enableSoftRadius} to be enabled. - * - * See also: - * - {@link enableSoftRadius} - */ - softRadius: number - unk_unk_f1_31: number - unk_unk_f1_32: number - unk_unk_f1_33: number - unk_unk_f1_34: number - unk_unk_f1_35: number - unk_unk_f1_36: number - unk_unk_f1_37: number - unk_unk_f1_38: number - unk_unk_f1_39: number - /** - * The time it takes for the force to fade out after the action has deactivated in seconds. Due to the way this value is stored, the time will be rounded to the nearest 1/30s. - */ - fadeOutTime: number - unk_unk_f1_41: number - unk_unk_f1_42: number - unk_unk_f1_43: number unk_unk_f1_44: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_unk_f1_45: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_unk_f1_46: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_unk_f1_47: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_unk_f1_48: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_unk_f1_49: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_unk_f1_50: number + /** + * Unknown integer. + * + * **Default**: `0` + */ unk_unk_f1_51: number - constructor(props: TurbulenceForceParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.TurbulenceForce, {isAppearance:true,isParticle:false}) this.assign(props) } } -export interface Unk10400Params { +/** + * ### {@link ActionType.Unk10400 Action 10400 - Unk10400} + * **Slot**: {@link ActionSlots.Unknown10400Action Unknown10400} + * + * Unknown root node action. + */ +class Unk10400 extends DataAction { + declare readonly type: ActionType.Unk10400 + declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_0?: number + unk_ds3_f1_0: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_1?: number + unk_ds3_f1_1: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_2?: number + unk_ds3_f1_2: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_3?: number + unk_ds3_f1_3: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_4?: number + unk_ds3_f1_4: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_5?: number + unk_ds3_f1_5: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_6?: number + unk_ds3_f1_6: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_7?: number + unk_ds3_f1_7: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_8?: number + unk_ds3_f1_8: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_9?: number + unk_ds3_f1_9: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_10?: number + unk_ds3_f1_10: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_11?: number + unk_ds3_f1_11: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_12?: number + unk_ds3_f1_12: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_13?: number + unk_ds3_f1_13: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_14?: number + unk_ds3_f1_14: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_15?: number + unk_ds3_f1_15: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_16?: number + unk_ds3_f1_16: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_17?: number + unk_ds3_f1_17: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_18?: number + unk_ds3_f1_18: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_19?: number + unk_ds3_f1_19: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_20?: number + unk_ds3_f1_20: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_21?: number + unk_ds3_f1_21: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_22?: number + unk_ds3_f1_22: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_23?: number + unk_ds3_f1_23: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_24?: number + unk_ds3_f1_24: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_25?: number + unk_ds3_f1_25: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_26?: number + unk_ds3_f1_26: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_27?: number + unk_ds3_f1_27: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_28?: number + unk_ds3_f1_28: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_29?: number + unk_ds3_f1_29: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_30?: number + unk_ds3_f1_30: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_31?: number + unk_ds3_f1_31: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_32?: number + unk_ds3_f1_32: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_33?: number + unk_ds3_f1_33: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_34?: number + unk_ds3_f1_34: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_35?: number + unk_ds3_f1_35: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_36?: number + unk_ds3_f1_36: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_37?: number + unk_ds3_f1_37: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_38?: number + unk_ds3_f1_38: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_39?: number + unk_ds3_f1_39: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_40?: number + unk_ds3_f1_40: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_41?: number + unk_ds3_f1_41: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_42?: number + unk_ds3_f1_42: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_43?: number + unk_ds3_f1_43: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_44?: number + unk_ds3_f1_44: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_45?: number + unk_ds3_f1_45: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_46?: number + unk_ds3_f1_46: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_47?: number + unk_ds3_f1_47: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_48?: number + unk_ds3_f1_48: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_49?: number + unk_ds3_f1_49: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_50?: number + unk_ds3_f1_50: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_51?: number + unk_ds3_f1_51: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_52?: number + unk_ds3_f1_52: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_53?: number + unk_ds3_f1_53: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_54?: number + unk_ds3_f1_54: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_55?: number + unk_ds3_f1_55: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_56?: number + unk_ds3_f1_56: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_57?: number + unk_ds3_f1_57: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_58?: number + unk_ds3_f1_58: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_59?: number + unk_ds3_f1_59: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_60?: number + unk_ds3_f1_60: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_61?: number + unk_ds3_f1_61: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_62?: number + unk_ds3_f1_62: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_63?: number + unk_ds3_f1_63: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_64?: number + unk_ds3_f1_64: number + constructor(props: Partial> = {}) { + super(ActionType.Unk10400, {isAppearance:false,isParticle:false}) + this.assign(props) + } } /** - * ### {@link ActionType.Unk10400 Action 10400 - Unk10400} - * **Slot**: {@link ActionSlots.Unknown10400Action Unknown10400} + * ### {@link ActionType.Unk10500 Action 10500 - Unk10500} + * **Slot**: {@link ActionSlots.Unknown10500Action Unknown10500} * * Unknown root node action. */ -class Unk10400 extends DataAction { - declare readonly type: ActionType.Unk10400 +class Unk10500 extends DataAction { + declare readonly type: ActionType.Unk10500 declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - unk_ds3_f1_0: number - unk_ds3_f1_1: number - unk_ds3_f1_2: number - unk_ds3_f1_3: number - unk_ds3_f1_4: number - unk_ds3_f1_5: number - unk_ds3_f1_6: number - unk_ds3_f1_7: number - unk_ds3_f1_8: number - unk_ds3_f1_9: number - unk_ds3_f1_10: number - unk_ds3_f1_11: number - unk_ds3_f1_12: number - unk_ds3_f1_13: number - unk_ds3_f1_14: number - unk_ds3_f1_15: number - unk_ds3_f1_16: number - unk_ds3_f1_17: number - unk_ds3_f1_18: number - unk_ds3_f1_19: number - unk_ds3_f1_20: number - unk_ds3_f1_21: number - unk_ds3_f1_22: number - unk_ds3_f1_23: number - unk_ds3_f1_24: number - unk_ds3_f1_25: number - unk_ds3_f1_26: number - unk_ds3_f1_27: number - unk_ds3_f1_28: number - unk_ds3_f1_29: number - unk_ds3_f1_30: number - unk_ds3_f1_31: number - unk_ds3_f1_32: number - unk_ds3_f1_33: number - unk_ds3_f1_34: number - unk_ds3_f1_35: number - unk_ds3_f1_36: number - unk_ds3_f1_37: number - unk_ds3_f1_38: number - unk_ds3_f1_39: number - unk_ds3_f1_40: number - unk_ds3_f1_41: number - unk_ds3_f1_42: number - unk_ds3_f1_43: number - unk_ds3_f1_44: number - unk_ds3_f1_45: number - unk_ds3_f1_46: number - unk_ds3_f1_47: number - unk_ds3_f1_48: number - unk_ds3_f1_49: number - unk_ds3_f1_50: number - unk_ds3_f1_51: number - unk_ds3_f1_52: number - unk_ds3_f1_53: number - unk_ds3_f1_54: number - unk_ds3_f1_55: number - unk_ds3_f1_56: number - unk_ds3_f1_57: number - unk_ds3_f1_58: number - unk_ds3_f1_59: number - unk_ds3_f1_60: number - unk_ds3_f1_61: number - unk_ds3_f1_62: number - unk_ds3_f1_63: number - unk_ds3_f1_64: number - constructor(props: Unk10400Params = {}) { - super(ActionType.Unk10400, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface Unk10500Params { /** * Controls how fast time passes for the entire effect. * @@ -39716,49 +30758,49 @@ export interface Unk10500Params { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - rateOfTime?: ScalarValue + rateOfTime: ScalarValue /** * When enabled, this limits visibility of nodes outside of the distance defined by {@link maxViewDistance}. * * **Default**: `false` */ - limitViewDistance?: boolean + limitViewDistance: boolean /** * All nodes that are farther away from the camera than this will not be visible. This restriction requires {@link limitViewDistance} to be enabled. * * **Default**: `0` */ - maxViewDistance?: number + maxViewDistance: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_2?: number + unk_ds3_f1_2: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_3?: number + unk_ds3_f1_3: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_4?: number + unk_ds3_f1_4: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_5?: number + unk_ds3_f1_5: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_6?: number + unk_ds3_f1_6: number /** * The game will simulate playing the effect for this amount of time in seconds before actually displaying the effect. This does not mean that it will delay displaying the effect, just that the effect will start as if it had already been playing for this time, kind of like skipping ahead in the animation. This doesn't affect everything in the effect, and a list of things affected has not been made, but it does affect periodic emitters at least. * @@ -39768,66 +30810,34 @@ export interface Unk10500Params { * * **Default**: `0` */ - initialSimulationTime?: number + initialSimulationTime: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_8?: number + unk_ds3_f1_8: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f1_9?: number -} - -/** - * ### {@link ActionType.Unk10500 Action 10500 - Unk10500} - * **Slot**: {@link ActionSlots.Unknown10500Action Unknown10500} - * - * Unknown root node action. - */ -class Unk10500 extends DataAction { - declare readonly type: ActionType.Unk10500 - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * Controls how fast time passes for the entire effect. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - rateOfTime: ScalarValue - /** - * When enabled, this limits visibility of nodes outside of the distance defined by {@link maxViewDistance}. - */ - limitViewDistance: boolean - /** - * All nodes that are farther away from the camera than this will not be visible. This restriction requires {@link limitViewDistance} to be enabled. - */ - maxViewDistance: number - unk_ds3_f1_2: number - unk_ds3_f1_3: number - unk_ds3_f1_4: number - unk_ds3_f1_5: number - unk_ds3_f1_6: number - /** - * The game will simulate playing the effect for this amount of time in seconds before actually displaying the effect. This does not mean that it will delay displaying the effect, just that the effect will start as if it had already been playing for this time, kind of like skipping ahead in the animation. This doesn't affect everything in the effect, and a list of things affected has not been made, but it does affect periodic emitters at least. - * - * Setting this to very high values can cause noticeable stutters in the game when the effect is spawned due to it having to simulate playing the effect for so long. - * - * In Dark Souls 3, Sekiro, and Elden Ring, this value will be rounded to the nearest 1/30s due to how it is stored in the file format. It is stored differently in Armored Core 6, and so no rounding will happen for that. - */ - initialSimulationTime: number - unk_ds3_f1_8: number unk_sdt_f1_9: number - constructor(props: Unk10500Params = {}) { + constructor(props: Partial> = {}) { super(ActionType.Unk10500, {isAppearance:false,isParticle:false}) this.assign(props) } } -export interface SpotLightParams { +/** + * ### {@link ActionType.SpotLight Action 11000 - SpotLight} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} + * + * Light source with an elliptic cone shape, a spot light. + */ +class SpotLight extends DataAction { + declare readonly type: ActionType.SpotLight + declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * Controls the diffuse color of the light. * @@ -39839,7 +30849,7 @@ export interface SpotLightParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - diffuseColor?: Vector4Value + diffuseColor: Vector4Value /** * Controls the specular color of the light. * @@ -39851,7 +30861,7 @@ export interface SpotLightParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - specularColor?: Vector4Value + specularColor: Vector4Value /** * A scalar multiplier for the {@link diffuseColor diffuse color}. Good for easily adjusting the brightness of the light without changing the color. * @@ -39861,7 +30871,7 @@ export interface SpotLightParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - diffuseMultiplier?: ScalarValue + diffuseMultiplier: ScalarValue /** * A scalar multiplier for the {@link specularColor specular color}. * @@ -39871,7 +30881,7 @@ export interface SpotLightParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - specularMultiplier?: ScalarValue + specularMultiplier: ScalarValue /** * Controls where the light starts in the cone. It bascially "slices off" the tip of the cone. If set to 0, it acts as if it is set to 0.5. * @@ -39879,7 +30889,7 @@ export interface SpotLightParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - near?: ScalarValue + near: ScalarValue /** * Controls how far away the base of the cone is from the light source. * @@ -39887,7 +30897,7 @@ export interface SpotLightParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - far?: ScalarValue + far: ScalarValue /** * The X radius for the elliptic base of the cone. * @@ -39895,7 +30905,7 @@ export interface SpotLightParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - radiusX?: ScalarValue + radiusX: ScalarValue /** * The Y radius for the elliptic base of the cone. * @@ -39903,31 +30913,31 @@ export interface SpotLightParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - radiusY?: ScalarValue + radiusY: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `1` */ - unk_ds3_p1_6?: ScalarValue + unk_ds3_p1_6: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `1` */ - unk_ds3_p1_7?: ScalarValue + unk_ds3_p1_7: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `1` */ - unk_sdt_p1_10?: ScalarValue + unk_sdt_p1_10: ScalarValue /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f1_0?: number + unk_sdt_f1_0: number /** * Toggles the jitter and flicker animations for the light. * @@ -39942,7 +30952,7 @@ export interface SpotLightParams { * - {@link flickerIntervalMax} * - {@link flickerBrightness} */ - jitterAndFlicker?: boolean + jitterAndFlicker: boolean /** * Controls the acceleration of the jittering. * @@ -39954,13 +30964,13 @@ export interface SpotLightParams { * - {@link jitterY} * - {@link jitterZ} */ - jitterAcceleration?: number + jitterAcceleration: number /** * Unknown float. * * **Default**: `0` */ - unk_sdt_f1_3?: number + unk_sdt_f1_3: number /** * Controls how much the light should move around randomly on the X-axis. * @@ -39972,7 +30982,7 @@ export interface SpotLightParams { * - {@link jitterY} * - {@link jitterZ} */ - jitterX?: number + jitterX: number /** * Controls how much the light should move around randomly on the Y-axis. * @@ -39984,7 +30994,7 @@ export interface SpotLightParams { * - {@link jitterX} * - {@link jitterZ} */ - jitterY?: number + jitterY: number /** * Controls how much the light should move around randomly on the Z-axis. * @@ -39996,7 +31006,7 @@ export interface SpotLightParams { * - {@link jitterX} * - {@link jitterY} */ - jitterZ?: number + jitterZ: number /** * Controls the minimum interval for flickering. * @@ -40007,7 +31017,7 @@ export interface SpotLightParams { * - {@link flickerIntervalMax} * - {@link flickerBrightness} */ - flickerIntervalMin?: number + flickerIntervalMin: number /** * Controls the maximum interval for flickering. * @@ -40018,7 +31028,7 @@ export interface SpotLightParams { * - {@link flickerIntervalMin} * - {@link flickerBrightness} */ - flickerIntervalMax?: number + flickerIntervalMax: number /** * Brightness multiplier for the light when it flickers. * @@ -40029,7 +31039,7 @@ export interface SpotLightParams { * - {@link flickerIntervalMin} * - {@link flickerIntervalMax} */ - flickerBrightness?: number + flickerBrightness: number /** * Controls if the light should have shadows or not. * @@ -40037,7 +31047,7 @@ export interface SpotLightParams { * * **Default**: `false` */ - shadows?: boolean + shadows: boolean /** * When enabled, this allows other properties and fields of the action to control the specular color independently of the diffuse color. When disabled, the diffuse counterpart of the properties or fields will affect both the diffuse and specular color. * @@ -40049,25 +31059,25 @@ export interface SpotLightParams { * - {@link diffuseMultiplier} * - {@link specularMultiplier} */ - separateSpecular?: boolean + separateSpecular: boolean /** * Controls how dark shadows from this light source are. At 0, the shadows will be entirely invisible. * * **Default**: `1` */ - shadowDarkness?: number + shadowDarkness: number /** * Unknown integer. * * **Default**: `2` */ - unk_ds3_f1_3?: number + unk_ds3_f1_3: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_4?: number + unk_ds3_f1_4: number /** * The number of seconds the light takes to fade to nothing after being destroyed. * @@ -40075,25 +31085,25 @@ export interface SpotLightParams { * * **Default**: `0` */ - fadeOutTime?: number + fadeOutTime: number /** * Unknown integer. * * **Default**: `100` */ - unk_sdt_f1_16?: number + unk_sdt_f1_16: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f1_17?: number + unk_sdt_f1_17: number /** * Unknown float. * * **Default**: `0` */ - unk_sdt_f1_18?: number + unk_sdt_f1_18: number /** * Controls the density of some sort of fake fog in the volume hit by the light. The fog does not affect the actual light produced by the source and is not affected by shadows. * @@ -40103,19 +31113,19 @@ export interface SpotLightParams { * - {@link phaseFunction} * - {@link asymmetryParam} */ - volumeDensity?: number + volumeDensity: number /** * Unknown float. * * **Default**: `0` */ - unk_sdt_f1_20?: number + unk_sdt_f1_20: number /** * Controls whether or not {@link asymmetryParam} affects the fake fog from {@link volumeDensity}. * * **Default**: `true` */ - phaseFunction?: boolean + phaseFunction: boolean /** * Controls how the fake fog from {@link volumeDensity} scatters the light. This value is ignored if {@link phaseFunction} is disabled, and the fog will scatter the light equally in all directions. * @@ -40126,7 +31136,7 @@ export interface SpotLightParams { * * **Default**: `0.75` */ - asymmetryParam?: number + asymmetryParam: number /** * Controls the falloff exponent of the light. * @@ -40134,279 +31144,56 @@ export interface SpotLightParams { * * **Default**: `1` */ - falloffExponent?: number + falloffExponent: number /** * Unknown integer. * * **Default**: `1` */ - unk_er_f1_24?: number + unk_er_f1_24: number /** * Unknown float. * * **Default**: `1` */ - unk_er_f1_25?: number + unk_er_f1_25: number /** * Unknown integer. * * **Default**: `1` */ - unk_er_f1_26?: number + unk_er_f1_26: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f1_27?: number + unk_er_f1_27: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_0?: number + unk_ds3_f1_0: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_5?: number + unk_ds3_f1_5: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_7?: number + unk_ds3_f1_7: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_8?: number -} - -/** - * ### {@link ActionType.SpotLight Action 11000 - SpotLight} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * Light source with an elliptic cone shape, a spot light. - */ -class SpotLight extends DataAction { - declare readonly type: ActionType.SpotLight - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} - /** - * Controls the diffuse color of the light. - * - * Values in this are unrestricted and can go above 1. - * - * If {@link separateSpecular} is disabled, this also controls the specular color of the light. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - diffuseColor: Vector4Value - /** - * Controls the specular color of the light. - * - * Values in this are unrestricted and can go above 1. - * - * If {@link separateSpecular} is disabled, this property is ignored and {@link diffuseColor} controls both the diffuse as well as the specular color. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - specularColor: Vector4Value - /** - * A scalar multiplier for the {@link diffuseColor diffuse color}. Good for easily adjusting the brightness of the light without changing the color. - * - * If {@link separateSpecular} is disabled, this also affects the specular color of the light. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - diffuseMultiplier: ScalarValue - /** - * A scalar multiplier for the {@link specularColor specular color}. - * - * If {@link separateSpecular} is disabled, this property is ignored. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - specularMultiplier: ScalarValue - /** - * Controls where the light starts in the cone. It bascially "slices off" the tip of the cone. If set to 0, it acts as if it is set to 0.5. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - near: ScalarValue - /** - * Controls how far away the base of the cone is from the light source. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - far: ScalarValue - /** - * The X radius for the elliptic base of the cone. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - radiusX: ScalarValue - /** - * The Y radius for the elliptic base of the cone. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - radiusY: ScalarValue - unk_ds3_p1_6: ScalarValue - unk_ds3_p1_7: ScalarValue - unk_sdt_p1_10: ScalarValue - unk_sdt_f1_0: number - /** - * Toggles the jitter and flicker animations for the light. - * - * See also: - * - {@link jitterAcceleration} - * - {@link jitterX} - * - {@link jitterY} - * - {@link jitterZ} - * - {@link flickerIntervalMin} - * - {@link flickerIntervalMax} - * - {@link flickerBrightness} - */ - jitterAndFlicker: boolean - /** - * Controls the acceleration of the jittering. - * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterX} - * - {@link jitterY} - * - {@link jitterZ} - */ - jitterAcceleration: number - unk_sdt_f1_3: number - /** - * Controls how much the light should move around randomly on the X-axis. - * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterY} - * - {@link jitterZ} - */ - jitterX: number - /** - * Controls how much the light should move around randomly on the Y-axis. - * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterX} - * - {@link jitterZ} - */ - jitterY: number - /** - * Controls how much the light should move around randomly on the Z-axis. - * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterX} - * - {@link jitterY} - */ - jitterZ: number - /** - * Controls the minimum interval for flickering. - * - * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMax} - * - {@link flickerBrightness} - */ - flickerIntervalMin: number - /** - * Controls the maximum interval for flickering. - * - * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMin} - * - {@link flickerBrightness} - */ - flickerIntervalMax: number - /** - * Brightness multiplier for the light when it flickers. - * - * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMin} - * - {@link flickerIntervalMax} - */ - flickerBrightness: number - /** - * Controls if the light should have shadows or not. - * - * Note: Map objects also have a setting for casting shadows, and both must be enabled for an object to cast shadows from the light source. - */ - shadows: boolean - /** - * When enabled, this allows other properties and fields of the action to control the specular color independently of the diffuse color. When disabled, the diffuse counterpart of the properties or fields will affect both the diffuse and specular color. - * - * See also: - * - {@link diffuseColor} - * - {@link specularColor} - * - {@link diffuseMultiplier} - * - {@link specularMultiplier} - */ - separateSpecular: boolean - /** - * Controls how dark shadows from this light source are. At 0, the shadows will be entirely invisible. - */ - shadowDarkness: number - unk_ds3_f1_3: number - unk_ds3_f1_4: number - /** - * The number of seconds the light takes to fade to nothing after being destroyed. - * - * Due to how the field this represents works, the time will be rounded to the nearest multiple of 1/30s. - */ - fadeOutTime: number - unk_sdt_f1_16: number - unk_sdt_f1_17: number - unk_sdt_f1_18: number - /** - * Controls the density of some sort of fake fog in the volume hit by the light. The fog does not affect the actual light produced by the source and is not affected by shadows. - * - * See also: - * - {@link phaseFunction} - * - {@link asymmetryParam} - */ - volumeDensity: number - unk_sdt_f1_20: number - /** - * Controls whether or not {@link asymmetryParam} affects the fake fog from {@link volumeDensity}. - */ - phaseFunction: boolean - /** - * Controls how the fake fog from {@link volumeDensity} scatters the light. This value is ignored if {@link phaseFunction} is disabled, and the fog will scatter the light equally in all directions. - * - * - At 0, the light is scattered equally in every direction. - * - As the value approaches 1, the light is scattered more and more forward, in the same direction as the light was already traveling. This means that the fake fog will be less visible from the side or behind, and more visible from in front of the light. - * - At 1, the fog will not scatter the light at all, so it will be entirely invisible. - * - Values above 1 produce unnatural-looking effects where the light darkens the fog instead. - */ - asymmetryParam: number - /** - * Controls the falloff exponent of the light. - * - * Note: This is possibly something else, but the behavior is pretty similar to a falloff exponent in a few ways. - */ - falloffExponent: number - unk_er_f1_24: number - unk_er_f1_25: number - unk_er_f1_26: number - unk_er_f1_27: number - unk_ds3_f1_0: number - unk_ds3_f1_5: number - unk_ds3_f1_7: number unk_ds3_f1_8: number - constructor(props: SpotLightParams = {}) { + constructor(props: Partial> = {}) { super(ActionType.SpotLight, {isAppearance:true,isParticle:false}) this.assign(props) } @@ -43627,7 +34414,7 @@ namespace FXRUtility { size: Vector3 = [1, 1, 1], color?: Vector4Value, lineWidth?: ScalarValue, - args?: BillboardExParams + args?: Partial> ) { const x1 = pos[0] - size[0] * 0.5 const y1 = pos[1] - size[1] * 0.5 @@ -43666,7 +34453,7 @@ namespace FXRUtility { height: number = 1, color?: Vector4Value, lineWidth?: ScalarValue, - args?: BillboardExParams + args?: Partial> ) { const w = width * 0.5 const h = height * 0.5 @@ -43694,7 +34481,7 @@ namespace FXRUtility { segments: number = 16, color?: Vector4Value, lineWidth?: ScalarValue, - args?: BillboardExParams, + args?: Partial>, ) { const angleInc = 2 * Math.PI / segments return new BasicNode([], arrayOf(segments, i => { @@ -43729,7 +34516,7 @@ namespace FXRUtility { segments: number = 16, color?: Vector4Value, lineWidth?: ScalarValue, - args?: BillboardExParams, + args?: Partial>, ) { return new BasicNode([], [ ellipse(radiusX, radiusY, segments, color, lineWidth, args), @@ -43757,7 +34544,7 @@ namespace FXRUtility { segments: number = 16, color?: Vector4Value, lineWidth?: ScalarValue, - args?: BillboardExParams, + args?: Partial>, ) { return new BasicNode([], [ transform([0, 0, -height * 0.5], [0, 0, 0], 0, ellipse(radiusX, radiusY, segments, color, lineWidth, args).nodes), @@ -43787,7 +34574,7 @@ namespace FXRUtility { recurse: boolean = true, color?: Vector4Value, lineWidth?: ScalarValue, - args?: BillboardExParams + args?: Partial> ) { const nodes = recurse ? Array.from(node.walk()) : [node] for (const n of nodes) { @@ -43843,7 +34630,7 @@ namespace FXRUtility { originY?: 'baseline' | 'top' | 'middle' | 'bottom' fontSize?: number color?: Vector4Value - args?: BillboardExParams + args?: Partial> } = {} ): BasicNode { const lines = text.split('\n') From a7ba0a52f46270d31e04aa1fe8cea1e06e9aa2c8 Mon Sep 17 00:00:00 2001 From: Even Torset Date: Sun, 24 Nov 2024 09:47:51 +0100 Subject: [PATCH 14/31] Added FXR.hasAppearance. --- CHANGELOG.md | 1 + src/fxr.ts | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbbc62d..6b96f7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,7 @@ - The `depthBias` field in `NodeAttributes` is now scaled by the `scale` methods. - The `unk_sdt_f2_38` field in `Distortion` is now scaled by the `scale` methods if `includeViewDistance` is enabled, and its effect has been documented. Exactly what it does is still unknown, so it remains unnamed. - The `unk_ds3_f2_29` field in many of the appearance actions has been identified as some kind of view distance threshold, and is therefore now also scaled by the `scale` methods if `includeViewDistance` is enabled. Exactly what this field does is still unknown. +- A new read-only `hasAppearance` property has been added to FXR objects, which can be used to check if an effect contains any appearance actions. - The documentation site has been updated with a few improvements. - It now has a new theme, one that uses colors closer to the FXR Playground style. - Enum members are now sorted in ascending order based on the value instead of alphabetically. diff --git a/src/fxr.ts b/src/fxr.ts index 85af163..accee05 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -9851,6 +9851,22 @@ class FXR { */ get gameHint() { return this.#gameHint } + /** + * True only if the effect contains an appearance action, and false + * otherwise. This may be useful for filtering FXR files that are "empty". + * + * Note that this does not check if any referenced FXR files have appearance + * actions, so an effect that only contains a proxy will return false. + */ + get hasAppearance() { + for (const config of this.root.walkConfigs()) { + if (config instanceof BasicConfig && config.appearance.type !== 0) { + return true + } + } + return false + } + } //#region State From 99cecba78500f01bf359f74748ff2639e0bd79e6 Mon Sep 17 00:00:00 2001 From: Even Torset Date: Mon, 25 Nov 2024 04:56:02 +0100 Subject: [PATCH 15/31] Fixed writing effects for Dark Souls 3 being destructive. --- CHANGELOG.md | 1 + src/fxr.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b96f7e..a265d74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ - Added links to the FXR Playground and Ko-fi to the sidebar. - Added the library version number to the header. - Fixed the `getActionCount` method on `NodeEmitterConfig` objects always returning `10`. It now correctly returns `9` if the given game is `Game.DarkSouls3`, and `10` otherwise. +- Fixed writing effects for Dark Souls 3 being destructive if the rate of time was set to anything other than 1. It now creates a clone of the tree structure and scales the rate of time in the clone before writing it instead of scaling the rate on the original directly. This shouldn't matter unless the same FXR object was written to a file multiple times, which most people would rarely have to do. - Replaced all data action constructor parameter interfaces with types based on the classes. This doesn't change anything functionally, but cleans up the code and the documentation site a lot. ~10k lines of code was removed by doing this. ## [17.0.0] - 2024-11-12 diff --git a/src/fxr.ts b/src/fxr.ts index accee05..b9c7bc1 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -9565,7 +9565,7 @@ class FXR { bw.fill('NodeOffset', bw.position) const nodes: Node[] = [] const root = game === Game.DarkSouls3 && this.root instanceof RootNode ? - this.root.scaleRateOfTime(rateOfTime) : + this.root.clone().scaleRateOfTime(rateOfTime) : this.root writeNode(root, bw, game, nodes) writeNodeChildren(root, bw, game, nodes) From 40331d2794e8d6e1aa9f3e94ab4f186dafed9495 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 06:18:13 +0000 Subject: [PATCH 16/31] Bump yaml from 2.6.0 to 2.6.1 Bumps [yaml](https://github.com/eemeli/yaml) from 2.6.0 to 2.6.1. - [Release notes](https://github.com/eemeli/yaml/releases) - [Commits](https://github.com/eemeli/yaml/compare/v2.6.0...v2.6.1) --- updated-dependencies: - dependency-name: yaml dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 625db43..c1ea844 100644 --- a/package-lock.json +++ b/package-lock.json @@ -729,11 +729,10 @@ } }, "node_modules/yaml": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", - "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", "dev": true, - "license": "ISC", "bin": { "yaml": "bin.mjs" }, From e9471a5c2a43a67286cbcfa8c7d2f4be4bfaa10d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 06:18:22 +0000 Subject: [PATCH 17/31] Bump typescript from 5.6.3 to 5.7.2 Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.6.3 to 5.7.2. - [Release notes](https://github.com/microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml) - [Commits](https://github.com/microsoft/TypeScript/compare/v5.6.3...v5.7.2) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 625db43..e0c5173 100644 --- a/package-lock.json +++ b/package-lock.json @@ -655,11 +655,10 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" From 8f17a39e321bd7e0a5eb30be54b06e5687ada573 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 06:18:26 +0000 Subject: [PATCH 18/31] Bump @types/node from 22.9.0 to 22.9.3 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.9.0 to 22.9.3. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 625db43..11d83e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,11 +45,10 @@ } }, "node_modules/@types/node": { - "version": "22.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", - "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "version": "22.9.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.3.tgz", + "integrity": "sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw==", "dev": true, - "license": "MIT", "dependencies": { "undici-types": "~6.19.8" } From ba404fbb5736fb5146e22285958d0849616bc9ac Mon Sep 17 00:00:00 2001 From: Even Torset Date: Mon, 25 Nov 2024 07:22:42 +0100 Subject: [PATCH 19/31] Fixed the node recolor method processing everything twice. Once even incorrectly, which is how this was found. Some of the context was missing for the function given to it. --- src/fxr.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/fxr.ts b/src/fxr.ts index b9c7bc1..80b894f 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -10332,9 +10332,6 @@ abstract class Node { recolor(funcOrPalette: Recolor.RecolorFunction | Recolor.ColorPalette, recurse: boolean = true) { if (typeof funcOrPalette === 'function') { - for (const action of this.walkActions(recurse)) if (action instanceof DataAction) { - action.recolor(funcOrPalette) - } for (const config of this.walkConfigs(recurse)) if (config instanceof BasicConfig) { config.recolor(funcOrPalette) } From 8490ec5ccfa5290c2ab166fa67e108d548430e07 Mon Sep 17 00:00:00 2001 From: Even Torset Date: Mon, 25 Nov 2024 07:30:36 +0100 Subject: [PATCH 20/31] Changed TS back to 5.6.3 to fix incompatibility with typedoc. --- package-lock.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 223a649..1a9159a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -654,10 +654,11 @@ } }, "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" From 11c420f2c47bdd497d3fe0ee6f24aa7cc1e14d44 Mon Sep 17 00:00:00 2001 From: Even Torset Date: Tue, 26 Nov 2024 06:07:43 +0100 Subject: [PATCH 21/31] Changed BillboardEx.unk_ds3_f2_1 to an integer. What it does is still entirely unknown, so it being a boolean before was just a guess. Its type now matches the same field in MultiTextureBillboardEx, which also makes it easier to convert one to the other. --- src/actions/603.yml | 4 +++- src/fxr.ts | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/actions/603.yml b/src/actions/603.yml index 346c238..5a978aa 100644 --- a/src/actions/603.yml +++ b/src/actions/603.yml @@ -337,7 +337,9 @@ properties: unk_ds3_f2_0: field: int unk_ds3_f2_1: - field: bool + field: int + desc: | + Unknown integer. Possibly boolean? unk_ds3_f2_2: field: int default: 8 diff --git a/src/fxr.ts b/src/fxr.ts index 80b894f..cda591a 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -3138,7 +3138,7 @@ const ActionData: Record Date: Wed, 27 Nov 2024 05:07:00 +0100 Subject: [PATCH 22/31] Fixed the documented default value of some boolean fields. Also changed unk_ds3_f2_1 in actions 606 and 10012 to be integers, just like the previous commit for 603. --- CHANGELOG.md | 2 ++ build/build.js | 3 +++ src/actions/10012.yml | 4 +++- src/actions/606.yml | 4 +++- src/fxr.ts | 22 +++++++++++----------- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a265d74..4ff0c55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,8 +47,10 @@ - Enum members are now sorted in ascending order based on the value instead of alphabetically. - Added links to the FXR Playground and Ko-fi to the sidebar. - Added the library version number to the header. +- The `unk_ds3_f2_1` field in `BillboardEx`, `Tracer`, and `DynamicTracer` has been changed to be an integer field. It was previously a boolean field, which was possibly an error because this field is entirely unknown. It is only ever 0 or 1 in vanilla, but that doesn't mean that those are the only possible values. As a side-effect of this, converting between `BillboardEx` and `MultiTextureBillboardEx` is now a bit easier, since the latter has always had this field as an integer. - Fixed the `getActionCount` method on `NodeEmitterConfig` objects always returning `10`. It now correctly returns `9` if the given game is `Game.DarkSouls3`, and `10` otherwise. - Fixed writing effects for Dark Souls 3 being destructive if the rate of time was set to anything other than 1. It now creates a clone of the tree structure and scales the rate of time in the clone before writing it instead of scaling the rate on the original directly. This shouldn't matter unless the same FXR object was written to a file multiple times, which most people would rarely have to do. +- Fixed the documented default value of some boolean fields being `0` instead of `false`. The actual default value was `false`, so this was just an error in the documentation. - Replaced all data action constructor parameter interfaces with types based on the classes. This doesn't change anything functionally, but cleans up the code and the documentation site a lot. ~10k lines of code was removed by doing this. ## [17.0.0] - 2024-11-12 diff --git a/build/build.js b/build/build.js index 989d7db..d85558c 100644 --- a/build/build.js +++ b/build/build.js @@ -117,6 +117,9 @@ function naturalSorter(as, bs) { } function defValString(prop) { + if (!('default' in prop) && prop.field === 'bool') { + return '`false`' + } let defValue = prop.default ?? 0 if (typeof defValue === 'string') { defValue = `{@link ${defValue}}` diff --git a/src/actions/10012.yml b/src/actions/10012.yml index 4c478c7..b0344c0 100644 --- a/src/actions/10012.yml +++ b/src/actions/10012.yml @@ -252,7 +252,9 @@ properties: unk_ds3_f2_0: field: int unk_ds3_f2_1: - field: bool + field: int + desc: | + Unknown integer. Possibly boolean? unk_ds3_f2_2: field: int default: 8 diff --git a/src/actions/606.yml b/src/actions/606.yml index c4bfd8d..b76a2f1 100644 --- a/src/actions/606.yml +++ b/src/actions/606.yml @@ -236,7 +236,9 @@ properties: unk_ds3_f2_0: field: int unk_ds3_f2_1: - field: bool + field: int + desc: | + Unknown integer. Possibly boolean? unk_ds3_f2_2: field: int default: 8 diff --git a/src/fxr.ts b/src/fxr.ts index cda591a..9d6e8bf 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -3508,7 +3508,7 @@ const ActionData: Record Date: Wed, 27 Nov 2024 22:05:08 +0100 Subject: [PATCH 23/31] Updated examples. --- NODE.md | 4 ++-- README.md | 4 ++-- examples/smoke_trail.js | 8 ++++---- examples/torch_fire.js | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/NODE.md b/NODE.md index 75c7851..a246f6b 100644 --- a/NODE.md +++ b/NODE.md @@ -1,5 +1,5 @@ # Before you continue -Just in case you happened upon this page before finding out about it: The [FXR Playground](https://fxr-playground.pages.dev) is website where you can use the library without having to install anything. It is recommended that you check it out before continuing to find out if you really need to install the library locally. +Just in case you happened upon this page before finding out about it: The [FXR Playground](https://fxr-playground.pages.dev) is a website where you can use the library without having to install anything. It is recommended that you check it out before continuing to find out if you really need to install the library locally. The playground includes a UI for performing simple actions such as recoloring or resizing existing effects, as well as things to simplify manual edits and running scripts that perform more advanced or bulk edits, or create entirely new effects from scratch. @@ -100,7 +100,7 @@ npm ls @cccode/fxr ``` If an update has broken your scripts or if you just want to go back to an older version of the library, you can install any specific version by putting the version number after `@` at the end of the package name in the install command. For example, this is how you would install version 10.0.0: ```text -npm i @cccode/fxr@10.0.0 --omit=dev +npm i @cccode/fxr@10.0.0 ```
diff --git a/README.md b/README.md index 8fa20eb..2c904c5 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The library is available on [npm](https://www.npmjs.com/package/@cccode/fxr), so If you *are* familiar with JS and Node.js, you can install the library with this command: ``` -npm i @cccode/fxr --omit=dev +npm i @cccode/fxr ``` ## Documentation @@ -48,7 +48,7 @@ const fxr = await FXR.read('f000450360.fxr') fxr.root.scale(0.5) // Or you can recolor the effect: -fxr.root.recolor(Recolor.standardBlend(hex`ff4d00`)) +fxr.root.recolor(Recolor.replace(hex`ff4d00`)) // Write the modified file. Note that you may change the game to output this // for to any of the four supported games, as long as the game supports all diff --git a/examples/smoke_trail.js b/examples/smoke_trail.js index 935b15f..fbe7358 100644 --- a/examples/smoke_trail.js +++ b/examples/smoke_trail.js @@ -73,10 +73,10 @@ fxr.root.nodes = emitters.map(emitter => new BasicNode([ blendMode: BlendMode.Screen, width: 0.1, uniformScale: true, - mask: 10061, - layer1: 26020, - layer1SpeedV: 0.1, - layer1OffsetU: RandomRangeProperty(0, 1), + layer1: 10061, + layer2: 26020, + layer2SpeedV: 0.1, + layer2OffsetU: RandomRangeProperty(0, 1), alphaFadeThreshold: new LinearProperty(false, [ new Keyframe(0, 255), new Keyframe(0.5, 0), diff --git a/examples/torch_fire.js b/examples/torch_fire.js index 4e040aa..76000f5 100644 --- a/examples/torch_fire.js +++ b/examples/torch_fire.js @@ -33,15 +33,15 @@ fxr.root.nodes = [ }), new ParticleForceAcceleration({ acceleration: 0.085 }), new MultiTextureBillboardEx({ - mask: 31001, - layer1: 34060, + layer1: 31001, + layer2: 34060, columns: 8, totalFrames: 64, blendMode: BlendMode.Add, width: 0.6, height: 0.6, color1: [1, 0.36, 0.16, 1], - layer1Color: [1, 1, 1, 0.75], + layer2Color: [1, 1, 1, 0.75], alphaFadeThreshold: new LinearProperty(false, [ new Keyframe(0, 255), new Keyframe(0.25, 0), @@ -49,7 +49,7 @@ fxr.root.nodes = [ ]), frameIndex: LinearProperty.basic(true, 1.5, 0, 64), frameIndexOffset: RandomRangeProperty(0, 64), - layer1SpeedV: 0.5, + layer2SpeedV: 0.5, rgbMultiplier: 400, offsetY: 0.3, unkDepthBlend2: 0.25, From 7e303316344a3f0b377446522393be5356571edc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 06:58:39 +0000 Subject: [PATCH 24/31] Bump typedoc from 0.26.11 to 0.27.2 Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.26.11 to 0.27.2. - [Release notes](https://github.com/TypeStrong/TypeDoc/releases) - [Changelog](https://github.com/TypeStrong/typedoc/blob/master/CHANGELOG.md) - [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.26.11...v0.27.2) --- updated-dependencies: - dependency-name: typedoc dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 72 +++++++++++++++++++++++++++++------------------ package.json | 2 +- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a9159a..a8e894c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,33 +13,59 @@ "cheerio": "^1.0.0", "chokidar": "^4.0.1", "npm-run-all2": "^7.0.1", - "typedoc": "^0.26.11", + "typedoc": "^0.27.2", "typedoc-github-theme": "^0.1.2", "typescript": "^5.6.3", "yaml": "^2.6.0" } }, - "node_modules/@shikijs/core": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.16.2.tgz", - "integrity": "sha512-XSVH5OZCvE4WLMgdoBqfPMYmGHGmCC3OgZhw0S7KcSi2XKZ+5oHGe71GFnTljgdOxvxx5WrRks6QoTLKrl1eAA==", + "node_modules/@gerrit0/mini-shiki": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.24.1.tgz", + "integrity": "sha512-PNP/Gjv3VqU7z7DjRgO3F9Ok5frTKqtpV+LJW1RzMcr2zpRk0ulhEWnbcNGXzPC7BZyWMIHrkfQX2GZRfxrn6Q==", "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-oniguruma": "^1.24.0", + "@shikijs/types": "^1.24.0", + "@shikijs/vscode-textmate": "^9.3.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.0.tgz", + "integrity": "sha512-Eua0qNOL73Y82lGA4GF5P+G2+VXX9XnuUxkiUuwcxQPH4wom+tE39kZpBFXfUuwNYxHSkrSxpB1p4kyRW0moSg==", + "dev": true, + "license": "MIT", "dependencies": { - "@shikijs/vscode-textmate": "^9.2.0", + "@shikijs/types": "1.24.0", + "@shikijs/vscode-textmate": "^9.3.0" + } + }, + "node_modules/@shikijs/types": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.0.tgz", + "integrity": "sha512-aptbEuq1Pk88DMlCe+FzXNnBZ17LCiLIGWAeCWhoFDzia5Q5Krx3DgnULLiouSdd6+LUM39XwXGppqYE0Ghtug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" } }, "node_modules/@shikijs/vscode-textmate": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.2.0.tgz", - "integrity": "sha512-5FinaOp6Vdh/dl4/yaOTh0ZeKch+rYS8DUb38V3GMKYVkdqzxw53lViRKUYkVILRiVQT7dcPC7VvAKOR73zVtQ==", - "dev": true + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz", + "integrity": "sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -57,7 +83,8 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ansi-styles": { "version": "6.2.1", @@ -606,29 +633,18 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shiki": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.16.2.tgz", - "integrity": "sha512-gSym0hZf5a1U0iDPsdoOAZbvoi+e0c6c3NKAi03FoSLTm7oG20tum29+gk0wzzivOasn3loxfGUPT+jZXIUbWg==", - "dev": true, - "dependencies": { - "@shikijs/core": "1.16.2", - "@shikijs/vscode-textmate": "^9.2.0", - "@types/hast": "^3.0.4" - } - }, "node_modules/typedoc": { - "version": "0.26.11", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.11.tgz", - "integrity": "sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.2.tgz", + "integrity": "sha512-C2ima5TZJHU3ecnRIz50lKd1BsYck5LhYQIy7MRPmjuSEJreUEAt+uAVcZgY7wZsSORzEI7xW8miZIdxv/cbmw==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@gerrit0/mini-shiki": "^1.24.0", "lunr": "^2.3.9", "markdown-it": "^14.1.0", "minimatch": "^9.0.5", - "shiki": "^1.16.2", - "yaml": "^2.5.1" + "yaml": "^2.6.1" }, "bin": { "typedoc": "bin/typedoc" @@ -637,7 +653,7 @@ "node": ">= 18" }, "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x" + "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x" } }, "node_modules/typedoc-github-theme": { diff --git a/package.json b/package.json index 2032004..a266e13 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "cheerio": "^1.0.0", "chokidar": "^4.0.1", "npm-run-all2": "^7.0.1", - "typedoc": "^0.26.11", + "typedoc": "^0.27.2", "typedoc-github-theme": "^0.1.2", "typescript": "^5.6.3", "yaml": "^2.6.0" From 97ea0f3c0e074baa544bbda5388f13c307f251da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 06:58:45 +0000 Subject: [PATCH 25/31] Bump typescript from 5.6.3 to 5.7.2 Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.6.3 to 5.7.2. - [Release notes](https://github.com/microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml) - [Commits](https://github.com/microsoft/TypeScript/compare/v5.6.3...v5.7.2) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a9159a..bdd4d97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -654,9 +654,9 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "dev": true, "license": "Apache-2.0", "bin": { From 318bf97f899bd29cbee72d29724d1a16152ab674 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 06:58:56 +0000 Subject: [PATCH 26/31] Bump @types/node from 22.9.3 to 22.10.1 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.9.3 to 22.10.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a9159a..90c1ce9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,12 +45,13 @@ } }, "node_modules/@types/node": { - "version": "22.9.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.3.tgz", - "integrity": "sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw==", + "version": "22.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", + "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~6.19.8" + "undici-types": "~6.20.0" } }, "node_modules/@types/unist": { @@ -684,10 +685,11 @@ } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" }, "node_modules/whatwg-encoding": { "version": "3.1.1", From 48e3c00d01b7df28d981fc8a6c168867f347f134 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 07:24:34 +0000 Subject: [PATCH 27/31] Bump typedoc-github-theme from 0.1.2 to 0.2.0 Bumps [typedoc-github-theme](https://github.com/KillerJulian/typedoc-github-theme) from 0.1.2 to 0.2.0. - [Release notes](https://github.com/KillerJulian/typedoc-github-theme/releases) - [Commits](https://github.com/KillerJulian/typedoc-github-theme/compare/v0.1.2...v0.2.0) --- updated-dependencies: - dependency-name: typedoc-github-theme dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8e1fe9f..94a3a38 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "chokidar": "^4.0.1", "npm-run-all2": "^7.0.1", "typedoc": "^0.27.2", - "typedoc-github-theme": "^0.1.2", + "typedoc-github-theme": "^0.2.0", "typescript": "^5.6.3", "yaml": "^2.6.0" } @@ -658,16 +658,16 @@ } }, "node_modules/typedoc-github-theme": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/typedoc-github-theme/-/typedoc-github-theme-0.1.2.tgz", - "integrity": "sha512-GFwQeq+z4FMtA9u2+wBx/UvzaX6t3xueigv6Jrt1G8JQLLyYuFfWwE3ESuKzpLfDu1+29GK4n70GbIqFRG+gaw==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/typedoc-github-theme/-/typedoc-github-theme-0.2.0.tgz", + "integrity": "sha512-ycTjNm7PZharoYg67oAFDC4JUvIqvFCLp4AiCKQBhlCsbiWiMYGEAPnuoRmV6+/CQsmH2l3dfOUiwM11ZtSGqA==", "dev": true, "license": "MIT", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "typedoc": "^0.26.0" + "typedoc": "^0.27.1" } }, "node_modules/typescript": { diff --git a/package.json b/package.json index a266e13..e049d46 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "chokidar": "^4.0.1", "npm-run-all2": "^7.0.1", "typedoc": "^0.27.2", - "typedoc-github-theme": "^0.1.2", + "typedoc-github-theme": "^0.2.0", "typescript": "^5.6.3", "yaml": "^2.6.0" } From dd222752d1df194128873c935c72fcf9efc1f35a Mon Sep 17 00:00:00 2001 From: Even Torset Date: Mon, 2 Dec 2024 08:34:23 +0100 Subject: [PATCH 28/31] Updated to work with TS 5.7 --- package-lock.json | 2 +- package.json | 2 +- src/fxr.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 94a3a38..481672e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "npm-run-all2": "^7.0.1", "typedoc": "^0.27.2", "typedoc-github-theme": "^0.2.0", - "typescript": "^5.6.3", + "typescript": "^5.7.2", "yaml": "^2.6.0" } }, diff --git a/package.json b/package.json index e049d46..d281d07 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "npm-run-all2": "^7.0.1", "typedoc": "^0.27.2", "typedoc-github-theme": "^0.2.0", - "typescript": "^5.6.3", + "typescript": "^5.7.2", "yaml": "^2.6.0" } } diff --git a/src/fxr.ts b/src/fxr.ts index 9d6e8bf..93e3957 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -8902,7 +8902,7 @@ const ActionDataConversion = { } //#region Binary Reader/Writer -class BinaryReader extends DataView { +class BinaryReader extends DataView { position: number = 0 littleEndian: boolean = true From b9707a9e30e28d6caebd8ce2565d492432e27d1f Mon Sep 17 00:00:00 2001 From: Even Torset Date: Wed, 4 Dec 2024 10:17:39 +0100 Subject: [PATCH 29/31] Merged meta prop into ActionData and added $data and $convert props. --- CHANGELOG.md | 4 + build/build.js | 11 +- src/fxr.ts | 572 +++++++++++++++++++++++++++++-------------------- 3 files changed, 346 insertions(+), 241 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ff0c55..22201c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,10 @@ - The `unk_ds3_f2_1` field in `BillboardEx`, `Tracer`, and `DynamicTracer` has been changed to be an integer field. It was previously a boolean field, which was possibly an error because this field is entirely unknown. It is only ever 0 or 1 in vanilla, but that doesn't mean that those are the only possible values. As a side-effect of this, converting between `BillboardEx` and `MultiTextureBillboardEx` is now a bit easier, since the latter has always had this field as an integer. - Fixed the `getActionCount` method on `NodeEmitterConfig` objects always returning `10`. It now correctly returns `9` if the given game is `Game.DarkSouls3`, and `10` otherwise. - Fixed writing effects for Dark Souls 3 being destructive if the rate of time was set to anything other than 1. It now creates a clone of the tree structure and scales the rate of time in the clone before writing it instead of scaling the rate on the original directly. This shouldn't matter unless the same FXR object was written to a file multiple times, which most people would rarely have to do. +- `DataAction`s (basically any class that represents a specific action in the library) now have a `$data` property for easily accessing most of the data stored in the library about the action type the class is for. This was already accessible from the `ActionData` object, and this property is just making it easier to access it. + - The `meta` property on `DataAction`s has been merged into the `ActionData` object, which means that any references to this property should be replaced with `$data` now. + - This uses a new naming scheme in the library. Properties with a name starting with `$` are for accessing various internal functions and information in the library. These are not meant to be useful for most people. They may be useful for some more advanced operations, but they are primarily for use internally. +- Similar to the note above, `DataAction`s now have a `$convert` property for accessing internal conversion functions for the action, which were only accessible from the `ActionDataConversion` object before. - Fixed the documented default value of some boolean fields being `0` instead of `false`. The actual default value was `false`, so this was just an error in the documentation. - Replaced all data action constructor parameter interfaces with types based on the classes. This doesn't change anything functionally, but cleans up the code and the documentation site a lot. ~10k lines of code was removed by doing this. diff --git a/build/build.js b/build/build.js index d85558c..f7d4620 100644 --- a/build/build.js +++ b/build/build.js @@ -237,7 +237,9 @@ export default async function(writeToDist = true) { `.trim().replace(/^\s{6}/gm, ' ')) actionDataEntries.push(` - [ActionType.${data.name}]: {${'properties' in data ? ` + [ActionType.${data.name}]: { + isAppearance: ${data.meta.isAppearance}, + isParticle: ${data.meta.isParticle}${'properties' in data ? `, props: { ${Object.entries(data.properties).map(([k, v]) => { return `${k}: { default: ${defValTS(v)}${ @@ -282,8 +284,8 @@ export default async function(writeToDist = true) { } `.trim().replace(/^\s{14}(?=\})/m, ' '.repeat(10)).replace(/^\s{16}/m, ' '.repeat(12)) }).join(',\n ')} - } - ` : ''}} + }` : ''} + } `.trim().replace(/^\s{4}/gm, '')) if (!data.omitClass) { @@ -298,7 +300,6 @@ export default async function(writeToDist = true) { */ class ${data.name} extends DataAction { declare readonly type: ActionType.${data.name} - declare readonly meta: ActionMeta & {${Object.entries(data.meta).map(e => `${e[0]}:${toTSString(e[1])}`)}} ${Object.entries(data.properties ?? {}).filter(e => !e[1].omitClassProp).map(([k, v]) => { return (` /** @@ -345,7 +346,7 @@ export default async function(writeToDist = true) { data.properties[propNames[0]].type ?? typeFromField(data.properties[propNames[0]].field) } = ${defValTS(firstProp)}` : ''}) { - super(ActionType.${data.name}, {${Object.entries(data.meta).map(e => `${e[0]}:${toTSString(e[1])}`)}})${'properties' in data ? ` + super(ActionType.${data.name})${'properties' in data ? ` this.assign(${propNames.length > 1 ? 'props' : `{ ${propNames[0]} }`})` : ''} } } diff --git a/src/fxr.ts b/src/fxr.ts index 93e3957..20b20e1 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -1743,7 +1743,7 @@ export interface IModifiableProperty { minify(): IModifier } -export interface ActionMeta { - /** - * Is `true` if the action is an - * {@link ActionSlots.AppearanceAction appearance action}. - */ - isAppearance: boolean - /** - * Is `true` if the action defines a particle appearance. Particles are - * affected by particle-related actions: - * - {@link ActionSlots.ParticleModifierAction ParticleModifierAction} - * - {@link ActionSlots.ParticleAttributesAction ParticleAttributesAction} - * - {@link ActionSlots.ParticleMovementAction ParticleMovementAction} - * - {@link ActionSlots.ParticleForceMovementAction ParticleForceMovementAction} - * - * Particles can be emitted by any of the regular emitters: - * - {@link ActionType.OneTimeEmitter OneTimeEmitter} - * - {@link ActionType.PeriodicEmitter PeriodicEmitter} - * - {@link ActionType.EqualDistanceEmitter EqualDistanceEmitter} - * - * Non-particles are not affected by the particle-related actions, and can - * only be emitted by {@link ActionType.OneTimeEmitter OneTimeEmitter}. - * - * GPU particles, for example those from - * {@link ActionType.GPUStandardParticle GPUStandardParticle}, do not count - * as particles in the same way. They are not affected by the - * particle-related actions, and the actions that define them also define - * their own emitter for the GPU particles instead of using the one in the - * node's emitter slot. - */ - isParticle: boolean -} - export interface NodeColorOptions { activeState?: number side?: 'start' | 'end' | 'middle' @@ -2096,12 +2064,50 @@ export type ActionDataProp = ( s10: 1 }) ) -const ActionData: Record games?: Record -}> = { +} +export type ActionDataConversionEntry = { + read?(props: Props, game: Game): Props + write?(props: Props, game: Game): Props + minify?(): AnyAction + fallback?(action: T, game: Game): Action +} +const ActionData: Record = { /*#ActionData start*/ [ActionType.NodeAcceleration]: { + isAppearance: false, + isParticle: false, props: { speedZ: { default: 0, scale: 1, time: 1 }, accelerationZ: { default: 0, scale: 1, time: 4 }, @@ -2122,6 +2128,8 @@ const ActionData: Record fieldCompCount[ - typeof adt.props[name].field === 'number' ? adt.props[name].field : adt.props[name].field[game] + typeof ade.props[name].field === 'number' ? ade.props[name].field : ade.props[name].field[game] ]) .reduce((a, e) => a + e, 0) ) @@ -6126,7 +6293,7 @@ function writeDataAction(action: DataAction, bw: BinaryWriter, game: Game, actio bw.writeInt32(data.properties1.length) bw.writeInt32(data.fields2 .map(name => fieldCompCount[ - typeof adt.props[name].field === 'number' ? adt.props[name].field : adt.props[name].field[game] + typeof ade.props[name].field === 'number' ? ade.props[name].field : ade.props[name].field[game] ]) .reduce((a, e) => a + e, 0) ) @@ -6278,8 +6445,8 @@ function readAnyAction(br: BinaryReader): AnyAction { function writeAnyAction(action: AnyAction, bw: BinaryWriter, game: Game, actions: AnyAction[]) { if (action instanceof DataAction) { - if ('props' in ActionData[action.type] && ActionData[action.type].games[game] === -2) { - writeAction(ActionDataConversion[action.type].fallback(action, game), bw, actions) + if ('props' in action.$data && action.$data.games[game] === -2) { + writeAction(action.$convert.fallback(action, game), bw, actions) } else { writeDataAction(action, bw, game, actions) } @@ -8491,7 +8658,7 @@ const GameVersionMap = { [Game.ArmoredCore6]: FXRVersion.Sekiro, } -const ActionDataConversion = { +const ActionDataConversion: Partial>> = { [ActionType.StaticNodeTransform]: { read(props: Props, game: Game) { props.offset[0] *= -1 @@ -10243,8 +10410,8 @@ abstract class Node { yield* action.properties1 yield* action.properties2 } else { - if ('props' in ActionData[action.type]) { - for (const prop of Object.keys(ActionData[action.type].props)) { + if ('props' in action.$data) { + for (const prop of Object.keys(action.$data.props)) { if (action[prop] instanceof Property) { yield action[prop] } @@ -11782,7 +11949,7 @@ class NodeEmitterConfig implements IConfig { //#region Action class Action implements IAction { - readonly meta: ActionMeta & {isAppearance:false,isParticle:false} = {isAppearance:false,isParticle:false} + readonly $data = { isAppearance: false, isParticle: false } constructor( public type: ActionType = ActionType.None, @@ -11945,12 +12112,24 @@ class DataAction implements IAction { /** * @param type The {@link ActionType numeric ID for the type of action} this represents. - * @param meta Contains information about the action type. */ - constructor(public readonly type: ActionType, public readonly meta: ActionMeta) {} + constructor(public readonly type: ActionType) {} + + /** + * An object containing most of the information that is stored in the library + * about the action type. + */ + get $data() { return ActionData[this.type] } + + /** + * An object containing various functions related to conversion between games + * and different formats, or undefined if the action does not have any of + * these functions. + */ + get $convert(): ActionDataConversionEntry { return ActionDataConversion[this.type] } assign(props: any = {}) { - for (const [k, v] of Object.entries(ActionData[this.type].props)) { + for (const [k, v] of Object.entries(this.$data.props)) { if ('omit' in v) { continue } @@ -11960,13 +12139,13 @@ class DataAction implements IAction { } toJSON() { - if (!('props' in ActionData[this.type])) { + if (!('props' in this.$data)) { return { type: this.type } } return { type: this.type, ...Object.fromEntries( - Object.entries(ActionData[this.type].props) + Object.entries(this.$data.props) .filter(([_, prop]) => !('omit' in prop)) .map(([prop]) => { const v = this[prop] @@ -11981,11 +12160,11 @@ class DataAction implements IAction { minify() { let minified: DataAction = this - if (this.type in ActionDataConversion && 'minify' in ActionDataConversion[this.type]) { - minified = ActionDataConversion[this.type].minify.call(this) + if (this.type in ActionDataConversion && 'minify' in this.$convert) { + minified = this.$convert.minify.call(this) } - if (minified instanceof DataAction && 'props' in ActionData[minified.type]) { - const propNames = Object.keys(ActionData[minified.type].props) + if (minified instanceof DataAction && 'props' in minified.$data) { + const propNames = Object.keys(minified.$data.props) if (propNames.length === 1) { return new (minified.constructor as any)( minified[propNames[0]] instanceof Property ? minified[propNames[0]].minify() : minified[propNames[0]] @@ -12004,7 +12183,7 @@ class DataAction implements IAction { getFields(game: Game, list: 'fields1' | 'fields2'): Field[] { const data = getActionGameData(this.type, game) return data[list].map((name: string) => { - const prop = ActionData[this.type].props[name] + const prop = this.$data.props[name] validateDataActionProp(this, name, prop) return Field.from( typeof prop.field === 'number' ? prop.field : prop.field[game], @@ -12016,7 +12195,7 @@ class DataAction implements IAction { getProperties(game: Game, list: 'properties1' | 'properties2'): AnyProperty[] { const data = getActionGameData(this.type, game) return (data[list] ?? []).map((name: string) => { - const prop = ActionData[this.type].props[name] + const prop = this.$data.props[name] validateDataActionProp(this, name, prop) return this[name] instanceof Property ? this[name].for(game) : Array.isArray(prop.default) ? new ConstantProperty(...this[name]).for(game) : @@ -12030,8 +12209,8 @@ class DataAction implements IAction { } toAction(game: Game) { - const convertedProps = this.type in ActionDataConversion && 'write' in ActionDataConversion[this.type] ? - ActionDataConversion[this.type].write(Object.assign(Object.create(null), this), game) : + const convertedProps = this.type in ActionDataConversion && 'write' in this.$convert ? + this.$convert.write(Object.assign(Object.create(null), this), game) : this return new Action( this.type, @@ -12048,12 +12227,12 @@ class DataAction implements IAction { type: ResourceType textureType?: string }[] { - if (!('props' in ActionData[this.type])) { + if (!('props' in this.$data)) { return [] } const resourceProps = [] - for (const [k, v] of Object.entries(ActionData[this.type].props)) { + for (const [k, v] of Object.entries(this.$data.props)) { if ('resource' in v) { if (v.resource === ResourceType.Texture) { resourceProps.push({ @@ -12078,8 +12257,8 @@ class DataAction implements IAction { * @param factor The factor to scale by. */ scale(factor: number, { includeViewDistance }: ScalingOptions = {}) { - if ('props' in ActionData[this.type]) { - for (const [k, v] of Object.entries(ActionData[this.type].props)) { + if ('props' in this.$data) { + for (const [k, v] of Object.entries(this.$data.props)) { if ('scale' in v) { if (v.scale === ScaleCondition.True) { this[k] = anyValueMult(factor, this[k]) @@ -12155,8 +12334,8 @@ class DataAction implements IAction { * @param func A function used to remap color values. */ recolor(func: Recolor.RecolorFunction, context?: BasicConfig) { - if ('props' in ActionData[this.type]) { - for (const [k, v] of Object.entries(ActionData[this.type].props)) { + if ('props' in this.$data) { + for (const [k, v] of Object.entries(this.$data.props)) { if ('color' in v) { this.recolorProperty(k, func, context) } @@ -12166,8 +12345,8 @@ class DataAction implements IAction { } *#colors(): Generator { - if ('props' in ActionData[this.type]) { - for (const [k, v] of Object.entries(ActionData[this.type].props)) { + if ('props' in this.$data) { + for (const [k, v] of Object.entries(this.$data.props)) { if ('color' in v) { let prop: Vector4Value = this[k] if (Array.isArray(prop)) { @@ -12242,8 +12421,8 @@ class DataAction implements IAction { scaleRateOfTime(factor: number) { const inv = 1 / factor const sq = factor * factor - if ('props' in ActionData[this.type]) { - for (const [name, prop] of Object.entries(ActionData[this.type].props)) { + if ('props' in this.$data) { + for (const [name, prop] of Object.entries(this.$data.props)) { if ( this[name] instanceof SequenceProperty || this[name] instanceof ComponentSequenceProperty @@ -12278,8 +12457,8 @@ class DataAction implements IAction { } clone(): DataAction { - if ('props' in ActionData[this.type]) { - const props = Object.keys(ActionData[this.type].props).map(k => [ + if ('props' in this.$data) { + const props = Object.keys(this.$data.props).map(k => [ k, this[k] instanceof Property ? this[k].clone() : Array.isArray(this[k]) ? this[k].slice() : this[k] @@ -12454,7 +12633,6 @@ function ParticleMovement(params: ParticleMovementProps = {}) { */ class NodeAcceleration extends DataAction { declare readonly type: ActionType.NodeAcceleration - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the speed of the node along its Z-axis. * @@ -12506,7 +12684,7 @@ class NodeAcceleration extends DataAction { */ unk_ds3_f1_2: number constructor(props: Partial> = {}) { - super(ActionType.NodeAcceleration, {isAppearance:false,isParticle:false}) + super(ActionType.NodeAcceleration) this.assign(props) } } @@ -12519,7 +12697,6 @@ class NodeAcceleration extends DataAction { */ class NodeTranslation extends DataAction { declare readonly type: ActionType.NodeTranslation - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * An offset for the position of the node. * @@ -12535,7 +12712,7 @@ class NodeTranslation extends DataAction { */ unk_er_f1_0: number constructor(props: Partial> = {}) { - super(ActionType.NodeTranslation, {isAppearance:false,isParticle:false}) + super(ActionType.NodeTranslation) this.assign(props) } } @@ -12548,7 +12725,6 @@ class NodeTranslation extends DataAction { */ class NodeSpin extends DataAction { declare readonly type: ActionType.NodeSpin - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The node's angular speed around its local X-axis in degrees per second. * @@ -12613,7 +12789,7 @@ class NodeSpin extends DataAction { */ unk_ds3_f1_0: number constructor(props: Partial> = {}) { - super(ActionType.NodeSpin, {isAppearance:false,isParticle:false}) + super(ActionType.NodeSpin) this.assign(props) } } @@ -12626,7 +12802,6 @@ class NodeSpin extends DataAction { */ class StaticNodeTransform extends DataAction { declare readonly type: ActionType.StaticNodeTransform - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Translation of the node. * @@ -12640,7 +12815,7 @@ class StaticNodeTransform extends DataAction { */ rotation: Vector3 constructor(props: Partial> = {}) { - super(ActionType.StaticNodeTransform, {isAppearance:false,isParticle:false}) + super(ActionType.StaticNodeTransform) this.assign(props) } } @@ -12653,7 +12828,6 @@ class StaticNodeTransform extends DataAction { */ class RandomNodeTransform extends DataAction { declare readonly type: ActionType.RandomNodeTransform - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Translation of the node. * @@ -12679,7 +12853,7 @@ class RandomNodeTransform extends DataAction { */ rotationVariance: Vector3 constructor(props: Partial> = {}) { - super(ActionType.RandomNodeTransform, {isAppearance:false,isParticle:false}) + super(ActionType.RandomNodeTransform) this.assign(props) } } @@ -12692,7 +12866,6 @@ class RandomNodeTransform extends DataAction { */ class NodeAttachToCamera extends DataAction { declare readonly type: ActionType.NodeAttachToCamera - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Disable this to stop the node from following the rotation of the camera. * @@ -12706,7 +12879,7 @@ class NodeAttachToCamera extends DataAction { */ unk_ds3_f1_1: number constructor(props: Partial> = {}) { - super(ActionType.NodeAttachToCamera, {isAppearance:false,isParticle:false}) + super(ActionType.NodeAttachToCamera) this.assign(props) } } @@ -12719,7 +12892,6 @@ class NodeAttachToCamera extends DataAction { */ class ParticleAcceleration extends DataAction { declare readonly type: ActionType.ParticleAcceleration - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. * @@ -12759,7 +12931,7 @@ class ParticleAcceleration extends DataAction { */ unk_ds3_f1_1: number constructor(props: Partial> = {}) { - super(ActionType.ParticleAcceleration, {isAppearance:false,isParticle:false}) + super(ActionType.ParticleAcceleration) this.assign(props) } } @@ -12772,7 +12944,6 @@ class ParticleAcceleration extends DataAction { */ class ParticleSpeed extends DataAction { declare readonly type: ActionType.ParticleSpeed - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. * @@ -12812,7 +12983,7 @@ class ParticleSpeed extends DataAction { */ unk_ds3_f1_1: number constructor(props: Partial> = {}) { - super(ActionType.ParticleSpeed, {isAppearance:false,isParticle:false}) + super(ActionType.ParticleSpeed) this.assign(props) } } @@ -12825,7 +12996,6 @@ class ParticleSpeed extends DataAction { */ class ParticleSpeedRandomTurns extends DataAction { declare readonly type: ActionType.ParticleSpeedRandomTurns - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. * @@ -12877,7 +13047,7 @@ class ParticleSpeedRandomTurns extends DataAction { */ turnInterval: number constructor(props: Partial> = {}) { - super(ActionType.ParticleSpeedRandomTurns, {isAppearance:false,isParticle:false}) + super(ActionType.ParticleSpeedRandomTurns) this.assign(props) } } @@ -12890,7 +13060,6 @@ class ParticleSpeedRandomTurns extends DataAction { */ class ParticleSpeedPartialFollow extends DataAction { declare readonly type: ActionType.ParticleSpeedPartialFollow - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. * @@ -12959,7 +13128,7 @@ class ParticleSpeedPartialFollow extends DataAction { */ followRotation: boolean constructor(props: Partial> = {}) { - super(ActionType.ParticleSpeedPartialFollow, {isAppearance:false,isParticle:false}) + super(ActionType.ParticleSpeedPartialFollow) this.assign(props) } } @@ -12972,7 +13141,6 @@ class ParticleSpeedPartialFollow extends DataAction { */ class NodeSound extends DataAction { declare readonly type: ActionType.NodeSound - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The ID of the sound to play. * @@ -12996,7 +13164,7 @@ class NodeSound extends DataAction { */ repeat: boolean constructor(props: Partial> = {}) { - super(ActionType.NodeSound, {isAppearance:false,isParticle:false}) + super(ActionType.NodeSound) this.assign(props) } } @@ -13009,7 +13177,6 @@ class NodeSound extends DataAction { */ class EmissionSound extends DataAction { declare readonly type: ActionType.EmissionSound - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The ID of the sound to play. * @@ -13023,7 +13190,7 @@ class EmissionSound extends DataAction { */ unk_ds3_f1_1: number constructor(props: Partial> = {}) { - super(ActionType.EmissionSound, {isAppearance:false,isParticle:false}) + super(ActionType.EmissionSound) this.assign(props) } } @@ -13036,7 +13203,6 @@ class EmissionSound extends DataAction { */ class NodeAccelerationRandomTurns extends DataAction { declare readonly type: ActionType.NodeAccelerationRandomTurns - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the speed of the node along its Z-axis. * @@ -13096,7 +13262,7 @@ class NodeAccelerationRandomTurns extends DataAction { */ turnInterval: number constructor(props: Partial> = {}) { - super(ActionType.NodeAccelerationRandomTurns, {isAppearance:false,isParticle:false}) + super(ActionType.NodeAccelerationRandomTurns) this.assign(props) } } @@ -13109,7 +13275,6 @@ class NodeAccelerationRandomTurns extends DataAction { */ class ParticleAccelerationRandomTurns extends DataAction { declare readonly type: ActionType.ParticleAccelerationRandomTurns - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. * @@ -13161,7 +13326,7 @@ class ParticleAccelerationRandomTurns extends DataAction { */ turnInterval: number constructor(props: Partial> = {}) { - super(ActionType.ParticleAccelerationRandomTurns, {isAppearance:false,isParticle:false}) + super(ActionType.ParticleAccelerationRandomTurns) this.assign(props) } } @@ -13174,7 +13339,6 @@ class ParticleAccelerationRandomTurns extends DataAction { */ class ParticleAccelerationPartialFollow extends DataAction { declare readonly type: ActionType.ParticleAccelerationPartialFollow - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the acceleration of the particle along the global Y-axis. Positive values will make the particles go down, and negative values will go up. * @@ -13243,7 +13407,7 @@ class ParticleAccelerationPartialFollow extends DataAction { */ followRotation: boolean constructor(props: Partial> = {}) { - super(ActionType.ParticleAccelerationPartialFollow, {isAppearance:false,isParticle:false}) + super(ActionType.ParticleAccelerationPartialFollow) this.assign(props) } } @@ -13256,7 +13420,6 @@ class ParticleAccelerationPartialFollow extends DataAction { */ class NodeAccelerationPartialFollow extends DataAction { declare readonly type: ActionType.NodeAccelerationPartialFollow - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the speed of the node along its Z-axis. * @@ -13338,7 +13501,7 @@ class NodeAccelerationPartialFollow extends DataAction { */ followRotation: boolean constructor(props: Partial> = {}) { - super(ActionType.NodeAccelerationPartialFollow, {isAppearance:false,isParticle:false}) + super(ActionType.NodeAccelerationPartialFollow) this.assign(props) } } @@ -13351,7 +13514,6 @@ class NodeAccelerationPartialFollow extends DataAction { */ class NodeAccelerationSpin extends DataAction { declare readonly type: ActionType.NodeAccelerationSpin - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the speed of the node along its Z-axis. * @@ -13466,7 +13628,7 @@ class NodeAccelerationSpin extends DataAction { */ unk_ds3_f1_3: number constructor(props: Partial> = {}) { - super(ActionType.NodeAccelerationSpin, {isAppearance:false,isParticle:false}) + super(ActionType.NodeAccelerationSpin) this.assign(props) } } @@ -13479,7 +13641,6 @@ class NodeAccelerationSpin extends DataAction { */ class NodeSpeed extends DataAction { declare readonly type: ActionType.NodeSpeed - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the speed of the node along its Z-axis. * @@ -13523,7 +13684,7 @@ class NodeSpeed extends DataAction { */ unk_ds3_f1_2: number constructor(props: Partial> = {}) { - super(ActionType.NodeSpeed, {isAppearance:false,isParticle:false}) + super(ActionType.NodeSpeed) this.assign(props) } } @@ -13536,7 +13697,6 @@ class NodeSpeed extends DataAction { */ class NodeSpeedRandomTurns extends DataAction { declare readonly type: ActionType.NodeSpeedRandomTurns - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the speed of the node along its Z-axis. * @@ -13588,7 +13748,7 @@ class NodeSpeedRandomTurns extends DataAction { */ turnInterval: number constructor(props: Partial> = {}) { - super(ActionType.NodeSpeedRandomTurns, {isAppearance:false,isParticle:false}) + super(ActionType.NodeSpeedRandomTurns) this.assign(props) } } @@ -13601,7 +13761,6 @@ class NodeSpeedRandomTurns extends DataAction { */ class NodeSpeedPartialFollow extends DataAction { declare readonly type: ActionType.NodeSpeedPartialFollow - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the speed of the node along its Z-axis. * @@ -13672,7 +13831,7 @@ class NodeSpeedPartialFollow extends DataAction { */ followRotation: boolean constructor(props: Partial> = {}) { - super(ActionType.NodeSpeedPartialFollow, {isAppearance:false,isParticle:false}) + super(ActionType.NodeSpeedPartialFollow) this.assign(props) } } @@ -13685,7 +13844,6 @@ class NodeSpeedPartialFollow extends DataAction { */ class NodeSpeedSpin extends DataAction { declare readonly type: ActionType.NodeSpeedSpin - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the speed of the node along its Z-axis. * @@ -13792,7 +13950,7 @@ class NodeSpeedSpin extends DataAction { */ unk_ds3_f1_3: number constructor(props: Partial> = {}) { - super(ActionType.NodeSpeedSpin, {isAppearance:false,isParticle:false}) + super(ActionType.NodeSpeedSpin) this.assign(props) } } @@ -13805,7 +13963,6 @@ class NodeSpeedSpin extends DataAction { */ class NodeAttributes extends DataAction { declare readonly type: ActionType.NodeAttributes - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The node duration in seconds. Can be set to -1 to make the node last forever. * @@ -13843,7 +14000,7 @@ class NodeAttributes extends DataAction { */ depthBias: number constructor(props: Partial> = {}) { - super(ActionType.NodeAttributes, {isAppearance:false,isParticle:false}) + super(ActionType.NodeAttributes) this.assign(props) } } @@ -13856,7 +14013,6 @@ class NodeAttributes extends DataAction { */ class ParticleAttributes extends DataAction { declare readonly type: ActionType.ParticleAttributes - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The particle duration in seconds. Can be set to -1 to make particles last forever. * @@ -13872,7 +14028,7 @@ class ParticleAttributes extends DataAction { */ attachment: AttachMode constructor(props: Partial> = {}) { - super(ActionType.ParticleAttributes, {isAppearance:false,isParticle:false}) + super(ActionType.ParticleAttributes) this.assign(props) } } @@ -13885,7 +14041,6 @@ class ParticleAttributes extends DataAction { */ class Unk130 extends DataAction { declare readonly type: ActionType.Unk130 - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Unknown scalar. * @@ -13989,7 +14144,7 @@ class Unk130 extends DataAction { */ unk_ds3_f1_8: number constructor(props: Partial> = {}) { - super(ActionType.Unk130, {isAppearance:false,isParticle:false}) + super(ActionType.Unk130) this.assign(props) } } @@ -14004,7 +14159,6 @@ class Unk130 extends DataAction { */ class ParticleModifier extends DataAction { declare readonly type: ActionType.ParticleModifier - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the speed of the particles emitted from this node, but only if the config has an action in the {@link ActionSlots.ParticleMovementAction ParticleMovement slot} that enables acceleration of particles. The direction is the particle's {@link InitialDirection initial direction}. * @@ -14065,7 +14219,7 @@ class ParticleModifier extends DataAction { */ uniformScale: boolean constructor(props: Partial> = {}) { - super(ActionType.ParticleModifier, {isAppearance:false,isParticle:false}) + super(ActionType.ParticleModifier) this.assign(props) } } @@ -14078,7 +14232,6 @@ class ParticleModifier extends DataAction { */ class SFXReference extends DataAction { declare readonly type: ActionType.SFXReference - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The ID of the referenced SFX. * @@ -14091,7 +14244,7 @@ class SFXReference extends DataAction { * **Default**: `0` */ constructor(sfx: number = 0) { - super(ActionType.SFXReference, {isAppearance:false,isParticle:false}) + super(ActionType.SFXReference) this.assign({ sfx }) } } @@ -14104,7 +14257,6 @@ class SFXReference extends DataAction { */ class LevelsOfDetailThresholds extends DataAction { declare readonly type: ActionType.LevelsOfDetailThresholds - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The node duration in seconds. Can be set to -1 to make the node last forever. * @@ -14150,7 +14302,7 @@ class LevelsOfDetailThresholds extends DataAction { */ unk_ac6_f1_5: number constructor(props: Partial> = {}) { - super(ActionType.LevelsOfDetailThresholds, {isAppearance:false,isParticle:false}) + super(ActionType.LevelsOfDetailThresholds) this.assign(props) } } @@ -14163,7 +14315,6 @@ class LevelsOfDetailThresholds extends DataAction { */ class StateConfigMap extends DataAction { declare readonly type: ActionType.StateConfigMap - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * A list of config indices. * @@ -14180,7 +14331,7 @@ class StateConfigMap extends DataAction { * **Default**: `[0]` */ constructor(configIndices: number[] = [0]) { - super(ActionType.StateConfigMap, {isAppearance:false,isParticle:false}) + super(ActionType.StateConfigMap) this.assign({ configIndices }) } } @@ -14193,10 +14344,9 @@ class StateConfigMap extends DataAction { */ class SelectAllNodes extends DataAction { declare readonly type: ActionType.SelectAllNodes - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} constructor() { - super(ActionType.SelectAllNodes, {isAppearance:false,isParticle:false}) + super(ActionType.SelectAllNodes) } } @@ -14208,7 +14358,6 @@ class SelectAllNodes extends DataAction { */ class SelectRandomNode extends DataAction { declare readonly type: ActionType.SelectRandomNode - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Probability weights for each child node to be selected for emission. * @@ -14225,7 +14374,7 @@ class SelectRandomNode extends DataAction { * **Default**: `[1]` */ constructor(weights: number[] = [1]) { - super(ActionType.SelectRandomNode, {isAppearance:false,isParticle:false}) + super(ActionType.SelectRandomNode) this.assign({ weights }) } } @@ -14238,7 +14387,6 @@ class SelectRandomNode extends DataAction { */ class PeriodicEmitter extends DataAction { declare readonly type: ActionType.PeriodicEmitter - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Time between emitting new particles in seconds. * @@ -14278,7 +14426,7 @@ class PeriodicEmitter extends DataAction { */ unk_ds3_f1_1: number constructor(props: Partial> = {}) { - super(ActionType.PeriodicEmitter, {isAppearance:false,isParticle:false}) + super(ActionType.PeriodicEmitter) this.assign(props) } } @@ -14291,7 +14439,6 @@ class PeriodicEmitter extends DataAction { */ class EqualDistanceEmitter extends DataAction { declare readonly type: ActionType.EqualDistanceEmitter - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * How much the emitter must move to trigger emission. * @@ -14333,7 +14480,7 @@ class EqualDistanceEmitter extends DataAction { */ unk_sdt_f1_1: number constructor(props: Partial> = {}) { - super(ActionType.EqualDistanceEmitter, {isAppearance:false,isParticle:false}) + super(ActionType.EqualDistanceEmitter) this.assign(props) } } @@ -14346,10 +14493,9 @@ class EqualDistanceEmitter extends DataAction { */ class OneTimeEmitter extends DataAction { declare readonly type: ActionType.OneTimeEmitter - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} constructor() { - super(ActionType.OneTimeEmitter, {isAppearance:false,isParticle:false}) + super(ActionType.OneTimeEmitter) } } @@ -14361,7 +14507,6 @@ class OneTimeEmitter extends DataAction { */ class PointEmitterShape extends DataAction { declare readonly type: ActionType.PointEmitterShape - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls the initial direction for particles. See {@link InitialDirection} for more information. * @@ -14374,7 +14519,7 @@ class PointEmitterShape extends DataAction { * **Default**: {@link InitialDirection.Emitter} */ constructor(direction: InitialDirection = InitialDirection.Emitter) { - super(ActionType.PointEmitterShape, {isAppearance:false,isParticle:false}) + super(ActionType.PointEmitterShape) this.assign({ direction }) } } @@ -14387,7 +14532,6 @@ class PointEmitterShape extends DataAction { */ class DiskEmitterShape extends DataAction { declare readonly type: ActionType.DiskEmitterShape - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Radius of the disk. * @@ -14415,7 +14559,7 @@ class DiskEmitterShape extends DataAction { */ direction: InitialDirection constructor(props: Partial> = {}) { - super(ActionType.DiskEmitterShape, {isAppearance:false,isParticle:false}) + super(ActionType.DiskEmitterShape) this.assign(props) } } @@ -14428,7 +14572,6 @@ class DiskEmitterShape extends DataAction { */ class RectangleEmitterShape extends DataAction { declare readonly type: ActionType.RectangleEmitterShape - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Width of the rectangle. * @@ -14464,7 +14607,7 @@ class RectangleEmitterShape extends DataAction { */ direction: InitialDirection constructor(props: Partial> = {}) { - super(ActionType.RectangleEmitterShape, {isAppearance:false,isParticle:false}) + super(ActionType.RectangleEmitterShape) this.assign(props) } } @@ -14477,7 +14620,6 @@ class RectangleEmitterShape extends DataAction { */ class SphereEmitterShape extends DataAction { declare readonly type: ActionType.SphereEmitterShape - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Radius of the sphere. * @@ -14493,7 +14635,7 @@ class SphereEmitterShape extends DataAction { */ emitInside: boolean constructor(props: Partial> = {}) { - super(ActionType.SphereEmitterShape, {isAppearance:false,isParticle:false}) + super(ActionType.SphereEmitterShape) this.assign(props) } } @@ -14506,7 +14648,6 @@ class SphereEmitterShape extends DataAction { */ class BoxEmitterShape extends DataAction { declare readonly type: ActionType.BoxEmitterShape - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Width of the cuboid. * @@ -14544,7 +14685,7 @@ class BoxEmitterShape extends DataAction { */ emitInside: boolean constructor(props: Partial> = {}) { - super(ActionType.BoxEmitterShape, {isAppearance:false,isParticle:false}) + super(ActionType.BoxEmitterShape) this.assign(props) } } @@ -14557,7 +14698,6 @@ class BoxEmitterShape extends DataAction { */ class CylinderEmitterShape extends DataAction { declare readonly type: ActionType.CylinderEmitterShape - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The radius of the cylinder. * @@ -14593,7 +14733,7 @@ class CylinderEmitterShape extends DataAction { */ yAxis: boolean constructor(props: Partial> = {}) { - super(ActionType.CylinderEmitterShape, {isAppearance:false,isParticle:false}) + super(ActionType.CylinderEmitterShape) this.assign(props) } } @@ -14606,10 +14746,9 @@ class CylinderEmitterShape extends DataAction { */ class NoSpread extends DataAction { declare readonly type: ActionType.NoSpread - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} constructor() { - super(ActionType.NoSpread, {isAppearance:false,isParticle:false}) + super(ActionType.NoSpread) } } @@ -14621,7 +14760,6 @@ class NoSpread extends DataAction { */ class CircularSpread extends DataAction { declare readonly type: ActionType.CircularSpread - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The maximum change in direction in degrees, the angle of the cone. * @@ -14650,7 +14788,7 @@ class CircularSpread extends DataAction { */ unk_er_f1_0: boolean constructor(props: Partial> = {}) { - super(ActionType.CircularSpread, {isAppearance:false,isParticle:false}) + super(ActionType.CircularSpread) this.assign(props) } } @@ -14663,7 +14801,6 @@ class CircularSpread extends DataAction { */ class EllipticalSpread extends DataAction { declare readonly type: ActionType.EllipticalSpread - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The maximum change in direction in degrees, one of the angles of the elliptical cone. * @@ -14706,7 +14843,7 @@ class EllipticalSpread extends DataAction { */ unk_er_f1_0: boolean constructor(props: Partial> = {}) { - super(ActionType.EllipticalSpread, {isAppearance:false,isParticle:false}) + super(ActionType.EllipticalSpread) this.assign(props) } } @@ -14719,7 +14856,6 @@ class EllipticalSpread extends DataAction { */ class RectangularSpread extends DataAction { declare readonly type: ActionType.RectangularSpread - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The maximum change in direction in degrees, one of the angles of the elliptical cone. * @@ -14756,7 +14892,7 @@ class RectangularSpread extends DataAction { */ distribution: ScalarValue constructor(props: Partial> = {}) { - super(ActionType.RectangularSpread, {isAppearance:false,isParticle:false}) + super(ActionType.RectangularSpread) this.assign(props) } } @@ -14769,7 +14905,6 @@ class RectangularSpread extends DataAction { */ class PointSprite extends DataAction { declare readonly type: ActionType.PointSprite - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Texture ID. * @@ -15211,7 +15346,7 @@ class PointSprite extends DataAction { */ unk_er_f2_39: number constructor(props: Partial> = {}) { - super(ActionType.PointSprite, {isAppearance:true,isParticle:true}) + super(ActionType.PointSprite) this.assign(props) } } @@ -15224,7 +15359,6 @@ class PointSprite extends DataAction { */ class Line extends DataAction { declare readonly type: ActionType.Line - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Blend mode. * @@ -15697,7 +15831,7 @@ class Line extends DataAction { */ unk_sdt_f2_39: number constructor(props: Partial> = {}) { - super(ActionType.Line, {isAppearance:true,isParticle:true}) + super(ActionType.Line) this.assign(props) } } @@ -15710,7 +15844,6 @@ class Line extends DataAction { */ class QuadLine extends DataAction { declare readonly type: ActionType.QuadLine - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Blend mode. * @@ -16200,7 +16333,7 @@ class QuadLine extends DataAction { */ unk_sdt_f2_39: number constructor(props: Partial> = {}) { - super(ActionType.QuadLine, {isAppearance:true,isParticle:true}) + super(ActionType.QuadLine) this.assign(props) } } @@ -16213,7 +16346,6 @@ class QuadLine extends DataAction { */ class BillboardEx extends DataAction { declare readonly type: ActionType.BillboardEx - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Texture ID. * @@ -17009,7 +17141,7 @@ class BillboardEx extends DataAction { */ unk_ac6_f2_45: number constructor(props: Partial> = {}) { - super(ActionType.BillboardEx, {isAppearance:true,isParticle:true}) + super(ActionType.BillboardEx) this.assign(props) } } @@ -17022,7 +17154,6 @@ class BillboardEx extends DataAction { */ class MultiTextureBillboardEx extends DataAction { declare readonly type: ActionType.MultiTextureBillboardEx - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Blend mode. * @@ -17937,7 +18068,7 @@ class MultiTextureBillboardEx extends DataAction { */ unk_ac6_f2_46: number constructor(props: Partial> = {}) { - super(ActionType.MultiTextureBillboardEx, {isAppearance:true,isParticle:true}) + super(ActionType.MultiTextureBillboardEx) this.assign(props) } } @@ -17952,7 +18083,6 @@ class MultiTextureBillboardEx extends DataAction { */ class Model extends DataAction { declare readonly type: ActionType.Model - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Model ID. * @@ -18768,7 +18898,7 @@ class Model extends DataAction { */ unk_ds3_f2_28: number constructor(props: Partial> = {}) { - super(ActionType.Model, {isAppearance:true,isParticle:true}) + super(ActionType.Model) this.assign(props) } } @@ -18781,7 +18911,6 @@ class Model extends DataAction { */ class Tracer extends DataAction { declare readonly type: ActionType.Tracer - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Texture ID. * @@ -19404,7 +19533,7 @@ class Tracer extends DataAction { */ unk_er_f2_39: number constructor(props: Partial> = {}) { - super(ActionType.Tracer, {isAppearance:true,isParticle:true}) + super(ActionType.Tracer) this.assign(props) } } @@ -19419,7 +19548,6 @@ class Tracer extends DataAction { */ class Distortion extends DataAction { declare readonly type: ActionType.Distortion - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Blend mode. * @@ -20030,7 +20158,7 @@ class Distortion extends DataAction { */ unk_sdt_f2_38: number constructor(props: Partial> = {}) { - super(ActionType.Distortion, {isAppearance:true,isParticle:true}) + super(ActionType.Distortion) this.assign(props) } } @@ -20045,7 +20173,6 @@ class Distortion extends DataAction { */ class RadialBlur extends DataAction { declare readonly type: ActionType.RadialBlur - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Blend mode. * @@ -20459,7 +20586,7 @@ class RadialBlur extends DataAction { */ unk_sdt_f2_30: number constructor(props: Partial> = {}) { - super(ActionType.RadialBlur, {isAppearance:true,isParticle:true}) + super(ActionType.RadialBlur) this.assign(props) } } @@ -20472,7 +20599,6 @@ class RadialBlur extends DataAction { */ class PointLight extends DataAction { declare readonly type: ActionType.PointLight - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * Controls the diffuse color of the light. * @@ -20886,7 +21012,7 @@ class PointLight extends DataAction { */ unk_ds3_f2_12: number constructor(props: Partial> = {}) { - super(ActionType.PointLight, {isAppearance:true,isParticle:false}) + super(ActionType.PointLight) this.assign(props) } } @@ -20901,10 +21027,9 @@ class PointLight extends DataAction { */ class SimulateTermination extends DataAction { declare readonly type: ActionType.SimulateTermination - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} constructor() { - super(ActionType.SimulateTermination, {isAppearance:false,isParticle:false}) + super(ActionType.SimulateTermination) } } @@ -20918,7 +21043,6 @@ class SimulateTermination extends DataAction { */ class FadeTermination extends DataAction { declare readonly type: ActionType.FadeTermination - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The duration of the fade out in seconds. * @@ -20935,7 +21059,7 @@ class FadeTermination extends DataAction { * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ constructor(duration: ScalarValue = 1) { - super(ActionType.FadeTermination, {isAppearance:false,isParticle:false}) + super(ActionType.FadeTermination) this.assign({ duration }) } } @@ -20950,10 +21074,9 @@ class FadeTermination extends DataAction { */ class InstantTermination extends DataAction { declare readonly type: ActionType.InstantTermination - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} constructor() { - super(ActionType.InstantTermination, {isAppearance:false,isParticle:false}) + super(ActionType.InstantTermination) } } @@ -20970,7 +21093,6 @@ class InstantTermination extends DataAction { */ class NodeForceSpeed extends DataAction { declare readonly type: ActionType.NodeForceSpeed - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The speed in the direction of the force. * @@ -20994,7 +21116,7 @@ class NodeForceSpeed extends DataAction { */ unk_sdt_f1_0: number constructor(props: Partial> = {}) { - super(ActionType.NodeForceSpeed, {isAppearance:false,isParticle:false}) + super(ActionType.NodeForceSpeed) this.assign(props) } } @@ -21012,7 +21134,6 @@ class NodeForceSpeed extends DataAction { */ class ParticleForceSpeed extends DataAction { declare readonly type: ActionType.ParticleForceSpeed - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The speed in the direction of the force. * @@ -21042,7 +21163,7 @@ class ParticleForceSpeed extends DataAction { */ unk_sdt_f1_1: number constructor(props: Partial> = {}) { - super(ActionType.ParticleForceSpeed, {isAppearance:false,isParticle:false}) + super(ActionType.ParticleForceSpeed) this.assign(props) } } @@ -21060,7 +21181,6 @@ class ParticleForceSpeed extends DataAction { */ class NodeForceAcceleration extends DataAction { declare readonly type: ActionType.NodeForceAcceleration - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The acceleration in the direction of the force. * @@ -21084,7 +21204,7 @@ class NodeForceAcceleration extends DataAction { */ unk_sdt_f1_0: number constructor(props: Partial> = {}) { - super(ActionType.NodeForceAcceleration, {isAppearance:false,isParticle:false}) + super(ActionType.NodeForceAcceleration) this.assign(props) } } @@ -21102,7 +21222,6 @@ class NodeForceAcceleration extends DataAction { */ class ParticleForceAcceleration extends DataAction { declare readonly type: ActionType.ParticleForceAcceleration - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The acceleration in the direction of the force. * @@ -21132,7 +21251,7 @@ class ParticleForceAcceleration extends DataAction { */ unk_sdt_f1_1: number constructor(props: Partial> = {}) { - super(ActionType.ParticleForceAcceleration, {isAppearance:false,isParticle:false}) + super(ActionType.ParticleForceAcceleration) this.assign(props) } } @@ -21149,7 +21268,6 @@ class ParticleForceAcceleration extends DataAction { */ class ParticleForceCollision extends DataAction { declare readonly type: ActionType.ParticleForceCollision - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The collision radius of the particles. This controls the maximum distance between the particles and a surface they can collide with for a collision to be detected. * @@ -21181,7 +21299,7 @@ class ParticleForceCollision extends DataAction { */ bounciness: number constructor(props: Partial> = {}) { - super(ActionType.ParticleForceCollision, {isAppearance:false,isParticle:false}) + super(ActionType.ParticleForceCollision) this.assign(props) } } @@ -21198,7 +21316,6 @@ class ParticleForceCollision extends DataAction { */ class GPUStandardParticle extends DataAction { declare readonly type: ActionType.GPUStandardParticle - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * Controls how well the particles follow the node if it moves. * @@ -22620,7 +22737,7 @@ class GPUStandardParticle extends DataAction { */ unk_er_f2_39: number constructor(props: Partial> = {}) { - super(ActionType.GPUStandardParticle, {isAppearance:true,isParticle:false}) + super(ActionType.GPUStandardParticle) this.assign(props) } } @@ -22637,7 +22754,6 @@ class GPUStandardParticle extends DataAction { */ class GPUStandardCorrectParticle extends DataAction { declare readonly type: ActionType.GPUStandardCorrectParticle - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * Controls how well the particles follow the node if it moves. * @@ -24053,7 +24169,7 @@ class GPUStandardCorrectParticle extends DataAction { */ unk_er_f2_39: number constructor(props: Partial> = {}) { - super(ActionType.GPUStandardCorrectParticle, {isAppearance:true,isParticle:false}) + super(ActionType.GPUStandardCorrectParticle) this.assign(props) } } @@ -24066,7 +24182,6 @@ class GPUStandardCorrectParticle extends DataAction { */ class LightShaft extends DataAction { declare readonly type: ActionType.LightShaft - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * Unknown scalar. * @@ -24308,7 +24423,7 @@ class LightShaft extends DataAction { */ unk_ds3_f1_29: number constructor(props: Partial> = {}) { - super(ActionType.LightShaft, {isAppearance:true,isParticle:false}) + super(ActionType.LightShaft) this.assign(props) } } @@ -24327,7 +24442,6 @@ class LightShaft extends DataAction { */ class GPUSparkParticle extends DataAction { declare readonly type: ActionType.GPUSparkParticle - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * Controls how well the particles follow the node if it moves. * @@ -25308,7 +25422,7 @@ class GPUSparkParticle extends DataAction { */ unk_ac6_f2_39: number constructor(props: Partial> = {}) { - super(ActionType.GPUSparkParticle, {isAppearance:true,isParticle:false}) + super(ActionType.GPUSparkParticle) this.assign(props) } } @@ -25328,7 +25442,6 @@ class GPUSparkParticle extends DataAction { */ class GPUSparkCorrectParticle extends DataAction { declare readonly type: ActionType.GPUSparkCorrectParticle - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * Controls how well the particles follow the node if it moves. * @@ -26309,7 +26422,7 @@ class GPUSparkCorrectParticle extends DataAction { */ unk_ac6_f2_39: number constructor(props: Partial> = {}) { - super(ActionType.GPUSparkCorrectParticle, {isAppearance:true,isParticle:false}) + super(ActionType.GPUSparkCorrectParticle) this.assign(props) } } @@ -26324,7 +26437,6 @@ class GPUSparkCorrectParticle extends DataAction { */ class DynamicTracer extends DataAction { declare readonly type: ActionType.DynamicTracer - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Texture ID. * @@ -26989,7 +27101,7 @@ class DynamicTracer extends DataAction { */ unk_ac6_f2_41: number constructor(props: Partial> = {}) { - super(ActionType.DynamicTracer, {isAppearance:true,isParticle:true}) + super(ActionType.DynamicTracer) this.assign(props) } } @@ -27002,7 +27114,6 @@ class DynamicTracer extends DataAction { */ class WaterInteraction extends DataAction { declare readonly type: ActionType.WaterInteraction - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * The ID for a texture that controls the shape of the interaction. * @@ -27034,7 +27145,7 @@ class WaterInteraction extends DataAction { */ duration: number constructor(props: Partial> = {}) { - super(ActionType.WaterInteraction, {isAppearance:true,isParticle:false}) + super(ActionType.WaterInteraction) this.assign(props) } } @@ -27047,7 +27158,6 @@ class WaterInteraction extends DataAction { */ class LensFlare extends DataAction { declare readonly type: ActionType.LensFlare - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * Layer 1 width. * @@ -27807,7 +27917,7 @@ class LensFlare extends DataAction { */ unk_er_f2_36: number constructor(props: Partial> = {}) { - super(ActionType.LensFlare, {isAppearance:true,isParticle:false}) + super(ActionType.LensFlare) this.assign(props) } } @@ -27822,7 +27932,6 @@ class LensFlare extends DataAction { */ class RichModel extends DataAction { declare readonly type: ActionType.RichModel - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Model ID. * @@ -28668,7 +28777,7 @@ class RichModel extends DataAction { */ unk_er_f2_37: number constructor(props: Partial> = {}) { - super(ActionType.RichModel, {isAppearance:true,isParticle:true}) + super(ActionType.RichModel) this.assign(props) } } @@ -28681,7 +28790,6 @@ class RichModel extends DataAction { */ class Unk10100 extends DataAction { declare readonly type: ActionType.Unk10100 - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Unknown integer. * @@ -29019,7 +29127,7 @@ class Unk10100 extends DataAction { */ unk_ds3_f1_55: number constructor(props: Partial> = {}) { - super(ActionType.Unk10100, {isAppearance:false,isParticle:false}) + super(ActionType.Unk10100) this.assign(props) } } @@ -29037,7 +29145,6 @@ class Unk10100 extends DataAction { */ class CancelForce extends DataAction { declare readonly type: ActionType.CancelForce - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * The shape of the volume. * @@ -29112,7 +29219,7 @@ class CancelForce extends DataAction { */ squarePrismApothem: number constructor(props: Partial> = {}) { - super(ActionType.CancelForce, {isAppearance:true,isParticle:false}) + super(ActionType.CancelForce) this.assign(props) } } @@ -29127,7 +29234,6 @@ class CancelForce extends DataAction { */ class WindForce extends DataAction { declare readonly type: ActionType.WindForce - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * The strength of the force applied in the volume. * @@ -29558,7 +29664,7 @@ class WindForce extends DataAction { */ unk_ds3_f1_43: number constructor(props: Partial> = {}) { - super(ActionType.WindForce, {isAppearance:true,isParticle:false}) + super(ActionType.WindForce) this.assign(props) } } @@ -29573,7 +29679,6 @@ class WindForce extends DataAction { */ class GravityForce extends DataAction { declare readonly type: ActionType.GravityForce - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * The strength of the force applied in the volume. * @@ -29862,7 +29967,7 @@ class GravityForce extends DataAction { */ fadeOutTime: number constructor(props: Partial> = {}) { - super(ActionType.GravityForce, {isAppearance:true,isParticle:false}) + super(ActionType.GravityForce) this.assign(props) } } @@ -29877,7 +29982,6 @@ class GravityForce extends DataAction { */ class ForceCollision extends DataAction { declare readonly type: ActionType.ForceCollision - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * The shape of the volume. * @@ -29933,7 +30037,7 @@ class ForceCollision extends DataAction { */ cylinderRadius: number constructor(props: Partial> = {}) { - super(ActionType.ForceCollision, {isAppearance:true,isParticle:false}) + super(ActionType.ForceCollision) this.assign(props) } } @@ -29948,7 +30052,6 @@ class ForceCollision extends DataAction { */ class TurbulenceForce extends DataAction { declare readonly type: ActionType.TurbulenceForce - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * Offset along the X-axis for the 3D noise used to control the strength and direction of the force in the volume. * @@ -30345,7 +30448,7 @@ class TurbulenceForce extends DataAction { */ unk_unk_f1_51: number constructor(props: Partial> = {}) { - super(ActionType.TurbulenceForce, {isAppearance:true,isParticle:false}) + super(ActionType.TurbulenceForce) this.assign(props) } } @@ -30358,7 +30461,6 @@ class TurbulenceForce extends DataAction { */ class Unk10400 extends DataAction { declare readonly type: ActionType.Unk10400 - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Unknown integer. * @@ -30750,7 +30852,7 @@ class Unk10400 extends DataAction { */ unk_ds3_f1_64: number constructor(props: Partial> = {}) { - super(ActionType.Unk10400, {isAppearance:false,isParticle:false}) + super(ActionType.Unk10400) this.assign(props) } } @@ -30763,7 +30865,6 @@ class Unk10400 extends DataAction { */ class Unk10500 extends DataAction { declare readonly type: ActionType.Unk10500 - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Controls how fast time passes for the entire effect. * @@ -30837,7 +30938,7 @@ class Unk10500 extends DataAction { */ unk_sdt_f1_9: number constructor(props: Partial> = {}) { - super(ActionType.Unk10500, {isAppearance:false,isParticle:false}) + super(ActionType.Unk10500) this.assign(props) } } @@ -30850,7 +30951,6 @@ class Unk10500 extends DataAction { */ class SpotLight extends DataAction { declare readonly type: ActionType.SpotLight - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * Controls the diffuse color of the light. * @@ -31207,7 +31307,7 @@ class SpotLight extends DataAction { */ unk_ds3_f1_8: number constructor(props: Partial> = {}) { - super(ActionType.SpotLight, {isAppearance:true,isParticle:false}) + super(ActionType.SpotLight) this.assign(props) } } @@ -33562,7 +33662,7 @@ namespace Recolor { * @param property A property name from the {@link action}. */ export function isPrimary(action: T, property: keyof T): boolean { - return ActionData[action.type]?.props?.[property]?.color === 1 + return action.$data.props?.[property]?.color === 1 } /** @@ -34596,7 +34696,7 @@ namespace FXRUtility { if (config instanceof NodeEmitterConfig || ( config instanceof BasicConfig && config.appearance instanceof DataAction && - config.appearance.meta.isParticle + config.appearance.$data.isParticle )) { const emShape = config.emitterShape if (emShape instanceof DiskEmitterShape) { From fb4686e06210f3d6a5642f0ac964366a463e768d Mon Sep 17 00:00:00 2001 From: Even Torset Date: Thu, 5 Dec 2024 00:12:36 +0100 Subject: [PATCH 30/31] Fixed writing data actions not working after the previous commit. --- src/fxr.ts | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/fxr.ts b/src/fxr.ts index 20b20e1..59a12cd 100644 --- a/src/fxr.ts +++ b/src/fxr.ts @@ -6312,8 +6312,8 @@ function writeDataAction(action: DataAction, bw: BinaryWriter, game: Game, actio function writeDataActionProperties(action: DataAction, bw: BinaryWriter, game: Game, index: number, properties: IModifiableProperty[]) { const conProps = bw.convertedDataActions.get(action) - const properties1: AnyProperty[] = action.getProperties.call(conProps, game, 'properties1') - const properties2: AnyProperty[] = action.getProperties.call(conProps, game, 'properties2') + const properties1: AnyProperty[] = action.getProperties(game, 'properties1', conProps) + const properties2: AnyProperty[] = action.getProperties(game, 'properties2', conProps) bw.fill(`ActionPropertiesOffset${index}`, bw.position) for (const property of properties1) { writeProperty(property, bw, game, properties, false) @@ -6332,8 +6332,8 @@ function writeDataActionSection10s(action: DataAction, bw: BinaryWriter, game: G function writeDataActionFields(action: DataAction, bw: BinaryWriter, game: Game, index: number): number { const conProps = bw.convertedDataActions.get(action) - const fields1: Field[] = action.getFields.call(conProps, game, 'fields1') - const fields2: Field[] = action.getFields.call(conProps, game, 'fields2') + const fields1: Field[] = action.getFields(game, 'fields1', conProps) + const fields2: Field[] = action.getFields(game, 'fields2', conProps) if (fields1.length + fields2.length === 0) { bw.fill(`ActionFieldsOffset${index}`, 0) return 0 @@ -12180,32 +12180,34 @@ class DataAction implements IAction { return minified } - getFields(game: Game, list: 'fields1' | 'fields2'): Field[] { + getFields(game: Game, list: 'fields1' | 'fields2', props: Props = this): Field[] { const data = getActionGameData(this.type, game) + const ade = this.$data return data[list].map((name: string) => { - const prop = this.$data.props[name] - validateDataActionProp(this, name, prop) + const prop = ade.props[name] + validateDataActionProp(props, name, prop) return Field.from( typeof prop.field === 'number' ? prop.field : prop.field[game], - this[name] instanceof Property ? this[name].valueAt(0) : this[name] + props[name] instanceof Property ? props[name].valueAt(0) : props[name] ) }) } - getProperties(game: Game, list: 'properties1' | 'properties2'): AnyProperty[] { + getProperties(game: Game, list: 'properties1' | 'properties2', props: Props = this): AnyProperty[] { const data = getActionGameData(this.type, game) + const ade = this.$data return (data[list] ?? []).map((name: string) => { - const prop = this.$data.props[name] - validateDataActionProp(this, name, prop) - return this[name] instanceof Property ? this[name].for(game) : Array.isArray(prop.default) ? - new ConstantProperty(...this[name]).for(game) : - new ConstantProperty(this[name]).for(game) + const prop = ade.props[name] + validateDataActionProp(props, name, prop) + return props[name] instanceof Property ? props[name].for(game) : Array.isArray(prop.default) ? + new ConstantProperty(...props[name]).for(game) : + new ConstantProperty(props[name]).for(game) }) } - getSection10s(game: Game): number[][] { + getSection10s(game: Game, props: Props = this): number[][] { const data = getActionGameData(this.type, game) - return (data.section10s ?? []).map((name: string) => this[name]) + return (data.section10s ?? []).map((name: string) => props[name]) } toAction(game: Game) { @@ -12214,11 +12216,11 @@ class DataAction implements IAction { this return new Action( this.type, - this.getFields.call(convertedProps, game, 'fields1'), - this.getFields.call(convertedProps, game, 'fields2'), - this.getProperties.call(convertedProps, game, 'properties1'), - this.getProperties.call(convertedProps, game, 'properties2'), - this.getSection10s.call(convertedProps, game) + this.getFields(game, 'fields1', convertedProps), + this.getFields(game, 'fields2', convertedProps), + this.getProperties(game, 'properties1', convertedProps), + this.getProperties(game, 'properties2', convertedProps), + this.getSection10s(game, convertedProps) ) } From 2fe36962974ebcd6ce50c219cc0ecdded42108ca Mon Sep 17 00:00:00 2001 From: Even Torset Date: Thu, 5 Dec 2024 00:33:59 +0100 Subject: [PATCH 31/31] 18.0.0 --- CHANGELOG.md | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22201c1..c9628a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [Unreleased] +## [18.0.0] - 2024-12-05 - Updated action 604 with new names and documentation for all of the layer-specific properties and fields. - `mask` is now `layer1`, and the old `layer1` and `layer2` fields are now `layer2` and `layer3` respectively. @@ -284,7 +284,7 @@ If you need to update your scripts, here's a table of things to find and replace - External values 2000 and 70200 for AC6 have been documented thanks to lugia19. - Fixed action 301 (EqualDistanceEmitter) missing a type for one of its fields, potentially causing issues when writing to DS3's structure. -[Unreleased]: https://github.com/EvenTorset/fxr/compare/v17.0.0...HEAD +[18.0.0]: https://github.com/EvenTorset/fxr/compare/v17.0.0...v18.0.0 [17.0.0]: https://github.com/EvenTorset/fxr/compare/v16.0.0...v17.0.0 [16.0.0]: https://github.com/EvenTorset/fxr/compare/v15.2.0...v16.0.0 [15.2.0]: https://github.com/EvenTorset/fxr/compare/v15.1.0...v15.2.0 diff --git a/package-lock.json b/package-lock.json index 481672e..68b0fb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@cccode/fxr", - "version": "17.0.0", + "version": "18.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@cccode/fxr", - "version": "17.0.0", + "version": "18.0.0", "license": "Unlicense", "devDependencies": { "@types/node": "^22.9.0", diff --git a/package.json b/package.json index d281d07..93a97c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@cccode/fxr", - "version": "17.0.0", + "version": "18.0.0", "description": "JavaScript library for creating and editing FXR files for Dark Souls 3, Sekiro, Elden Ring, and Armored Core 6.", "author": "CCCode", "type": "module",