SF
STS Forge

Data Assets

DataTable, Curve, and Array verbs for structured data manipulation.

Back to AI Guide

Verbs for reading and writing DataTable rows, Curve keys, and array properties on any UObject asset. All verbs return JSON to stdout. Use -compile -save flags on write verbs to persist changes.


DataTable verbs#

dt-list-rows#

List all row names and struct fields in a DataTable.

Category: Read

Args:

Arg Required Description
-asset= Yes DataTable asset path

Examples:

-verb=dt-list-rows -asset=/Game/Data/DT_WeaponStats

Output:

{
    "success": true,
    "rowStruct": "FWeaponStatsRow",
    "fields": ["Damage", "FireRate", "MagazineSize", "ReloadTime"],
    "rows": ["AR_Default", "SMG_Default", "Shotgun_Default"]
}

dt-read-row#

Read all field values for a single row.

Category: Read

Args:

Arg Required Description
-asset= Yes DataTable asset path
-row= Yes Row name

Examples:

-verb=dt-read-row -asset=/Game/Data/DT_WeaponStats -row=AR_Default

Output:

{
    "success": true,
    "row": "AR_Default",
    "fields": {
        "Damage": "25.0",
        "FireRate": "600.0",
        "MagazineSize": "30",
        "ReloadTime": "2.1"
    }
}

dt-add-row#

Add an empty row to a DataTable. Idempotent: if the row already exists, the verb succeeds without modifying it.

Category: Write

Args:

Arg Required Description
-asset= Yes DataTable asset path
-row= Yes Row name to add

Examples:

-verb=dt-add-row -asset=/Game/Data/DT_WeaponStats -row=LMG_Default -save

After adding, use dt-set-field to populate field values.


dt-remove-row#

Remove a row from a DataTable. Idempotent: if the row does not exist, the verb succeeds without error.

Category: Write

Args:

Arg Required Description
-asset= Yes DataTable asset path
-row= Yes Row name to remove

Examples:

-verb=dt-remove-row -asset=/Game/Data/DT_WeaponStats -row=Shotgun_Default -save

dt-set-field#

Set a field value on a specific row.

Category: Write

Args:

Arg Required Description
-asset= Yes DataTable asset path
-row= Yes Row name
-field= Yes Field/column name
-value= Yes Value as string

Examples:

# Set a single numeric field
-verb=dt-set-field -asset=/Game/Data/DT_WeaponStats -row=AR_Default -field=Damage -value=30.0 -save

# Set a string field
-verb=dt-set-field -asset=/Game/Data/DT_WeaponStats -row=AR_Default -field=DisplayName -value="Assault Rifle" -save

Batch example: add a row and populate all its fields in one commandlet run:

{
    "defaultAsset": "/Game/Data/DT_WeaponStats",
    "operations": [
        { "verb": "dt-add-row", "args": { "row": "LMG_Default" } },
        { "verb": "dt-set-field", "args": { "row": "LMG_Default", "field": "Damage", "value": "18.0" } },
        { "verb": "dt-set-field", "args": { "row": "LMG_Default", "field": "FireRate", "value": "750.0" } },
        { "verb": "dt-set-field", "args": { "row": "LMG_Default", "field": "MagazineSize", "value": "100" } },
        { "verb": "dt-set-field", "args": { "row": "LMG_Default", "field": "ReloadTime", "value": "4.5" } }
    ],
    "save": true
}

Curve verbs#

curve-list-keys#

List all keys across all channels in a curve asset.

Category: Read

Args:

Arg Required Description
-asset= Yes Curve asset path (CurveFloat, CurveVector, CurveLinearColor)

Examples:

-verb=curve-list-keys -asset=/Game/Data/Curves/C_DamageFalloff

Output:

{
    "success": true,
    "curveType": "CurveFloat",
    "channels": [
        {
            "name": "Value",
            "keys": [
                { "time": 0.0, "value": 1.0, "interp": "Linear" },
                { "time": 50.0, "value": 0.75, "interp": "Linear" },
                { "time": 100.0, "value": 0.4, "interp": "Constant" }
            ]
        }
    ]
}

For a CurveVector, channels are named X, Y, Z. For CurveLinearColor, channels are R, G, B, A.


curve-add-key#

Add or update a key at a given time. Idempotent at the time value: if a key already exists at that time, its value and interpolation are overwritten.

Category: Write

Args:

Arg Required Description
-asset= Yes Curve asset path
-time= Yes Key time (float)
-value= Yes Key value (float)
-interp= No Interpolation mode: Linear (default), Constant, Cubic
-channel= No Channel name. Value for CurveFloat, X/Y/Z for CurveVector, R/G/B/A for CurveLinearColor. Defaults to first channel.

Examples:

# Add a key to a float curve
-verb=curve-add-key -asset=/Game/Data/Curves/C_DamageFalloff -time=75.0 -value=0.5 -save

# Add with constant interpolation
-verb=curve-add-key -asset=/Game/Data/Curves/C_DamageFalloff -time=120.0 -value=0.2 -interp=Constant -save

# Add a key to the Y channel of a vector curve
-verb=curve-add-key -asset=/Game/Data/Curves/C_RecoilPattern -time=0.5 -value=2.0 -channel=Y -save

Batch example: build a damage falloff curve from scratch:

