Secondary's NPC Tracker

From Infinite Worlds
Jump to navigation Jump to search

A long time ago when the summary instructions where much worse having an interesting cast of characters that stayed consistent through a story was an actual challenge. At that time I repurposed Self's aging information tracked item to make a system to keep track of characters important to the story. This stopped being useful once summary got better, but now with YAML it is once again cost effective to have one of these, if repurposed to be a reminder rather than a core tracker.

JSON[edit]

Tracked Items[edit]

{
    "id": [REPLACE],
    "name": "Known Characters",
    "positionInList": [REPLACE],
    "dataType": "yaml",
    "visibility": "everyone",
    "description": "A clean and short description of important characters to the story",
    "updateInstructions": "Whenever I meet a new character of importance or note, create an entry for them in this list including their name, their relationship to me and a once sentence or less description of them from my perspective. Additionally include if they are alive or dead and set relevance to 0. Whenever a character is a part of a turn or mentioned or comes up in any other way set relevance to 0. NEVER change relevance for any other reason than to reset it. Whenever the relationship, description, or alive fields change, update them to reflect the current story state while maintaining conciseness. Remember, your goal is not to create a definitive description of a character but instead to simply keep a rough track of the characters that are most important",
    "formatExample": "- name: Mark\n  relationship: My friend from work\n  description: A cool dude who I like hanging out with\n  alive: True\n  relevance: 5\n- name: Mom\n  relationship: Mother\n  description: My mom who was too good to me\n  alive: False\n  relevance: 20",
    "enforceFormat": true,
    "formatSchema": "- name: text\n  relationship: text\n  description: text\n  alive:\n  relevance: number",
    "initialValue": "",
    "initialValueBasedOnPC": "same",
    "autoUpdate": true,
    "variableName": "known_characters",
    "driftAcknowledgedForName": null
}

Triggers[edit]

{
    "id": [REPLACE],
    "name": "Clean Know Characters",
    "triggerEffects": [
        {
            "id": [REPLACE],
            "data": "$known_characters.remove($known_characters.sort_by(relevance, desc).first())",
            "type": "effectRunScript"
        }
    ],
    "triggerConditions": [
        {
            "id": [REPLACE],
            "data": "$known_characters.count > $game.turn_number^(1/2) + 5",
            "type": "triggerOnPawScript",
            "category": "condition"
        }
    ],
    "canTriggerMoreThanOnce": true
},
{
    "id": [REPLACE],
    "name": "Increase Relevance Counter",
    "triggerEffects": [
        {
            "id": [REPLACE],
            "data": "$known_characters.all().relevance +=1",
            "type": "effectRunScript"
        }
    ],
    "triggerConditions": [
        {
            "id": [REPLACE],
            "data": 1,
            "type": "triggerOnTurn",
            "category": "condition"
        }
    ],
    "canTriggerMoreThanOnce": true
}

Plaintext[edit]

Known Characters Data Type[edit]

YAML

Known Characters Description[edit]

A clean and short description of important characters to the story

Known Characters Update[edit]

Whenever I meet a new character of importance or note, create an entry for them in this list including their name, their relationship to me and a once sentence or less description of them from my perspective. Additionally include if they are alive or dead and set relevance to 0. Whenever a character is a part of a turn or mentioned or comes up in any other way set relevance to 0. NEVER change relevance for any other reason than to reset it. Whenever the relationship, description, or alive fields change, update them to reflect the current story state while maintaining conciseness. Remember, your goal is not to create a definitive description of a character but instead to simply keep a rough track of the characters that are most important

Known Characters Layout Example[edit]

- name: Mark
  relationship: My friend from work
  description: A cool dude who I like hanging out with
  alive: True
  relevance: 5
- name: Mom
  relationship: Mother
  description: My mom who was too good to me
  alive: False
  relevance: 20

Known Characters Enforced Layout[edit]

- name: text
  relationship: text
  description: text
  alive:
  relevance: number

Clean Know Characters Trigger Conditions[edit]

Pawscript Expression:

$known_characters.count > $game.turn_number^(1/2) + 5

Can be triggered multiple times.

Clean Know Characters Effects[edit]

Run a script:

$known_characters.remove($known_characters.sort_by(relevance, desc).first())

Increase Relevance Counter Trigger Conditions[edit]

Turn number at least 1

Can be triggered multiple times.

Increase Relevance Effects[edit]

Run a script:

$known_characters.all().relevance +=1

Explanation[edit]

The basic idea is that this system tries to keep the AI aware of the most important characters so none get left by the wayside. We keep just a minor amount of data on each character, their name, a short description, their relationship to me, and if they are alive or dead. The key element that keeps this TI from going out of control is the relevance component that gets increased by 1 each turn and reset when the character is mentioned or brought up in the story. This makes it so that when this TI is running too long and needs to be culled, you are culling the least important character to the plot.

Caveats[edit]

As mentioned, this idea came from when the summary system was a lot worse and the AI needed this prompting a lot more. It is not nearly as important anymore and more often than not you would be better served by some custom summary instructions. This system would be best used in worlds where you have a cast of 5-10 characters that come in and out of relevance.

The instructions are quite vague, I have often seen it not reset the counter when it should or do it when it should not, and of course it will often make descriptions longer than they should. There is also no prevention for information leakage baked in so that might happen.

This system can get into a loop where it keeps trying to remove characters every turn as it is stuck over the limit. Thankfully this no longer massively effects costs due to Pawscript but can still cause issues.