scriptName defaultNPCrunToTRIG extends objectReference
{Linked NPC(s) on defaultMasterPackage will check out their linked runToWhenTriggered ref(s)}

bool property runToPatrol auto
{Always run to patrol? (regardless of Player stealth.)  DEFAULT: False}
bool property walkToPatrol auto
{Always run to patrol? (regardless of Player stealth.)  DEFAULT: False}

bool ranOnce
actor NPC
actor player
bool playerSneaky

EVENT onLoad()
	player = (Game.GetForm(0x14) as Actor)
	NPC = getLinkedRef() as actor
endEVENT

EVENT onTriggerEnter(objectReference actronaut)
	; trigger only on player entering
	if actronaut == player && ranOnce == FALSE
		ranOnce = TRUE
		triggerNPC()
	endif
endEVENT

EVENT onActivate(objectReference actronaut)
	; including activate event support so we can trigger this from a door/lever/etc activated by player
	if ranOnce == FALSE
		ranOnce = TRUE
		triggerNPC()
	endif
endEVENT

;======================================
; This function is the meat. Declaring here so we can call from either event type
FUNCTION triggerNPC()	
		if stealthCheck()
			; player is sneaking and has better sneak, so WALK to the patrol
			; variable04 helps the package stack along via stack conditions in defaultMasterPackage
			NPC.setActorValue("variable04", 1)
		elseif !stealthCheck()
			; player wasn't sneaking or failed check, so RUN there.
			NPC.setActorValue("variable04", 2)
		endif
		
		; politely ask NPC to evp package stack and realize he needs to build a path
		NPC.evaluatePackage()
		
		; set var04 to an invalid to avoid retracing steps
		utility.wait(5)
		NPC.setActorValue("variable04",3)
endFUNCTION

;=====================================
; Breaking stealth check into separate function in case this needs changes 
bool FUNCTION stealthCheck()
	; a very basic stealth check for run/walk check
	; TRUE return = player is "sneaky" so walk
	; FALSE retrun = player isn't sneaky, so run
	; first, an error checker
	if runToPatrol == TRUE && walkToPatrol == TRUE
; 		debug.trace("ERROR: Run/Walk properties mutually exclusive.  Setting both to false on "+self)
		runToPatrol = FALSE
		walkToPatrol = FALSE
	endif
	
	; return quickly if user has explicity chosen behavior
	if runToPatrol == TRUE
		return FALSE
	elseif walkToPatrol == TRUE
		return TRUE
	endif
	
	if (Game.GetForm(0x14) as Actor).getActorValue("Sneak") >= NPC.getActorValue("Sneak") && player.isSneaking() == TRUE
		; player is sneaking and has higher skill than NPC, so walk
		return FALSE
	else
		; player is either not sneaky or worse at it than NPC
		return TRUE
	endif
endFUNCTION