diff --git a/CHANGELOG.md b/CHANGELOG.md index e757de9..c9628a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,62 @@ # Changelog +## [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. + - 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` +- 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. +- 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. + - 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. + - 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 `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. + - 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. +- `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. + ## [17.0.0] - 2024-11-12 - Named and documented three actions: @@ -227,6 +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. +[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/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/build/build.js b/build/build.js index e86859b..f7d4620 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 = { @@ -70,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) @@ -108,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}}` @@ -130,6 +142,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 = [] @@ -211,11 +237,13 @@ 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)}${ - 'field' in v ? `, field: ${fieldMap[v.field]}` : '' + 'field' in v ? `, field: ${fieldData(v.field)}` : '' }${ 'resource' in v ? `, resource: ${resourceMap[v.resource]}` : '' }${ @@ -225,7 +253,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` : '' }${ @@ -256,42 +284,13 @@ 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) { 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 ?? typeMap[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 ? ` @@ -301,26 +300,28 @@ 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 ( - '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 ?? typeMap[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]} ${ @@ -340,10 +341,12 @@ 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.length > 1 ? `props: Partial> = {}` : + `${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 ? ` + super(ActionType.${data.name})${'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/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, diff --git a/package-lock.json b/package-lock.json index 74ba9e5..68b0fb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,62 +1,91 @@ { "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.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.27.2", + "typedoc-github-theme": "^0.2.0", + "typescript": "^5.7.2", + "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": "*" } }, "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.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": { "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", @@ -147,6 +176,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 +188,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 +441,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", @@ -602,28 +634,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" @@ -632,14 +654,28 @@ "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": { + "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.27.1" } }, "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" @@ -665,10 +701,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", @@ -709,9 +746,9 @@ } }, "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, "bin": { "yaml": "bin.mjs" diff --git a/package.json b/package.json index 0d04014..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", @@ -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.27.2", + "typedoc-github-theme": "^0.2.0", + "typescript": "^5.7.2", + "yaml": "^2.6.0" } } diff --git a/src/actions/10000.yml b/src/actions/10000.yml index aa2f11e..2065519 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. @@ -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 @@ -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 8ef3939..80d4f3b 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. @@ -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 @@ -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/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 a05c337..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. @@ -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..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. @@ -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..b0344c0 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. @@ -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 @@ -295,7 +297,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 +311,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 +327,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 +341,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 +357,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 +369,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 +393,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ds3_f2_27: field: int default: 1 @@ -399,7 +401,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/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 0c0bcd6..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. @@ -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 @@ -474,7 +476,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 +490,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 +506,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 +520,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 +536,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 +548,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 +572,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_er_f2_27: field: int unk_er_f2_28: @@ -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/actions/10500.yml b/src/actions/10500.yml index 89592cf..e84a99f 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: @@ -33,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: @@ -51,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: @@ -62,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 @@ -75,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: @@ -89,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/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/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/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/actions/600.yml b/src/actions/600.yml index fbb6969..8d5908a 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. @@ -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 @@ -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 a91bd87..cba5129 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. @@ -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 @@ -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 e50ca06..cda008e 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. @@ -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 @@ -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 ceeb51e..5a978aa 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. @@ -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 @@ -380,7 +382,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 +396,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 +412,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 +426,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 +442,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 +454,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 +478,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ds3_f2_27: field: int default: 1 @@ -484,7 +486,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 7be8457..2cee127 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. @@ -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 @@ -461,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. @@ -475,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. @@ -491,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. @@ -505,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. @@ -521,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: @@ -533,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: @@ -557,7 +573,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ds3_f2_27: field: int default: 1 @@ -565,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: | @@ -631,9 +651,9 @@ games: DS3: fields1: - orientation - - mask - layer1 - layer2 + - layer3 - blendMode - uniformScale - unk_ds3_f1_6 @@ -694,18 +714,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 +732,12 @@ games: - layer2OffsetV - layer2ScaleU - layer2ScaleV + - layer3SpeedU + - layer3SpeedV + - layer3OffsetU + - layer3OffsetV + - layer3ScaleU + - layer3ScaleV properties2: - rgbMultiplier - alphaMultiplier @@ -729,9 +749,9 @@ games: SDT: fields1: - orientation - - mask - layer1 - layer2 + - layer3 - uniformScale - unk_ds3_f1_6 - columns @@ -804,18 +824,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 +842,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/actions/605.yml b/src/actions/605.yml index be4d184..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. @@ -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..b76a2f1 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. @@ -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 @@ -279,7 +281,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 +295,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 +311,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 +325,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 +341,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 +353,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 +377,7 @@ properties: default: 1 unkDepthBlend2: field: float - scale: true + scale: distance unk_ds3_f2_27: field: int default: 1 @@ -383,7 +385,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/607.yml b/src/actions/607.yml index 8a41ca6..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,6 +432,11 @@ properties: field: int unk_sdt_f2_38: field: float + scale: distance + 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/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..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. @@ -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/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 8eeaaeb..59a12cd 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. * @@ -1574,6 +1573,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, } /** @@ -1736,7 +1743,7 @@ export interface IModifiableProperty - clone(): IConfig } export interface IModifier { @@ -1773,36 +1801,14 @@ export interface IModifier { 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' + layer?: number +} + +export interface ScalingOptions { + includeViewDistance?: boolean } export type AnyAction = Action | DataAction @@ -1834,28 +1840,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*/ @@ -2009,6 +2018,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 }) @@ -2026,12 +2044,12 @@ export type FilledActionGameDataEntry = { } export type ActionDataProp = ( { - field?: FieldType + field?: FieldType | Partial> resource?: ResourceType textureType?: string scale?: ScaleCondition time?: TimeOperation - color?: 1 + color?: 1 | 2 omit?: 1 paths?: { [game: string]: [string, number] @@ -2046,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 }, @@ -2072,6 +2128,8 @@ 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) { @@ -6021,7 +6243,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( @@ -6048,11 +6272,11 @@ function writeDataAction(action: DataAction, bw: BinaryWriter, game: Game, actio throw new Error('DataActions cannot be formatted for Game.Generic.') } bw.convertedDataActions.set(action, - action.type in ActionDataConversion && 'write' in ActionDataConversion[action.type] ? - ActionDataConversion[action.type].write(Object.assign(Object.create(null), action), game) : + action.type in ActionDataConversion && 'write' in action.$convert ? + action.$convert.write(Object.assign(Object.create(null), action), game) : action ) - const adt = ActionData[action.type] + const ade = action.$data const data = getActionGameData(action.type, game) const count = actions.length bw.writeInt16(action.type) @@ -6060,13 +6284,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 ade.props[name].field === 'number' ? ade.props[name].field : ade.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 ade.props[name].field === 'number' ? ade.props[name].field : ade.props[name].field[game] + ]) .reduce((a, e) => a + e, 0) ) bw.writeInt32(0) @@ -6084,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) @@ -6104,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 @@ -6217,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) } @@ -8116,7 +8344,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. */ @@ -8149,6 +8377,280 @@ 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) +} + +function genFilledPaletteAndFunctions(inputPalette: Recolor.ColorPalette) { + if (!( + 'commonParticleNormal' in inputPalette || + 'commonParticleMultiply' in inputPalette || + 'commonParticleAdd' in inputPalette || + 'commonParticleSubtract' in inputPalette || + 'distortionParticle' in inputPalette || + 'blurParticle' in inputPalette || + 'light' in inputPalette || + 'gpuParticle' in inputPalette || + 'lensFlare' in inputPalette + )) { + throw new Error('Invalid color palette.') + } + const palette: Recolor.ColorPalette = {} + for (const [k, v] of Object.entries(inputPalette) 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, + }] + } + + 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, @@ -8156,14 +8658,14 @@ const GameVersionMap = { [Game.ArmoredCore6]: FXRVersion.Sekiro, } -const ActionDataConversion = { +const ActionDataConversion: Partial>> = { [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 @@ -8179,11 +8681,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 }, @@ -8204,88 +8706,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 @@ -8300,17 +8802,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 @@ -8318,7 +8820,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) @@ -8354,7 +8856,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 @@ -8386,7 +8888,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 @@ -8406,7 +8908,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 @@ -8438,7 +8940,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 @@ -8461,14 +8963,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) @@ -8477,14 +8979,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) @@ -8493,39 +8995,53 @@ 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: Props, game: Game) { + if (game !== Game.ArmoredCore6) { + props.initialSimulationTime = props.initialSimulationTime / 30 + } + return props + }, + write(props: Props, game: Game) { + if (game === Game.EldenRing) { + props.initialSimulationTime = Math.round(props.initialSimulationTime * 30) + } + return props + } + }, [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 @@ -8538,7 +9054,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 @@ -8553,7 +9069,7 @@ const ActionDataConversion = { } //#region Binary Reader/Writer -class BinaryReader extends DataView { +class BinaryReader extends DataView { position: number = 0 littleEndian: boolean = true @@ -9216,7 +9732,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) @@ -9502,6 +10018,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 @@ -9878,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] } @@ -9913,12 +10445,34 @@ abstract class Node { * lengths, and radii of the actions in the branch, except certain * multiplicative fields and properties. * @param factor The factor to scale the branch with. - * @param recurse Controls whether or not the scaling should be applied to + * @param options.recurse Controls whether or not the scaling should be applied to * all descendant nodes. Defaults to true. */ - scale(factor: number, recurse: boolean = true) { - for (const action of this.walkActions(recurse)) if (action instanceof DataAction) { - action.scale(factor) + scale(factor: number, options: ScalingOptions & { recurse?: boolean } = {}) { + if (this instanceof NodeWithConfigs || this instanceof GenericNode) { + for (const config of this.configs) { + config.scale(factor, options) + } + if (this instanceof GenericNode) { + for (const action of this.actions) if (action instanceof DataAction) { + action.scale(factor, options) + } + } + } else { + for (const action of this.walkActions(false)) if (action instanceof DataAction) { + action.scale(factor, options) + } + } + if ((options.recurse ?? true) && ( + this instanceof GenericNode || + this instanceof RootNode || + this instanceof LevelsOfDetailNode || + this instanceof BasicNode || + this instanceof NodeEmitterNode + )) { + for (const node of this.nodes) { + node.scale(factor, options) + } } return this } @@ -9945,378 +10499,38 @@ 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) } } 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, - }] - } + 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 } + /** + * 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 +10692,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 +10767,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 +10867,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 +10973,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 +11036,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 +11246,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) @@ -10948,37 +11333,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)) @@ -10991,6 +11376,13 @@ class NodeConfig implements IConfig { ) } + scale(factor: number, options: ScalingOptions) { + for (const action of this.walkActions()) if (action instanceof DataAction) { + action.scale(factor, options) + } + return this + } + } /** @@ -11033,7 +11425,7 @@ class LevelsOfDetailConfig implements IConfig { return { type: this.type, duration: this.duration instanceof Property ? this.duration.toJSON() : this.duration, - thresholds: this.thresholds, + thresholds: this.thresholds.slice(0, 5), unk_ac6_f1_5: this.unk_ac6_f1_5 } } @@ -11052,24 +11444,13 @@ class LevelsOfDetailConfig implements IConfig { ) } -} + scale(factor: number, options: ScalingOptions = {}) { + if (options.includeViewDistance) { + this.thresholds = this.thresholds.slice(0, 5).map(t => t * factor) + } + return this + } -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 } /** @@ -11114,9 +11495,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; @@ -11137,21 +11518,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 } } @@ -11259,19 +11640,159 @@ 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 + } + + /** + * 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 { - 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 } /** @@ -11306,7 +11827,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)) @@ -11338,7 +11859,7 @@ class NodeEmitterConfig implements IConfig { } getActionCount(game: Game): number { - return 10 + return game === Game.DarkSouls3 ? 9 : 10 } getActions(game: Game): AnyAction[] { @@ -11416,12 +11937,19 @@ 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 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, @@ -11584,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 } @@ -11599,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] @@ -11620,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]] @@ -11640,45 +12180,47 @@ 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 = ActionData[this.type].props[name] - validateDataActionProp(this, name, prop) + const prop = ade.props[name] + validateDataActionProp(props, name, prop) return Field.from( - prop.field, - this[name] instanceof Property ? this[name].valueAt(0) : this[name] + typeof prop.field === 'number' ? prop.field : prop.field[game], + 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 = ActionData[this.type].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) { - 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, - 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) ) } @@ -11687,12 +12229,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({ @@ -11716,14 +12258,18 @@ class DataAction implements IAction { * used with actions that have scaling properties. * @param factor The factor to scale by. */ - scale(factor: number) { - if ('props' in ActionData[this.type]) { - for (const [k, v] of Object.entries(ActionData[this.type].props)) { + scale(factor: number, { includeViewDistance }: ScalingOptions = {}) { + 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]) } else if (v.scale === ScaleCondition.IfNotMinusOne && this[k] !== -1) { this[k] *= factor + } else if (v.scale === ScaleCondition.Distance && includeViewDistance) { + this[k] = anyValueMult(factor, this[k]) + } else if (v.scale === ScaleCondition.DistanceIfNotMinusOne && includeViewDistance && this[k] !== -1) { + this[k] *= factor } } } @@ -11738,7 +12284,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 || @@ -11747,17 +12293,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 => !( @@ -11771,13 +12317,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) } } } @@ -11789,11 +12335,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) { - if ('props' in ActionData[this.type]) { - for (const [k, v] of Object.entries(ActionData[this.type].props)) { + recolor(func: Recolor.RecolorFunction, context?: BasicConfig) { + if ('props' in this.$data) { + for (const [k, v] of Object.entries(this.$data.props)) { if ('color' in v) { - this.recolorProperty(k, func) + this.recolorProperty(k, func, context) } } } @@ -11801,8 +12347,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)) { @@ -11877,8 +12423,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 @@ -11913,8 +12459,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] @@ -11946,7 +12492,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, @@ -12009,7 +12555,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 @@ -12040,7 +12586,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 @@ -12081,7 +12627,14 @@ 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 /** * Controls the speed of the node along its Z-axis. * @@ -12089,7 +12642,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. * @@ -12097,7 +12650,7 @@ export interface NodeAccelerationParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationZ?: ScalarValue + accelerationZ: ScalarValue /** * Multiplier for {@link accelerationZ}. * @@ -12105,7 +12658,7 @@ export interface NodeAccelerationParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationMultiplierZ?: ScalarValue + accelerationMultiplierZ: ScalarValue /** * Controls the acceleration of the node along its Y-axis. * @@ -12113,89 +12666,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 = {}) { - super(ActionType.NodeAcceleration, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.NodeAcceleration) 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} @@ -12204,24 +12699,34 @@ export interface NodeTranslationParams { */ 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. * + * **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 = {}) { - super(ActionType.NodeTranslation, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.NodeTranslation) 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 /** * The node's angular speed around its local X-axis in degrees per second. * @@ -12232,7 +12737,7 @@ export interface NodeSpinParams { * See also: * - {@link angularSpeedMultiplierX} */ - angularSpeedX?: ScalarValue + angularSpeedX: ScalarValue /** * Multiplier for {@link angularSpeedX}. * @@ -12240,7 +12745,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. * @@ -12251,7 +12756,7 @@ export interface NodeSpinParams { * See also: * - {@link angularSpeedMultiplierY} */ - angularSpeedY?: ScalarValue + angularSpeedY: ScalarValue /** * Multiplier for {@link angularSpeedY}. * @@ -12259,7 +12764,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. * @@ -12270,7 +12775,7 @@ export interface NodeSpinParams { * See also: * - {@link angularSpeedMultiplierZ} */ - angularSpeedZ?: ScalarValue + angularSpeedZ: ScalarValue /** * Multiplier for {@link angularSpeedZ}. * @@ -12278,91 +12783,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 = {}) { - super(ActionType.NodeSpin, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.NodeSpin) 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} @@ -12371,46 +12804,22 @@ export interface StaticNodeTransformParams { */ class StaticNodeTransform extends DataAction { declare readonly type: ActionType.StaticNodeTransform - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * Translation of the node. - */ - offset: Vector3 - /** - * The rotation of the node. - */ - rotation: Vector3 - constructor(props: StaticNodeTransformParams = {}) { - super(ActionType.StaticNodeTransform, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface RandomNodeTransformParams { /** * Translation of the node. * * **Default**: `[0, 0, 0]` */ - offset?: Vector3 + 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 + rotation: Vector3 + constructor(props: Partial> = {}) { + super(ActionType.StaticNodeTransform) + this.assign(props) + } } /** @@ -12421,44 +12830,36 @@ export interface RandomNodeTransformParams { */ class RandomNodeTransform extends DataAction { declare readonly type: ActionType.RandomNodeTransform - 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 = {}) { - super(ActionType.RandomNodeTransform, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.RandomNodeTransform) 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} @@ -12467,57 +12868,22 @@ export interface NodeAttachToCameraParams { */ 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. - */ - 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) + this.assign(props) + } } /** @@ -12528,74 +12894,48 @@ export interface ParticleAccelerationParams { */ 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. * * 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) + this.assign(props) + } } /** @@ -12606,36 +12946,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. * @@ -12645,7 +12955,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}. * @@ -12653,7 +12963,7 @@ export interface ParticleSpeedRandomTurnsParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - speed?: ScalarValue + speed: ScalarValue /** * Multiplier for {@link speed}. * @@ -12661,31 +12971,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) + this.assign(props) + } } /** @@ -12696,24 +12998,29 @@ 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}. * + * **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 @@ -12722,23 +13029,39 @@ class ParticleSpeedRandomTurns 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 + /** + * 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 - constructor(props: ParticleSpeedRandomTurnsParams = {}) { - super(ActionType.ParticleSpeedRandomTurns, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.ParticleSpeedRandomTurns) this.assign(props) } } -export interface ParticleSpeedPartialFollowParams { +/** + * ### {@link ActionType.ParticleSpeedPartialFollow Action 65 - ParticleSpeedPartialFollow} + * **Slot**: {@link ActionSlots.ParticleMovementAction ParticleMovement} + * + * Controls the movement of particles. This extends {@link ActionType.ParticleSpeedRandomTurns ParticleSpeedRandomTurns} with the ability to make particles partially follow the parent node. + */ +class ParticleSpeedPartialFollow extends DataAction { + declare readonly type: ActionType.ParticleSpeedPartialFollow /** * 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. * @@ -12748,7 +13071,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}. * @@ -12756,7 +13079,7 @@ export interface ParticleSpeedPartialFollowParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - speed?: ScalarValue + speed: ScalarValue /** * Multiplier for {@link speed}. * @@ -12764,7 +13087,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}. * @@ -12774,7 +13097,7 @@ export interface ParticleSpeedPartialFollowParams { * * **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. * @@ -12785,13 +13108,13 @@ export interface ParticleSpeedPartialFollowParams { * 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. * @@ -12799,149 +13122,55 @@ export interface ParticleSpeedPartialFollowParams { * * **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.ParticleSpeedPartialFollow) + this.assign(props) + } } /** - * ### {@link ActionType.ParticleSpeedPartialFollow Action 65 - ParticleSpeedPartialFollow} - * **Slot**: {@link ActionSlots.ParticleMovementAction ParticleMovement} + * ### {@link ActionType.NodeSound Action 75 - NodeSound} + * **Slot**: {@link ActionSlots.NodeAudioAction NodeAudio} * - * Controls the movement of particles. This extends {@link ActionType.ParticleSpeedRandomTurns ParticleSpeedRandomTurns} with the ability to make particles partially follow the parent node. + * Plays a sound effect when the node activates that can repeat. */ -class ParticleSpeedPartialFollow extends DataAction { - declare readonly type: ActionType.ParticleSpeedPartialFollow - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} +class NodeSound extends DataAction { + declare readonly type: ActionType.NodeSound /** - * 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}. + * The ID of the sound to play. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - gravity: ScalarValue + sound: number /** - * 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}. + * Volume multiplier. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - speed: ScalarValue - /** - * Multiplier for {@link speed}. + * Does not seem to work in Elden Ring, and probably doesn't in Armored Core 6 either. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - speedMultiplier: ScalarValue + volume: number /** - * The particles will turn a random amount based on this value at intervals defined by {@link turnInterval}. + * Controls whether the sound will repeat or not. * - * This turning affects the particles' current direction, which can affect various other things, for example this action's {@link speed}. + * Does not seem to work in Elden Ring, and probably doesn't in Armored Core 6 either. * - * **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 speed}. - */ - turnInterval: number - /** - * Disabling this will make {@link followFactor} only affect translation and not rotation. - */ - followRotation: boolean - constructor(props: ParticleSpeedPartialFollowParams = {}) { - 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} - * - * Plays a sound effect when the node activates that can repeat. - */ -class NodeSound extends DataAction { - declare readonly type: ActionType.NodeSound - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} - /** - * The ID of the sound to play. - */ - sound: number - /** - * Volume multiplier. - * - * Does not seem to work in Elden Ring, and probably doesn't in Armored Core 6 either. - */ - 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 = {}) { - super(ActionType.NodeSound, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.NodeSound) 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} @@ -12950,77 +13179,22 @@ export interface EmissionSoundParams { */ class EmissionSound extends DataAction { declare readonly type: ActionType.EmissionSound - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * The ID of the sound to play. - */ - sound: number - unk_ds3_f1_1: number - constructor(props: EmissionSoundParams = {}) { - super(ActionType.EmissionSound, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface NodeAccelerationRandomTurnsParams { - /** - * Controls the speed of the node along its Z-axis. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - speedZ?: ScalarValue - /** - * Controls the acceleration of the node along its Z-axis. This value cannot be negative. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationZ?: ScalarValue - /** - * Multiplier for {@link accelerationZ}. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationMultiplierZ?: ScalarValue - /** - * Controls the acceleration of the node along its Y-axis. - * - * **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}. - * - * **Default**: `0` - * - * **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. * * **Default**: `0` */ - alignWithMotion?: number + sound: number /** * Unknown float. * - * **Default**: `0` - */ - 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` + * **Default**: `1` */ - turnInterval?: number + unk_ds3_f1_1: number + constructor(props: Partial> = {}) { + super(ActionType.EmissionSound) + this.assign(props) + } } /** @@ -13031,103 +13205,68 @@ export interface NodeAccelerationRandomTurnsParams { */ 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. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ speedZ: ScalarValue /** * Controls the acceleration of the node along its Z-axis. This value cannot be negative. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ accelerationZ: ScalarValue /** * Multiplier for {@link accelerationZ}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ accelerationMultiplierZ: ScalarValue /** * Controls the acceleration of the node along its Y-axis. * + * **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}. * + * **Default**: `0` + * * **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. - * - * 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} - */ - 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}. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - maxTurnAngle?: ScalarValue + alignWithMotion: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_0?: number + unk_ds3_f1_1: 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}. + * 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) + this.assign(props) + } } /** @@ -13138,49 +13277,6 @@ export interface ParticleAccelerationRandomTurnsParams { */ 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. - * - * 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. * @@ -13190,7 +13286,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}. * @@ -13198,7 +13294,7 @@ export interface ParticleAccelerationPartialFollowParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - acceleration?: ScalarValue + acceleration: ScalarValue /** * Multiplier for {@link acceleration}. * @@ -13206,7 +13302,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}. * @@ -13216,24 +13312,13 @@ export interface ParticleAccelerationPartialFollowParams { * * **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. * @@ -13241,13 +13326,11 @@ export interface ParticleAccelerationPartialFollowParams { * * **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.ParticleAccelerationRandomTurns) + this.assign(props) + } } /** @@ -13258,24 +13341,29 @@ export interface ParticleAccelerationPartialFollowParams { */ 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}. * + * **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} */ accelerationMultiplier: ScalarValue @@ -13284,36 +13372,56 @@ class ParticleAccelerationPartialFollow extends DataAction { * * This turning affects the particles' current direction, which can affect various other things, for example this action's {@link acceleration}. * + * **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 acceleration}. + * + * **Default**: `0` */ turnInterval: number /** * Disabling this will make {@link followFactor} only affect translation and not rotation. + * + * **Default**: `true` */ followRotation: boolean - constructor(props: ParticleAccelerationPartialFollowParams = {}) { - super(ActionType.ParticleAccelerationPartialFollow, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.ParticleAccelerationPartialFollow) 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 /** * Controls the speed of the node along its Z-axis. * @@ -13321,7 +13429,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. * @@ -13332,7 +13440,7 @@ export interface NodeAccelerationPartialFollowParams { * See also: * - {@link accelerationY} */ - accelerationZ?: ScalarValue + accelerationZ: ScalarValue /** * Multiplier for {@link accelerationZ}. * @@ -13340,7 +13448,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}. * @@ -13350,7 +13458,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}. * @@ -13358,7 +13466,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. * @@ -13369,106 +13477,45 @@ 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) + 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 - 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 { +class NodeAccelerationSpin extends DataAction { + declare readonly type: ActionType.NodeAccelerationSpin /** * Controls the speed of the node along its Z-axis. * @@ -13476,7 +13523,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. * @@ -13484,7 +13531,7 @@ export interface NodeAccelerationSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationZ?: ScalarValue + accelerationZ: ScalarValue /** * Multiplier for {@link accelerationZ}. * @@ -13492,7 +13539,7 @@ export interface NodeAccelerationSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationMultiplierZ?: ScalarValue + accelerationMultiplierZ: ScalarValue /** * Controls the acceleration of the node along its Y-axis. * @@ -13500,7 +13547,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. * @@ -13511,7 +13558,7 @@ export interface NodeAccelerationSpinParams { * See also: * - {@link angularSpeedMultiplierX} */ - angularSpeedX?: ScalarValue + angularSpeedX: ScalarValue /** * Multiplier for {@link angularSpeedX}. * @@ -13519,7 +13566,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. * @@ -13530,7 +13577,7 @@ export interface NodeAccelerationSpinParams { * See also: * - {@link angularSpeedMultiplierY} */ - angularSpeedY?: ScalarValue + angularSpeedY: ScalarValue /** * Multiplier for {@link angularSpeedY}. * @@ -13538,7 +13585,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. * @@ -13549,7 +13596,7 @@ export interface NodeAccelerationSpinParams { * See also: * - {@link angularSpeedMultiplierZ} */ - angularSpeedZ?: ScalarValue + angularSpeedZ: ScalarValue /** * Multiplier for {@link angularSpeedZ}. * @@ -13557,125 +13604,101 @@ 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) + 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 - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} +class NodeSpeed extends DataAction { + declare readonly type: ActionType.NodeSpeed /** * Controls the speed of the node along its Z-axis. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ speedZ: ScalarValue /** - * Controls the acceleration of the node along its Z-axis. This value cannot be negative. + * Multiplier for {@link speedZ}. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - accelerationZ: ScalarValue - /** - * Multiplier for {@link accelerationZ}. + * **Default**: `1` * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationMultiplierZ: ScalarValue + 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. + * **Default**: `0` * * **Argument**: {@link PropertyArgument.ActiveTime Active time} - * - * See also: - * - {@link angularSpeedMultiplierY} */ - angularSpeedY: ScalarValue + accelerationY: ScalarValue /** - * Multiplier for {@link angularSpeedY}. + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - angularSpeedMultiplierY: ScalarValue + unk_ds3_f1_0: number /** - * The node's angular speed around its local Z-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * 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. * - * See also: - * - {@link angularSpeedMultiplierZ} + * **Default**: `0` */ - angularSpeedZ: ScalarValue + alignWithMotion: number /** - * Multiplier for {@link angularSpeedZ}. + * Unknown integer. * - * **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. + * **Default**: `0` */ - alignWithMotion: number - unk_ds3_f1_3: number - constructor(props: NodeAccelerationSpinParams = {}) { - super(ActionType.NodeAccelerationSpin, {isAppearance:false,isParticle:false}) + unk_ds3_f1_2: number + constructor(props: Partial> = {}) { + super(ActionType.NodeSpeed) this.assign(props) } } -export interface NodeSpeedParams { +/** + * ### {@link ActionType.NodeSpeedRandomTurns Action 121 - NodeSpeedRandomTurns} + * **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. + */ +class NodeSpeedRandomTurns extends DataAction { + declare readonly type: ActionType.NodeSpeedRandomTurns /** * Controls the speed of the node along its Z-axis. * @@ -13683,7 +13706,7 @@ export interface NodeSpeedParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - speedZ?: ScalarValue + speedZ: ScalarValue /** * Multiplier for {@link speedZ}. * @@ -13691,7 +13714,7 @@ export interface NodeSpeedParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - speedMultiplierZ?: ScalarValue + speedMultiplierZ: ScalarValue /** * Controls the acceleration of the node along its Y-axis. * @@ -13699,303 +13722,130 @@ export interface NodeSpeedParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationY?: ScalarValue + accelerationY: ScalarValue /** - * Unknown integer. + * The node will turn a random amount based on this value at intervals defined by {@link turnInterval}. * * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - unk_ds3_f1_0?: number + 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_2?: 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 + constructor(props: Partial> = {}) { + super(ActionType.NodeSpeedRandomTurns) + this.assign(props) + } } /** - * ### {@link ActionType.NodeSpeed Action 120 - NodeSpeed} + * ### {@link ActionType.NodeSpeedPartialFollow Action 122 - NodeSpeedPartialFollow} * **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.NodeSpeedRandomTurns NodeSpeedRandomTurns} with the ability to make the node partially follow or exaggerate the parent node's movement. */ -class NodeSpeed extends DataAction { - declare readonly type: ActionType.NodeSpeed - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} +class NodeSpeedPartialFollow extends DataAction { + declare readonly type: ActionType.NodeSpeedPartialFollow /** * 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 - 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. + * The node will turn a random amount based on this value at intervals defined by {@link turnInterval}. * * **Default**: `0` * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - speedZ?: ScalarValue + maxTurnAngle: ScalarValue /** - * Multiplier for {@link speedZ}. + * 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**: `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 will turn a random amount based on this value at intervals defined by {@link turnInterval}. - * - * **Default**: `0` - * - * **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. - * - * **Default**: `0` - */ - alignWithMotion?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - 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 -} - -/** - * ### {@link ActionType.NodeSpeedRandomTurns Action 121 - NodeSpeedRandomTurns} - * **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. - */ -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 - /** - * 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. - * - * **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}. - * - * **Default**: `0` - * - * **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` + * **Default**: `0` * * **Argument**: {@link PropertyArgument.ActiveTime Active time} * * 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) + 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 - 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. - * - * 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}. - * - * **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: NodeSpeedPartialFollowParams = {}) { - super(ActionType.NodeSpeedPartialFollow, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface NodeSpeedSpinParams { +class NodeSpeedSpin extends DataAction { + declare readonly type: ActionType.NodeSpeedSpin /** * Controls the speed of the node along its Z-axis. * @@ -14003,7 +13853,7 @@ export interface NodeSpeedSpinParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - speedZ?: ScalarValue + speedZ: ScalarValue /** * Multiplier for {@link speedZ}. * @@ -14011,7 +13861,7 @@ export interface NodeSpeedSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - speedMultiplierZ?: ScalarValue + speedMultiplierZ: ScalarValue /** * Controls the acceleration of the node along its Y-axis. * @@ -14019,7 +13869,7 @@ export interface NodeSpeedSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - accelerationY?: ScalarValue + accelerationY: ScalarValue /** * The node's angular speed around its local X-axis in degrees per second. * @@ -14030,7 +13880,7 @@ export interface NodeSpeedSpinParams { * See also: * - {@link angularSpeedMultiplierX} */ - angularSpeedX?: ScalarValue + angularSpeedX: ScalarValue /** * Multiplier for {@link angularSpeedX}. * @@ -14038,7 +13888,7 @@ export interface NodeSpeedSpinParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - angularSpeedMultiplierX?: ScalarValue + angularSpeedMultiplierX: ScalarValue /** * The node's angular speed around its local Y-axis in degrees per second. * @@ -14049,7 +13899,7 @@ export interface NodeSpeedSpinParams { * See also: * - {@link angularSpeedMultiplierY} */ - angularSpeedY?: ScalarValue + angularSpeedY: ScalarValue /** * Multiplier for {@link angularSpeedY}. * @@ -14057,7 +13907,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. * @@ -14068,7 +13918,7 @@ export interface NodeSpeedSpinParams { * See also: * - {@link angularSpeedMultiplierZ} */ - angularSpeedZ?: ScalarValue + angularSpeedZ: ScalarValue /** * Multiplier for {@link angularSpeedZ}. * @@ -14076,119 +13926,45 @@ 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 = {}) { - super(ActionType.NodeSpeedSpin, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.NodeSpeedSpin) this.assign(props) } } -export interface NodeAttributesParams { +/** + * ### {@link ActionType.NodeAttributes Action 128 - NodeAttributes} + * **Slot**: {@link ActionSlots.NodeAttributesAction NodeAttributes} + * + * Controls various things about the node, like its duration, and how it is attached to the parent node. + */ +class NodeAttributes extends DataAction { + declare readonly type: ActionType.NodeAttributes /** * The node duration in seconds. Can be set to -1 to make the node last forever. * @@ -14196,25 +13972,25 @@ export interface NodeAttributesParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - duration?: ScalarValue + duration: ScalarValue /** * The delay in seconds before the node becomes active. * * **Default**: `0` */ - delay?: number + delay: number /** * Unknown integer. * * **Default**: `1` */ - unk_ds3_f1_1?: number + unk_ds3_f1_1: number /** * Controls how the node is attached to the parent node. * * **Default**: {@link AttachMode.Parent} */ - attachment?: AttachMode + 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. * @@ -14224,64 +14000,13 @@ export interface NodeAttributesParams { * * **Default**: `0` */ - depthBias?: number -} - -/** - * ### {@link ActionType.NodeAttributes Action 128 - NodeAttributes} - * **Slot**: {@link ActionSlots.NodeAttributesAction NodeAttributes} - * - * Controls various things about the node, like its duration, and how it is attached to the parent node. - */ -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. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - duration: ScalarValue - /** - * The delay in seconds before the node becomes active. - */ - delay: number - unk_ds3_f1_1: number - /** - * Controls how the node is attached to the parent node. - */ - 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. - */ depthBias: number - constructor(props: NodeAttributesParams = {}) { - super(ActionType.NodeAttributes, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.NodeAttributes) 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} @@ -14290,222 +14015,142 @@ export interface ParticleAttributesParams { */ 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. * + * **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 = {}) { - super(ActionType.ParticleAttributes, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.ParticleAttributes) 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 /** - * 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 = {}) { - super(ActionType.Unk130, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.Unk130) 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} @@ -14516,10 +14161,11 @@ export interface ParticleModifierParams { */ 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}. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ speed: ScalarValue @@ -14528,6 +14174,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 @@ -14536,6 +14184,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 @@ -14544,6 +14194,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 @@ -14552,20 +14204,24 @@ 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 = {}) { - super(ActionType.ParticleModifier, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.ParticleModifier) this.assign(props) } } @@ -14578,9 +14234,10 @@ 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. + * + * **Default**: `0` */ sfx: number /** @@ -14589,12 +14246,19 @@ class SFXReference extends DataAction { * **Default**: `0` */ constructor(sfx: number = 0) { - super(ActionType.SFXReference, {isAppearance:false,isParticle:false}) + super(ActionType.SFXReference) this.assign({ sfx }) } } -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 /** * The node duration in seconds. Can be set to -1 to make the node last forever. * @@ -14602,83 +14266,45 @@ 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 = {}) { - super(ActionType.LevelsOfDetailThresholds, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.LevelsOfDetailThresholds) this.assign(props) } } @@ -14691,11 +14317,12 @@ 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. * * 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[] /** @@ -14706,7 +14333,7 @@ class StateConfigMap extends DataAction { * **Default**: `[0]` */ constructor(configIndices: number[] = [0]) { - super(ActionType.StateConfigMap, {isAppearance:false,isParticle:false}) + super(ActionType.StateConfigMap) this.assign({ configIndices }) } } @@ -14719,10 +14346,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) } } @@ -14734,11 +14360,12 @@ 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. * * The weights are stored as integers, so non-integer values in this list will be truncated. + * + * **Default**: `[1]` */ weights: number[] /** @@ -14749,12 +14376,19 @@ class SelectRandomNode extends DataAction { * **Default**: `[1]` */ constructor(weights: number[] = [1]) { - super(ActionType.SelectRandomNode, {isAppearance:false,isParticle:false}) + super(ActionType.SelectRandomNode) this.assign({ weights }) } } -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 /** * Time between emitting new particles in seconds. * @@ -14762,7 +14396,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. * @@ -14770,7 +14404,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. * @@ -14778,7 +14412,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. * @@ -14786,56 +14420,27 @@ 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) + 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 - 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 { +class EqualDistanceEmitter extends DataAction { + declare readonly type: ActionType.EqualDistanceEmitter /** * How much the emitter must move to trigger emission. * @@ -14843,13 +14448,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. * @@ -14857,54 +14462,27 @@ 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 = {}) { - super(ActionType.EqualDistanceEmitter, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.EqualDistanceEmitter) this.assign(props) } } @@ -14917,10 +14495,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) } } @@ -14932,9 +14509,10 @@ 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. + * + * **Default**: {@link InitialDirection.Emitter} */ direction: InitialDirection /** @@ -14943,40 +14521,11 @@ 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 }) } } -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} @@ -14985,10 +14534,11 @@ export interface DiskEmitterShapeParams { */ class DiskEmitterShape extends DataAction { declare readonly type: ActionType.DiskEmitterShape - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Radius of the disk. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ radius: ScalarValue @@ -14999,54 +14549,21 @@ 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. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - distribution: ScalarValue - /** - * Controls the initial direction for particles. See {@link InitialDirection} for more information. - */ - direction: InitialDirection - constructor(props: DiskEmitterShapeParams = {}) { - super(ActionType.DiskEmitterShape, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface RectangleEmitterShapeParams { - /** - * Width of the rectangle. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - sizeX?: ScalarValue - /** - * Height of the rectangle. - * - * **Default**: `1` - * - * **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. - * * **Default**: `0` * * **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 + direction: InitialDirection + constructor(props: Partial> = {}) { + super(ActionType.DiskEmitterShape) + this.assign(props) + } } /** @@ -15057,16 +14574,19 @@ export interface RectangleEmitterShapeParams { */ class RectangleEmitterShape extends DataAction { declare readonly type: ActionType.RectangleEmitterShape - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Width of the rectangle. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ sizeX: ScalarValue /** * Height of the rectangle. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ sizeY: ScalarValue @@ -15077,36 +14597,23 @@ class RectangleEmitterShape extends DataAction { * - At -1, particles have a 100% chance of being emitted from the perimeter of the rectangle. * - 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: RectangleEmitterShapeParams = {}) { - super(ActionType.RectangleEmitterShape, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.RectangleEmitterShape) 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} @@ -15115,62 +14622,26 @@ export interface SphereEmitterShapeParams { */ class SphereEmitterShape extends DataAction { declare readonly type: ActionType.SphereEmitterShape - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * 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 = {}) { - super(ActionType.SphereEmitterShape, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.SphereEmitterShape) 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} @@ -15179,74 +14650,46 @@ export interface BoxEmitterShapeParams { */ class BoxEmitterShape extends DataAction { declare readonly type: ActionType.BoxEmitterShape - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * Width of the cuboid. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ sizeX: ScalarValue /** * Height of the cuboid. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - sizeY: ScalarValue - /** - * Depth of the cuboid. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - sizeZ: ScalarValue - /** - * Controls the initial direction for particles. See {@link InitialDirection} for more information. - */ - 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. - */ - emitInside: boolean - constructor(props: BoxEmitterShapeParams = {}) { - 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 + sizeY: ScalarValue /** - * The height of the cylinder. + * Depth of the cuboid. * * **Default**: `1` * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - height?: ScalarValue + 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 cylinder. Otherwise the particles will be emitted only from the surface of the cylinder, excluding the ends. - * - * **Default**: `true` - */ - emitInside?: boolean + direction: InitialDirection /** - * If true, the cylinder will be aligned with the Y-axis instead of the Z-axis. + * 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` */ - yAxis?: boolean + emitInside: boolean + constructor(props: Partial> = {}) { + super(ActionType.BoxEmitterShape) + this.assign(props) + } } /** @@ -15257,33 +14700,42 @@ export interface CylinderEmitterShapeParams { */ class CylinderEmitterShape extends DataAction { declare readonly type: ActionType.CylinderEmitterShape - declare readonly meta: ActionMeta & {isAppearance:false,isParticle:false} /** * 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 = {}) { - super(ActionType.CylinderEmitterShape, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.CylinderEmitterShape) this.assign(props) } } @@ -15296,43 +14748,12 @@ 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) } } -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} @@ -15341,62 +14762,19 @@ export interface CircularSpreadParams { */ 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. * - * **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. - * - * **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. - */ - unk_er_f1_0: boolean - constructor(props: CircularSpreadParams = {}) { - 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 + 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 angleX} and {@link angleY}. + * - 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. * @@ -15404,13 +14782,17 @@ export interface EllipticalSpreadParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - distribution?: ScalarValue + 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 + unk_er_f1_0: boolean + constructor(props: Partial> = {}) { + super(ActionType.CircularSpread) + this.assign(props) + } } /** @@ -15421,10 +14803,11 @@ export interface EllipticalSpreadParams { */ 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. * + * **Default**: `30` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} * * See also: @@ -15434,6 +14817,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: @@ -15448,57 +14833,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 = {}) { - super(ActionType.EllipticalSpread, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.EllipticalSpread) 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} @@ -15507,10 +14858,11 @@ export interface RectangularSpreadParams { */ 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. * + * **Default**: `30` + * * **Argument**: {@link PropertyArgument.ActiveTime Active time} * * See also: @@ -15520,6 +14872,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: @@ -15534,16 +14888,25 @@ 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 = {}) { - super(ActionType.RectangularSpread, {isAppearance:false,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.RectangularSpread) 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 /** * Texture ID. * @@ -15551,7 +14914,7 @@ export interface PointSpriteParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - texture?: ScalarValue + texture: ScalarValue /** * Blend mode. * @@ -15559,7 +14922,7 @@ export interface PointSpriteParams { * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - blendMode?: BlendMode | ScalarProperty + blendMode: BlendMode | ScalarProperty /** * Particle size. * @@ -15567,7 +14930,7 @@ export interface PointSpriteParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - size?: ScalarValue + size: ScalarValue /** * Color multiplier. * @@ -15581,7 +14944,7 @@ export interface PointSpriteParams { * - {@link color2} * - {@link color3} */ - color1?: Vector4Value + color1: Vector4Value /** * Color multiplier. * @@ -15595,7 +14958,7 @@ export interface PointSpriteParams { * - {@link color1} * - {@link color3} */ - color2?: Vector4Value + color2: Vector4Value /** * Color multiplier. * @@ -15609,7 +14972,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. * @@ -15617,7 +14980,7 @@ export interface PointSpriteParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - rgbMultiplier?: ScalarValue + rgbMultiplier: ScalarValue /** * Alpha multiplier. * @@ -15625,31 +14988,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. * @@ -15659,61 +15022,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}. * @@ -15726,7 +15089,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. * @@ -15739,37 +15102,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. * @@ -15784,7 +15147,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. * @@ -15801,7 +15164,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. * @@ -15816,7 +15179,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. * @@ -15833,7 +15196,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. * @@ -15846,7 +15209,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. * @@ -15859,79 +15222,81 @@ 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. * + * 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_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. * @@ -15939,146 +15304,261 @@ 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) + 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 - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} - /** - * Texture ID. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - texture: ScalarValue +class Line extends DataAction { + declare readonly type: ActionType.Line /** * 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. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} * * See also: * - {@link color1} * - {@link color2} + * - {@link color3} + * - {@link endColor} */ - color3: Vector4Value + startColor: Vector4Value /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * The color for the end of the line. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - rgbMultiplier: ScalarValue - /** - * Alpha 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 color3} + * - {@link startColor} */ - alphaMultiplier: ScalarValue - unk_ds3_p2_2: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value + endColor: Vector4Value /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. + * Multiplier for the line {@link length}. * - * 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**: `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}. @@ -16087,6 +15567,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} */ @@ -16098,20 +15580,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} @@ -16127,6 +15638,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} @@ -16140,6 +15653,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} @@ -16155,6 +15670,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} @@ -16166,6 +15683,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} @@ -16177,6 +15696,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} @@ -16185,38 +15706,146 @@ 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) 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 /** * Blend mode. * @@ -16224,7 +15853,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. * @@ -16235,7 +15875,7 @@ export interface LineParams { * See also: * - {@link lengthMultiplier} */ - length?: ScalarValue + length: ScalarValue /** * Color multiplier. * @@ -16251,7 +15891,7 @@ export interface LineParams { * - {@link startColor} * - {@link endColor} */ - color1?: Vector4Value + color1: Vector4Value /** * Color multiplier. * @@ -16267,9 +15907,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. * @@ -16283,9 +15923,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. * @@ -16299,7 +15939,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}. * @@ -16307,7 +15955,7 @@ export interface LineParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - lengthMultiplier?: ScalarValue + lengthMultiplier: ScalarValue /** * Color multiplier. * @@ -16323,7 +15971,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. * @@ -16331,7 +15979,7 @@ export interface LineParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - rgbMultiplier?: ScalarValue + rgbMultiplier: ScalarValue /** * Alpha multiplier. * @@ -16339,31 +15987,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. * @@ -16373,49 +16021,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}. * @@ -16428,7 +16076,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. * @@ -16441,37 +16089,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. * @@ -16486,7 +16134,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. * @@ -16503,7 +16151,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. * @@ -16518,7 +16166,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. * @@ -16535,7 +16183,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. * @@ -16548,7 +16196,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. * @@ -16561,81 +16209,81 @@ 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. * + * 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_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. * @@ -16643,542 +16291,534 @@ 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) + 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 - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} +class BillboardEx extends DataAction { + declare readonly type: ActionType.BillboardEx + /** + * 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 - unk_ds3_f2_29: number - unk_sdt_f2_30: number + angularSpeedMultiplierZ: ScalarValue /** - * When set to 1, this stops the particles from being shown indoors. + * 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. * - * Other values are used in AC6, but what they do is unknown. + * **Default**: `0` + * + * **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. + * 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} */ - 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 { + frameIndex: ScalarValue /** - * Blend mode. + * Seemingly identical to {@link frameIndex}? 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 + frameIndexOffset: ScalarValue /** - * The width of the line. + * Unknown scalar. * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `0` + */ + unk_ds3_p1_21: ScalarValue + /** + * Unknown scalar. * - * See also: - * - {@link widthMultiplier} + * **Default**: `0` */ - width?: ScalarValue + unk_ds3_p1_22: ScalarValue /** - * The length of the line. + * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * * **Default**: `1` * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} - * - * See also: - * - {@link lengthMultiplier} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - length?: ScalarValue + rgbMultiplier: ScalarValue /** - * Color 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, 1, 1, 1]` + * 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 integer. Possibly boolean? + * + * **Default**: `0` + */ + 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` */ - 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}. * @@ -17191,7 +16831,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. * @@ -17204,37 +16844,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. * @@ -17249,7 +16889,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. * @@ -17266,7 +16906,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. * @@ -17281,7 +16921,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. * @@ -17298,7 +16938,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. * @@ -17311,7 +16951,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. * @@ -17324,79 +16964,83 @@ 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. * + * 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_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. * @@ -17404,402 +17048,273 @@ 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) + 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 - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} +class MultiTextureBillboardEx extends DataAction { + declare readonly type: ActionType.MultiTextureBillboardEx /** * 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}. - * - * **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**: `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} - */ - rgbMultiplier: ScalarValue - /** - * Alpha multiplier. - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * - {@link angularSpeedY} + * - {@link angularSpeedMultiplierY} */ - alphaMultiplier: ScalarValue - unk_ds3_p2_2: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value + rotationY: ScalarValue /** - * 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. + * Rotation around the Z-axis in degrees. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - 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 - /** - * 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. + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: - * - {@link bloomColor} + * - {@link angularSpeedZ} + * - {@link angularSpeedMultiplierZ} */ - bloom: boolean + rotationZ: 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. - * - * 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. + * Angular speed around the X-axis in degrees per second. * - * 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. + * **Default**: `0` * - * 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. + * **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. - * - * 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. + * Multiplier for {@link angularSpeedX}. * - * 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. + * **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. + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link rotationX} */ - maxFadeDistance: number + angularSpeedMultiplierX: 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. - * - * 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. + * Angular speed around the Y-axis in degrees per second. * - * 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**: `0` * - * 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} - */ - 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 - /** - * 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. + * - {@link rotationY} + * - {@link angularSpeedMultiplierY} */ - 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 { + angularSpeedY: ScalarValue /** - * Texture ID. + * Multiplier for {@link angularSpeedY}. * * **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 - /** - * X position offset. - * - * **Default**: `0` - * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - offsetX?: ScalarValue - /** - * Y position offset. - * - * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * See also: + * - {@link rotationY} */ - offsetY?: ScalarValue + angularSpeedMultiplierY: ScalarValue /** - * Z position offset. + * Angular speed around the Z-axis in degrees per second. * * **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. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link scaleVariationX} + * - {@link rotationZ} + * - {@link angularSpeedMultiplierZ} */ - width?: ScalarValue + angularSpeedZ: ScalarValue /** - * The height of the particle. - * - * If {@link uniformScale} is enabled, {@link width} also controls the height, and this property is ignored. + * Multiplier for {@link angularSpeedZ}. * * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link scaleVariationY} + * - {@link rotationZ} */ - height?: ScalarValue + angularSpeedMultiplierZ: ScalarValue /** - * Color multiplier. + * Color multiplier for the particle. * * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. * @@ -17811,9 +17326,9 @@ export interface BillboardExParams { * - {@link color2} * - {@link color3} */ - color1?: Vector4Value + color1: Vector4Value /** - * Color multiplier. + * 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. * @@ -17825,9 +17340,9 @@ export interface BillboardExParams { * - {@link color1} * - {@link color3} */ - color2?: Vector4Value + color2: Vector4Value /** - * Color multiplier. + * 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}. * @@ -17839,7 +17354,37 @@ export interface BillboardExParams { * - {@link color1} * - {@link color2} */ - color3?: Vector4Value + 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 /** * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. * @@ -17849,150 +17394,169 @@ export interface BillboardExParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - alphaFadeThreshold?: ScalarValue + alphaFadeThreshold: ScalarValue /** - * Rotation around the X-axis in degrees. + * 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.Constant0 Constant 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. * - * See also: - * - {@link angularSpeedX} - * - {@link angularSpeedMultiplierX} + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - rotationX?: ScalarValue + frameIndexOffset: ScalarValue /** - * Rotation around the Y-axis in degrees. + * Horiztonal scroll speed for Layer 1. * * **Default**: `0` * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + */ + layer1SpeedU: ScalarValue + /** + * Vertical scroll speed for Layer 1. * - * See also: - * - {@link angularSpeedY} - * - {@link angularSpeedMultiplierY} + * **Default**: `0` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - rotationY?: ScalarValue + layer1SpeedV: ScalarValue /** - * Rotation around the Z-axis in degrees. + * Horizontal offset for the UV coordinates of Layer 1. * * **Default**: `0` * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link angularSpeedZ} - * - {@link angularSpeedMultiplierZ} */ - rotationZ?: ScalarValue + layer1OffsetU: ScalarValue /** - * Angular speed around the X-axis in degrees per second. + * Vertical offset for the UV coordinates of Layer 1. * * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationX} - * - {@link angularSpeedMultiplierX} + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - angularSpeedX?: ScalarValue + layer1OffsetV: ScalarValue /** - * Multiplier for {@link angularSpeedX}. + * Horizontal scale for the UV coordinates of Layer 1. * * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + */ + layer1ScaleU: ScalarValue + /** + * Vertical scale for the UV coordinates of Layer 1. * - * See also: - * - {@link rotationX} + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - 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. * @@ -18000,7 +17564,7 @@ export interface BillboardExParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - rgbMultiplier?: ScalarValue + rgbMultiplier: ScalarValue /** * Alpha multiplier. * @@ -18008,31 +17572,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. * @@ -18042,41 +17606,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. * @@ -18085,16 +17639,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`. * @@ -18103,7 +17655,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. * @@ -18112,7 +17664,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. * @@ -18124,85 +17676,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}. * @@ -18215,7 +17761,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. * @@ -18228,37 +17774,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. * @@ -18273,7 +17819,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. * @@ -18290,7 +17836,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. * @@ -18305,7 +17851,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. * @@ -18322,7 +17868,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. * @@ -18335,7 +17881,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. * @@ -18348,81 +17894,81 @@ 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. * - * **Default**: `5` + * 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_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. * @@ -18430,7 +17976,7 @@ export interface BillboardExParams { * * **Default**: `0` */ - unk_sdt_f2_32?: number + unk_sdt_f2_32: number /** * Specular texture ID. * @@ -18439,9 +17985,8 @@ export interface BillboardExParams { * See also: * - {@link lighting} * - {@link glossiness} - * - {@link specularity} */ - specular?: number + specular: number /** * Controls how sharp the specular highlights are. * @@ -18450,190 +17995,154 @@ 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) + 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 - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} +class Model extends DataAction { + declare readonly type: ActionType.Model /** - * 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: @@ -18644,6 +18153,8 @@ class BillboardEx extends DataAction { /** * Rotation around the Y-axis in degrees. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: @@ -18654,6 +18165,8 @@ class BillboardEx extends DataAction { /** * Rotation around the Z-axis in degrees. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: @@ -18664,6 +18177,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: @@ -18674,6 +18189,8 @@ class BillboardEx extends DataAction { /** * Multiplier for {@link angularSpeedX}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -18683,6 +18200,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: @@ -18693,6 +18212,8 @@ class BillboardEx extends DataAction { /** * Multiplier for {@link angularSpeedY}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -18702,6 +18223,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: @@ -18712,6 +18235,8 @@ class BillboardEx extends DataAction { /** * Multiplier for {@link angularSpeedZ}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -18719,66 +18244,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 /** @@ -18786,24 +18468,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} */ @@ -18811,50 +18513,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. * @@ -18862,20 +18654,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} @@ -18891,6 +18709,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} @@ -18904,6 +18724,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} @@ -18919,6 +18741,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} @@ -18930,6 +18754,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} @@ -18941,6 +18767,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} @@ -18949,238 +18777,188 @@ class BillboardEx extends DataAction { * - {@link minDistanceThreshold} */ maxDistanceThreshold: number + /** + * Unknown float. + * + * **Default**: `0` + */ unk_ds3_f2_20: number + /** + * Unknown integer. + * + * **Default**: `0` + */ 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 - /** - * Controls how dark shaded parts of the particle are. - */ - shadowDarkness: 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` + */ + unk_sdt_f2_34: number + /** + * Unknown integer. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `-2` + */ + unk_sdt_f2_35: number + /** + * Unknown integer. * - * See also: - * - {@link angularSpeedX} - * - {@link angularSpeedMultiplierX} + * **Default**: `-2` */ - rotationX?: ScalarValue + unk_sdt_f2_36: 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_sdt_f2_37: 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_ac6_f2_38: number /** - * Angular speed around the X-axis in degrees per second. + * Unknown float. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationX} - * - {@link angularSpeedMultiplierX} */ - angularSpeedX?: ScalarValue + unk_ds3_f2_28: number + constructor(props: Partial> = {}) { + super(ActionType.Model) + 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 /** - * 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}. * @@ -19192,9 +18970,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. * @@ -19206,9 +18984,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}. * @@ -19220,31 +18998,7 @@ export interface MultiTextureBillboardExParams { * - {@link color1} * - {@link color2} */ - color3?: Vector4Value - /** - * Color multiplier for both of the texture layers. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layersColor?: Vector4Value - /** - * Color multiplier for Layer 1. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layer1Color?: Vector4Value - /** - * Color multiplier for Layer 2. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layer2Color?: Vector4Value + color3: Vector4Value /** * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. * @@ -19254,7 +19008,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. * @@ -19264,7 +19018,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. * @@ -19272,139 +19026,37 @@ export interface MultiTextureBillboardExParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - frameIndexOffset?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_23?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_24?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_25?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_26?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_ds3_p1_27?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_ds3_p1_28?: ScalarValue - /** - * Horiztonal scroll speed for Layer 1. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layer1SpeedU?: ScalarValue - /** - * Vertical scroll speed for Layer 1. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layer1SpeedV?: ScalarValue - /** - * Horizontal offset for the UV coordinates of Layer 1. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - layer1OffsetU?: ScalarValue - /** - * Vertical offset for the UV coordinates of Layer 1. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - layer1OffsetV?: ScalarValue - /** - * Horizontal scale for the UV coordinates of Layer 1. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layer1ScaleU?: ScalarValue - /** - * Vertical scale for the UV coordinates of Layer 1. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layer1ScaleV?: ScalarValue + frameIndexOffset: ScalarValue /** - * Horiztonal scroll speed for Layer 2. + * 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} */ - layer2SpeedU?: ScalarValue + textureFraction: ScalarValue /** - * Vertical scroll speed for Layer 2. + * Controls how fast the UV coordinates should move horizontally. * * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - layer2SpeedV?: ScalarValue - /** - * Horizontal offset for the UV coordinates of Layer 2. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - layer2OffsetU?: ScalarValue + speedU: ScalarValue /** - * Vertical offset for the UV coordinates of Layer 2. + * Controls how much the UV coordinates should be randomly offset by per segment. * * **Default**: `0` * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - */ - layer2OffsetV?: ScalarValue - /** - * Horizontal scale for the UV coordinates of Layer 2. - * - * **Default**: `1` - * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - layer2ScaleU?: ScalarValue + varianceV: ScalarValue /** - * Vertical scale for the UV coordinates of Layer 2. - * - * **Default**: `1` + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `-1` */ - layer2ScaleV?: ScalarValue + unk_ds3_p1_13: ScalarValue /** * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * @@ -19412,7 +19064,7 @@ export interface MultiTextureBillboardExParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - rgbMultiplier?: ScalarValue + rgbMultiplier: ScalarValue /** * Alpha multiplier. * @@ -19420,31 +19072,36 @@ export interface MultiTextureBillboardExParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - alphaMultiplier?: ScalarValue + alphaMultiplier: ScalarValue /** - * Unknown. + * 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} */ - unk_ds3_p2_2?: ScalarValue + distortionIntensity: 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. * @@ -19454,47 +19111,60 @@ export interface MultiTextureBillboardExParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - alphaThreshold?: ScalarValue + alphaThreshold: ScalarValue /** - * Controls the orientation mode for the particles. See {@link OrientationMode} for more information. + * Tracer orientation mode. See {@link TracerOrientationMode} for more information. * - * **Default**: {@link OrientationMode.CameraPlane} + * **Default**: {@link TracerOrientationMode.LocalZ} */ - orientation?: OrientationMode + orientation: TracerOrientationMode /** - * Mask texture ID. + * Normal map texture ID. * - * **Default**: `1` + * This is used to control the distortion effect of the trail. + * + * **Default**: `0` + * + * See also: + * - {@link distortionIntensity} */ - mask?: number + normalMap: number /** - * Layer 1 texture ID. + * 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**: `1` + * **Default**: `0` */ - layer1?: number + segmentInterval: number /** - * Layer 2 texture ID. + * The trail is made up of multiple quads, or *segments*. This controls how long each segment should last in seconds. * * **Default**: `1` */ - layer2?: number + segmentDuration: 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` + * The trail is made up of multiple quads, or *segments*. This controls how many segments may exist at the same time. * - * See also: - * - {@link width} - * - {@link height} + * **Default**: `100` */ - uniformScale?: boolean + concurrentSegments: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_6?: number + 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`. * @@ -19503,7 +19173,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. * @@ -19512,91 +19182,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 integer. Possibly boolean? * * **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 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}. * @@ -19609,7 +19261,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. * @@ -19622,37 +19274,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. * @@ -19667,7 +19319,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. * @@ -19684,7 +19336,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. * @@ -19699,7 +19351,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. * @@ -19716,7 +19368,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. * @@ -19729,7 +19381,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. * @@ -19742,79 +19394,81 @@ 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. * - * **Default**: `5` + * 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_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. * @@ -19822,7 +19476,7 @@ export interface MultiTextureBillboardExParams { * * **Default**: `0` */ - unk_sdt_f2_32?: number + unk_sdt_f2_32: number /** * Specular texture ID. * @@ -19831,8 +19485,9 @@ export interface MultiTextureBillboardExParams { * See also: * - {@link lighting} * - {@link glossiness} + * - {@link specularity} */ - specular?: number + specular: number /** * Controls how sharp the specular highlights are. * @@ -19841,474 +19496,423 @@ 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 + unk_sdt_f2_36: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_37?: number + unk_sdt_f2_37: number /** - * Unknown integer. + * Controls how bright the specular highlights are. * - * **Default**: `1` - */ - unk_sdt_f2_38?: number - /** - * Unknown integer. + * **Default**: `0.5` * - * **Default**: `1` + * See also: + * - {@link lighting} + * - {@link specular} + * - {@link glossiness} */ - unk_sdt_f2_39?: number + specularity: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f2_40?: number + unk_er_f2_39: number + constructor(props: Partial> = {}) { + super(ActionType.Tracer) + this.assign(props) + } +} + +/** + * ### {@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 /** - * Unknown integer. + * Blend mode. * - * **Default**: `0` + * **Default**: {@link BlendMode.Normal} + * + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - unk_sdt_f2_41?: number + blendMode: BlendMode | ScalarProperty /** - * Unknown integer. + * X position offset. * * **Default**: `0` - */ - unk_er_f2_42?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_er_f2_43?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_er_f2_44?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_er_f2_45?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f2_46?: number -} - -/** - * ### {@link ActionType.MultiTextureBillboardEx Action 604 - MultiTextureBillboardEx} - * **Slot**: {@link ActionSlots.AppearanceAction Appearance} - * - * Particle with multiple textures that can scroll. - */ -class MultiTextureBillboardEx extends DataAction { - declare readonly type: ActionType.MultiTextureBillboardEx - 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} + * + * **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. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * The depth of the particle. * - * See also: - * - {@link angularSpeedY} - * - {@link angularSpeedMultiplierY} - */ - rotationY: ScalarValue - /** - * Rotation around the Z-axis in degrees. + * If {@link uniformScale} is enabled, {@link sizeX} also controls the depth, and this property is ignored. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * 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. * - * See also: - * - {@link angularSpeedZ} - * - {@link angularSpeedMultiplierZ} - */ - rotationZ: ScalarValue - /** - * Angular speed around the X-axis in degrees per second. + * **Default**: `1` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: - * - {@link rotationX} - * - {@link angularSpeedMultiplierX} + * - {@link scaleVariationZ} + * - {@link sizeX} + * - {@link sizeY} */ - angularSpeedX: ScalarValue + sizeZ: ScalarValue /** - * Multiplier for {@link angularSpeedX}. + * 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} - */ - angularSpeedMultiplierX: ScalarValue - /** - * Angular speed around the Y-axis in degrees per second. + * **Default**: `[1, 1, 1, 1]` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationY} - * - {@link angularSpeedMultiplierY} */ - angularSpeedY: ScalarValue + color: Vector4Value /** - * Multiplier for {@link angularSpeedY}. + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationY} + * **Default**: `[1, 1, 1, 1]` */ - angularSpeedMultiplierY: ScalarValue + unk_ds3_p1_7: Vector4Value /** - * Angular speed around the Z-axis in degrees per second. + * Controls the intensity of the distortion effect. At 0, there is no distortion at all. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` * - * See also: - * - {@link rotationZ} - * - {@link angularSpeedMultiplierZ} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - angularSpeedZ: ScalarValue + intensity: ScalarValue /** - * Multiplier for {@link angularSpeedZ}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Unknown scalar. * - * See also: - * - {@link rotationZ} + * **Default**: `0` */ - angularSpeedMultiplierZ: ScalarValue + unk_ds3_p1_9: ScalarValue /** - * Color multiplier for the particle. + * Controls the speed of the stirring effect in degrees per second. Requires {@link mode} to be set to {@link DistortionMode.Stir}. * - * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. + * **Default**: `60` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link color2} - * - {@link color3} */ - color1: Vector4Value + stirSpeed: 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. + * 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.EmissionTime Emission time} + * **Default**: `1` * - * See also: - * - {@link color1} - * - {@link color3} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - color2: Vector4Value + radius: 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}. + * Horizontal 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 + normalMapOffsetU: ScalarValue /** - * Color multiplier for both of the texture layers. + * Vertical offset for the {@link normalMap normal map}. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - */ - layersColor: Vector4Value - /** - * Color multiplier for Layer 1. + * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - layer1Color: Vector4Value + normalMapOffsetV: ScalarValue /** - * Color multiplier for Layer 2. + * Horizontal offset speed for the {@link normalMap normal map}. + * + * **Default**: `0` * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - layer2Color: Vector4Value + normalMapSpeedU: ScalarValue /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. + * Vertical offset speed for the {@link normalMap normal map}. * - * 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 + normalMapSpeedV: ScalarValue /** - * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. + * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * - * Seemingly identical to {@link frameIndexOffset}? The sum of these two properties is the actual frame index that gets used. + * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - frameIndex: ScalarValue + rgbMultiplier: ScalarValue /** - * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. + * Alpha multiplier. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - frameIndexOffset: ScalarValue - unk_ds3_p1_23: ScalarValue - unk_ds3_p1_24: ScalarValue - unk_ds3_p1_25: ScalarValue - unk_ds3_p1_26: ScalarValue - unk_ds3_p1_27: ScalarValue - unk_ds3_p1_28: ScalarValue + alphaMultiplier: ScalarValue /** - * Horiztonal scroll speed for Layer 1. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - layer1SpeedU: ScalarValue + unk_ds3_p2_2: ScalarValue /** - * Vertical scroll speed for Layer 1. + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `[1, 1, 1, 1]` */ - layer1SpeedV: ScalarValue + unk_ds3_p2_3: Vector4Value /** - * Horizontal offset for the UV coordinates of Layer 1. + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `[1, 1, 1, 1]` */ - layer1OffsetU: ScalarValue + unk_ds3_p2_4: Vector4Value /** - * Vertical offset for the UV coordinates of Layer 1. + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `[1, 1, 1, 1]` */ - layer1OffsetV: ScalarValue + unk_ds3_p2_5: Vector4Value /** - * Horizontal scale 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.ParticleAge Particle age} + * 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} */ - 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} + * 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` */ - layer2ScaleU: ScalarValue + texture: number /** - * Vertical scale for the UV coordinates of Layer 2. + * Normal map texture ID. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Only used if the distortion {@link mode} is set to something that uses it. + * + * **Default**: `0` */ - layer2ScaleV: ScalarValue + normalMap: number /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * Mask texture ID. This texture is used to control the color and opacity of the particle. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - rgbMultiplier: ScalarValue + mask: number /** - * Alpha multiplier. + * 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.ActiveTime Active time} + * If {@link uniformScale} is enabled, this also affects the height. + * + * **Default**: `1` + * + * See also: + * - {@link scaleVariationY} + * - {@link scaleVariationZ} */ - alphaMultiplier: ScalarValue - unk_ds3_p2_2: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value + scaleVariationX: 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 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. * - * 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 height, and this field is ignored. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` + * + * See also: + * - {@link scaleVariationX} + * - {@link scaleVariationZ} */ - alphaThreshold: ScalarValue + scaleVariationY: number /** - * Controls the orientation mode for the particles. See {@link OrientationMode} for more information. + * 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} */ - orientation: OrientationMode + scaleVariationZ: number /** - * Mask 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} */ - mask: number + uniformScale: boolean /** - * Layer 1 texture ID. + * Unknown integer. + * + * **Default**: `-2` */ - layer1: number + unk_ds3_f1_11: number /** - * Layer 2 texture ID. + * Unknown integer. + * + * **Default**: `0` */ - layer2: 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. * @@ -20316,20 +19920,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} @@ -20345,6 +19975,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} @@ -20358,6 +19990,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} @@ -20373,6 +20007,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} @@ -20384,6 +20020,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} @@ -20395,6 +20033,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} @@ -20403,373 +20043,240 @@ class MultiTextureBillboardEx extends DataAction { * - {@link minDistanceThreshold} */ maxDistanceThreshold: number + /** + * Unknown float. + * + * **Default**: `1` + */ 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 /** - * Controls how dark shaded parts of the particle are. + * Unknown integer. + * + * **Default**: `0` */ - shadowDarkness: number - unk_sdt_f2_31: number + unk_ds3_f2_21: 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_22: number /** - * Specular texture ID. + * Unknown integer. * - * See also: - * - {@link lighting} - * - {@link glossiness} + * **Default**: `0` */ - specular: number + unk_ds3_f2_23: number /** - * Controls how sharp the specular highlights are. + * Unknown integer. * - * See also: - * - {@link lighting} - * - {@link specular} + * **Default**: `0` */ - glossiness: number + unk_ds3_f2_24: number /** - * Controls how the particles are lit. See {@link LightingMode} for more information. + * Unknown float. + * + * **Default**: `1` */ - 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 { + unkDepthBlend1: number /** - * Model ID. - * - * **Default**: `80201` + * Unknown float. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `0` */ - model?: ScalarValue + unkDepthBlend2: number /** - * The width of the particle. - * - * If {@link uniformScale} is enabled, this also controls the height and depth. + * Unknown integer. * * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationX} - * - {@link sizeY} - * - {@link sizeZ} */ - sizeX?: ScalarValue + unk_ds3_f2_27: 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 integer. * - * See also: - * - {@link scaleVariationY} - * - {@link sizeX} - * - {@link sizeZ} + * **Default**: `0` */ - sizeY?: ScalarValue + unk_ds3_f2_28: number /** - * The depth of the particle. - * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the depth, and this property is ignored. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Unknown integer. * - * See also: - * - {@link scaleVariationZ} - * - {@link sizeX} - * - {@link sizeY} + * **Default**: `0` */ - sizeZ?: ScalarValue + unk_ds3_f2_29: 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_30: 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_sdt_f2_31: 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_32: 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_33: number /** - * Multiplier for {@link angularSpeedX}. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Unknown float. * - * See also: - * - {@link rotationX} + * **Default**: `0` */ - angularSpeedMultiplierX?: ScalarValue + unk_sdt_f2_34: number /** - * Angular speed around the Y-axis in degrees per second. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Unknown integer. * - * See also: - * - {@link rotationY} - * - {@link angularSpeedMultiplierY} + * **Default**: `-1` */ - angularSpeedY?: ScalarValue + unk_sdt_f2_35: number /** - * Multiplier for {@link angularSpeedY}. - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * 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) + 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 /** * 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. - * - * 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` + * Unknown vector4. * - * **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. * @@ -20777,7 +20284,7 @@ export interface ModelParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - rgbMultiplier?: ScalarValue + rgbMultiplier: ScalarValue /** * Alpha multiplier. * @@ -20785,245 +20292,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. * @@ -21033,37 +20400,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. * @@ -21078,7 +20445,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. * @@ -21095,7 +20462,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. * @@ -21110,7 +20477,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. * @@ -21127,7 +20494,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. * @@ -21140,7 +20507,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. * @@ -21153,1437 +20520,1510 @@ 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) + 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 /** - * Unknown integer. + * Controls the diffuse color of the light. * - * **Default**: `0` - */ - unk_sdt_f2_31?: number - /** - * Unknown integer. + * Values in this are unrestricted and can go above 1. * - * When set to 1, it can cause some ugly "outline" effects on things seen through particles. + * If {@link separateSpecular} is disabled, this also controls the specular color of the light. * - * **Default**: `0` - */ - unk_sdt_f2_32?: number - /** - * Unknown integer. + * **Default**: `[1, 1, 1, 1]` * - * **Default**: `0` - */ - unk_sdt_f2_33?: number - /** - * Unknown float. + * **Argument**: {@link PropertyArgument.ActiveTime Active time} * - * **Default**: `0` + * See also: + * - {@link specularColor} */ - unk_sdt_f2_34?: number + diffuseColor: Vector4Value /** - * Unknown integer. + * Controls the specular color of the light. * - * **Default**: `-2` - */ - unk_sdt_f2_35?: number - /** - * Unknown integer. + * Values in this are unrestricted and can go above 1. * - * **Default**: `-2` + * 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_36?: 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_37?: number + radius: ScalarValue /** - * Unknown integer. + * Unknown scalar. * * **Default**: `0` */ - unk_ac6_f2_38?: number + unk_ds3_p1_3: ScalarValue /** - * Unknown float. + * Unknown scalar. * * **Default**: `0` */ - 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_4: ScalarValue /** - * Model ID. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `0` */ - model: ScalarValue + unk_ds3_p1_5: ScalarValue /** - * The width of the particle. - * - * If {@link uniformScale} is enabled, this also controls the height and depth. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationX} - * - {@link sizeY} - * - {@link sizeZ} + * **Default**: `0` */ - sizeX: ScalarValue + unk_ds3_p1_6: ScalarValue /** - * The height of the particle. - * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the height, and this property is ignored. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationY} - * - {@link sizeX} - * - {@link sizeZ} + * **Default**: `10` */ - sizeY: ScalarValue + unk_ds3_p1_7: 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} + * **Default**: `10` */ - sizeZ: ScalarValue + unk_ds3_p1_8: ScalarValue /** - * Rotation around the X-axis in degrees. - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * Unknown scalar. * - * See also: - * - {@link angularSpeedX} - * - {@link angularSpeedMultiplierX} + * **Default**: `10` */ - rotationX: ScalarValue + unk_ds3_p1_9: ScalarValue /** - * Rotation around the Y-axis in degrees. + * 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.Constant0 Constant 0} + * **Default**: `1` * * See also: - * - {@link angularSpeedY} - * - {@link angularSpeedMultiplierY} + * - {@link falloffExponent} */ - rotationY: ScalarValue + unk_ds3_p2_0: ScalarValue /** - * Rotation around the Z-axis in degrees. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `1` + */ + unk_ds3_p2_1: ScalarValue + /** + * Unknown scalar. * - * See also: - * - {@link angularSpeedZ} - * - {@link angularSpeedMultiplierZ} + * **Default**: `1` */ - rotationZ: ScalarValue + unk_sdt_p2_2: ScalarValue /** - * Angular speed around the X-axis in degrees per second. + * A scalar multiplier for the {@link diffuseColor diffuse color}. Good for easily adjusting the brightness of the light without changing the color. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * If {@link separateSpecular} is disabled, this also affects the specular color of the light. * - * See also: - * - {@link rotationX} - * - {@link angularSpeedMultiplierX} + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - angularSpeedX: ScalarValue + diffuseMultiplier: ScalarValue /** - * Multiplier for {@link angularSpeedX}. + * A scalar multiplier for the {@link specularColor specular color}. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * If {@link separateSpecular} is disabled, this property is ignored. * - * See also: - * - {@link rotationX} + * **Default**: `1` + * + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - angularSpeedMultiplierX: ScalarValue + specularMultiplier: ScalarValue /** - * Angular speed around the Y-axis in degrees per second. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Unknown integer. * - * See also: - * - {@link rotationY} - * - {@link angularSpeedMultiplierY} + * **Default**: `0` */ - angularSpeedY: ScalarValue + unk_ds3_f1_0: number /** - * Multiplier for {@link angularSpeedY}. + * Unknown float. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` + */ + unk_ds3_f1_1: number + /** + * Unknown integer. * - * See also: - * - {@link rotationY} + * **Default**: `0` */ - angularSpeedMultiplierY: ScalarValue + unk_ds3_f2_0: number /** - * Angular speed around the Z-axis in degrees per second. + * Toggles the jitter and flicker animations for the light. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `false` * * See also: - * - {@link rotationZ} - * - {@link angularSpeedMultiplierZ} + * - {@link jitterAcceleration} + * - {@link jitterX} + * - {@link jitterY} + * - {@link jitterZ} + * - {@link flickerIntervalMin} + * - {@link flickerIntervalMax} + * - {@link flickerBrightness} */ - angularSpeedZ: ScalarValue + jitterAndFlicker: boolean /** - * Multiplier for {@link angularSpeedZ}. + * Controls the acceleration of the jittering. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` * * See also: - * - {@link rotationZ} + * - {@link jitterAndFlicker} + * - {@link jitterX} + * - {@link jitterY} + * - {@link jitterZ} */ - angularSpeedMultiplierZ: ScalarValue + jitterAcceleration: number /** - * 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. + * Unknown float. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `0` */ - blendMode: BlendMode | ScalarProperty + unk_ds3_f2_3: number /** - * Color multiplier. - * - * Values in this will be clamped to the 0-1 range. To use values outside of this range, see {@link color3}. + * Controls how much the light should move around randomly on the X-axis. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` * * See also: - * - {@link color2} - * - {@link color3} + * - {@link jitterAndFlicker} + * - {@link jitterAcceleration} + * - {@link jitterY} + * - {@link jitterZ} */ - color1: Vector4Value + jitterX: 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. + * Controls how much the light should move around randomly on the Y-axis. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `0` * * See also: - * - {@link color1} - * - {@link color3} + * - {@link jitterAndFlicker} + * - {@link jitterAcceleration} + * - {@link jitterX} + * - {@link jitterZ} */ - color2: Vector4Value + jitterY: 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}. + * Controls how much the light should move around randomly on the Z-axis. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` * * See also: - * - {@link color1} - * - {@link color2} + * - {@link jitterAndFlicker} + * - {@link jitterAcceleration} + * - {@link jitterX} + * - {@link jitterY} */ - color3: Vector4Value - unk_ds3_p1_15: ScalarValue + jitterZ: number /** - * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. + * Controls the minimum interval for flickering. * - * 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} + * See also: + * - {@link jitterAndFlicker} + * - {@link flickerIntervalMax} + * - {@link flickerBrightness} */ - frameIndex: ScalarValue + flickerIntervalMin: number /** - * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. + * Controls the maximum interval for flickering. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` + * + * See also: + * - {@link jitterAndFlicker} + * - {@link flickerIntervalMin} + * - {@link flickerBrightness} */ - frameIndexOffset: ScalarValue + flickerIntervalMax: number /** - * 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. + * Brightness multiplier for the light when it flickers. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `0.5` * * See also: - * - {@link speedU} - * - {@link offsetV} + * - {@link jitterAndFlicker} + * - {@link flickerIntervalMin} + * - {@link flickerIntervalMax} */ - offsetU: ScalarValue + flickerBrightness: number /** - * Vertical offset for the UV coordinates of the model. + * Controls if the light should have shadows or not. * - * 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. + * 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. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `false` */ - offsetV: ScalarValue + shadows: boolean /** - * 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. + * 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. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `false` * * See also: - * - {@link speedMultiplierU} - * - {@link offsetU} - */ - speedU: ScalarValue - /** - * Multiplier for {@link speedU}. - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * - {@link diffuseColor} + * - {@link specularColor} + * - {@link diffuseMultiplier} + * - {@link specularMultiplier} */ - speedMultiplierU: ScalarValue + separateSpecular: boolean /** - * 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. + * The number of seconds the light takes to fade to nothing after being destroyed. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Due to how the field this represents works, the time will be rounded to the nearest multiple of 1/30s. * - * See also: - * - {@link speedMultiplierV} - * - {@link offsetV} + * **Default**: `0` */ - speedV: ScalarValue + fadeOutTime: number /** - * Multiplier for {@link speedV}. + * Controls how dark shadows from this light source are. At 0, the shadows will be entirely invisible. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - speedMultiplierV: ScalarValue - unk_ds3_p1_24: ScalarValue + shadowDarkness: number /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - rgbMultiplier: ScalarValue + unk_ds3_f2_15: number /** - * Alpha multiplier. + * Unknown integer. * - * **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. + * **Default**: `2` */ - orientation: ModelOrientationMode + unk_ds3_f2_16: 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. + * Unknown integer. * - * See also: - * - {@link scaleVariationY} - * - {@link scaleVariationZ} + * **Default**: `1` */ - scaleVariationX: number + unk_ds3_f2_17: 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. + * Unknown float. * - * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationZ} + * **Default**: `0` */ - scaleVariationY: number + unk_ds3_f2_18: 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. + * Unknown float. * - * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationY} + * **Default**: `0` */ - scaleVariationZ: number + unk_ds3_f2_19: 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. + * Unknown float. * - * See also: - * - {@link sizeX} - * - {@link sizeY} - * - {@link sizeZ} - * - {@link scaleVariationX} - * - {@link scaleVariationY} - * - {@link scaleVariationZ} + * **Default**: `0` */ - uniformScale: boolean + unk_ds3_f2_20: 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**: `0` */ - columns: number + unk_ds3_f2_21: 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**: `100` */ - 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 + unk_ds3_f2_22: number /** - * Anibnd ID. + * Unknown integer. * - * See also: - * - {@link animation} - * - {@link loopAnimation} - * - {@link animationSpeed} + * **Default**: `0` */ - anibnd: number + unk_ds3_f2_23: number /** - * Controls which animation in the {@link anibnd} to play. + * 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. * - * See also: - * - {@link anibnd} - * - {@link loopAnimation} - * - {@link animationSpeed} + * Setting this to `0` will disable the distance limit. + * + * **Default**: `0` */ - animation: number + maxViewDistance: number /** - * If disabled, the {@link animation} will only play once and then freeze on the last frame. If enabled, the animation will loop. + * 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 anibnd} - * - {@link animation} - * - {@link animationSpeed} + * - {@link phaseFunction} + * - {@link asymmetryParam} */ - loopAnimation: boolean + volumeDensity: number /** - * Controls the speed at which the {@link animation} plays. + * Unknown float. * - * See also: - * - {@link anibnd} - * - {@link animation} - * - {@link loopAnimation} + * **Default**: `0` */ - 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 + unk_sdt_f2_25: 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. + * Controls whether or not {@link asymmetryParam} affects the fake fog from {@link volumeDensity}. * - * 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` */ - 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 + phaseFunction: boolean /** - * 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 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. * - * 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. + * - 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. * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `0.75` */ - minFadeDistance: number + asymmetryParam: 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. + * Controls the falloff exponent of the light. * - * This requires {@link minFadeDistance} to be set to a positive value or 0. + * Note: This is possibly something else, but the behavior is pretty similar to a falloff exponent in a few ways. * - * 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} + * - {@link unk_ds3_p2_0} */ - minDistance: number + falloffExponent: 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. + * Unknown integer. * - * 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` + */ + unk_er_f2_29: number + /** + * Unknown float. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - maxFadeDistance: number + unk_er_f2_30: 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. + * Unknown integer. * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. + * **Default**: `1` + */ + unk_er_f2_31: number + /** + * Unknown integer. * - * 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} + * **Default**: `0` */ - 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 + unk_er_f2_32: number /** - * Unknown integer. + * Unknown. Only used in Dark Souls 3. * - * When set to 1, it can cause some ugly "outline" effects on things seen through particles. + * **Default**: `1` */ - 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}) + unk_ds3_f2_12: number + constructor(props: Partial> = {}) { + super(ActionType.PointLight) this.assign(props) } } -export interface TracerParams { +/** + * ### {@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 + + constructor() { + super(ActionType.SimulateTermination) + } +} + +/** + * ### {@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 /** - * Texture ID. + * The duration of the fade out in seconds. * * **Default**: `1` * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - texture?: ScalarValue + duration: ScalarValue /** - * Blend mode. - * - * **Default**: {@link BlendMode.Normal} + * @param duration The duration of the fade out in seconds. + * + * **Default**: `1` * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - blendMode?: BlendMode | ScalarProperty + constructor(duration: ScalarValue = 1) { + super(ActionType.FadeTermination) + 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 + + constructor() { + super(ActionType.InstantTermination) + } +} + +/** + * ### {@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 /** - * The width of the trail. + * The speed in the direction of the force. * - * **Default**: `1` + * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - width?: ScalarValue + speed: ScalarValue /** - * Multiplier for {@link width}. + * A multiplier for {@link speed}. * * **Default**: `1` * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - widthMultiplier?: ScalarValue + speedMultiplier: ScalarValue /** - * Unknown. + * Unknown integer. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_p1_2?: ScalarValue + unk_sdt_f1_0: number + constructor(props: Partial> = {}) { + super(ActionType.NodeForceSpeed) + 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 /** - * Unknown. + * The speed in the direction of the force. * * **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} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - color1?: Vector4Value + speed: 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. - * - * **Default**: `[1, 1, 1, 1]` + * A multiplier for {@link speed}. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `1` * - * See also: - * - {@link color1} - * - {@link color3} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - color2?: Vector4Value + speedMultiplier: 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}. - * - * **Default**: `[1, 1, 1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Unknown integer. * - * See also: - * - {@link color1} - * - {@link color2} + * **Default**: `1` */ - color3?: Vector4Value + unk_sdt_f1_0: 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. 0 and 1 seems to be valid values, while all other values cause the wind to not affect the particles. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - alphaFadeThreshold?: ScalarValue + unk_sdt_f1_1: number + constructor(props: Partial> = {}) { + super(ActionType.ParticleForceSpeed) + 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 /** - * 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. + * The acceleration in the direction of the force. * * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - frameIndex?: ScalarValue + acceleration: ScalarValue /** - * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. + * A multiplier for {@link acceleration}. * - * **Default**: `0` + * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - frameIndexOffset?: ScalarValue + accelerationMultiplier: 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` + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - textureFraction?: ScalarValue + unk_sdt_f1_0: number + constructor(props: Partial> = {}) { + super(ActionType.NodeForceAcceleration) + 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 /** - * Controls how fast the UV coordinates should move horizontally. + * The acceleration in the direction of the force. * * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - speedU?: ScalarValue + acceleration: ScalarValue /** - * Controls how much the UV coordinates should be randomly offset by per segment. + * A multiplier for {@link acceleration}. * - * **Default**: `0` + * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - varianceV?: ScalarValue + accelerationMultiplier: ScalarValue /** - * Unknown. + * Unknown integer. * - * **Default**: `-1` + * **Default**: `1` */ - unk_ds3_p1_13?: ScalarValue + unk_sdt_f1_0: number /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - * - * **Default**: `1` + * Unknown. 0 and 1 seems to be valid values, while all other values cause the wind to not affect the particles. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - rgbMultiplier?: ScalarValue + unk_sdt_f1_1: number + constructor(props: Partial> = {}) { + super(ActionType.ParticleForceAcceleration) + this.assign(props) + } +} + +/** + * ### {@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 /** - * Alpha multiplier. + * 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` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - alphaMultiplier?: ScalarValue + radius: number /** - * Controls the intensity of the distortion effect. At 0, there is no distortion at all. - * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * 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. | * - * See also: - * - {@link normalMap} + * **Default**: `0.5` */ - distortionIntensity?: ScalarValue + friction: number /** - * Unknown. + * 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**: `[1, 1, 1, 1]` + * **Default**: `0.5` */ - unk_ds3_p2_3?: Vector4Value + bounciness: number + constructor(props: Partial> = {}) { + super(ActionType.ParticleForceCollision) + this.assign(props) + } +} + +/** + * ### {@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 /** - * Unknown. + * Controls how well the particles follow the node if it moves. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` */ - unk_ds3_p2_4?: Vector4Value + particleFollowFactor: ScalarValue /** - * Unknown. + * Unknown scalar. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` */ - unk_ds3_p2_5?: Vector4Value + unk_ds3_p1_1: ScalarValue /** - * 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 scalar. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - alphaThreshold?: ScalarValue + unk_ds3_p1_2: ScalarValue /** - * Tracer orientation mode. See {@link TracerOrientationMode} for more information. + * Unknown scalar. * - * **Default**: {@link TracerOrientationMode.LocalZ} + * **Default**: `0` */ - orientation?: TracerOrientationMode + unk_ds3_p1_3: ScalarValue /** - * Normal map texture ID. - * - * This is used to control the distortion effect of the trail. + * Particle acceleration along the X-axis. * * **Default**: `0` * * See also: - * - {@link distortionIntensity} + * - {@link particleAccelerationMin} + * - {@link particleAccelerationMax} */ - normalMap?: number + particleAccelerationX: ScalarValue /** - * 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. + * Particle acceleration along the Y-axis. * * **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` + * See also: + * - {@link particleAccelerationMin} + * - {@link particleAccelerationMax} */ - segmentDuration?: number + particleAccelerationY: ScalarValue /** - * The trail is made up of multiple quads, or *segments*. This controls how many segments may exist at the same time. + * Particle acceleration along the Z-axis. * - * **Default**: `100` + * **Default**: `0` + * + * See also: + * - {@link particleAccelerationMin} + * - {@link particleAccelerationMax} */ - concurrentSegments?: number + particleAccelerationZ: ScalarValue /** - * Unknown integer. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_f1_7?: number + unk_ds3_p1_7: ScalarValue /** - * Unknown float. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_f1_8?: number + unk_ds3_p1_8: ScalarValue /** - * Unknown float. + * Angular acceleration for particles around the Z-axis in degrees per second squared. * * **Default**: `0` + * + * See also: + * - {@link particleAngularAccelerationMin} + * - {@link particleAngularAccelerationMax} */ - unk_ds3_f1_9?: number + particleAngularAccelerationZ: ScalarValue /** - * 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 rate of change for the width of the particles. * - * **Default**: `1` + * **Default**: `0` * * See also: - * - {@link totalFrames} + * - {@link particleGrowthRateXStatic} */ - columns?: number + particleGrowthRateX: ScalarValue /** - * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. + * The rate of change for the height of the particles. * - * **Default**: `1` + * **Default**: `0` * * See also: - * - {@link columns} + * - {@link particleGrowthRateYStatic} */ - totalFrames?: number + particleGrowthRateY: ScalarValue /** - * 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 scalar. * - * **Default**: `true` + * **Default**: `0` */ - attachedUV?: boolean + unk_ds3_p1_12: ScalarValue /** - * Unknown integer. + * Color multiplier. * - * **Default**: `-1` + * Values in this are unrestricted and can go above 1. + * + * **Default**: `[1, 1, 1, 1]` + * + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - unk_ds3_f1_13?: number + color: Vector4Value /** - * Unknown integer. + * Unknown scalar. * - * **Default**: `-1` + * **Default**: `1` */ - unk_ds3_f1_14?: number + unk_ds3_p1_14: ScalarValue /** - * Unknown integer. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_f1_15?: number + unk_ds3_p1_15: ScalarValue /** - * Unknown integer. + * Seemingly identical to {@link particleAccelerationZ}? * - * **Default**: `1` + * **Default**: `0` */ - unk_er_f1_14?: number + unkParticleAcceleration: ScalarValue /** - * Unknown integer. + * Unknown scalar. * - * **Default**: `1` + * **Default**: `0` */ - unk_er_f1_15?: number + unk_ds3_p1_17: ScalarValue /** - * Unknown integer. + * Downwards acceleration for particles. * * **Default**: `0` */ - unk_er_f1_16?: number + particleGravity: ScalarValue /** - * Unknown integer. + * Maximum random turn angle for particles. Requires {@link particleRandomTurns} to be enabled. * * **Default**: `0` + * + * See also: + * - {@link particleRandomTurns} + * - {@link particleRandomTurnIntervalMax} */ - unk_ds3_f2_0?: number + particleRandomTurnAngle: ScalarValue /** - * Unknown boolean. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_f2_1?: boolean + unk_ds3_p1_20: ScalarValue /** - * Unknown integer. + * Unknown scalar. * - * **Default**: `8` + * **Default**: `1` */ - unk_ds3_f2_2?: number + unk_ds3_p2_0: ScalarValue /** - * Unknown integer. + * Unknown scalar. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f2_3?: number + unk_ds3_p2_1: ScalarValue /** - * 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 scalar. * - * See also: - * - {@link bloomColor} + * **Default**: `0` */ - bloom?: boolean + unk_ds3_p2_2: 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. + * Unknown vector4. * - * 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, 1]` + */ + unk_ds3_p2_3: Vector4Value + /** + * Unknown vector4. * - * **Default**: `[1, 1, 1, 0]` + * **Default**: `[1, 1, 1, 1]` + */ + unk_ds3_p2_4: Vector4Value + /** + * Unknown vector4. * - * See also: - * - {@link bloom} + * **Default**: `[1, 1, 1, 1]` */ - bloomColor?: Vector4 + unk_ds3_p2_5: Vector4Value /** - * Unknown float. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_f2_9?: number + unk_ds3_p2_6: ScalarValue /** * Unknown integer. * - * **Default**: `0` + * **Default**: `1005` */ - unk_ds3_f2_10?: number + unk_ds3_f1_0: number /** - * Unknown integer. + * The ID of the texture of the particles. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f2_11?: number + texture: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_12?: number + unk_ds3_f1_2: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_13?: number + normalMap: 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 the shape of the particle emitter. See {@link EmitterShape} for more details. * - * 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**: {@link EmitterShape.Box} + */ + emitterShape: EmitterShape + /** + * Unknown integer. * - * **Default**: `-1` + * **Default**: `0` + */ + unk_ds3_f1_5: number + /** + * The size of the emitter. * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `[1, 1, 1]` */ - minFadeDistance?: number + emitterSize: 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. + * The rotation of the emitter. * - * This requires {@link minFadeDistance} to be set to a positive value or 0. + * **Default**: `[0, 0, 0]` + */ + emitterRotation: Vector3 + /** + * Unknown float. * - * 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` + */ + unk_ds3_f1_12: number + /** + * Unknown float. * - * **Default**: `-1` + * **Default**: `1` + */ + unk_ds3_f1_13: number + /** + * Unknown float. * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - minDistance?: number + unk_ds3_f1_14: 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 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. | * - * 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` + */ + 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. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `0` */ - maxFadeDistance?: number + unk_ds3_f1_19: 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. + * Unknown integer. * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. + * **Default**: `0` + */ + unk_ds3_f1_20: number + /** + * Unknown integer. * - * 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**: `100` + */ + unk_ds3_f1_21: number + /** + * The number of particles to emit per emission. * - * **Default**: `-1` + * **Default**: `10` * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link emissionParticleCountMin} + * - {@link emissionParticleCountMax} */ - maxDistance?: number + emissionParticleCount: 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. + * 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**: `-1` + * **Default**: `0` * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} + * - {@link emissionParticleCount} + * - {@link emissionParticleCountMax} */ - minDistanceThreshold?: number + emissionParticleCountMin: 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. + * 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**: `-1` + * **Default**: `0` * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} + * - {@link emissionParticleCount} + * - {@link emissionParticleCountMin} */ - maxDistanceThreshold?: number + emissionParticleCountMax: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_20?: number + unk_ds3_f1_25: number /** - * Unknown integer. + * 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 emissionIntervalMax} */ - unk_ds3_f2_21?: number + emissionIntervalMin: number /** - * Unknown integer. + * 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 emissionIntervalMin} */ - unk_ds3_f2_22?: number + emissionIntervalMax: number /** - * Unknown integer. + * 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` */ - unk_ds3_f2_23?: number + emissionCountLimit: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_24?: number + unk_ds3_f1_30: number /** - * Unknown float. + * 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` */ - unkDepthBlend1?: number + particleDuration: number /** - * Unknown float. + * Unknown integer. * * **Default**: `0` */ - unkDepthBlend2?: number + unk_ds3_f1_32: number /** * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_ds3_f2_27?: number + unk_ds3_f1_33: number /** - * Unknown integer. + * Particle position offset. * - * **Default**: `0` + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleOffsetMin} + * - {@link particleOffsetMax} */ - unk_ds3_f2_28?: number + particleOffset: Vector3 /** - * Unknown float. + * 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**: `5` + * **Default**: `[0, 0, 0]` */ - unk_ds3_f2_29?: number + particleOffsetMin: Vector3 /** - * Controls how dark shaded parts of the trail are. + * 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` + * **Default**: `[0, 0, 0]` */ - shadowDarkness?: number + particleOffsetMax: Vector3 /** - * Unknown integer. + * Particle speed. * - * **Default**: `0` + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleSpeedMin} + * - {@link particleSpeedMax} */ - unk_sdt_f2_31?: number + particleSpeed: Vector3 /** - * Unknown integer. + * Minimum particle speed. A random value between this and {@link particleSpeedMax} will be added to {@link particleSpeed} to get the final speed. * - * 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]` + */ + 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` + * **Default**: `[0, 0, 0]` */ - unk_sdt_f2_32?: number + particleSpeedMax: Vector3 /** - * Specular texture ID. + * 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` + * **Default**: `[0, 0, 0]` * * See also: - * - {@link lighting} - * - {@link glossiness} - * - {@link specularity} + * - {@link particleAccelerationX} + * - {@link particleAccelerationY} + * - {@link particleAccelerationZ} */ - specular?: number + particleAccelerationMin: Vector3 /** - * Controls how sharp the specular highlights are. + * 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.25` + * **Default**: `[0, 0, 0]` * * See also: - * - {@link lighting} - * - {@link specular} - * - {@link specularity} + * - {@link particleAccelerationX} + * - {@link particleAccelerationY} + * - {@link particleAccelerationZ} */ - glossiness?: number + particleAccelerationMax: Vector3 /** - * Controls how the trail is lit. See {@link LightingMode} for more information. + * Maximum amount of random rotation for each particle in degrees. * - * **Default**: {@link LightingMode.Unlit} + * **Default**: `[0, 0, 0]` */ - lighting?: LightingMode + particleRotationVariance: Vector3 /** - * Unknown integer. + * Maximum amount of random angular speed for each particle in degrees per second. * - * **Default**: `-2` + * **Default**: `[0, 0, 0]` */ - unk_sdt_f2_36?: number + particleAngularSpeedVariance: Vector3 /** - * Unknown integer. + * Minimum amount of random angular acceleration for each particle in degrees per second squared. * - * **Default**: `0` + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleAngularAccelerationMax} */ - unk_sdt_f2_37?: number + particleAngularAccelerationMin: Vector3 /** - * Controls how bright the specular highlights are. + * Maximum amount of random angular acceleration for each particle in degrees per second squared. * - * **Default**: `0.5` + * **Default**: `[0, 0, 0]` * * See also: - * - {@link lighting} - * - {@link specular} - * - {@link glossiness} + * - {@link particleAngularAccelerationMin} */ - specularity?: number + particleAngularAccelerationMax: Vector3 /** - * Unknown integer. + * 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**: `0` + * **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} */ - 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} + particleUniformScale: boolean /** - * Texture ID. + * The width of the particle. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `1` */ - texture: ScalarValue + particleSizeX: number /** - * Blend mode. + * The height of the particle. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `1` */ - blendMode: BlendMode | ScalarProperty + particleSizeY: number /** - * The width of the trail. + * Unknown float. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - width: ScalarValue + unk_ds3_f1_73: number /** - * Multiplier for {@link width}. + * 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. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `0` */ - widthMultiplier: ScalarValue - unk_ds3_p1_2: ScalarValue - unk_ds3_p1_3: ScalarValue + particleSizeXMin: 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} + * 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. * - * See also: - * - {@link color2} - * - {@link color3} + * **Default**: `0` */ - color1: Vector4Value + particleSizeYMin: number /** - * Color multiplier. + * Unknown float. * - * 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**: `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. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **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. * - * See also: - * - {@link color1} - * - {@link color3} + * **Default**: `0` */ - color2: Vector4Value + particleSizeYMax: number /** - * Color multiplier. + * 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_ds3_f1_79: number + /** + * The rate of change for the width of the particles. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` * * See also: - * - {@link color1} - * - {@link color2} + * - {@link particleGrowthRateX} */ - color3: Vector4Value + particleGrowthRateXStatic: number /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. + * The rate of change for the height of the particles. * - * 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} + * See also: + * - {@link particleGrowthRateY} */ - alphaFadeThreshold: ScalarValue + particleGrowthRateYStatic: number /** - * The index of the frame to show from the texture atlas. Can be animated using a {@link PropertyFunction.Linear linear property} or similar. + * Unknown float. * - * Seemingly identical to {@link frameIndexOffset}? The sum of these two properties is the actual frame index that gets used. + * **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. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - frameIndex: ScalarValue + particleGrowthRateXMin: number /** - * Seemingly identical to {@link frameIndex}? The sum of these two properties is the actual frame index that gets used. + * 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. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - frameIndexOffset: ScalarValue + particleGrowthRateYMin: 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 float. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - textureFraction: ScalarValue + unk_ds3_f1_85: number /** - * Controls how fast the UV coordinates should move horizontally. + * 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. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - speedU: ScalarValue + particleGrowthRateXMax: number /** - * Controls how much the UV coordinates should be randomly offset by per segment. + * 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. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - varianceV: ScalarValue - unk_ds3_p1_13: ScalarValue + particleGrowthRateYMax: number /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - rgbMultiplier: ScalarValue + unk_ds3_f1_88: number /** - * Alpha multiplier. + * Minimum acceleration of change for the width of the particles. A random value between this and {@link particleGrowthAccelerationXMax} will be the final growth acceleration. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - alphaMultiplier: ScalarValue + particleGrowthAccelerationXMin: number /** - * Controls the intensity of the distortion effect. At 0, there is no distortion at all. + * Minimum acceleration of change for the height of the particles. A random value between this and {@link particleGrowthAccelerationYMax} will be the final growth acceleration. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` + */ + particleGrowthAccelerationYMin: number + /** + * Unknown float. * - * See also: - * - {@link normalMap} + * **Default**: `0` */ - distortionIntensity: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value + unk_ds3_f1_91: number /** - * Parts of the particle with less opacity than this threshold will be invisible. The range is 0-255. + * Minimum acceleration of change for the width of the particles. A random value between this and {@link particleGrowthAccelerationXMin} will be the final growth acceleration. * - * This threshold creates a hard cut-off between visible and not visible, which is unlike the {@link alphaFadeThreshold}. + * **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. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - alphaThreshold: ScalarValue + particleGrowthAccelerationYMax: number /** - * Tracer orientation mode. See {@link TracerOrientationMode} for more information. + * Unknown float. + * + * **Default**: `0` */ - orientation: TracerOrientationMode + unk_ds3_f1_94: number /** - * Normal map texture ID. + * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * - * This is used to control the distortion effect of the trail. + * **Default**: `1` + */ + rgbMultiplier: number + /** + * Alpha multiplier. * - * See also: - * - {@link distortionIntensity} + * **Default**: `1` */ - normalMap: number + alphaMultiplier: 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. + * 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]` */ - segmentInterval: number + colorMin: Vector4 /** - * The trail is made up of multiple quads, or *segments*. This controls how long each segment should last in seconds. + * 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]` */ - segmentDuration: number + colorMax: Vector4 /** - * The trail is made up of multiple quads, or *segments*. This controls how many segments may exist at the same time. + * Blend mode. + * + * **Default**: {@link BlendMode.Normal} */ - concurrentSegments: number - unk_ds3_f1_7: number - unk_ds3_f1_8: number - unk_ds3_f1_9: number + 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} */ @@ -22591,594 +22031,484 @@ class Tracer 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 /** - * 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}. + * When enabled, this makes each particle pick a random frame from the animation and only display that one frame. * - * 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**: `false` * * See also: - * - {@link bloomColor} + * - {@link columns} + * - {@link totalFrames} + * - {@link maxFrameIndex} */ - bloom: boolean + randomTextureFrame: 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. + * Unknown integer. * - * See also: - * - {@link bloom} + * **Default**: `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 + unk_ds3_f1_109: 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 the maximum frame index when {@link randomTextureFrame picking a random frame to display}. * - * 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 randomTextureFrame} */ - minFadeDistance: number + maxFrameIndex: 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. + * Unknown integer. * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `-1` */ - minDistance: number + unk_ds3_f1_111: 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**: `-1` */ - maxFadeDistance: number + unk_ds3_f1_112: 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**: `0` */ - maxDistance: number + unk_ds3_f1_113: 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. + * Unknown integer. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - minDistanceThreshold: number + unk_ds3_f1_114: 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} - */ - 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 - /** - * Controls how dark shaded parts of the trail are. + * **Default**: `0` */ - shadowDarkness: number - unk_sdt_f2_31: number + unk_ds3_f1_115: 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_f1_116: number /** - * Specular texture ID. + * Unknown float. * - * See also: - * - {@link lighting} - * - {@link glossiness} - * - {@link specularity} + * **Default**: `1` */ - specular: number + unk_ds3_f1_117: number /** - * Controls how sharp the specular highlights are. + * Unknown float. * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link specularity} + * **Default**: `1` */ - glossiness: number + unk_ds3_f1_118: number /** - * Controls how the trail is lit. See {@link LightingMode} for more information. + * Multiplier for {@link particleDuration}. + * + * **Default**: `1` */ - lighting: LightingMode - unk_sdt_f2_36: number - unk_sdt_f2_37: number + particleDurationMultiplier: number /** - * Controls how bright the specular highlights are. + * Unknown float. * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link glossiness} + * **Default**: `1` */ - specularity: number - unk_er_f2_39: number - constructor(props: TracerParams = {}) { - super(ActionType.Tracer, {isAppearance:true,isParticle:true}) - this.assign(props) - } -} - -export interface DistortionParams { + unk_ds3_f1_120: number /** - * Blend mode. - * - * **Default**: {@link BlendMode.Normal} + * Scalar multiplier for the size of the particles. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `1` */ - blendMode?: BlendMode | ScalarProperty + particleSizeMultiplier: number /** - * X position offset. - * - * **Default**: `0` + * Unknown float. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - offsetX?: ScalarValue + unk_ds3_f1_122: number /** - * Y position offset. - * - * **Default**: `0` + * Unknown float. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - offsetY?: ScalarValue + unk_ds3_f1_123: number /** - * Z position offset. - * - * **Default**: `0` + * Unknown float. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - offsetZ?: ScalarValue + unk_ds3_f1_124: 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 + unk_ds3_f1_125: number /** - * The height of the particle. - * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the height, and this property is ignored. + * Unknown float. * * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationY} - * - {@link sizeX} - * - {@link sizeZ} */ - sizeY?: ScalarValue + unk_ds3_f1_126: number /** - * The depth of the particle. - * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the depth, and this property is ignored. + * Unknown integer. * - * 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**: `0` + */ + unk_ds3_f1_127: number + /** + * Unknown float. * * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link scaleVariationZ} - * - {@link sizeX} - * - {@link sizeY} */ - sizeZ?: ScalarValue + unk_ds3_f1_128: number /** - * 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]` + * Unknown float. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - color?: Vector4Value + unk_ds3_f1_129: number /** - * Unknown. + * Unknown float. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `1` */ - unk_ds3_p1_7?: Vector4Value + unk_ds3_f1_130: number /** - * Controls the intensity of the distortion effect. At 0, there is no distortion at all. + * Unknown float. * * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - intensity?: ScalarValue + unk_ds3_f1_131: number /** - * Unknown. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_p1_9?: ScalarValue + unk_ds3_f1_132: number /** - * Controls the speed of the stirring effect in degrees per second. Requires {@link mode} to be set to {@link DistortionMode.Stir}. - * - * **Default**: `60` + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - stirSpeed?: ScalarValue + unk_ds3_f1_133: number /** - * 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` + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - radius?: ScalarValue + unk_ds3_f1_134: number /** - * Horizontal offset for the {@link normalMap normal map}. + * Unknown float. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - normalMapOffsetU?: ScalarValue + unk_ds3_f1_135: number /** - * Vertical offset for the {@link normalMap normal map}. + * Unknown float. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - normalMapOffsetV?: ScalarValue + unk_ds3_f1_136: number /** - * Horizontal offset speed for the {@link normalMap normal map}. + * Unknown integer. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - normalMapSpeedU?: ScalarValue + unk_ds3_f1_137: number /** - * Vertical offset speed for the {@link normalMap normal map}. - * - * **Default**: `0` + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `8` */ - normalMapSpeedV?: ScalarValue + unk_ds3_f1_138: number /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. - * - * **Default**: `1` + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - rgbMultiplier?: ScalarValue + unk_ds3_f1_139: number /** - * Alpha multiplier. - * - * **Default**: `1` + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - alphaMultiplier?: ScalarValue + unk_ds3_f1_140: number /** - * Unknown. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_p2_2?: ScalarValue + unk_ds3_f1_141: number /** - * Unknown. + * If enabled, the particle system stops updating if the camera is beyond the distance specified by {@link updateDistance} from the node. * - * **Default**: `[1, 1, 1, 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**: `false` */ - unk_ds3_p2_3?: Vector4Value + limitUpdateDistance: boolean /** - * Unknown. + * Controls how close the camera needs to be to the node for the particle system to update. Requires {@link limitUpdateDistance} to be enabled. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` */ - unk_ds3_p2_4?: Vector4Value + updateDistance: number /** - * Unknown. + * 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, 1, 1, 1]` + * **Default**: `false` + * + * See also: + * - {@link particleBounciness} */ - unk_ds3_p2_5?: Vector4Value + particleCollision: 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. + * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. * * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * See also: + * - {@link particleCollision} */ - alphaThreshold?: ScalarValue + particleBounciness: number /** - * Unknown. + * 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**: `1` + * **Default**: `false` + * + * See also: + * - {@link particleRandomTurnIntervalMax} + * - {@link particleRandomTurnAngle} */ - unk_er_p2_7?: ScalarValue + particleRandomTurns: boolean /** - * Unknown. + * 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} */ - unk_er_p2_8?: ScalarValue + particleRandomTurnIntervalMax: number /** - * Controls what type of distortion to apply. See {@link DistortionMode} for more details. + * 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**: {@link DistortionMode.NormalMap} + * **Default**: `false` + * + * See also: + * - {@link particleTraceLength} */ - mode?: DistortionMode + traceParticles: boolean /** - * Controls the shape of the particle. See {@link DistortionShape} for more information. + * Unknown float. * - * **Default**: {@link DistortionShape.Rectangle} + * **Default**: `1` */ - shape?: DistortionShape + unk_ds3_f1_149: number /** - * Controls the orientation mode for the particles. See {@link OrientationMode} for more information. + * Controls how much the particles are stretched when {@link traceParticles} is enabled. * - * **Default**: {@link OrientationMode.CameraPlane} + * **Default**: `1` */ - orientation?: OrientationMode + particleTraceLength: number /** - * 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. + * 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` */ - texture?: number + traceParticlesThreshold: number /** - * Normal map texture ID. + * If enabled, this will add a billboarding sprite to the leading end of trace particles. * - * Only used if the distortion {@link mode} is set to something that uses it. + * **Default**: `false` * - * **Default**: `0` + * See also: + * - {@link traceParticles} */ - normalMap?: number + traceParticleHead: boolean /** - * Mask texture ID. This texture is used to control the color and opacity of the particle. + * Unknown integer. * * **Default**: `0` */ - mask?: number + unk_ds3_f1_153: 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. + * Unknown integer. * - * If {@link uniformScale} is enabled, this also affects the height. + * **Default**: `0` + */ + unk_ds3_f1_154: number + /** + * Controls whether or not the particles have a bloom effect. * - * **Default**: `1` + * **Default**: `false` * * See also: - * - {@link scaleVariationY} - * - {@link scaleVariationZ} + * - {@link bloomColor} */ - scaleVariationX?: number + bloom: boolean /** - * 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. + * 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. * - * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the height, and this field is ignored. + * 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` + * **Default**: `[1, 1, 1, 0]` * * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationZ} + * - {@link bloom} */ - scaleVariationY?: number + bloomColor: Vector4 /** - * 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. + * Unknown float. * * **Default**: `1` + */ + unk_sdt_f1_160: number + /** + * Unknown integer. * - * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationY} + * **Default**: `0` */ - scaleVariationZ?: number + unk_sdt_f1_161: 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. + * Unknown float. * - * **Default**: `false` + * **Default**: `1` + */ + unk_sdt_f1_162: number + /** + * Unknown float. * - * See also: - * - {@link sizeX} - * - {@link sizeY} - * - {@link sizeZ} - * - {@link scaleVariationX} - * - {@link scaleVariationY} - * - {@link scaleVariationZ} + * **Default**: `1` */ - uniformScale?: boolean + unk_sdt_f1_163: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `-2` + * **Default**: `1` */ - unk_ds3_f1_11?: number + unk_sdt_f1_164: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_12?: number + unk_sdt_f1_165: number /** - * Unknown integer. + * Unknown float. * * **Default**: `1` */ - unk_er_f1_12?: number + unk_sdt_f1_166: number /** - * Unknown integer. + * Unknown float. * * **Default**: `1` */ - unk_er_f1_13?: 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_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 float. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_ds3_f2_3?: number + unk_ds3_f2_3: number /** * Unknown integer. * * **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. + * Unknown float. * - * 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` + */ + unk_ds3_f2_5: number + /** + * Unknown float. * - * **Default**: `[1, 1, 1, 0]` + * **Default**: `1` + */ + unk_ds3_f2_6: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_ds3_f2_7: number + /** + * Unknown float. + * + * **Default**: `1` */ - bloomColor?: Vector4 + unk_ds3_f2_8: number /** * 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. * @@ -23193,7 +22523,7 @@ export interface DistortionParams { * - {@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. * @@ -23210,7 +22540,7 @@ export interface DistortionParams { * - {@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. * @@ -23225,7 +22555,7 @@ export interface DistortionParams { * - {@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. * @@ -23242,7 +22572,7 @@ export interface DistortionParams { * - {@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. * @@ -23255,7 +22585,7 @@ export interface DistortionParams { * - {@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. * @@ -23268,2281 +22598,1894 @@ export interface DistortionParams { * - {@link maxDistance} * - {@link minDistanceThreshold} */ - maxDistanceThreshold?: number + maxDistanceThreshold: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `1` + * **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 integer. + * Unknown float. * * **Default**: `0` */ - unk_ds3_f2_29?: number + unk_sdt_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. * + * 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 + unk_sdt_f2_32: number /** - * Unknown integer. + * Specular texture ID. * * **Default**: `0` + * + * See also: + * - {@link lighting} + * - {@link glossiness} + * - {@link specularity} */ - unk_sdt_f2_33?: number + specular: number /** - * Unknown float. + * Controls how sharp the specular highlights are. * - * **Default**: `0` + * **Default**: `0.25` + * + * See also: + * - {@link lighting} + * - {@link specular} + * - {@link specularity} */ - unk_sdt_f2_34?: number + glossiness: number /** * Unknown integer. * - * **Default**: `-1` + * **Default**: {@link LightingMode.Unlit} */ - unk_sdt_f2_35?: number + 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 /** - * 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**: `0` */ - unk_sdt_f2_38?: number + unk_er_f2_39: number + constructor(props: Partial> = {}) { + super(ActionType.GPUStandardParticle) + this.assign(props) + } } /** - * ### {@link ActionType.Distortion Action 607 - Distortion} + * ### {@link ActionType.GPUStandardCorrectParticle Action 10001 - GPUStandardCorrectParticle} * **Slot**: {@link ActionSlots.AppearanceAction Appearance} * - * A particle that distorts anything seen through it. + * Very similar to {@link ActionType.GPUStandardParticle GPUStandardParticle}, with no known differences. * - * Note: This particle is not visible if the "Effects" setting is set to "Low". + * 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 Distortion extends DataAction { - declare readonly type: ActionType.Distortion - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} +class GPUStandardCorrectParticle extends DataAction { + declare readonly type: ActionType.GPUStandardCorrectParticle /** - * Blend mode. + * Controls how well the particles follow the node if it moves. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `0` */ - blendMode: BlendMode | ScalarProperty + particleFollowFactor: ScalarValue /** - * X position offset. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - offsetX: ScalarValue + unk_ds3_p1_1: ScalarValue /** - * Y position offset. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - offsetY: ScalarValue + unk_ds3_p1_2: ScalarValue /** - * Z position offset. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - offsetZ: ScalarValue + unk_ds3_p1_3: ScalarValue /** - * The width of the particle. + * Particle acceleration along the X-axis. * - * If {@link uniformScale} is enabled, this also controls the height and depth. + * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * See also: + * - {@link particleAccelerationMin} + * - {@link particleAccelerationMax} + */ + particleAccelerationX: ScalarValue + /** + * Particle acceleration along the Y-axis. + * + * **Default**: `0` * * See also: - * - {@link scaleVariationX} - * - {@link sizeY} - * - {@link sizeZ} + * - {@link particleAccelerationMin} + * - {@link particleAccelerationMax} */ - sizeX: ScalarValue + particleAccelerationY: ScalarValue /** - * The height of the particle. + * Particle acceleration along the Z-axis. * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the height, and this property is ignored. + * **Default**: `0` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * 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 scaleVariationY} - * - {@link sizeX} - * - {@link sizeZ} + * - {@link particleAngularAccelerationMin} + * - {@link particleAngularAccelerationMax} */ - sizeY: ScalarValue + particleAngularAccelerationZ: ScalarValue /** - * The depth of the particle. + * The rate of change for the width of the particles. * - * If {@link uniformScale} is enabled, {@link sizeX} also controls the depth, and this property is ignored. + * **Default**: `0` * - * 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. + * See also: + * - {@link particleGrowthRateXStatic} + */ + particleGrowthRateX: ScalarValue + /** + * The rate of change for the height of the particles. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` * * See also: - * - {@link scaleVariationZ} - * - {@link sizeX} - * - {@link sizeY} + * - {@link particleGrowthRateYStatic} */ - sizeZ: ScalarValue + particleGrowthRateY: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` + */ + unk_ds3_p1_12: 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. + * Values in this are unrestricted and can go above 1. + * + * **Default**: `[1, 1, 1, 1]` * * **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. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` */ - intensity: ScalarValue - unk_ds3_p1_9: ScalarValue + unk_ds3_p1_14: ScalarValue /** - * Controls the speed of the stirring effect in degrees per second. Requires {@link mode} to be set to {@link DistortionMode.Stir}. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - stirSpeed: ScalarValue + unk_ds3_p1_15: 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. + * Seemingly identical to {@link particleAccelerationZ}? * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - radius: ScalarValue + unkParticleAcceleration: ScalarValue /** - * Horizontal offset for the {@link normalMap normal map}. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `0` */ - normalMapOffsetU: ScalarValue + unk_ds3_p1_17: ScalarValue /** - * Vertical offset for the {@link normalMap normal map}. + * Downwards acceleration for particles. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `0` */ - normalMapOffsetV: ScalarValue + particleGravity: ScalarValue /** - * Horizontal offset speed for the {@link normalMap normal map}. + * Maximum random turn angle for particles. Requires {@link particleRandomTurns} to be enabled. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` + * + * See also: + * - {@link particleRandomTurns} + * - {@link particleRandomTurnIntervalMax} */ - normalMapSpeedU: ScalarValue + particleRandomTurnAngle: ScalarValue /** - * Vertical offset speed for the {@link normalMap normal map}. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - normalMapSpeedV: ScalarValue + unk_ds3_p1_20: ScalarValue /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` */ - rgbMultiplier: ScalarValue + unk_ds3_p2_0: ScalarValue /** - * Alpha multiplier. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` + */ + unk_ds3_p2_1: ScalarValue + /** + * Unknown scalar. + * + * **Default**: `0` */ - 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. + * Unknown vector4. * - * 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**: `[1, 1, 1, 1]` + */ + unk_ds3_p2_3: Vector4Value + /** + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `[1, 1, 1, 1]` */ - alphaThreshold: ScalarValue - unk_er_p2_7: ScalarValue - unk_er_p2_8: ScalarValue + unk_ds3_p2_4: Vector4Value /** - * Controls what type of distortion to apply. See {@link DistortionMode} for more details. + * Unknown vector4. + * + * **Default**: `[1, 1, 1, 1]` */ - mode: DistortionMode + unk_ds3_p2_5: Vector4Value /** - * Controls the shape of the particle. See {@link DistortionShape} for more information. + * Unknown scalar. + * + * **Default**: `0` */ - shape: DistortionShape + unk_ds3_p2_6: ScalarValue /** - * Controls the orientation mode for the particles. See {@link OrientationMode} for more information. + * Unknown integer. + * + * **Default**: `1005` */ - orientation: OrientationMode + unk_ds3_f1_0: number /** - * Texture ID. + * The ID of the texture of the particles. * - * 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**: `1` */ texture: number /** - * Normal map texture ID. + * Unknown integer. * - * Only used if the distortion {@link mode} is set to something that uses it. + * **Default**: `0` */ - normalMap: number + unk_ds3_f1_2: number /** - * Mask texture ID. This texture is used to control the color and opacity of the particle. + * Unknown integer. + * + * **Default**: `0` */ - mask: number + 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. - * - * If {@link uniformScale} is enabled, this also affects the height. + * Controls the shape of the particle emitter. See {@link EmitterShape} for more details. * - * See also: - * - {@link scaleVariationY} - * - {@link scaleVariationZ} + * **Default**: {@link EmitterShape.Box} */ - scaleVariationX: number + emitterShape: EmitterShape /** - * 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. + * Unknown integer. * - * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationZ} + * **Default**: `0` */ - scaleVariationY: number + unk_ds3_f1_5: 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. + * The size of the emitter. * - * If {@link uniformScale} is enabled, {@link scaleVariationX} also affects the depth, and this field is ignored. + * **Default**: `[1, 1, 1]` + */ + emitterSize: Vector3 + /** + * The rotation of the emitter. * - * See also: - * - {@link scaleVariationX} - * - {@link scaleVariationY} + * **Default**: `[0, 0, 0]` */ - scaleVariationZ: number + emitterRotation: Vector3 /** - * 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. + * Unknown float. * - * See also: - * - {@link sizeX} - * - {@link sizeY} - * - {@link sizeZ} - * - {@link scaleVariationX} - * - {@link scaleVariationY} - * - {@link scaleVariationZ} + * **Default**: `1` */ - 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. + * Unknown float. * - * 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` */ - 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 + unk_ds3_f1_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. + * Unknown float. * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - minFadeDistance: number + unk_ds3_f1_14: 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. + * 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 minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `0` */ - minDistance: number + emitterDistribution: 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 float. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `0` */ - maxFadeDistance: number + unk_ds3_f1_16: 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 float. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `0` */ - maxDistance: number + unk_ds3_f1_17: 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. + * Unknown integer. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} + * **Default**: `-1` */ - minDistanceThreshold: number + unk_ds3_f1_18: 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_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 - unk_sdt_f2_38: number - constructor(props: DistortionParams = {}) { - super(ActionType.Distortion, {isAppearance:true,isParticle:true}) - this.assign(props) - } -} - -export interface RadialBlurParams { + unk_ds3_f1_19: number /** - * Blend mode. - * - * **Default**: {@link BlendMode.Normal} + * Unknown integer. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `0` */ - blendMode?: BlendMode | ScalarProperty + unk_ds3_f1_20: number /** - * Mask texture ID. This texture is used to control the opacity of the particle. - * - * **Default**: `1` + * Unknown integer. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `100` */ - mask?: ScalarValue + unk_ds3_f1_21: number /** - * X position offset. - * - * **Default**: `0` + * The number of particles to emit per emission. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `10` * * See also: - * - {@link offsetY} - * - {@link offsetZ} + * - {@link emissionParticleCountMin} + * - {@link emissionParticleCountMax} */ - offsetX?: ScalarValue + emissionParticleCount: number /** - * Y position offset. + * 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` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * * See also: - * - {@link offsetX} - * - {@link offsetZ} + * - {@link emissionParticleCount} + * - {@link emissionParticleCountMax} */ - offsetY?: ScalarValue + emissionParticleCountMin: number /** - * Z position offset. + * 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` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * * See also: - * - {@link offsetX} - * - {@link offsetY} + * - {@link emissionParticleCount} + * - {@link emissionParticleCountMin} */ - offsetZ?: ScalarValue + emissionParticleCountMax: number /** - * The width of the particle. + * Unknown integer. * - * If {@link uniformScale} is enabled, this also controls the height. + * **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` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * * See also: - * - {@link height} + * - {@link emissionIntervalMax} */ - width?: ScalarValue + emissionIntervalMin: number /** - * The height of the particle. - * - * If {@link uniformScale} is enabled, {@link width} also controls the height, and this property is ignored. + * 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` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * * See also: - * - {@link width} + * - {@link emissionIntervalMin} */ - height?: ScalarValue + emissionIntervalMax: number /** - * 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]` + * If enabled, the number of emissions will be limited by {@link emissionCountLimit}. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `false` */ - color?: Vector4Value + limitEmissionCount: boolean /** - * Unknown. + * The total number of emissions. This limit is only applied if {@link limitEmissionCount} is enabled. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` */ - unk_ds3_p1_6?: Vector4Value + emissionCountLimit: number /** - * Controls the amount of blur to apply. Values greater than 1 may appear glitchy. - * - * **Default**: `0.5` + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` */ - blurRadius?: ScalarValue + unk_ds3_f1_30: number /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * 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` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - rgbMultiplier?: ScalarValue + particleDuration: number /** - * Alpha multiplier. - * - * **Default**: `1` + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - alphaMultiplier?: ScalarValue + unk_ds3_f1_32: number /** - * Unknown. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_p2_2?: ScalarValue + unk_ds3_f1_33: number /** - * Unknown. + * Particle position offset. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleOffsetMin} + * - {@link particleOffsetMax} */ - unk_ds3_p2_3?: Vector4Value + particleOffset: Vector3 /** - * Unknown. + * 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**: `[1, 1, 1, 1]` + * **Default**: `[0, 0, 0]` */ - unk_ds3_p2_4?: Vector4Value + particleOffsetMin: Vector3 /** - * Unknown. + * 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**: `[1, 1, 1, 1]` + * **Default**: `[0, 0, 0]` */ - unk_ds3_p2_5?: Vector4Value + particleOffsetMax: Vector3 /** - * 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. + * Particle speed. * - * **Default**: `0` + * **Default**: `[0, 0, 0]` * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * See also: + * - {@link particleSpeedMin} + * - {@link particleSpeedMax} */ - alphaThreshold?: ScalarValue + particleSpeed: Vector3 /** - * 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. + * Minimum particle speed. A random value between this and {@link particleSpeedMax} will be added to {@link particleSpeed} to get the final speed. * - * **Default**: `false` + * **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. * - * See also: - * - {@link width} - * - {@link height} + * **Default**: `[0, 0, 0]` */ - uniformScale?: boolean + particleSpeedMax: Vector3 /** - * Controls how many times to apply the effect. Higher values can have a significant impact on performance. + * 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**: `1` + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleAccelerationX} + * - {@link particleAccelerationY} + * - {@link particleAccelerationZ} */ - iterations?: number + particleAccelerationMin: Vector3 /** - * Unknown integer. + * 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` + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleAccelerationX} + * - {@link particleAccelerationY} + * - {@link particleAccelerationZ} */ - unk_ds3_f1_4?: number + particleAccelerationMax: Vector3 /** - * Unknown integer. + * Maximum amount of random rotation for each particle in degrees. * - * **Default**: `1` + * **Default**: `[0, 0, 0]` */ - unk_er_f1_3?: number + particleRotationVariance: Vector3 /** - * Unknown integer. + * Maximum amount of random angular speed for each particle in degrees per second. * - * **Default**: `1` + * **Default**: `[0, 0, 0]` */ - unk_er_f1_4?: number + particleAngularSpeedVariance: Vector3 /** - * Unknown integer. + * Minimum amount of random angular acceleration for each particle in degrees per second squared. * - * **Default**: `0` + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleAngularAccelerationMax} */ - unk_ds3_f2_0?: number + particleAngularAccelerationMin: Vector3 /** - * Unknown integer. + * Maximum amount of random angular acceleration for each particle in degrees per second squared. * - * **Default**: `0` + * **Default**: `[0, 0, 0]` + * + * See also: + * - {@link particleAngularAccelerationMin} */ - unk_ds3_f2_1?: number + particleAngularAccelerationMax: Vector3 /** - * Unknown integer. + * 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**: `8` + * **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} */ - unk_ds3_f2_2?: number + particleUniformScale: boolean /** - * Unknown float. + * The width of the particle. * * **Default**: `1` */ - unk_ds3_f2_3?: number + particleSizeX: number /** - * Unknown integer. + * The height of the particle. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f2_4?: number + particleSizeY: 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` */ - bloomColor?: Vector4 + unk_ds3_f1_73: number /** - * Unknown integer. + * 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_ds3_f2_9?: number + particleSizeXMin: number /** - * Unknown integer. + * 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` */ - unk_ds3_f2_10?: number + particleSizeYMin: number /** - * Unknown integer. + * Unknown float. * * **Default**: `0` */ - unk_ds3_f2_11?: number + unk_ds3_f1_76: number /** - * Unknown integer. + * 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` */ - unk_ds3_f2_12?: number + particleSizeXMax: number /** - * Unknown integer. + * 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` */ - unk_ds3_f2_13?: number + particleSizeYMax: 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` + * Unknown float. * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `0` */ - minFadeDistance?: number + unk_ds3_f1_79: 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 rate of change for the width of the particles. * - * **Default**: `-1` + * **Default**: `0` * * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link particleGrowthRateX} */ - minDistance?: number + particleGrowthRateXStatic: 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. + * The rate of change for the height of the particles. * - * **Default**: `-1` + * **Default**: `0` * * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * - {@link particleGrowthRateY} */ - maxFadeDistance?: number + particleGrowthRateYStatic: 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 float. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `0` */ - maxDistance?: number + unk_ds3_f1_82: 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` + * 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. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} + * **Default**: `0` */ - minDistanceThreshold?: number + particleGrowthRateXMin: 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` + * 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. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} + * **Default**: `0` */ - maxDistanceThreshold?: number + particleGrowthRateYMin: number /** * Unknown float. * - * **Default**: `0.5` + * **Default**: `0` */ - unk_ds3_f2_20?: number + unk_ds3_f1_85: number /** - * Unknown integer. + * 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**: `1` + * **Default**: `0` */ - unk_ds3_f2_21?: number + particleGrowthRateXMax: number /** - * Unknown float. + * 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` */ - unk_ds3_f2_22?: number + particleGrowthRateYMax: number /** - * Unknown integer. + * Unknown float. * * **Default**: `0` */ - unk_ds3_f2_23?: number + unk_ds3_f1_88: number /** - * Unknown integer. + * 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` */ - unk_ds3_f2_24?: number + particleGrowthAccelerationXMin: number /** - * Unknown float. + * 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**: `1` + * **Default**: `0` */ - unkDepthBlend1?: number + particleGrowthAccelerationYMin: number /** * Unknown float. * * **Default**: `0` */ - unkDepthBlend2?: number + unk_ds3_f1_91: number /** - * Unknown integer. + * 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**: `1` + * **Default**: `0` */ - unk_ds3_f2_27?: number + particleGrowthAccelerationXMax: number /** - * Unknown integer. + * 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` */ - unk_ds3_f2_28?: number + particleGrowthAccelerationYMax: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f2_29?: number + unk_ds3_f1_94: number /** - * Unknown float. + * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * - * **Default**: `0` + * **Default**: `1` */ - 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} + rgbMultiplier: number /** - * Blend mode. + * Alpha multiplier. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `1` */ - blendMode: BlendMode | ScalarProperty + alphaMultiplier: number /** - * Mask texture ID. This texture is used to control the opacity of the particle. + * 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. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `[0, 0, 0, 0]` */ - mask: ScalarValue + colorMin: Vector4 /** - * X position offset. + * 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. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `[0, 0, 0, 0]` + */ + colorMax: Vector4 + /** + * Blend mode. * - * See also: - * - {@link offsetY} - * - {@link offsetZ} + * **Default**: {@link BlendMode.Normal} */ - offsetX: ScalarValue + blendMode: BlendMode /** - * Y position offset. + * 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.ParticleAge Particle age} + * **Default**: `1` * * See also: - * - {@link offsetX} - * - {@link offsetZ} + * - {@link totalFrames} */ - offsetY: ScalarValue + columns: number /** - * Z position offset. + * To split the texture into multiple animation frames, this value must be set to the total number of frames in the texture. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` * * See also: - * - {@link offsetX} - * - {@link offsetY} + * - {@link columns} */ - offsetZ: ScalarValue + totalFrames: number /** - * The width of the particle. - * - * If {@link uniformScale} is enabled, this also controls the height. + * When enabled, this makes each particle pick a random frame from the animation and only display that one frame. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `false` * * See also: - * - {@link height} + * - {@link columns} + * - {@link totalFrames} + * - {@link maxFrameIndex} */ - width: ScalarValue + randomTextureFrame: boolean /** - * The height of the particle. + * Unknown integer. * - * If {@link uniformScale} is enabled, {@link width} also controls the height, and this property is ignored. + * **Default**: `0` + */ + unk_ds3_f1_109: number + /** + * Controls the maximum frame index when {@link randomTextureFrame picking a random frame to display}. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `0` * * See also: - * - {@link width} + * - {@link randomTextureFrame} */ - height: ScalarValue + maxFrameIndex: number /** - * 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. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `-1` */ - color: Vector4Value - unk_ds3_p1_6: Vector4Value + unk_ds3_f1_111: number /** - * Controls the amount of blur to apply. Values greater than 1 may appear glitchy. + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `-1` */ - blurRadius: ScalarValue + unk_ds3_f1_112: number /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - rgbMultiplier: ScalarValue + unk_ds3_f1_113: number /** - * Alpha multiplier. + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` */ - alphaMultiplier: ScalarValue - unk_ds3_p2_2: ScalarValue - unk_ds3_p2_3: Vector4Value - unk_ds3_p2_4: Vector4Value - unk_ds3_p2_5: Vector4Value + unk_ds3_f1_114: 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 alpha *fade* threshold properties in some similar actions. + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - alphaThreshold: ScalarValue + unk_ds3_f1_115: 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**: `0` */ - uniformScale: boolean + unk_ds3_f1_116: number /** - * Controls how many times to apply the effect. Higher values can have a significant impact on performance. + * Unknown float. + * + * **Default**: `1` */ - 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 + unk_ds3_f1_117: 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. + * Unknown float. * - * 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` */ - 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 + unk_ds3_f1_118: 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. + * Multiplier for {@link particleDuration}. * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - minFadeDistance: number + particleDurationMultiplier: 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. + * Unknown float. * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - minDistance: number + unk_ds3_f1_120: 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. + * Scalar multiplier for the size of the particles. * - * 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` + */ + particleSizeMultiplier: number + /** + * Unknown float. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - maxFadeDistance: number + unk_ds3_f1_122: 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. + * Unknown float. * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. + * **Default**: `1` + */ + unk_ds3_f1_123: number + /** + * Unknown float. * - * 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` + */ + unk_ds3_f1_124: number + /** + * Unknown float. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - maxDistance: number + unk_ds3_f1_125: 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. + * Unknown float. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - minDistanceThreshold: number + unk_ds3_f1_126: 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_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 { + unk_ds3_f1_127: number /** - * 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} + * Unknown float. * - * See also: - * - {@link specularColor} + * **Default**: `1` */ - diffuseColor?: Vector4Value + unk_ds3_f1_128: number /** - * 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]` + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` */ - specularColor?: Vector4Value + unk_ds3_f1_129: number /** - * 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` + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` */ - radius?: ScalarValue + unk_ds3_f1_130: number /** - * Unknown. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_p1_3?: ScalarValue + unk_ds3_f1_131: number /** - * Unknown. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_p1_4?: ScalarValue + unk_ds3_f1_132: number /** - * Unknown. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_p1_5?: ScalarValue + unk_ds3_f1_133: number /** - * Unknown. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_p1_6?: ScalarValue + unk_ds3_f1_134: number /** - * Unknown. + * Unknown float. * - * **Default**: `10` + * **Default**: `0` */ - unk_ds3_p1_7?: ScalarValue + unk_ds3_f1_135: number /** - * Unknown. + * Unknown float. * - * **Default**: `10` + * **Default**: `0` */ - unk_ds3_p1_8?: ScalarValue + unk_ds3_f1_136: number /** - * Unknown. + * Unknown integer. * - * **Default**: `10` + * **Default**: `0` */ - unk_ds3_p1_9?: ScalarValue + unk_ds3_f1_137: number /** - * 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` + * Unknown integer. * - * See also: - * - {@link falloffExponent} + * **Default**: `8` */ - unk_ds3_p2_0?: ScalarValue + unk_ds3_f1_138: number /** - * Unknown. + * Unknown float. * - * **Default**: `1` + * **Default**: `0` */ - unk_ds3_p2_1?: ScalarValue + unk_ds3_f1_139: number /** - * Unknown. + * Unknown float. * - * **Default**: `1` + * **Default**: `0` */ - unk_sdt_p2_2?: ScalarValue + unk_ds3_f1_140: number /** - * 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` + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - diffuseMultiplier?: ScalarValue + unk_ds3_f1_141: number /** - * A scalar multiplier for the {@link specularColor specular color}. - * - * If {@link separateSpecular} is disabled, this property is ignored. + * 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. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `false` */ - specularMultiplier?: ScalarValue + 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_ds3_f1_0?: number + updateDistance: number /** - * Unknown float. + * 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**: `0` + * **Default**: `false` + * + * See also: + * - {@link particleBounciness} */ - unk_ds3_f1_1?: number + particleCollision: boolean /** - * Unknown integer. + * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. * * **Default**: `0` + * + * See also: + * - {@link particleCollision} */ - unk_ds3_f2_0?: number + particleBounciness: number /** - * Toggles the jitter and flicker animations for the light. + * 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 jitterAcceleration} - * - {@link jitterX} - * - {@link jitterY} - * - {@link jitterZ} - * - {@link flickerIntervalMin} - * - {@link flickerIntervalMax} - * - {@link flickerBrightness} + * - {@link particleRandomTurnIntervalMax} + * - {@link particleRandomTurnAngle} */ - jitterAndFlicker?: boolean + particleRandomTurns: boolean /** - * Controls the acceleration of the jittering. + * The maximum amount of time in seconds to wait between making random turns. Requires {@link particleRandomTurns} to be enabled. * * **Default**: `1` * * See also: - * - {@link jitterAndFlicker} - * - {@link jitterX} - * - {@link jitterY} - * - {@link jitterZ} - */ - jitterAcceleration?: number - /** - * Unknown float. - * - * **Default**: `0` + * - {@link particleRandomTurns} + * - {@link particleRandomTurnAngle} */ - unk_ds3_f2_3?: number + particleRandomTurnIntervalMax: number /** - * Controls how much the light should move around randomly on the X-axis. + * 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**: `0` + * **Default**: `false` * * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterY} - * - {@link jitterZ} + * - {@link particleTraceLength} */ - jitterX?: number + traceParticles: boolean /** - * Controls how much the light should move around randomly on the Y-axis. - * - * **Default**: `0` + * Unknown float. * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterX} - * - {@link jitterZ} + * **Default**: `1` */ - jitterY?: number + unk_ds3_f1_149: number /** - * Controls how much the light should move around randomly on the Z-axis. - * - * **Default**: `0` + * Controls how much the particles are stretched when {@link traceParticles} is enabled. * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterX} - * - {@link jitterY} + * **Default**: `1` */ - jitterZ?: number + particleTraceLength: number /** - * Controls the minimum interval for flickering. + * 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` - * - * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMax} - * - {@link flickerBrightness} */ - flickerIntervalMin?: number + traceParticlesThreshold: number /** - * Controls the maximum interval for flickering. + * If enabled, this will add a billboarding sprite to the leading end of trace particles. * - * **Default**: `1` + * **Default**: `false` * * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMin} - * - {@link flickerBrightness} + * - {@link traceParticles} */ - flickerIntervalMax?: number + traceParticleHead: boolean /** - * Brightness multiplier for the light when it flickers. - * - * **Default**: `0.5` + * Unknown integer. * - * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMin} - * - {@link flickerIntervalMax} + * **Default**: `0` */ - flickerBrightness?: number + unk_ds3_f1_153: 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. + * Unknown integer. * - * **Default**: `false` + * **Default**: `0` */ - shadows?: boolean + unk_ds3_f1_154: number /** - * 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. + * Controls whether or not the particles have a bloom effect. * * **Default**: `false` * * See also: - * - {@link diffuseColor} - * - {@link specularColor} - * - {@link diffuseMultiplier} - * - {@link specularMultiplier} + * - {@link bloomColor} */ - separateSpecular?: boolean + bloom: boolean /** - * The number of seconds the light takes to fade to nothing after being destroyed. + * 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. * - * Due to how the field this represents works, the time will be rounded to the nearest multiple of 1/30s. + * 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` + * **Default**: `[1, 1, 1, 0]` + * + * See also: + * - {@link bloom} */ - fadeOutTime?: number + bloomColor: Vector4 /** - * Controls how dark shadows from this light source are. At 0, the shadows will be entirely invisible. + * Unknown float. * * **Default**: `1` */ - shadowDarkness?: number + unk_sdt_f1_160: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_15?: number + unk_sdt_f1_161: number /** - * Unknown integer. + * Unknown float. * - * **Default**: `2` + * **Default**: `1` */ - unk_ds3_f2_16?: number + unk_sdt_f1_162: number /** - * Unknown integer. + * Unknown float. * * **Default**: `1` */ - unk_ds3_f2_17?: number + unk_sdt_f1_163: number /** * Unknown float. * + * **Default**: `1` + */ + unk_sdt_f1_164: number + /** + * Unknown integer. + * * **Default**: `0` */ - unk_ds3_f2_18?: number + unk_sdt_f1_165: number /** * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f2_19?: number + unk_sdt_f1_166: number /** * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f2_20?: number + unk_er_f1_167: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_21?: number + unk_ds3_f2_0: number /** * Unknown integer. * - * **Default**: `100` + * **Default**: `0` */ - unk_ds3_f2_22?: number + unk_ds3_f2_1: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `8` */ - unk_ds3_f2_23?: number + unk_ds3_f2_2: 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. + * Unknown integer. * * **Default**: `0` */ - maxViewDistance?: number + unk_ds3_f2_3: 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. + * Unknown integer. * * **Default**: `0` - * - * See also: - * - {@link phaseFunction} - * - {@link asymmetryParam} */ - volumeDensity?: number + unk_ds3_f2_4: number /** * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_sdt_f2_25?: number + unk_ds3_f2_5: number /** - * Controls whether or not {@link asymmetryParam} affects the fake fog from {@link volumeDensity}. + * Unknown float. * - * **Default**: `true` + * **Default**: `1` */ - phaseFunction?: boolean + unk_ds3_f2_6: number /** - * 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. + * Unknown float. * - * **Default**: `0.75` + * **Default**: `1` */ - asymmetryParam?: number + unk_ds3_f2_7: 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. + * Unknown float. * * **Default**: `1` - * - * See also: - * - {@link unk_ds3_p2_0} */ - falloffExponent?: number + unk_ds3_f2_8: number /** * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_er_f2_29?: number + unk_ds3_f2_9: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_er_f2_30?: number + unk_ds3_f2_10: number /** * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_er_f2_31?: number + unk_ds3_f2_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f2_32?: number + unk_ds3_f2_12: number /** - * Unknown. Only used in Dark Souls 3. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - 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} + unk_ds3_f2_13: number /** - * Controls the diffuse color of the light. - * - * Values in this are unrestricted and can go above 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. * - * If {@link separateSpecular} is disabled, this also controls the specular color of the light. + * 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. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `-1` * * See also: - * - {@link specularColor} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - diffuseColor: Vector4Value + minFadeDistance: number /** - * Controls the specular color of the light. + * 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. * - * Values in this are unrestricted and can go above 1. + * This requires {@link minFadeDistance} to be set to a positive value or 0. * - * If {@link separateSpecular} is disabled, this property is ignored and {@link diffuseColor} controls both the diffuse as well as the specular color. + * 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.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**: `-1` * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * See also: + * - {@link minFadeDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - 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 + minDistance: number /** - * 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. + * 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 falloffExponent} + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - unk_ds3_p2_0: ScalarValue - unk_ds3_p2_1: ScalarValue - unk_sdt_p2_2: ScalarValue + maxFadeDistance: number /** - * A scalar multiplier for the {@link diffuseColor diffuse color}. Good for easily adjusting the brightness of the light without changing the color. + * 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. * - * If {@link separateSpecular} is disabled, this also affects the specular color of the light. + * This requires {@link maxFadeDistance} to be set to a positive value or 0. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - diffuseMultiplier: ScalarValue - /** - * A scalar multiplier for the {@link specularColor specular color}. + * 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. * - * If {@link separateSpecular} is disabled, this property is ignored. + * **Default**: `-1` * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * See also: + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - specularMultiplier: ScalarValue - unk_ds3_f1_0: number - unk_ds3_f1_1: number - unk_ds3_f2_0: number + maxDistance: number /** - * Toggles the jitter and flicker animations for the light. + * 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 jitterAcceleration} - * - {@link jitterX} - * - {@link jitterY} - * - {@link jitterZ} - * - {@link flickerIntervalMin} - * - {@link flickerIntervalMax} - * - {@link flickerBrightness} + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link maxDistanceThreshold} */ - jitterAndFlicker: boolean + minDistanceThreshold: number /** - * Controls the acceleration of the jittering. + * 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 jitterAndFlicker} - * - {@link jitterX} - * - {@link jitterY} - * - {@link jitterZ} + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} */ - jitterAcceleration: number - unk_ds3_f2_3: number + maxDistanceThreshold: number /** - * Controls how much the light should move around randomly on the X-axis. + * Unknown integer. * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterY} - * - {@link jitterZ} + * **Default**: `0` */ - jitterX: number + unk_ds3_f2_20: number /** - * Controls how much the light should move around randomly on the Y-axis. + * Unknown integer. * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterX} - * - {@link jitterZ} + * **Default**: `0` */ - jitterY: number + unk_ds3_f2_21: number /** - * Controls how much the light should move around randomly on the Z-axis. + * Unknown integer. * - * See also: - * - {@link jitterAndFlicker} - * - {@link jitterAcceleration} - * - {@link jitterX} - * - {@link jitterY} + * **Default**: `0` */ - jitterZ: number + unk_ds3_f2_22: number /** - * Controls the minimum interval for flickering. + * Unknown integer. * - * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMax} - * - {@link flickerBrightness} + * **Default**: `0` */ - flickerIntervalMin: number + unk_ds3_f2_23: number /** - * Controls the maximum interval for flickering. + * Unknown integer. * - * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMin} - * - {@link flickerBrightness} + * **Default**: `0` */ - flickerIntervalMax: number + unk_ds3_f2_24: number /** - * Brightness multiplier for the light when it flickers. + * Unknown float. * - * See also: - * - {@link jitterAndFlicker} - * - {@link flickerIntervalMin} - * - {@link flickerIntervalMax} + * **Default**: `1` */ - flickerBrightness: number + unkDepthBlend1: number /** - * Controls if the light should have shadows or not. + * Unknown float. * - * 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**: `0` */ - shadows: boolean + unkDepthBlend2: number /** - * 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. + * Unknown integer. * - * See also: - * - {@link diffuseColor} - * - {@link specularColor} - * - {@link diffuseMultiplier} - * - {@link specularMultiplier} + * **Default**: `1` */ - separateSpecular: boolean + unk_ds3_f2_27: number /** - * The number of seconds the light takes to fade to nothing after being destroyed. + * Unknown integer. * - * Due to how the field this represents works, the time will be rounded to the nearest multiple of 1/30s. + * **Default**: `0` */ - fadeOutTime: number + unk_ds3_f2_28: number /** - * Controls how dark shadows from this light source are. At 0, the shadows will be entirely invisible. + * Unknown float. + * + * **Default**: `0` */ - 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 + unk_sdt_f2_29: 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. + * Controls how dark shaded parts of the particle are. * - * Setting this to `0` will disable the distance limit. + * **Default**: `0` */ - maxViewDistance: number + shadowDarkness: 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. + * When set to 1, this stops the particles from being shown indoors. * - * See also: - * - {@link phaseFunction} - * - {@link asymmetryParam} + * Other values are used in AC6, but what they do is unknown. + * + * **Default**: `0` */ - volumeDensity: number - unk_sdt_f2_25: number + unkHideIndoors: number /** - * Controls whether or not {@link asymmetryParam} affects the fake fog from {@link volumeDensity}. + * 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` */ - phaseFunction: boolean + unk_sdt_f2_32: number /** - * 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. + * Specular texture ID. * - * - 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` + * + * See also: + * - {@link lighting} + * - {@link glossiness} + * - {@link specularity} */ - asymmetryParam: number + specular: number /** - * Controls the falloff exponent of the light. + * Controls how sharp the specular highlights are. * - * Note: This is possibly something else, but the behavior is pretty similar to a falloff exponent in a few ways. + * **Default**: `0.25` * * See also: - * - {@link unk_ds3_p2_0} + * - {@link lighting} + * - {@link specular} + * - {@link specularity} */ - falloffExponent: number - unk_er_f2_29: number - unk_er_f2_30: number - unk_er_f2_31: number - unk_er_f2_32: number + glossiness: number /** - * Unknown. Only used in Dark Souls 3. + * Unknown integer. + * + * **Default**: {@link LightingMode.Unlit} */ - 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} + lighting: LightingMode /** - * The duration of the fade out in seconds. + * Unknown integer. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `-2` */ - duration: ScalarValue + unk_sdt_f2_36: number /** - * @param duration The duration of the fade out in seconds. - * - * **Default**: `1` + * Unknown integer. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `0` */ - constructor(duration: ScalarValue = 1) { - super(ActionType.FadeTermination, {isAppearance:false,isParticle:false}) - this.assign({ duration }) + 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 + constructor(props: Partial> = {}) { + super(ActionType.GPUStandardCorrectParticle) + this.assign(props) } } /** - * ### {@link ActionType.InstantTermination Action 702 - InstantTermination} - * **Slot**: {@link ActionSlots.TerminationAction Termination} - * - * Makes the effect instantly disappear when it terminates. + * ### {@link ActionType.LightShaft Action 10003 - LightShaft} + * **Slot**: {@link ActionSlots.AppearanceAction Appearance} * - * Note: An effect terminates when it reaches {@link State} -1. + * 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 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 { +class LightShaft extends DataAction { + declare readonly type: ActionType.LightShaft /** - * The speed in the direction of the force. + * Unknown scalar. * - * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` */ - speed?: ScalarValue + width: ScalarValue /** - * A multiplier for {@link speed}. + * Unknown scalar. * * **Default**: `1` + */ + height: ScalarValue + /** + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `[1, 1, 1, 1]` */ - speedMultiplier?: ScalarValue + color1: Vector4Value /** - * Unknown integer. + * Unknown vector4. * - * **Default**: `1` + * **Default**: `[1, 1, 1, 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} + color2: Vector4Value /** - * The speed in the direction of the force. + * Unknown vector4. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `[1, 1, 1, 1]` */ - speed: ScalarValue + color3: Vector4Value /** - * A multiplier for {@link speed}. + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - speedMultiplier: ScalarValue - unk_sdt_f1_0: number - constructor(props: NodeForceSpeedParams = {}) { - super(ActionType.NodeForceSpeed, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface ParticleForceSpeedParams { + unk_ds3_p1_5: ScalarValue /** - * The speed in the direction of the force. + * Unknown scalar. * * **Default**: `0` + */ + unk_ds3_p1_6: ScalarValue + /** + * Unknown scalar. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - speed?: ScalarValue + unk_ds3_p1_7: ScalarValue /** - * A multiplier for {@link speed}. + * Unknown scalar. * * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - speedMultiplier?: ScalarValue + unk_ds3_p1_8: ScalarValue /** - * Unknown integer. + * Unknown scalar. * * **Default**: `1` */ - unk_sdt_f1_0?: number + unk_ds3_p1_9: ScalarValue /** - * Unknown. 0 and 1 seems to be valid values, while all other values cause the wind to not affect the particles. + * Texture ID. * * **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} + texture: number /** - * The speed in the direction of the force. + * Blend mode. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: {@link BlendMode.Add} */ - speed: ScalarValue + blendMode: BlendMode /** - * A multiplier for {@link speed}. + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0.75` */ - speedMultiplier: ScalarValue - unk_sdt_f1_0: number + unk_ds3_f1_2: number /** - * Unknown. 0 and 1 seems to be valid values, while all other values cause the wind to not affect the particles. + * Unknown float. + * + * **Default**: `0.75` */ - unk_sdt_f1_1: number - constructor(props: ParticleForceSpeedParams = {}) { - super(ActionType.ParticleForceSpeed, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface NodeForceAccelerationParams { + unk_ds3_f1_3: number /** - * The acceleration in the direction of the force. + * Unknown float. * - * **Default**: `0` + * **Default**: `2` + */ + unk_ds3_f1_4: number + /** + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0.1` */ - acceleration?: ScalarValue + unk_ds3_f1_5: number /** - * A multiplier for {@link acceleration}. + * Unknown float. * * **Default**: `1` + */ + unk_ds3_f1_6: number + /** + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **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` */ - accelerationMultiplier?: ScalarValue + layers: number /** - * Unknown integer. + * Unknown float. * * **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} + unk_ds3_f1_9: number /** - * The acceleration in the direction of the force. + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` */ - acceleration: ScalarValue + unk_ds3_f1_10: number /** - * A multiplier for {@link acceleration}. + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` */ - accelerationMultiplier: ScalarValue - unk_sdt_f1_0: number - constructor(props: NodeForceAccelerationParams = {}) { - super(ActionType.NodeForceAcceleration, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface ParticleForceAccelerationParams { + unk_ds3_f1_11: number /** - * The acceleration in the direction of the force. + * Unknown integer. * * **Default**: `0` + */ + unk_ds3_f1_12: number + /** + * Unknown integer. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `0` */ - acceleration?: ScalarValue + unk_ds3_f1_13: number /** - * A multiplier for {@link acceleration}. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` + */ + unk_ds3_f1_14: number + /** + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` */ - accelerationMultiplier?: ScalarValue + unk_ds3_f1_15: number /** * Unknown integer. * * **Default**: `1` */ - unk_sdt_f1_0?: number + unk_ds3_f1_16: number /** - * Unknown. 0 and 1 seems to be valid values, while all other values cause the wind to not affect the particles. + * Unknown integer. * * **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} + unk_ds3_f1_17: number /** - * The acceleration in the direction of the force. + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` */ - acceleration: ScalarValue + unk_ds3_f1_18: number /** - * A multiplier for {@link acceleration}. + * Unknown float. * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} + * **Default**: `1` */ - accelerationMultiplier: ScalarValue - unk_sdt_f1_0: number + unk_ds3_f1_19: number /** - * Unknown. 0 and 1 seems to be valid values, while all other values cause the wind to not affect the particles. + * Unknown float. + * + * **Default**: `1` */ - unk_sdt_f1_1: number - constructor(props: ParticleForceAccelerationParams = {}) { - super(ActionType.ParticleForceAcceleration, {isAppearance:false,isParticle:false}) - this.assign(props) - } -} - -export interface ParticleForceCollisionParams { + unk_ds3_f1_20: number /** - * 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. + * Unknown float. * * **Default**: `1` */ - radius?: number + unk_ds3_f1_21: 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. | + * Unknown float. * - * **Default**: `0.5` + * **Default**: `-1` */ - friction?: number + unk_ds3_f1_22: 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. | + * Unknown float. * - * **Default**: `0.5` + * **Default**: `-1` */ - 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} + unk_ds3_f1_23: number /** - * 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. + * Unknown integer. + * + * **Default**: `0` */ - radius: number + unk_ds3_f1_24: 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. | + * Unknown float. + * + * **Default**: `1` */ - friction: number + unk_ds3_f1_25: 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. | + * Unknown float. + * + * **Default**: `1` */ - bounciness: number - constructor(props: ParticleForceCollisionParams = {}) { - super(ActionType.ParticleForceCollision, {isAppearance:false,isParticle:false}) + unk_ds3_f1_26: number + /** + * Unknown float. + * + * **Default**: `1` + */ + unk_ds3_f1_27: number + /** + * Unknown float. + * + * **Default**: `-1` + */ + unk_ds3_f1_28: number + /** + * Unknown integer. + * + * **Default**: `0` + */ + unk_ds3_f1_29: number + constructor(props: Partial> = {}) { + super(ActionType.LightShaft) this.assign(props) } } -export interface GPUStandardParticleParams { +/** + * ### {@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 /** * Controls how well the particles follow the node if it moves. * * **Default**: `0` */ - particleFollowFactor?: ScalarValue + particleFollowFactor: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p1_1?: ScalarValue + unk_ac6_p1_1: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p1_2?: ScalarValue + unk_ac6_p1_2: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p1_3?: ScalarValue + unk_ac6_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. - * - * **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 + particleAccelerationZ: ScalarValue /** * Color multiplier. * @@ -25552,161 +24495,141 @@ export interface GPUStandardParticleParams { * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - color?: Vector4Value + color: Vector4Value /** - * Unknown. + * The length of the particles. * * **Default**: `1` */ - unk_ds3_p1_14?: ScalarValue + particleLength: ScalarValue /** - * Unknown. + * The width of the particles. * - * **Default**: `0` + * **Default**: `0.1` */ - unk_ds3_p1_15?: ScalarValue + particleWidth: ScalarValue /** - * Seemingly identical to {@link particleAccelerationZ}? + * Similar to {@link particleAccelerationZ}, but this does not go exactly north? * - * **Default**: `0` - */ - unkParticleAcceleration?: ScalarValue - /** - * Unknown. + * This requires any of the following fields to have a non-zero value: + * - {@link particleSpeedMin} + * - {@link particleSpeedMax} * * **Default**: `0` */ - unk_ds3_p1_17?: ScalarValue + unkParticleAcceleration: ScalarValue /** - * Downwards acceleration for particles. + * Unknown scalar. * * **Default**: `0` */ - particleGravity?: ScalarValue + unk_ac6_p1_11: ScalarValue /** - * Maximum random turn angle for particles. Requires {@link particleRandomTurns} to be enabled. + * Downwards acceleration for particles. * - * **Default**: `0` + * This requires any of the following fields to have a non-zero value: + * - {@link particleSpeedMin} + * - {@link particleSpeedMax} * - * See also: - * - {@link particleRandomTurns} - * - {@link particleRandomTurnIntervalMax} + * **Default**: `1` */ - particleRandomTurnAngle?: ScalarValue + particleGravity: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p1_20?: ScalarValue + unk_ac6_p1_13: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `1` */ - unk_ds3_p2_0?: ScalarValue + unk_ac6_p2_0: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `1` */ - unk_ds3_p2_1?: ScalarValue + unk_ac6_p2_1: ScalarValue /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p2_2?: ScalarValue + unk_ac6_p2_2: ScalarValue /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_3?: Vector4Value + unk_ac6_p2_3: Vector4Value /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_4?: Vector4Value + unk_ac6_p2_4: Vector4Value /** - * Unknown. + * Unknown vector4. * * **Default**: `[1, 1, 1, 1]` */ - unk_ds3_p2_5?: Vector4Value + unk_ac6_p2_5: Vector4Value /** - * Unknown. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_p2_6?: ScalarValue - /** - * Unknown integer. - * - * **Default**: `1005` - */ - unk_ds3_f1_0?: number + unk_ac6_p2_6: ScalarValue /** * 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 + texture: 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_ds3_f1_5?: number + unk_ac6_f1_2: 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_ds3_f1_12?: number + unk_ac6_f1_9: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_13?: number + unk_ac6_f1_10: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_14?: 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 | @@ -25719,43 +24642,37 @@ export interface GPUStandardParticleParams { * * **Default**: `0` */ - emitterDistribution?: number + emitterDistribution: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_16?: number + unk_ac6_f1_13: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_17?: number + unk_ac6_f1_14: number /** * Unknown integer. * * **Default**: `-1` */ - unk_ds3_f1_18?: number + unk_ac6_f1_15: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_19?: number + unk_ac6_f1_16: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_20?: number - /** - * Unknown integer. - * - * **Default**: `100` - */ - unk_ds3_f1_21?: number + unk_ac6_f1_17: number /** * The number of particles to emit per emission. * @@ -25765,7 +24682,7 @@ export interface GPUStandardParticleParams { * - {@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}. * @@ -25775,7 +24692,7 @@ export interface GPUStandardParticleParams { * - {@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}. * @@ -25785,67 +24702,73 @@ export interface GPUStandardParticleParams { * - {@link emissionParticleCount} * - {@link emissionParticleCountMin} */ - emissionParticleCountMax?: number + emissionParticleCountMax: number /** - * Unknown integer. + * 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} */ - unk_ds3_f1_25?: number + emissionInterval: 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. + * 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**: `1` + * **Default**: `0` * * See also: + * - {@link emissionInterval} * - {@link emissionIntervalMax} */ - emissionIntervalMin?: number + 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. + * 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**: `1` + * **Default**: `0` * * See also: + * - {@link emissionInterval} * - {@link emissionIntervalMin} */ - emissionIntervalMax?: number + emissionIntervalMax: number /** - * If enabled, the number of emissions will be limited by {@link emissionCountLimit}. + * If enabled, the number of emissions will be limited by {@link concurrentEmissionsLimit}. * * **Default**: `false` */ - limitEmissionCount?: boolean + limitConcurrentEmissions: boolean /** - * The total number of emissions. This limit is only applied if {@link limitEmissionCount} is enabled. + * The total number of emissions. This limit is only applied if {@link limitConcurrentEmissions} is enabled. * * **Default**: `0` */ - emissionCountLimit?: number + concurrentEmissionsLimit: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_30?: 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. * * **Default**: `1` */ - particleDuration?: number + particleDuration: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_32?: number + unk_ac6_f1_28: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_33?: number + unk_ac6_f1_29: number /** * Particle position offset. * @@ -25855,10096 +24778,3150 @@ export interface GPUStandardParticleParams { * - {@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 - /** - * 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 + particleOffsetMax: Vector3 /** - * Maximum particle speed. A random value between this and {@link particleSpeedMin} will be added to {@link particleSpeed} to get the final speed. + * Unknown integer. * - * **Default**: `[0, 0, 0]` + * **Default**: `0` */ - particleSpeedMax?: Vector3 + unk_ac6_f1_39: number /** - * Minimum particle acceleration. A random value between this and {@link particleAccelerationMax} will be added to the three acceleration properties to get the final acceleration. + * Minimum particle speed. * - * **Default**: `[0, 0, 0]` + * **Default**: `[-0.01, -0.01, -0.01]` * * See also: - * - {@link particleAccelerationX} - * - {@link particleAccelerationY} - * - {@link particleAccelerationZ} + * - {@link particleSpeedMax} */ - particleAccelerationMin?: Vector3 + particleSpeedMin: 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. + * Maximum particle speed. * - * **Default**: `[0, 0, 0]` + * **Default**: `[0.01, 0.01, 0.01]` * * See also: - * - {@link particleAccelerationX} - * - {@link particleAccelerationY} - * - {@link particleAccelerationZ} - */ - particleAccelerationMax?: Vector3 - /** - * Maximum amount of random rotation for each particle in degrees. - * - * **Default**: `[0, 0, 0]` + * - {@link particleSpeedMin} */ - particleRotationVariance?: Vector3 + particleSpeedMax: Vector3 /** - * Maximum amount of random angular speed for each particle in degrees per second. + * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * - * **Default**: `[0, 0, 0]` + * **Default**: `1` */ - particleAngularSpeedVariance?: Vector3 + rgbMultiplier: number /** - * Minimum amount of random angular acceleration for each particle in degrees per second squared. - * - * **Default**: `[0, 0, 0]` + * Alpha multiplier. * - * See also: - * - {@link particleAngularAccelerationMax} + * **Default**: `1` */ - particleAngularAccelerationMin?: Vector3 + alphaMultiplier: number /** - * Maximum amount of random angular acceleration for each particle in degrees per second squared. - * - * **Default**: `[0, 0, 0]` + * 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. * - * See also: - * - {@link particleAngularAccelerationMin} + * **Default**: `[0, 0, 0, 0]` */ - particleAngularAccelerationMax?: Vector3 + colorMin: Vector4 /** - * 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` + * 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. * - * 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} + * **Default**: `[0, 0, 0, 0]` */ - particleUniformScale?: boolean + colorMax: Vector4 /** - * The width of the particle. + * Blend mode. * - * **Default**: `1` + * **Default**: {@link BlendMode.Add} */ - particleSizeX?: number + blendMode: BlendMode /** - * The height of the particle. + * Unknown integer. * - * **Default**: `1` + * **Default**: `-1` */ - particleSizeY?: number + unk_ac6_f1_57: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `1` + * **Default**: `-1` */ - unk_ds3_f1_73?: number + unk_ac6_f1_58: 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. + * Unknown integer. * * **Default**: `0` */ - particleSizeXMin?: number + unk_ac6_f1_59: 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. + * Unknown integer. * * **Default**: `0` */ - particleSizeYMin?: number + unk_ac6_f1_60: number /** - * Unknown float. + * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_76?: number + unk_ac6_f1_61: 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. + * Unknown integer. * * **Default**: `0` */ - particleSizeXMax?: number + unk_ac6_f1_62: 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. + * 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` + * **Default**: `1` */ - particleSizeYMax?: number + particleLengthMin: number /** - * Unknown float. + * 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` + * **Default**: `1` */ - unk_ds3_f1_79?: number + particleLengthMax: number /** - * The rate of change for the width of the particles. - * - * **Default**: `0` + * Minimum particle width. A random value between this and {@link particleWidthMax} will be **multiplied** by {@link particleWidth} to get the final particle width. * - * See also: - * - {@link particleGrowthRateX} + * **Default**: `1` */ - particleGrowthRateXStatic?: number + particleWidthMin: number /** - * The rate of change for the height of the particles. - * - * **Default**: `0` + * Maximum particle width. A random value between this and {@link particleWidthMin} will be **multiplied** by {@link particleWidth} to get the final particle width. * - * See also: - * - {@link particleGrowthRateY} + * **Default**: `1` */ - particleGrowthRateYStatic?: number + particleWidthMax: number /** * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f1_82?: number + unk_ac6_f1_67: 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. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - particleGrowthRateXMin?: number + unk_ac6_f1_68: 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. + * Multiplier for {@link particleDuration}. * - * **Default**: `0` + * **Default**: `1` */ - particleGrowthRateYMin?: number + particleDurationMultiplier: 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` + * **Default**: `1` */ - particleGrowthRateXMax?: number + unk_ac6_f1_70: 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. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - particleGrowthRateYMax?: number + unk_ac6_f1_71: number /** * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f1_88?: number + unk_ac6_f1_72: 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. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - particleGrowthAccelerationXMin?: number + unk_ac6_f1_73: 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. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - particleGrowthAccelerationYMin?: number + unk_ac6_f1_74: number /** * Unknown float. * * **Default**: `0` */ - unk_ds3_f1_91?: number + unk_ac6_f1_75: 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. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - particleGrowthAccelerationXMax?: number + unk_ac6_f1_76: 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. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - particleGrowthAccelerationYMax?: number + unk_ac6_f1_77: number /** * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f1_94?: number + unk_ac6_f1_78: number /** - * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. + * Unknown float. * * **Default**: `1` */ - rgbMultiplier?: number + unk_ac6_f1_79: number /** - * Alpha multiplier. + * Unknown float. * * **Default**: `1` */ - alphaMultiplier?: number + unk_ac6_f1_80: 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. + * Unknown integer. * - * **Default**: `[0, 0, 0, 0]` + * **Default**: `0` */ - colorMin?: Vector4 + unk_ac6_f1_81: number /** - * 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. + * Unknown integer. * - * **Default**: `[0, 0, 0, 0]` + * **Default**: `0` */ - colorMax?: Vector4 + unk_ac6_f1_82: number /** - * Blend mode. + * Unknown integer. * - * **Default**: {@link BlendMode.Normal} + * **Default**: `0` */ - blendMode?: BlendMode + unk_ac6_f1_83: 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` + * 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 totalFrames} + * **Default**: `0` */ - columns?: number + unk_ac6_f1_84: 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` + * 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. * - * See also: - * - {@link columns} + * **Default**: `0` */ - totalFrames?: number + unk_ac6_f1_85: number /** - * When enabled, this makes each particle pick a random frame from the animation and only display that one frame. - * - * **Default**: `false` + * Unknown integer. * - * See also: - * - {@link columns} - * - {@link totalFrames} - * - {@link maxFrameIndex} + * **Default**: `0` */ - randomTextureFrame?: boolean + unk_ac6_f1_86: number /** * Unknown integer. * - * **Default**: `0` + * **Default**: `8` */ - unk_ds3_f1_109?: number + unk_ac6_f1_87: number /** - * Controls the maximum frame index when {@link randomTextureFrame picking a random frame to display}. + * Unknown integer. * * **Default**: `0` - * - * See also: - * - {@link randomTextureFrame} */ - maxFrameIndex?: number + unk_ac6_f1_88: number /** * Unknown integer. * - * **Default**: `-1` + * **Default**: `0` */ - unk_ds3_f1_111?: number + unk_ac6_f1_89: number /** - * Unknown integer. + * 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**: `false` */ - unk_ds3_f1_112?: 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_ds3_f1_113?: number + updateDistance: number /** - * Unknown integer. + * 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 particleBounciness} */ - unk_ds3_f1_114?: number + particleCollision: boolean /** - * Unknown integer. + * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. * * **Default**: `0` + * + * See also: + * - {@link particleCollision} */ - unk_ds3_f1_115?: number + particleBounciness: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_116?: number + unk_ac6_f1_94: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_ds3_f1_117?: number + unk_ac6_f1_95: number /** - * Unknown float. + * Controls whether or not the particles have a bloom effect. * - * **Default**: `1` + * **Default**: `false` + * + * See also: + * - {@link bloomColor} */ - unk_ds3_f1_118?: number + bloom: boolean /** - * Multiplier for {@link particleDuration}. + * 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} */ - particleDurationMultiplier?: number + bloomColor: Vector4 /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_120?: number + unk_ac6_f1_101: number /** - * Scalar multiplier for the size of the particles. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - particleSizeMultiplier?: number + unk_ac6_f1_102: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_122?: number + unk_ac6_f1_103: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_ds3_f1_123?: number + unk_ac6_f2_0: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_ds3_f1_124?: number + unk_ac6_f2_1: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `1` + * **Default**: `8` */ - unk_ds3_f1_125?: number + unk_ac6_f2_2: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_ds3_f1_126?: number + unk_ac6_f2_3: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_127?: number + unk_ac6_f2_4: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_128?: number + unk_ac6_f2_5: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_129?: number + unk_ac6_f2_6: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_130?: number + unk_ac6_f2_7: number /** * Unknown float. * * **Default**: `1` */ - unk_ds3_f1_131?: number + unk_ac6_f2_8: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_132?: number + unk_ac6_f2_9: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_133?: number + unk_ac6_f2_10: 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 + unk_ac6_f2_11: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_137?: number + unk_ac6_f2_12: number /** * Unknown integer. * - * **Default**: `8` - */ - unk_ds3_f1_138?: number - /** - * Unknown float. - * * **Default**: `0` */ - unk_ds3_f1_139?: number + unk_ac6_f2_13: number /** - * Unknown float. + * 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. * - * **Default**: `0` - */ - unk_ds3_f1_140?: number - /** - * Unknown integer. + * This requires {@link minFadeDistance} to be set to a positive value or 0. * - * **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. + * 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. * - * 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**: `-1` * - * **Default**: `0` + * See also: + * - {@link minFadeDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - limitUpdateDistance?: boolean + minFadeDistance: number /** - * Controls how close the camera needs to be to the node for the particle system to update. Requires {@link limitUpdateDistance} to be enabled. + * 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**: `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. + * 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**: `false` + * **Default**: `-1` * * See also: - * - {@link particleBounciness} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - particleCollision?: boolean + minDistance: number /** - * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. - * - * **Default**: `0` + * 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. * - * 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. + * 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**: `false` + * **Default**: `-1` * * See also: - * - {@link particleRandomTurnIntervalMax} - * - {@link particleRandomTurnAngle} + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - particleRandomTurns?: boolean + maxFadeDistance: number /** - * The maximum amount of time in seconds to wait between making random turns. Requires {@link particleRandomTurns} to be enabled. + * 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**: `1` + * This requires {@link maxFadeDistance} to be set to a positive value or 0. * - * 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. + * 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**: `false` + * **Default**: `-1` * * See also: - * - {@link particleTraceLength} - */ - traceParticles?: boolean - /** - * Unknown float. - * - * **Default**: `1` + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - unk_ds3_f1_149?: number + maxDistance: number /** - * Controls how much the particles are stretched when {@link traceParticles} is enabled. + * 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` - */ - 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**: `-1` * - * **Default**: `0` + * See also: + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link maxDistanceThreshold} */ - traceParticlesThreshold?: number + minDistanceThreshold: number /** - * If enabled, this will add a billboarding sprite to the leading end of trace particles. + * 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**: `false` + * **Default**: `-1` * * See also: - * - {@link traceParticles} + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} */ - traceParticleHead?: boolean + maxDistanceThreshold: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_153?: number + unk_ac6_f2_20: 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 + unk_ac6_f2_21: 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]` + * Unknown integer. * - * See also: - * - {@link bloom} + * **Default**: `0` */ - bloomColor?: Vector4 + unk_ac6_f2_22: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_sdt_f1_160?: number + unk_ac6_f2_23: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f1_161?: number + unk_ac6_f2_24: number /** * Unknown float. * * **Default**: `1` */ - unk_sdt_f1_162?: number + unkDepthBlend1: number /** * Unknown float. * - * **Default**: `1` + * **Default**: `0` */ - unk_sdt_f1_163?: number + unkDepthBlend2: number /** - * Unknown float. + * Unknown integer. * * **Default**: `1` */ - unk_sdt_f1_164?: number + unk_ac6_f2_27: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f1_165?: number + unk_ac6_f2_28: number /** * Unknown float. * - * **Default**: `1` + * **Default**: `0` */ - unk_sdt_f1_166?: number + unk_ac6_f2_29: number /** - * Unknown float. + * Controls how dark shaded parts of the particle are. * * **Default**: `1` */ - unk_er_f1_167?: number + shadowDarkness: number /** - * Desaturates the particles, making them more grayscale. At 0, the particles will have their regular colors. At 1, they will be entirely grayscale. + * 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` */ - desaturate?: number + unkHideIndoors: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_0?: number + unk_ac6_f2_32: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_1?: number + unk_ac6_f2_33: number + /** + * Unknown float. + * + * **Default**: `0.5` + */ + unk_ac6_f2_34: number /** * Unknown integer. * - * **Default**: `8` + * **Default**: {@link LightingMode.Unlit} */ - unk_ds3_f2_2?: number + lighting: LightingMode /** * Unknown integer. * - * **Default**: `0` + * **Default**: `-2` */ - unk_ds3_f2_3?: number + unk_ac6_f2_36: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_4?: number + unk_ac6_f2_37: number /** * Unknown float. * - * **Default**: `1` + * **Default**: `0` */ - unk_ds3_f2_5?: number + unk_ac6_f2_38: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_ds3_f2_6?: number + unk_ac6_f2_39: number + constructor(props: Partial> = {}) { + super(ActionType.GPUSparkParticle) + 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 /** - * Unknown float. + * Controls how well the particles follow the node if it moves. * - * **Default**: `1` + * **Default**: `0` */ - unk_ds3_f2_7?: number + particleFollowFactor: ScalarValue /** - * Unknown float. + * Unknown scalar. * - * **Default**: `1` + * **Default**: `0` */ - unk_ds3_f2_8?: number + unk_ac6_p1_1: ScalarValue /** - * Unknown integer. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_f2_9?: number + unk_ac6_p1_2: ScalarValue /** - * Unknown integer. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_f2_10?: number + unk_ac6_p1_3: ScalarValue /** - * Unknown integer. + * Particle acceleration along the X-axis. * * **Default**: `0` */ - unk_ds3_f2_11?: number + particleAccelerationX: ScalarValue /** - * Unknown integer. + * Particle acceleration along the Y-axis. * * **Default**: `0` */ - unk_ds3_f2_12?: number + particleAccelerationY: ScalarValue /** - * Unknown integer. + * Particle acceleration along the Z-axis. * * **Default**: `0` */ - unk_ds3_f2_13?: number + particleAccelerationZ: 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. + * Color multiplier. * - * 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. + * Values in this are unrestricted and can go above 1. * - * **Default**: `-1` + * **Default**: `[1, 1, 1, 1]` * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - minFadeDistance?: number + color: Vector4Value /** - * 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. + * The length of the particles. * - * This requires {@link minFadeDistance} to be set to a positive value or 0. + * **Default**: `1` + */ + particleLength: ScalarValue + /** + * The width of the particles. * - * 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.1` + */ + particleWidth: ScalarValue + /** + * Similar to {@link particleAccelerationZ}, but this does not go exactly north? * - * **Default**: `-1` + * This requires any of the following fields to have a non-zero value: + * - {@link particleSpeedMin} + * - {@link particleSpeedMax} * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `0` */ - minDistance?: number + unkParticleAcceleration: 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. + * Unknown scalar. * - * 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` + */ + unk_ac6_p1_11: ScalarValue + /** + * Downwards acceleration for particles. * - * **Default**: `-1` + * This requires any of the following fields to have a non-zero value: + * - {@link particleSpeedMin} + * - {@link particleSpeedMax} * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - maxFadeDistance?: number + particleGravity: 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. - * - * This requires {@link maxFadeDistance} to be set to a positive value or 0. + * Unknown scalar. * - * 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` + */ + unk_ac6_p1_13: ScalarValue + /** + * Unknown scalar. * - * **Default**: `-1` + * **Default**: `1` + */ + unk_ac6_p2_0: ScalarValue + /** + * Unknown scalar. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - maxDistance?: number + unk_ac6_p2_1: 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. + * Unknown scalar. * - * **Default**: `-1` + * **Default**: `0` + */ + unk_ac6_p2_2: ScalarValue + /** + * Unknown vector4. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} + * **Default**: `[1, 1, 1, 1]` */ - minDistanceThreshold?: number + unk_ac6_p2_3: Vector4Value /** - * 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 vector4. * - * **Default**: `-1` + * **Default**: `[1, 1, 1, 1]` + */ + unk_ac6_p2_4: Vector4Value + /** + * Unknown vector4. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} + * **Default**: `[1, 1, 1, 1]` */ - maxDistanceThreshold?: number + unk_ac6_p2_5: Vector4Value /** - * Unknown integer. + * Unknown scalar. * * **Default**: `0` */ - unk_ds3_f2_20?: number + unk_ac6_p2_6: ScalarValue /** - * Unknown integer. + * The ID of the texture of the particles. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f2_21?: number + texture: number /** - * Unknown integer. + * Controls the shape of the particle emitter. See {@link EmitterShape} for more details. * - * **Default**: `0` + * **Default**: {@link EmitterShape.Box} */ - unk_ds3_f2_22?: number + emitterShape: EmitterShape /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_23?: number + unk_ac6_f1_2: number /** - * Unknown integer. + * The size of the emitter. * - * **Default**: `0` + * **Default**: `[1, 1, 1]` + */ + emitterSize: Vector3 + /** + * The rotation of the emitter. + * + * **Default**: `[0, 0, 0]` */ - unk_ds3_f2_24?: number + emitterRotation: Vector3 /** * Unknown float. * * **Default**: `1` */ - unkDepthBlend1?: number + unk_ac6_f1_9: number /** * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unkDepthBlend2?: number + unk_ac6_f1_10: number /** - * Unknown integer. + * Unknown float. * * **Default**: `1` */ - unk_ds3_f2_27?: number + unk_ac6_f1_11: number /** - * Unknown integer. + * 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` */ - unk_ds3_f2_28?: number + emitterDistribution: number /** * Unknown float. * * **Default**: `0` */ - unk_sdt_f2_29?: number + unk_ac6_f1_13: number /** - * Controls how dark shaded parts of the particle are. + * Unknown float. * * **Default**: `0` */ - shadowDarkness?: number + unk_ac6_f1_14: 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**: `-1` + */ + unk_ac6_f1_15: number + /** + * Unknown integer. * * **Default**: `0` */ - unkHideIndoors?: number + unk_ac6_f1_16: number /** * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_sdt_f2_32?: number + unk_ac6_f1_17: number /** - * Specular texture ID. + * The number of particles to emit per emission. * - * **Default**: `0` + * **Default**: `10` * * See also: - * - {@link lighting} - * - {@link glossiness} - * - {@link specularity} + * - {@link emissionParticleCountMin} + * - {@link emissionParticleCountMax} */ - specular?: number + emissionParticleCount: number /** - * Controls how sharp the specular highlights are. + * 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.25` + * **Default**: `0` * * See also: - * - {@link lighting} - * - {@link specular} - * - {@link specularity} + * - {@link emissionParticleCount} + * - {@link emissionParticleCountMax} */ - glossiness?: number + emissionParticleCountMin: number /** - * Unknown integer. + * 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**: {@link LightingMode.Unlit} - */ - lighting?: LightingMode - /** - * Unknown integer. + * **Default**: `0` * - * **Default**: `-2` + * See also: + * - {@link emissionParticleCount} + * - {@link emissionParticleCountMin} */ - unk_sdt_f2_36?: number + emissionParticleCountMax: number /** - * Unknown integer. + * 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} */ - unk_sdt_f2_37?: number + emissionInterval: number /** - * Controls how bright the specular highlights are. + * 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.5` + * **Default**: `0` * * See also: - * - {@link lighting} - * - {@link specular} - * - {@link glossiness} + * - {@link emissionInterval} + * - {@link emissionIntervalMax} */ - specularity?: number + emissionIntervalMin: number /** - * Unknown integer. + * 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} */ - 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} + emissionIntervalMax: number /** - * Controls how well the particles follow the node if it moves. + * If enabled, the number of emissions will be limited by {@link concurrentEmissionsLimit}. + * + * **Default**: `false` */ - particleFollowFactor: ScalarValue - unk_ds3_p1_1: ScalarValue - unk_ds3_p1_2: ScalarValue - unk_ds3_p1_3: ScalarValue + limitConcurrentEmissions: boolean /** - * Particle acceleration along the X-axis. + * The total number of emissions. This limit is only applied if {@link limitConcurrentEmissions} is enabled. * - * See also: - * - {@link particleAccelerationMin} - * - {@link particleAccelerationMax} + * **Default**: `0` */ - particleAccelerationX: ScalarValue + concurrentEmissionsLimit: number /** - * Particle acceleration along the Y-axis. + * Unknown integer. * - * See also: - * - {@link particleAccelerationMin} - * - {@link particleAccelerationMax} + * **Default**: `0` */ - particleAccelerationY: ScalarValue + unk_ac6_f1_26: number /** - * Particle acceleration along the Z-axis. + * 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 particleAccelerationMin} - * - {@link particleAccelerationMax} + * **Default**: `1` */ - particleAccelerationZ: ScalarValue - unk_ds3_p1_7: ScalarValue - unk_ds3_p1_8: ScalarValue + particleDuration: number /** - * Angular acceleration for particles around the Z-axis in degrees per second squared. + * Unknown integer. * - * See also: - * - {@link particleAngularAccelerationMin} - * - {@link particleAngularAccelerationMax} + * **Default**: `0` */ - particleAngularAccelerationZ: ScalarValue + unk_ac6_f1_28: number /** - * The rate of change for the width of the particles. + * Unknown integer. * - * See also: - * - {@link particleGrowthRateXStatic} + * **Default**: `0` */ - particleGrowthRateX: ScalarValue + unk_ac6_f1_29: number /** - * The rate of change for the height of the particles. + * Particle position offset. + * + * **Default**: `[0, 0, 0]` * * See also: - * - {@link particleGrowthRateYStatic} + * - {@link particleOffsetMin} + * - {@link particleOffsetMax} */ - particleGrowthRateY: ScalarValue - unk_ds3_p1_12: ScalarValue + particleOffset: Vector3 /** - * 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 - 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. - * - * **Default**: `1` - */ - 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} - */ - 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 - 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 - 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: GPUStandardCorrectParticleParams = {}) { - super(ActionType.GPUStandardCorrectParticle, {isAppearance:true,isParticle:false}) - this.assign(props) - } -} - -export interface LightShaftParams { - /** - * Unknown. - * - * **Default**: `1` - */ - width?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - height?: ScalarValue - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - color1?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - color2?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - color3?: Vector4Value - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_5?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_6?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ds3_p1_7?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_ds3_p1_8?: ScalarValue - /** - * Unknown. - * - * **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_ds3_f1_10?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_11?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_12?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_13?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_14?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_15?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_ds3_f1_16?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_17?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_18?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_19?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_20?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_21?: number - /** - * Unknown float. - * - * **Default**: `-1` - */ - unk_ds3_f1_22?: number - /** - * Unknown float. - * - * **Default**: `-1` - */ - unk_ds3_f1_23?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_24?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_25?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_26?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_27?: number - /** - * Unknown float. - * - * **Default**: `-1` - */ - unk_ds3_f1_28?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f1_29?: number -} - -/** - * ### {@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} - 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 - /** - * Texture ID. - */ - texture: number - /** - * Blend mode. - */ - 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 - /** - * The number of layers to use for the light shaft effect. Higher values will look better, but will probably perform worse. - */ - 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}) - this.assign(props) - } -} - -export interface GPUSparkParticleParams { - /** - * Controls how well the particles follow the node if it moves. - * - * **Default**: `0` - */ - particleFollowFactor?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ac6_p1_1?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ac6_p1_2?: ScalarValue - /** - * Unknown. - * - * **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 - /** - * 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 - /** - * The length of the particles. - * - * **Default**: `1` - */ - particleLength?: ScalarValue - /** - * The width of the particles. - * - * **Default**: `0.1` - */ - 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} - * - * **Default**: `0` - */ - unkParticleAcceleration?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - 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} - * - * **Default**: `1` - */ - particleGravity?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ac6_p1_13?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_ac6_p2_0?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_ac6_p2_1?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ac6_p2_2?: ScalarValue - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ac6_p2_3?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ac6_p2_4?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ac6_p2_5?: Vector4Value - /** - * Unknown. - * - * **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: - * | 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_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} - */ - 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 - /** - * 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} - */ - 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. - * - * **Default**: `0` - * - * 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. - * - * **Default**: `0` - * - * See also: - * - {@link emissionInterval} - * - {@link emissionIntervalMin} - */ - 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. - * - * **Default**: `0` - */ - concurrentEmissionsLimit?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - 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. - * - * **Default**: `1` - */ - particleDuration?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_28?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_29?: 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 - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_39?: number - /** - * Minimum particle speed. - * - * **Default**: `[-0.01, -0.01, -0.01]` - * - * See also: - * - {@link particleSpeedMax} - */ - particleSpeedMin?: Vector3 - /** - * Maximum particle speed. - * - * **Default**: `[0.01, 0.01, 0.01]` - * - * See also: - * - {@link particleSpeedMin} - */ - particleSpeedMax?: Vector3 - /** - * 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.Add} - */ - blendMode?: BlendMode - /** - * Unknown integer. - * - * **Default**: `-1` - */ - unk_ac6_f1_57?: number - /** - * Unknown integer. - * - * **Default**: `-1` - */ - unk_ac6_f1_58?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_59?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_60?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_61?: number - /** - * 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. - * - * **Default**: `1` - */ - 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. - * - * **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. - * - * **Default**: `1` - */ - 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. - * - * **Default**: `1` - */ - particleWidthMax?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_67?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_68?: number - /** - * Multiplier for {@link particleDuration}. - * - * **Default**: `1` - */ - particleDurationMultiplier?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_70?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_71?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_72?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_73?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_74?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ac6_f1_75?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_76?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_77?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_78?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_79?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_80?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_81?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_82?: number - /** - * 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. - * - * **Default**: `0` - */ - 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. - * - * **Default**: `0` - */ - unk_ac6_f1_85?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_86?: number - /** - * Unknown integer. - * - * **Default**: `8` - */ - unk_ac6_f1_87?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_88?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - 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. - * - * **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 - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_94?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_95?: 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_ac6_f1_101?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_102?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_103?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - 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_ac6_f2_5?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f2_6?: number - /** - * Unknown float. - * - * **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 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. - * - * **Default**: `-1` - * - * See also: - * - {@link minDistance} - * - {@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_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_ac6_f2_38?: number - /** - * Unknown integer. - * - * **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} - */ - 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_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. - */ - 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 - 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}) - this.assign(props) - } -} - -export interface GPUSparkCorrectParticleParams { - /** - * Controls how well the particles follow the node if it moves. - * - * **Default**: `0` - */ - particleFollowFactor?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ac6_p1_1?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ac6_p1_2?: ScalarValue - /** - * Unknown. - * - * **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 - /** - * 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 - /** - * The length of the particles. - * - * **Default**: `1` - */ - particleLength?: ScalarValue - /** - * The width of the particles. - * - * **Default**: `0.1` - */ - 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} - * - * **Default**: `0` - */ - unkParticleAcceleration?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - 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} - * - * **Default**: `1` - */ - particleGravity?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ac6_p1_13?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_ac6_p2_0?: ScalarValue - /** - * Unknown. - * - * **Default**: `1` - */ - unk_ac6_p2_1?: ScalarValue - /** - * Unknown. - * - * **Default**: `0` - */ - unk_ac6_p2_2?: ScalarValue - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ac6_p2_3?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ac6_p2_4?: Vector4Value - /** - * Unknown. - * - * **Default**: `[1, 1, 1, 1]` - */ - unk_ac6_p2_5?: Vector4Value - /** - * Unknown. - * - * **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: - * | 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_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} - */ - 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 - /** - * 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} - */ - 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. - * - * **Default**: `0` - * - * 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. - * - * **Default**: `0` - * - * See also: - * - {@link emissionInterval} - * - {@link emissionIntervalMin} - */ - 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. - * - * **Default**: `0` - */ - concurrentEmissionsLimit?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - 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. - * - * **Default**: `1` - */ - particleDuration?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_28?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_29?: 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 - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_39?: number - /** - * Minimum particle speed. - * - * **Default**: `[-0.01, -0.01, -0.01]` - * - * See also: - * - {@link particleSpeedMax} - */ - particleSpeedMin?: Vector3 - /** - * Maximum particle speed. - * - * **Default**: `[0.01, 0.01, 0.01]` - * - * See also: - * - {@link particleSpeedMin} - */ - particleSpeedMax?: Vector3 - /** - * 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.Add} - */ - blendMode?: BlendMode - /** - * Unknown integer. - * - * **Default**: `-1` - */ - unk_ac6_f1_57?: number - /** - * Unknown integer. - * - * **Default**: `-1` - */ - unk_ac6_f1_58?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_59?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_60?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_61?: number - /** - * 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. - * - * **Default**: `1` - */ - 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. - * - * **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. - * - * **Default**: `1` - */ - 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. - * - * **Default**: `1` - */ - particleWidthMax?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_67?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_68?: number - /** - * Multiplier for {@link particleDuration}. - * - * **Default**: `1` - */ - particleDurationMultiplier?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_70?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_71?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_72?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_73?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_74?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_ac6_f1_75?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_76?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_77?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_78?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_79?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_80?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_81?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_82?: number - /** - * 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. - * - * **Default**: `0` - */ - 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. - * - * **Default**: `0` - */ - unk_ac6_f1_85?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_86?: number - /** - * Unknown integer. - * - * **Default**: `8` - */ - unk_ac6_f1_87?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_88?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - 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. - * - * **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 - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_94?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_95?: 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_ac6_f1_101?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f1_102?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f1_103?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - 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_ac6_f2_5?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ac6_f2_6?: number - /** - * Unknown float. - * - * **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 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. - * - * **Default**: `-1` - * - * See also: - * - {@link minDistance} - * - {@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_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_ac6_f2_38?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ac6_f2_39?: number -} - -/** - * ### {@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. - */ - 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} - */ - 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_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. - */ - 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 - 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 { - /** - * 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_sdt_f1_14?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_sdt_f1_15?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_sdt_f1_16?: number - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_sdt_f1_17?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_er_f1_18?: number - /** - * Unknown integer. - * - * **Default**: `1` - */ - unk_er_f1_19?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_er_f1_20?: number - /** - * Unknown float. - * - * **Default**: `0` - */ - unk_er_f1_21?: number - /** - * Unknown integer. - * - * **Default**: `0` - */ - unk_ds3_f2_0?: number - /** - * Unknown boolean. + * 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` + * **Default**: `[0, 0, 0]` */ - unk_ds3_f2_1?: boolean + particleOffsetMin: Vector3 /** - * Unknown integer. + * 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**: `8` + * **Default**: `[0, 0, 0]` */ - unk_ds3_f2_2?: number + particleOffsetMax: Vector3 /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_3?: number + unk_ac6_f1_39: 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. + * Minimum particle speed. * - * **Default**: `true` + * **Default**: `[-0.01, -0.01, -0.01]` * * See also: - * - {@link bloomColor} + * - {@link particleSpeedMax} */ - bloom?: boolean + particleSpeedMin: 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. + * Maximum particle speed. * - * **Default**: `[1, 1, 1, 0]` + * **Default**: `[0.01, 0.01, 0.01]` * * See also: - * - {@link bloom} - */ - 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` + * - {@link particleSpeedMin} */ - unk_ds3_f2_12?: number + particleSpeedMax: Vector3 /** - * Unknown integer. + * Scalar multiplier for the color that does not affect the alpha. Effectively a brightness multiplier. * - * **Default**: `0` + * **Default**: `1` */ - unk_ds3_f2_13?: number + rgbMultiplier: 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` + * Alpha multiplier. * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - minFadeDistance?: number + alphaMultiplier: 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` + * 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. * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `[0, 0, 0, 0]` */ - minDistance?: number + colorMin: Vector4 /** - * 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` + * 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. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `[0, 0, 0, 0]` */ - maxFadeDistance?: number + colorMax: Vector4 /** - * 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` + * Blend mode. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: {@link BlendMode.Add} */ - maxDistance?: number + blendMode: BlendMode /** - * 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. * * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} */ - minDistanceThreshold?: number + unk_ac6_f1_57: 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. * * **Default**: `-1` - * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - */ - maxDistanceThreshold?: number - /** - * Unknown float. - * - * **Default**: `0` */ - unk_ds3_f2_20?: number + unk_ac6_f1_58: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_21?: number + unk_ac6_f1_59: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_22?: number + unk_ac6_f1_60: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_23?: number + unk_ac6_f1_61: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f2_24?: number + unk_ac6_f1_62: number /** - * Unknown float. + * Minimum particle length. A random value between this and {@link particleLengthMax} will be **multiplied** by {@link particleLength} to get the final particle length. * * **Default**: `1` */ - unkDepthBlend1?: number + particleLengthMin: number /** - * Unknown float. + * 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` + * **Default**: `1` */ - unkDepthBlend2?: number + particleLengthMax: number /** - * Unknown integer. + * 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` */ - unk_ds3_f2_27?: number + particleWidthMin: number /** - * Unknown integer. + * 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` */ - unk_ds3_f2_28?: number + particleWidthMax: number /** * Unknown float. * - * **Default**: `5` - */ - 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` + * **Default**: `1` */ - unk_sdt_f2_37?: number + unk_ac6_f1_67: number /** - * Controls how bright the specular highlights are. - * - * **Default**: `0.5` + * Unknown float. * - * See also: - * - {@link lighting} - * - {@link specular} - * - {@link glossiness} + * **Default**: `1` */ - specularity?: number + unk_ac6_f1_68: number /** - * Unknown integer. + * Multiplier for {@link particleDuration}. * - * **Default**: `0` + * **Default**: `1` */ - unk_er_f2_39?: number + particleDurationMultiplier: number /** * Unknown float. * * **Default**: `1` */ - unk_er_f2_40?: number + unk_ac6_f1_70: number /** * Unknown float. * - * **Default**: `0` - */ - 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} - /** - * 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. + * **Default**: `1` */ - 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_71: 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 float. * - * See also: - * - {@link bloomColor} + * **Default**: `1` */ - bloom: boolean + unk_ac6_f1_72: 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**: `1` */ - 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 + unk_ac6_f1_73: 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 float. * - * See also: - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - minFadeDistance: number + unk_ac6_f1_74: 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. + * Unknown float. * - * See also: - * - {@link minFadeDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `0` */ - minDistance: number + unk_ac6_f1_75: 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 float. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - maxFadeDistance: number + unk_ac6_f1_76: 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. + * Unknown float. * - * 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` + */ + unk_ac6_f1_77: number + /** + * Unknown float. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link minDistanceThreshold} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - maxDistance: number + unk_ac6_f1_78: 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. + * Unknown float. * - * See also: - * - {@link minFadeDistance} - * - {@link minDistance} - * - {@link maxFadeDistance} - * - {@link maxDistance} - * - {@link maxDistanceThreshold} + * **Default**: `1` */ - minDistanceThreshold: number + unk_ac6_f1_79: 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 float. * - * 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 - unk_ds3_f2_29: number + unk_ac6_f1_80: number /** - * Controls how dark shaded parts of the trail are. + * Unknown integer. + * + * **Default**: `0` */ - shadowDarkness: number - unk_sdt_f2_31: number + unk_ac6_f1_81: 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_ac6_f1_82: number /** - * Specular texture ID. + * Unknown integer. * - * See also: - * - {@link lighting} - * - {@link glossiness} - * - {@link specularity} + * **Default**: `0` */ - specular: number + unk_ac6_f1_83: number /** - * Controls how sharp the specular highlights are. + * 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 lighting} - * - {@link specular} - * - {@link specularity} + * **Default**: `0` */ - glossiness: number + unk_ac6_f1_84: number /** - * Controls how the trail is lit. See {@link LightingMode} for more information. + * 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` */ - lighting: LightingMode - unk_sdt_f2_36: number - unk_sdt_f2_37: number + unk_ac6_f1_85: 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_86: number /** - * The ID for a texture that controls the shape of the interaction. + * Unknown integer. * - * **Default**: `50004` + * **Default**: `8` */ - texture?: number + unk_ac6_f1_87: 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_88: 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_89: number /** - * The time it takes for the water to be pushed down to the {@link depth} in seconds. + * If enabled, the particle system stops updating if the camera is beyond the distance specified by {@link updateDistance} from the node. * - * **Default**: `0.15` + * 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**: `false` */ - descent?: number + limitUpdateDistance: boolean /** - * The duration of the interaction in seconds. Basically how long to hold the water pressed down. + * 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.15` + * **Default**: `0` */ - 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} + updateDistance: number /** - * The ID for a texture that controls the shape of the interaction. + * 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} */ - texture: number + particleCollision: boolean /** - * Controls how deep to push the water, or how intense the ripples caused by the interaction are. + * Controls how strong the rebound from hitting a surface is when {@link particleCollision} is enabled. + * + * **Default**: `0` + * + * See also: + * - {@link particleCollision} */ - depth: number + particleBounciness: number /** - * Controls the size of the interaction area. Ripples caused by the interaction may go outside of the area. + * Unknown integer. + * + * **Default**: `0` */ - size: number + unk_ac6_f1_94: number /** - * The time it takes for the water to be pushed down to the {@link depth} in seconds. + * Unknown integer. + * + * **Default**: `0` */ - descent: number + unk_ac6_f1_95: number /** - * The duration of the interaction in seconds. Basically how long to hold the water pressed down. + * Controls whether or not the particles have a bloom effect. + * + * **Default**: `false` + * + * See also: + * - {@link bloomColor} */ - duration: number - constructor(props: WaterInteractionParams = {}) { - super(ActionType.WaterInteraction, {isAppearance:true,isParticle:false}) - this.assign(props) - } -} - -export interface LensFlareParams { + bloom: boolean /** - * Layer 1 width. + * 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} */ - layer1Width?: ScalarValue + bloomColor: Vector4 /** - * Layer 1 height. + * Unknown float. * * **Default**: `1` */ - layer1Height?: ScalarValue + unk_ac6_f1_101: number /** - * Layer 1 color. + * Unknown integer. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` */ - layer1Color?: Vector4Value + unk_ac6_f1_102: number /** - * Layer 2 width. + * Unknown float. * * **Default**: `1` */ - layer2Width?: ScalarValue + unk_ac6_f1_103: number /** - * Layer 2 height. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - layer2Height?: ScalarValue + unk_ac6_f2_0: number /** - * Layer 2 color. + * Unknown integer. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` */ - layer2Color?: Vector4Value + unk_ac6_f2_1: number /** - * Layer 3 width. + * Unknown integer. * - * **Default**: `1` + * **Default**: `8` */ - layer3Width?: ScalarValue + unk_ac6_f2_2: number /** - * Layer 3 height. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - layer3Height?: ScalarValue + unk_ac6_f2_3: number /** - * Layer 3 color. + * Unknown integer. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `0` */ - layer3Color?: Vector4Value + unk_ac6_f2_4: number /** - * Layer 4 width. + * Unknown float. * * **Default**: `1` */ - layer4Width?: ScalarValue + unk_ac6_f2_5: number /** - * Layer 4 height. + * Unknown float. * * **Default**: `1` */ - layer4Height?: ScalarValue + unk_ac6_f2_6: number /** - * Layer 4 color. + * Unknown float. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `1` */ - layer4Color?: Vector4Value + unk_ac6_f2_7: number /** - * Layer 1 texture ID. + * Unknown float. * * **Default**: `1` */ - layer1?: number + unk_ac6_f2_8: number /** - * Layer 2 texture ID. + * Unknown integer. * * **Default**: `0` */ - layer2?: number + unk_ac6_f2_9: number /** - * Layer 3 texture ID. + * Unknown integer. * * **Default**: `0` */ - layer3?: number + unk_ac6_f2_10: number /** - * Layer 4 texture ID. - * - * This layer seems to work a bit differently from the others in Sekiro. + * Unknown integer. * * **Default**: `0` */ - layer4?: number + unk_ac6_f2_11: number /** - * Blend mode. + * Unknown integer. * - * **Default**: {@link BlendMode.Add} + * **Default**: `0` */ - blendMode?: BlendMode + unk_ac6_f2_12: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f1_4?: number + unk_ac6_f2_13: number /** - * Diameter of the lens flare source sphere. + * 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. * - * The opacity of the lens flare depends on how much of the source is in view. + * This requires {@link minFadeDistance} to be set to a positive value or 0. * - * **Default**: `1` - */ - sourceSize?: 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. + * 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` - */ - opacityTransitionDuration?: number - /** - * Unknown integer. + * **Default**: `-1` * - * **Default**: `0` + * See also: + * - {@link minFadeDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - unk_er_f1_8?: number + minFadeDistance: number /** - * Number of copies of layer 1. Why this exists is unknown, they all just stack on top of each other. + * 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. * - * Each copy will pick its own random values for the scale variation. + * 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` + * **Default**: `-1` * * See also: - * - {@link layer1ScaleVariationX} - * - {@link layer1ScaleVariationY} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - layer1Count?: number + minDistance: number /** - * The {@link layer1Width 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 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 layer1Count} - * - {@link layer1UniformScale} - * - {@link layer1ScaleVariationY} + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - layer1ScaleVariationX?: number + maxFadeDistance: number /** - * The {@link layer1Height layer's height} is multiplied by a random value between this and 1. + * 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**: `1` + * 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 layer1Count} - * - {@link layer1UniformScale} - * - {@link layer1ScaleVariationX} + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link minDistanceThreshold} + * - {@link maxDistanceThreshold} */ - layer1ScaleVariationY?: number + maxDistance: 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. + * 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**: `false` + * **Default**: `-1` * * See also: - * - {@link layer1Width} - * - {@link layer1Height} - * - {@link layer1ScaleVariationX} - * - {@link layer1ScaleVariationX} + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link maxDistanceThreshold} */ - layer1UniformScale?: boolean + minDistanceThreshold: number /** - * Multiplier for the {@link layer1Color layer's color}. + * 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, 1, 1, 1]` + * **Default**: `-1` * * See also: - * - {@link layer1Color} + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link minDistanceThreshold} */ - layer1ColorMultiplier?: Vector4 + maxDistanceThreshold: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f1_17?: number + unk_ac6_f2_20: number /** - * Unknown float. + * Unknown integer. * * **Default**: `0` */ - unk_er_f1_18?: number + unk_ac6_f2_21: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `1` + * **Default**: `0` */ - unk_er_f1_19?: number + unk_ac6_f2_22: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `-1` + * **Default**: `0` */ - unk_er_f1_20?: number + unk_ac6_f2_23: number /** - * Number of copies of layer 2. 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. - * - * **Default**: `1` + * Unknown integer. * - * See also: - * - {@link layer2ScaleVariationX} - * - {@link layer2ScaleVariationY} + * **Default**: `0` */ - layer2Count?: number + unk_ac6_f2_24: number /** - * The {@link layer2Width layer's width} is multiplied by a random value between this and 1. + * Unknown float. * * **Default**: `1` + */ + unkDepthBlend1: number + /** + * Unknown float. * - * See also: - * - {@link layer2Count} - * - {@link layer2UniformScale} - * - {@link layer2ScaleVariationY} + * **Default**: `0` */ - layer2ScaleVariationX?: number + unkDepthBlend2: number /** - * The {@link layer2Height layer's height} is multiplied by a random value between this and 1. + * Unknown integer. * * **Default**: `1` + */ + unk_ac6_f2_27: number + /** + * Unknown integer. * - * See also: - * - {@link layer2Count} - * - {@link layer2UniformScale} - * - {@link layer2ScaleVariationX} + * **Default**: `0` */ - layer2ScaleVariationY?: number + unk_ac6_f2_28: 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. + * Unknown float. * - * **Default**: `false` + * **Default**: `0` + */ + unk_ac6_f2_29: number + /** + * Controls how dark shaded parts of the particle are. * - * See also: - * - {@link layer2Width} - * - {@link layer2Height} - * - {@link layer2ScaleVariationX} - * - {@link layer2ScaleVariationX} + * **Default**: `1` */ - layer2UniformScale?: boolean + shadowDarkness: number /** - * Multiplier for the {@link layer2Color layer's color}. + * When set to 1, this stops the particles from being shown indoors. * - * **Default**: `[1, 1, 1, 1]` + * Other values are used in AC6, but what they do is unknown. * - * See also: - * - {@link layer2Color} + * **Default**: `0` */ - layer2ColorMultiplier?: Vector4 + unkHideIndoors: number /** * Unknown integer. * * **Default**: `0` */ - unk_er_f1_29?: number + unk_ac6_f2_32: number /** - * Unknown float. + * Unknown integer. * * **Default**: `0` */ - unk_er_f1_30?: number + unk_ac6_f2_33: number /** * Unknown float. * - * **Default**: `1` + * **Default**: `0.5` */ - unk_er_f1_31?: number + unk_ac6_f2_34: number /** - * Unknown float. + * Unknown integer. * - * **Default**: `-1` + * **Default**: {@link LightingMode.Unlit} */ - unk_er_f1_32?: number + lighting: LightingMode /** - * Number of copies of layer 3. 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. - * - * **Default**: `1` + * Unknown integer. * - * See also: - * - {@link layer3ScaleVariationX} - * - {@link layer3ScaleVariationY} + * **Default**: `-2` */ - layer3Count?: number + unk_ac6_f2_36: number /** - * The {@link layer3Width layer's width} is multiplied by a random value between this and 1. - * - * **Default**: `1` + * Unknown integer. * - * See also: - * - {@link layer3Count} - * - {@link layer3UniformScale} - * - {@link layer3ScaleVariationY} + * **Default**: `0` */ - layer3ScaleVariationX?: number + unk_ac6_f2_37: number /** - * The {@link layer3Height layer's height} is multiplied by a random value between this and 1. - * - * **Default**: `1` + * Unknown float. * - * See also: - * - {@link layer3Count} - * - {@link layer3UniformScale} - * - {@link layer3ScaleVariationX} + * **Default**: `0` */ - layer3ScaleVariationY?: number + unk_ac6_f2_38: 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. - * - * **Default**: `false` + * Unknown integer. * - * See also: - * - {@link layer3Width} - * - {@link layer3Height} - * - {@link layer3ScaleVariationX} - * - {@link layer3ScaleVariationX} + * **Default**: `0` */ - layer3UniformScale?: boolean + unk_ac6_f2_39: number + constructor(props: Partial> = {}) { + super(ActionType.GPUSparkCorrectParticle) + 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 /** - * Multiplier for the {@link layer3Color layer's color}. + * Texture ID. * - * **Default**: `[1, 1, 1, 1]` + * **Default**: `1` * - * See also: - * - {@link layer3Color} + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - layer3ColorMultiplier?: Vector4 + texture: ScalarValue /** - * Unknown integer. + * Blend mode. * - * **Default**: `0` - */ - unk_er_f1_41?: number - /** - * Unknown float. + * **Default**: {@link BlendMode.Normal} * - * **Default**: `0` + * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ - unk_er_f1_42?: number + blendMode: BlendMode | ScalarProperty /** - * Unknown float. + * The width of the trail. * * **Default**: `1` - */ - unk_er_f1_43?: number - /** - * Unknown float. * - * **Default**: `-1` + * **Argument**: {@link PropertyArgument.ParticleAge Particle age} */ - unk_er_f1_44?: number + width: ScalarValue /** - * 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. + * Multiplier for {@link width}. * * **Default**: `1` * - * See also: - * - {@link layer4ScaleVariationX} - * - {@link layer4ScaleVariationY} + * **Argument**: {@link PropertyArgument.EmissionTime Emission time} */ - layer4Count?: number + widthMultiplier: ScalarValue /** - * The {@link layer4Width layer's width} is multiplied by a random value between this and 1. + * Unknown scalar. * - * **Default**: `1` - * - * See also: - * - {@link layer4Count} - * - {@link layer4UniformScale} - * - {@link layer4ScaleVariationY} + * **Default**: `0` */ - layer4ScaleVariationX?: number + unk_ds3_p1_2: ScalarValue /** - * The {@link layer4Height layer's height} is multiplied by a random value between this and 1. - * - * **Default**: `1` + * 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 integer. Possibly boolean? * * **Default**: `0` */ - unk_er_f2_25?: number + unk_ds3_f2_1: number /** * 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. + * 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} */ - layer4Color: Vector4Value + minFadeDistance: number /** - * Layer 1 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} */ - layer1: number + minDistance: number /** - * Layer 2 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} */ - layer2: number + maxFadeDistance: number /** - * Layer 3 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 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} */ - layer3: number + maxDistance: number /** - * Layer 4 texture ID. + * 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. * - * This layer seems to work a bit differently from the others in Sekiro. + * **Default**: `-1` + * + * See also: + * - {@link minFadeDistance} + * - {@link minDistance} + * - {@link maxFadeDistance} + * - {@link maxDistance} + * - {@link maxDistanceThreshold} */ - layer4: number + minDistanceThreshold: number /** - * Blend mode. + * 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} */ - blendMode: BlendMode - unk_er_f1_4: number + maxDistanceThreshold: number /** - * Diameter of the lens flare source sphere. + * Unknown float. * - * The opacity of the lens flare depends on how much of the source is in view. + * **Default**: `0` */ - sourceSize: number + unk_ds3_f2_20: 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 integer. + * + * **Default**: `0` */ - opacityTransitionDuration: number - unk_er_f1_8: number + unk_ds3_f2_21: 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_22: 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_23: 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_24: 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 float. * - * See also: - * - {@link layer1Width} - * - {@link layer1Height} - * - {@link layer1ScaleVariationX} - * - {@link layer1ScaleVariationX} + * **Default**: `1` */ - layer1UniformScale: boolean + unkDepthBlend1: number /** - * Multiplier for the {@link layer1Color layer's color}. + * Unknown float. * - * See also: - * - {@link layer1Color} + * **Default**: `0` */ - layer1ColorMultiplier: Vector4 - unk_er_f1_17: number - unk_er_f1_18: number - unk_er_f1_19: number - unk_er_f1_20: number + unkDepthBlend2: number /** - * Number of copies of layer 2. 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 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) + 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 /** - * 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) 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 /** - * 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` + */ + layer2Height: ScalarValue + /** + * Layer 2 color. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `[1, 1, 1, 1]` + */ + layer2Color: Vector4Value + /** + * Layer 3 width. * - * See also: - * - {@link scaleVariationZ} - * - {@link sizeX} - * - {@link sizeY} + * **Default**: `1` */ - sizeZ?: ScalarValue + layer3Width: ScalarValue /** - * Rotation around the X-axis in degrees. + * Layer 3 height. * - * **Default**: `0` + * **Default**: `1` + */ + layer3Height: ScalarValue + /** + * Layer 3 color. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `[1, 1, 1, 1]` + */ + layer3Color: Vector4Value + /** + * Layer 4 width. * - * See also: - * - {@link angularSpeedX} - * - {@link angularSpeedMultiplierX} + * **Default**: `1` */ - rotationX?: ScalarValue + layer4Width: ScalarValue /** - * Rotation around the Y-axis in degrees. + * Layer 4 height. * - * **Default**: `0` + * **Default**: `1` + */ + layer4Height: ScalarValue + /** + * Layer 4 color. * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * **Default**: `[1, 1, 1, 1]` + */ + layer4Color: Vector4Value + /** + * Layer 1 texture ID. * - * See also: - * - {@link angularSpeedY} - * - {@link angularSpeedMultiplierY} + * **Default**: `1` */ - rotationY?: ScalarValue + layer1: number /** - * Rotation around the Z-axis in degrees. + * Layer 2 texture ID. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} - * - * See also: - * - {@link angularSpeedZ} - * - {@link angularSpeedMultiplierZ} */ - rotationZ?: ScalarValue + layer2: number /** - * Angular speed around the X-axis in degrees per second. + * Layer 3 texture ID. * * **Default**: `0` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * - * See also: - * - {@link rotationX} - * - {@link angularSpeedMultiplierX} */ - angularSpeedX?: ScalarValue + layer3: number /** - * Multiplier for {@link angularSpeedX}. + * 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 rotationX} + * **Default**: {@link BlendMode.Add} */ - angularSpeedMultiplierX?: ScalarValue + blendMode: BlendMode /** - * Angular speed around the Y-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 rotationY} - * - {@link angularSpeedMultiplierY} + * **Default**: `1` */ - angularSpeedY?: ScalarValue + sourceSize: number /** - * Multiplier for {@link angularSpeedY}. + * 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 rotationY} */ - angularSpeedMultiplierY?: ScalarValue + opacityTransitionDuration: number /** - * Angular speed around the Z-axis in degrees per second. + * Unknown integer. * * **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. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * Each copy will pick its own random values for the scale variation. + * + * **Default**: `1` * * See also: - * - {@link rotationZ} - * - {@link angularSpeedMultiplierZ} + * - {@link layer1ScaleVariationX} + * - {@link layer1ScaleVariationY} */ - angularSpeedZ?: ScalarValue + layer1Count: number /** - * Multiplier for {@link angularSpeedZ}. + * The {@link layer1Width layer's width} is multiplied by a random value between this and 1. * * **Default**: `1` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * * See also: - * - {@link rotationZ} + * - {@link layer1Count} + * - {@link layer1UniformScale} + * - {@link layer1ScaleVariationY} */ - angularSpeedMultiplierZ?: ScalarValue + layer1ScaleVariationX: number /** - * 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]` + * 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 color2} - * - {@link color3} + * - {@link layer1Count} + * - {@link layer1UniformScale} + * - {@link layer1ScaleVariationX} */ - color1?: Vector4Value + layer1ScaleVariationY: 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]` + * 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. * - * **Argument**: {@link PropertyArgument.EmissionTime Emission time} + * **Default**: `false` * * See also: - * - {@link color1} - * - {@link color3} + * - {@link layer1Width} + * - {@link layer1Height} + * - {@link layer1ScaleVariationX} + * - {@link layer1ScaleVariationX} */ - color2?: Vector4Value + layer1UniformScale: boolean /** - * 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}. + * Multiplier for the {@link layer1Color layer's color}. * * **Default**: `[1, 1, 1, 1]` * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} - * * See also: - * - {@link color1} - * - {@link color2} - */ - color3?: Vector4Value - /** - * Unknown. - * - * **Default**: `0` + * - {@link layer1Color} */ - unk_er_p1_16?: ScalarValue + layer1ColorMultiplier: Vector4 /** - * Unknown. + * Unknown integer. * * **Default**: `0` */ - unk_er_p1_17?: ScalarValue - /** - * Seemingly identical to {@link rgbMultiplier}? - * - * **Default**: `1` - * - * **Argument**: {@link PropertyArgument.ActiveTime Active time} - */ - rgbMultiplier2?: ScalarValue + unk_er_f1_17: number /** - * Unknown. + * Unknown float. * * **Default**: `0` */ - unk_er_p1_19?: ScalarValue + unk_er_f1_18: number /** - * Unknown. + * Unknown float. * - * **Default**: `0` + * **Default**: `1` */ - unk_er_p1_20?: ScalarValue + unk_er_f1_19: number /** - * Offset for the UV coordinates of the model. - * - * **Default**: `[0, 0]` - * - * **Argument**: {@link PropertyArgument.Constant0 Constant 0} + * Unknown float. * - * See also: - * - {@link uvSpeed} + * **Default**: `-1` */ - uvOffset?: Vector2Value + unk_er_f1_20: number /** - * Scroll speed for the model's texture. + * Number of copies of layer 2. Why this exists is unknown, they all just stack on top of each other. * - * **Default**: `[0, 0]` + * Each copy will pick its own random values for the scale variation. * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * **Default**: `1` * * See also: - * - {@link uvSpeedMultiplier} - */ - uvSpeed?: Vector2Value - /** - * Multiplier for {@link uvSpeed} - * - * **Default**: `[1, 1]` - * - * **Argument**: {@link PropertyArgument.ParticleAge Particle age} + * - {@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 /** - * Unknown integer. + * Unknown float. * * **Default**: `0` */ - unk_er_f1_7?: number + 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) + this.assign(props) + } } /** @@ -35957,10 +27934,11 @@ export interface RichModelParams { */ class RichModel extends DataAction { declare readonly type: ActionType.RichModel - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:true} /** * Model ID. * + * **Default**: `80201` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} */ model: ScalarValue @@ -35969,6 +27947,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: @@ -35982,6 +27962,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: @@ -35995,6 +27977,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: @@ -36006,6 +27990,8 @@ class RichModel extends DataAction { /** * Rotation around the X-axis in degrees. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: @@ -36016,6 +28002,8 @@ class RichModel extends DataAction { /** * Rotation around the Y-axis in degrees. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: @@ -36026,6 +28014,8 @@ class RichModel extends DataAction { /** * Rotation around the Z-axis in degrees. * + * **Default**: `0` + * * **Argument**: {@link PropertyArgument.Constant0 Constant 0} * * See also: @@ -36036,6 +28026,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: @@ -36046,6 +28038,8 @@ class RichModel extends DataAction { /** * Multiplier for {@link angularSpeedX}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36055,6 +28049,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: @@ -36065,6 +28061,8 @@ class RichModel extends DataAction { /** * Multiplier for {@link angularSpeedY}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36074,6 +28072,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: @@ -36084,6 +28084,8 @@ class RichModel extends DataAction { /** * Multiplier for {@link angularSpeedZ}. * + * **Default**: `1` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36095,6 +28097,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: @@ -36107,6 +28111,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: @@ -36119,6 +28125,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: @@ -36126,19 +28134,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: @@ -36148,6 +28180,8 @@ class RichModel extends DataAction { /** * Scroll speed for the model's texture. * + * **Default**: `[0, 0]` + * * **Argument**: {@link PropertyArgument.ParticleAge Particle age} * * See also: @@ -36157,28 +28191,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 /** @@ -36186,6 +28253,8 @@ class RichModel extends DataAction { * * If {@link uniformScale} is enabled, this also affects the height. * + * **Default**: `1` + * * See also: * - {@link scaleVariationY} * - {@link scaleVariationZ} @@ -36196,6 +28265,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} @@ -36206,6 +28277,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} @@ -36214,6 +28287,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} @@ -36223,14 +28298,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 - unk_er_f1_7: 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**: `false` + */ + 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} @@ -36240,6 +28342,8 @@ class RichModel extends DataAction { /** * Controls which animation in the {@link anibnd} to play. * + * **Default**: `0` + * * See also: * - {@link anibnd} * - {@link loopAnimation} @@ -36249,6 +28353,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} @@ -36258,38 +28364,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. @@ -36297,19 +28540,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} @@ -36325,6 +28602,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} @@ -36338,6 +28617,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} @@ -36353,6 +28634,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} @@ -36364,6 +28647,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} @@ -36375,6 +28660,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} @@ -36383,517 +28670,468 @@ 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) + 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 /** * 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) + this.assign(props) + } } /** @@ -36909,7 +29147,6 @@ export interface CancelForceParams { */ class CancelForce extends DataAction { declare readonly type: ActionType.CancelForce - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * The shape of the volume. * @@ -36921,11 +29158,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} */ @@ -36933,6 +29174,8 @@ class CancelForce extends DataAction { /** * The size of the {@link ForceVolumeShape.Box box} volume. * + * **Default**: `[0, 0, 0]` + * * See also: * - {@link shape} */ @@ -36940,6 +29183,8 @@ class CancelForce extends DataAction { /** * The height of the {@link ForceVolumeShape.Cylinder cylinder} volume. * + * **Default**: `0` + * * See also: * - {@link shape} * - {@link cylinderRadius} @@ -36948,6 +29193,8 @@ class CancelForce extends DataAction { /** * The radius of the {@link ForceVolumeShape.Cylinder cylinder} volume. * + * **Default**: `0` + * * See also: * - {@link shape} * - {@link cylinderHeight} @@ -36956,6 +29203,8 @@ class CancelForce extends DataAction { /** * The height of the {@link ForceVolumeShape.SquarePrism square prism} volume. * + * **Default**: `0` + * * See also: * - {@link shape} * - {@link squarePrismApothem} @@ -36964,18 +29213,29 @@ 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 = {}) { - super(ActionType.CancelForce, {isAppearance:true,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.CancelForce) 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 /** * The strength of the force applied in the volume. * @@ -36988,7 +29248,7 @@ export interface WindForceParams { * - {@link forceRandomMultiplierMax} * - {@link forceMultiplier} */ - force?: ScalarValue + force: ScalarValue /** * The shape of the volume. * @@ -37003,7 +29263,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. * @@ -37012,7 +29272,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. * @@ -37021,7 +29281,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. * @@ -37031,7 +29291,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. * @@ -37041,7 +29301,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. * @@ -37051,7 +29311,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. * @@ -37061,139 +29321,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. * @@ -37203,43 +29463,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}. * @@ -37252,7 +29512,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}. * @@ -37265,37 +29525,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}. * @@ -37308,286 +29568,119 @@ 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 - /** - * Unknown float. - * - * **Default**: `1` - */ - unk_ds3_f1_43?: number -} - -/** - * ### {@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. - * - * **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 + /** + * Unknown float. + * + * **Default**: `1` + */ unk_ds3_f1_43: number - constructor(props: WindForceParams = {}) { - super(ActionType.WindForce, {isAppearance:true,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.WindForce) this.assign(props) } } -export interface GravityForceParams { +/** + * ### {@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 /** * The strength of the force applied in the volume. * @@ -37600,7 +29693,7 @@ export interface GravityForceParams { * - {@link forceRandomMultiplierMax} * - {@link forceMultiplier} */ - force?: ScalarValue + force: ScalarValue /** * The shape of the volume. * @@ -37615,7 +29708,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. * @@ -37624,7 +29717,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. * @@ -37633,7 +29726,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. * @@ -37643,7 +29736,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. * @@ -37653,7 +29746,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. * @@ -37663,7 +29756,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. * @@ -37673,121 +29766,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}. * @@ -37800,7 +29893,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}. * @@ -37813,37 +29906,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}. * @@ -37856,234 +29949,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 = {}) { - super(ActionType.GravityForce, {isAppearance:true,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.GravityForce) 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} @@ -38094,7 +29984,6 @@ export interface ForceCollisionParams { */ class ForceCollision extends DataAction { declare readonly type: ActionType.ForceCollision - declare readonly meta: ActionMeta & {isAppearance:true,isParticle:false} /** * The shape of the volume. * @@ -38107,11 +29996,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} */ @@ -38119,6 +30012,8 @@ class ForceCollision extends DataAction { /** * The size of the {@link ForceVolumeShape.Box box} volume. * + * **Default**: `[0, 0, 0]` + * * See also: * - {@link shape} */ @@ -38126,6 +30021,8 @@ class ForceCollision extends DataAction { /** * The height of the {@link ForceVolumeShape.Cylinder cylinder} volume. * + * **Default**: `0` + * * See also: * - {@link shape} * - {@link cylinderRadius} @@ -38134,18 +30031,29 @@ 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 = {}) { - super(ActionType.ForceCollision, {isAppearance:true,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.ForceCollision) 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 /** * Offset along the X-axis for the 3D noise used to control the strength and direction of the force in the volume. * @@ -38157,7 +30065,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. * @@ -38169,7 +30077,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. * @@ -38181,7 +30089,7 @@ export interface TurbulenceForceParams { * - {@link noiseOffsetX} * - {@link noiseOffsetY} */ - noiseOffsetZ?: ScalarValue + noiseOffsetZ: ScalarValue /** * The strength of the force applied in the volume. * @@ -38193,7 +30101,7 @@ export interface TurbulenceForceParams { * - {@link forceRandomMultiplierMin} * - {@link forceRandomMultiplierMax} */ - force?: ScalarValue + force: ScalarValue /** * The shape of the volume. * @@ -38208,7 +30116,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. * @@ -38217,7 +30125,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. * @@ -38226,7 +30134,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. * @@ -38236,7 +30144,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. * @@ -38246,7 +30154,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. * @@ -38256,7 +30164,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. * @@ -38266,97 +30174,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}. * @@ -38366,7 +30274,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}. * @@ -38376,25 +30284,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. * @@ -38403,7 +30311,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. * @@ -38414,802 +30322,551 @@ 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 + fadeOutTime: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_43?: number + unk_unk_f1_41: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_44?: number + unk_unk_f1_42: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_45?: number + unk_unk_f1_43: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_46?: number + unk_unk_f1_44: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_47?: number + unk_unk_f1_45: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_48?: number + unk_unk_f1_46: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_49?: number + unk_unk_f1_47: number /** * Unknown integer. * * **Default**: `0` */ - unk_unk_f1_50?: number + unk_unk_f1_48: 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 - unk_unk_f1_45: number - unk_unk_f1_46: number - unk_unk_f1_47: number - unk_unk_f1_48: number 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 = {}) { - super(ActionType.TurbulenceForce, {isAppearance:true,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.TurbulenceForce) 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 /** * 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) + 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 - 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 { +class Unk10500 extends DataAction { + declare readonly type: ActionType.Unk10500 /** * Controls how fast time passes for the entire effect. * @@ -39217,114 +30874,85 @@ 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 /** - * 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. * - * **Default**: `0` - */ - unk_ac6_f1_7?: number - /** - * Unknown integer. + * 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_ds3_f1_8?: number + initialSimulationTime: number /** * Unknown integer. * * **Default**: `0` */ - unk_sdt_f1_9?: number + unk_ds3_f1_8: number /** * Unknown integer. * * **Default**: `0` */ - unk_ds3_f1_7?: 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 - unk_ac6_f1_7: 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}) + constructor(props: Partial> = {}) { + super(ActionType.Unk10500) 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 /** * Controls the diffuse color of the light. * @@ -39336,7 +30964,7 @@ export interface SpotLightParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - diffuseColor?: Vector4Value + diffuseColor: Vector4Value /** * Controls the specular color of the light. * @@ -39348,7 +30976,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. * @@ -39358,7 +30986,7 @@ export interface SpotLightParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - diffuseMultiplier?: ScalarValue + diffuseMultiplier: ScalarValue /** * A scalar multiplier for the {@link specularColor specular color}. * @@ -39368,7 +30996,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. * @@ -39376,7 +31004,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. * @@ -39384,7 +31012,7 @@ export interface SpotLightParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - far?: ScalarValue + far: ScalarValue /** * The X radius for the elliptic base of the cone. * @@ -39392,7 +31020,7 @@ export interface SpotLightParams { * * **Argument**: {@link PropertyArgument.ActiveTime Active time} */ - radiusX?: ScalarValue + radiusX: ScalarValue /** * The Y radius for the elliptic base of the cone. * @@ -39400,31 +31028,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. * @@ -39439,7 +31067,7 @@ export interface SpotLightParams { * - {@link flickerIntervalMax} * - {@link flickerBrightness} */ - jitterAndFlicker?: boolean + jitterAndFlicker: boolean /** * Controls the acceleration of the jittering. * @@ -39451,13 +31079,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. * @@ -39469,7 +31097,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. * @@ -39481,7 +31109,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. * @@ -39493,7 +31121,7 @@ export interface SpotLightParams { * - {@link jitterX} * - {@link jitterY} */ - jitterZ?: number + jitterZ: number /** * Controls the minimum interval for flickering. * @@ -39504,7 +31132,7 @@ export interface SpotLightParams { * - {@link flickerIntervalMax} * - {@link flickerBrightness} */ - flickerIntervalMin?: number + flickerIntervalMin: number /** * Controls the maximum interval for flickering. * @@ -39515,7 +31143,7 @@ export interface SpotLightParams { * - {@link flickerIntervalMin} * - {@link flickerBrightness} */ - flickerIntervalMax?: number + flickerIntervalMax: number /** * Brightness multiplier for the light when it flickers. * @@ -39526,7 +31154,7 @@ export interface SpotLightParams { * - {@link flickerIntervalMin} * - {@link flickerIntervalMax} */ - flickerBrightness?: number + flickerBrightness: number /** * Controls if the light should have shadows or not. * @@ -39534,7 +31162,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. * @@ -39546,25 +31174,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. * @@ -39572,25 +31200,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. * @@ -39600,19 +31228,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. * @@ -39623,7 +31251,7 @@ export interface SpotLightParams { * * **Default**: `0.75` */ - asymmetryParam?: number + asymmetryParam: number /** * Controls the falloff exponent of the light. * @@ -39631,280 +31259,57 @@ 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 = {}) { - super(ActionType.SpotLight, {isAppearance:true,isParticle:false}) + constructor(props: Partial> = {}) { + super(ActionType.SpotLight) this.assign(props) } } @@ -41949,7 +33354,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: { @@ -42228,59 +33638,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 action.$data.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] + } } /** @@ -42366,29 +33810,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] @@ -43094,7 +34529,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 @@ -43133,7 +34568,7 @@ namespace FXRUtility { height: number = 1, color?: Vector4Value, lineWidth?: ScalarValue, - args?: BillboardExParams + args?: Partial> ) { const w = width * 0.5 const h = height * 0.5 @@ -43161,7 +34596,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 => { @@ -43196,7 +34631,7 @@ namespace FXRUtility { segments: number = 16, color?: Vector4Value, lineWidth?: ScalarValue, - args?: BillboardExParams, + args?: Partial>, ) { return new BasicNode([], [ ellipse(radiusX, radiusY, segments, color, lineWidth, args), @@ -43224,7 +34659,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), @@ -43254,7 +34689,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) { @@ -43263,7 +34698,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) { @@ -43310,7 +34745,7 @@ namespace FXRUtility { originY?: 'baseline' | 'top' | 'middle' | 'bottom' fontSize?: number color?: Vector4Value - args?: BillboardExParams + args?: Partial> } = {} ): BasicNode { const lines = text.split('\n') 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" + ] +}