Please take what I'm about to post with the usual disclaimer covering *all* my posts about scripting -- I don't know what the hell I'm talking about, this is all new and weird for me, I'm making stuff up as I go along! -- and what you just posted BioSpirit reminded me of some odd code I found in the Greevers.txt.

You've very, very likely already seen it, or are simply smart enough to know this already, but on the off chance that it's relevant to your interest and new to you, it's some stuff about a First-In-Last-Out 'stacking' structure. It specifically came to mind when I read your (2) request.

Code
//REGION Stacks

//Stacks are a useful tool to mimic a FILO stack structure.
//Add items using the Stack((STRING)_ID,_Value) command.
//At any time you can query for TopOfStackCharacter((STRING)_ID,_Value), TopOfStackItem((STRING)_ID,_Value) or TopOfStackTrigger((STRING)_ID,_Value)
//If you wish to pop the top member of the stack, just call PopStack((STRING)_ID);
PROC
Stack_Internal((STRING)_ID,(STRING)_Value)
AND
NOT DB_StackInternalCounter(_,_ID)
THEN
DB_StackInternalCounter(0,_ID);
TopOfStack(_ID,_Value);

PROC
Stack_Internal((STRING)_ID,(STRING)_Value)
AND
DB_StackInternalCounter(_Amount,_ID)
AND
IntegerSum(_Amount,1,_NewAmount)
AND
TopOfStack(_ID,_TopValue)
THEN
NOT DB_StackInternalCounter(_Amount,_ID);
DB_StackInternalCounter(_NewAmount,_ID);
DB_StackInternalMember(_NewAmount,_ID,_Value);
NOT TopOfStack(_ID,_TopValue);
TopOfStack(_ID,_Value);

PROC
PopStack((STRING)_ID)
AND
DB_StackInternalCounter(1,_ID)
AND
TopOfStack(_ID,_Value)
THEN
NOT TopOfStack(_ID,_Value);
NOT DB_StackInternalCounter(1,_ID);
NOT DB_StackInternalMember(1,_ID,_Value);
ProcClearOldTopOfStackCharacter(_ID);
ProcClearOldTopOfStackItem(_ID);
ProcClearOldTopOfStackTrigger(_ID);

PROC
PopStack((STRING)_ID)
AND
DB_StackInternalCounter(_Amount,_ID)
AND
IntegerSubtract(_Amount,1,_NewAmount)
AND
DB_StackInternalMember(_Amount,_ID,_OldTopValue)
AND
DB_StackInternalMember(_NewAmount,_ID,_NewTopValue)
THEN
NOT DB_StackInternalCounter(_Amount,_ID);
DB_StackInternalCounter(_NewAmount,_ID);
NOT DB_StackInternalMember(_Amount,_ID,_OldTopValue);
NOT TopOfStack(_ID,_OldTopValue);
TopOfStack(_ID,_NewTopValue);

PROC
StackCharacter((STRING)_ID,(CHARACTER)_Value)
AND
CharacterGetUUID(_Value,_UUID)
THEN
StackType(_ID,"Character");
Stack_CharacterUUID(_Value,_UUID);
Stack_Internal(_ID,_UUID);

PROC
StackItem((STRING)_ID,(ITEM)_Value)
AND
ItemGetUUID(_Value,_UUID)
THEN
StackType(_ID,"Item");
Stack_ItemUUID(_Value,_UUID);
Stack_Internal(_ID,_UUID);

PROC
StackTrigger((STRING)_ID,(TRIGGER)_Value)
AND
TriggerGetUUID(_Value,_UUID)
THEN
StackType(_ID,"Trigger");
Stack_TriggerUUID(_Value,_UUID);
Stack_Internal(_ID,_UUID);

IF
TopOfStack(_ID,_UUID)
AND
StackType(_ID,"Character")
AND
Stack_CharacterUUID(_Value,_UUID)
THEN
ProcClearOldTopOfStackCharacter(_ID);
TopOfStackCharacter(_ID,_Value);

IF
TopOfStack(_ID,_UUID)
AND
StackType(_ID,"Item")
AND
Stack_ItemUUID(_Value,_UUID)
THEN
ProcClearOldTopOfStackItem(_ID);
TopOfStackItem(_ID,_Value);

IF
TopOfStack(_ID,_UUID)
AND
StackType(_ID,"Trigger")
AND
Stack_TriggerUUID(_Value,_UUID)
THEN
ProcClearOldTopOfStackTrigger(_ID);
TopOfStackTrigger(_ID,_Value);

PROC
ProcClearOldTopOfStackCharacter((STRING)_ID)
AND
TopOfStackCharacter(_ID,_Value)
THEN
NOT TopOfStackCharacter(_ID,_Value);

PROC
ProcClearOldTopOfStackItem((STRING)_ID)
AND
TopOfStackItem(_ID,_Value)
THEN
NOT TopOfStackItem(_ID,_Value);

PROC
ProcClearOldTopOfStackTrigger((STRING)_ID)
AND
TopOfStackTrigger(_ID,_Value)
THEN
NOT TopOfStackTrigger(_ID,_Value);

//END_REGION


Again, sorry if this is old news, or super obvious or whatever.


Escape From Smalcatraz: Steam/Nexus. Forum thread.