Skip to content

Including displayName (with tempering/tier status) in inventory/equipment decorators #396

@Gerkinfeltser

Description

@Gerkinfeltser

What do you want?

NPCs should be able to see the actual display name of items — including tempering status like (Flawless), (Legendary), (Epic), and custom names set by the player.

Right now, if a player is wielding a Steel Greatsword (Flawless) and wearing Hide Boots (Flawless), the NPC just sees "Steel Greatsword" and "Hide Boots". The tempering is completely invisible to the AI.

Why?

This limits a lot of natural NPC behavior:

  • Smiths can't comment on tempering quality ("That's a fine edge you've put on that blade")
  • Guards can't notice valuable gear ("By the Nine, is that legendary armor?")
  • Traders can't reference the actual item they just sold you
  • The grindstone/workbench results are invisible — player tempers something and no NPC ever notices
  • Followers don't understand gear upgrades. You give a follower a tempered weapon or improved armor, but they have no awareness of the upgrade. They can't thank you for the improved gear or acknowledge the difference from their old equipment

Enchanted item names DO work (e.g. "Imperial Sword of Long-Embers" shows up correctly). It's specifically tempering and custom names that get stripped.

What area does this affect?

Prompts / templates

How should it work?

Add a displayName field to each item returned by get_inventory(), get_worn_equipment(), and get_merchant_inventory(), populated via the game's GetDisplayName() instead of just GetName().

Currently the decorators only expose name (base item name). The template engine doesn't have a displayName field — rendering {{ item.displayName }} just outputs the raw expression unchanged.

Current output in LLM prompts:

### Worn Equipment
- **Feet**: Hide Boots
- **Forehead**: Leather Helmet
- **leftHand**: Steel Greatsword (drawn)

Expected output:

### Worn Equipment
- **Feet**: Hide Boots (Flawless)
- **Forehead**: Leather Helmet (Flawless)
- **leftHand**: Steel Greatsword (Flawless) (drawn)

Items without tempering or custom names would show the same name as today.

This also affects the event system. Looking at actual LLM prompts from openrouter_input.log, equip events only show base names:

- **Prisoner** equipped Steel Greatsword (just happened)

And worn equipment output:

### Worn Equipment
- **leftHand**: Steel Greatsword (drawn)

No tempering info anywhere in the prompt chain.

Scope

Small tweak (config option, UI adjustment, minor behavior change)

Alternatives or workarounds

Small tweak (add one field to existing decorator output, swap GetName to GetDisplayName)

Anything else?

I checked if there's any way to get this from the template side — there isn't. The field simply doesn't exist on the item object. The only alternative would be manually creating world knowledge entries for every tempered item, which isn't practical.

I also checked via another SKSE plugin which correctly returns both name and displayName fields from the same game data, confirming the engine absolutely has this information available.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions