//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