{
    "defaultAsset": "/Game/Data/Curves/C_DamageFalloff",
    "operations": [
        { "verb": "curve-add-key", "args": { "time": "0.0", "value": "1.0", "interp": "Linear" } },
        { "verb": "curve-add-key", "args": { "time": "30.0", "value": "1.0", "interp": "Linear" } },
        { "verb": "curve-add-key", "args": { "time": "60.0", "value": "0.7", "interp": "Linear" } },
        { "verb": "curve-add-key", "args": { "time": "100.0", "value": "0.35", "interp": "Constant" } }
    ],
    "save": true
}

curve-remove-key#

Remove a key at a given time. Idempotent: if no key exists at that time, the verb succeeds without error.

Category: Write

Args:

Arg Required Description
-asset= Yes Curve asset path
-time= Yes Key time (float)
-channel= No Channel name (same options as curve-add-key)

Examples:

-verb=curve-remove-key -asset=/Game/Data/Curves/C_DamageFalloff -time=75.0 -save

# Remove from a specific channel on a vector curve
-verb=curve-remove-key -asset=/Game/Data/Curves/C_RecoilPattern -time=0.5 -channel=Y -save

Array verbs#

Operate on array properties of any UObject asset (Blueprints, DataAssets, GameplayEffects, etc.). The property name refers to the UPROPERTY name on the asset's class or CDO.

array-count#

Get element count and the inner type of an array property.

Category: Read

Args:

Arg Required Description
-asset= Yes Asset path
-property= Yes Array property name

Examples:

-verb=array-count -asset=/Game/Abilities/GA_FireWeapon -property=ActivationRequiredTags

Output:

{
    "success": true,
    "property": "ActivationRequiredTags",
    "count": 3,
    "innerType": "GameplayTag"
}

array-get#

Read one or all elements of an array property.

Category: Read

Args:

Arg Required Description
-asset= Yes Asset path
-property= Yes Array property name
-index= No Element index (0-based). Mutually exclusive with -all.
-all No Flag (presence-only): read all elements. Mutually exclusive with -index.

Provide either -index=N or -all. If neither is given, defaults to reading the first element.

Examples:

# Read a single element
-verb=array-get -asset=/Game/Abilities/GA_FireWeapon -property=ActivationRequiredTags -index=0

# Read all elements
-verb=array-get -asset=/Game/Abilities/GA_FireWeapon -property=ActivationRequiredTags -all

Output (single element):

{
    "success": true,
    "property": "ActivationRequiredTags",
    "index": 0,
    "value": "Ability.Weapon.CanFire"
}

Output (all elements):

{
    "success": true,
    "property": "ActivationRequiredTags",
    "count": 3,
    "elements": [
        { "index": 0, "value": "Ability.Weapon.CanFire" },
        { "index": 1, "value": "State.Alive" },
        { "index": 2, "value": "State.NotReloading" }
    ]
}

array-add#

Append an element to an array property.

Category: Write

Args:

Arg Required Description
-asset= Yes Asset path
-property= Yes Array property name
-value= Yes Element value as string

Examples:

# Add a gameplay tag
-verb=array-add -asset=/Game/Abilities/GA_FireWeapon -property=ActivationRequiredTags -value="State.Aiming" -compile -save

# Add an asset reference
-verb=array-add -asset=/Game/Characters/BP_PlayerCharacter -property=DefaultAbilities -value="/Game/Abilities/GA_Sprint" -compile -save

array-remove#

Remove an element by index. Elements after the removed index shift down.

Category: Write

Args:

Arg Required Description
-asset= Yes Asset path
-property= Yes Array property name
-index= Yes Element index to remove (0-based)

Examples:

-verb=array-remove -asset=/Game/Abilities/GA_FireWeapon -property=ActivationRequiredTags -index=2 -compile -save

Tip: Use array-get -all first to identify the correct index before removing, especially when indices may have shifted from prior operations.


array-clear#

Clear all elements from an array property. Idempotent: succeeds even if the array is already empty.

Category: Write

Args:

Arg Required Description
-asset= Yes Asset path
-property= Yes Array property name

Examples:

-verb=array-clear -asset=/Game/Abilities/GA_FireWeapon -property=ActivationBlockedTags -compile -save

array-set#

Set the value of an element at a specific index. The index must already exist (use array-add to grow the array first).

Category: Write

Args:

Arg Required Description
-asset= Yes Asset path
-property= Yes Array property name
-index= Yes Element index (0-based)
-value= Yes New value as string

Examples:

# Replace a tag at index 1
-verb=array-set -asset=/Game/Abilities/GA_FireWeapon -property=ActivationRequiredTags -index=1 -value="State.Combat" -compile -save

Batch example: replace all elements in an array:

{
    "defaultAsset": "/Game/Abilities/GA_FireWeapon",
    "operations": [
        { "verb": "array-clear", "args": { "property": "ActivationRequiredTags" } },
        { "verb": "array-add", "args": { "property": "ActivationRequiredTags", "value": "Ability.Weapon.CanFire" } },
        { "verb": "array-add", "args": { "property": "ActivationRequiredTags", "value": "State.Alive" } },
        { "verb": "array-add", "args": { "property": "ActivationRequiredTags", "value": "State.Combat" } }
    ],
    "compile": true,
    "save": true
}