This script handles various aspects of the story NPCs. This has been added into SpawnManager script to be handled entirely.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PresetNPC : MonoBehaviour
{
    [Header("NPC Properties")]
    public float npcCompetency = 0f;
    public float itemDurability = 0f;
    public GameObject assignedItem;

    [Header("Dialogue Properties")]
    public TextAsset dialogueData;
    public GameObject visualCue;

    private GameObject currentItem;
    private float repairUrgency;

    public float RepairUrgency
    {
        get { return repairUrgency; }
    }

    private void Start()
    {
        AssignItem();
        CalculateCoreRepairUrgency();
    }

    private void Update()
    {
        // only recalculate urgency if npcCompetency or itemDurability changes.
        if (Mathf.Approximately(repairUrgency, CalculateCoreRepairUrgency()))
        {
            CalculateCoreRepairUrgency();
        }

        if (!DialogueManager.GetInstance().dialogueisPlaying)
        {
            visualCue.SetActive(true);
            if (Input.GetButtonDown("Fire1"))
            {
                DialogueManager.GetInstance().EnterDialogueMode(dialogueData);
            }
            else
            {
                visualCue.SetActive(false);
            }
        }
    }

    private void Interact()
    {
        if (dialogueData != null)
        {
            DialogueManager.GetInstance().EnterDialogueMode(dialogueData);
        }
    }

    private float CalculateCoreRepairUrgency()
    {
        repairUrgency = 1 - (npcCompetency * itemDurability);
        return repairUrgency;
    }

    private void AssignItem()
    {
        if (assignedItem != null)
        {
            currentItem = Instantiate(assignedItem);
            currentItem.SetActive(true);
            //currentItem = Instantiate(assignedItem, transform.position, Quaternion.identity, transform);
            //currentItem.transform.localPosition = Vector3.zero;
        }
        else
        {
            Debug.LogError("Item is not assigned to the NPC.");
        }
    }
}