//:://////////////////////////////////////////////
//:: Maze: Behaviour selection convo for PCs
//:: prc_maze_convo
//:://////////////////////////////////////////////
/** @file
    This convo displays a timer for the PC
    and a choice of whether to start attempting
    escape from the maze or to wait it out.


    @author Ornedan
    @date   Created  - 2005.10.20
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////

#include "prc_alterations"
#include "spinc_maze"

//////////////////////////////////////////////////
/* Constant defintions                          */
//////////////////////////////////////////////////

const int STAGE_ENTRY = 0;
const int STAGE_EXIT  = 1;

const int SELECTION_ESCAPE = 1;
const int SELECTION_WAIT   = 2;

const int ERROR_CODE_5_FIX = 1;

//////////////////////////////////////////////////
/* Aid functions                                */
//////////////////////////////////////////////////

string GetTimeLeft(object oPC)
{
    int nSH = GetLocalInt(oPC, "PRC_Maze_EntryHour"),
        nSM = GetLocalInt(oPC, "PRC_Maze_EntryMinute"),
        nSS = GetLocalInt(oPC, "PRC_Maze_EntrySecond");
    int nCH = GetTimeHour(),
        nCM = GetTimeMinute(),
        nCS = GetTimeSecond();

    // Calculate ingame hour diff
    int nHDiff = nCH < nSH ? // Has the day changed? Since the time is 10 mins, day cannot change twice even at the fastest scale
                  (24 + nCH - nSH) : // Yes
                  (nCH - nSH)        // No
                  ;
    // Calculate real minute diff
    int nMDiff = nHDiff ? // Have full hours passed?
                  (FloatToInt(HoursToSeconds(nHDiff) / 60) + nCM - nSM) : // Yes
                  (nCM - nSM)                                        // No
                  ;
    // Calculate real second diff
    int nSDiff = nMDiff ? // Have full minutes passed?
                  ((nMDiff * 60) + nCS - nSS) : // Yes
                  (nCS - nSS)                   // No
                  ;

    // Convert the second diff to a string
    return IntToString((600 - nSDiff) / 60) + ":" + IntToPaddedString((600 - nSDiff) % 60, 2, FALSE);
}


//////////////////////////////////////////////////
/* Main function                                */
//////////////////////////////////////////////////

void main()
{if(DEBUG) DoDebug("prc_maze_convo running");
    object oPC = GetPCSpeaker();
    /* Get the value of the local variable set by the conversation script calling
     * this script. Values:
     * DYNCONV_ABORTED     Conversation aborted
     * DYNCONV_EXITED      Conversation exited via the exit node
     * DYNCONV_SETUP_STAGE System's reply turn
     * 0                   Error - something else called the script
     * Other               The user made a choice
     */
   int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
    // The stage is used to determine the active conversation node.
    // 0 is the entry node.
    int nStage = GetStage(oPC);

    // Check which of the conversation scripts called the scripts
    if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort
        return;

    if(nValue == DYNCONV_SETUP_STAGE)
    {

        if(nStage == STAGE_ENTRY)
        {
            // Set the header
            SetHeader(GetStringByStrRef(16825700) // Do you want to attempt to escape the maze?\nIf you choose to escape, you will make a DC20 Intellicence check each round until you succeed and escape or 10 minutes pass. If you choose to wait, you will be automatically removed from the maze after 10 minutes have passed.\n\nTime left - min:sec
                    + " - " + GetTimeLeft(oPC)
                      );

            // Only add the responses once
            if(!GetIsStageSetUp(nStage, oPC))
            {
                // Add responses for the PC
                AddChoice(GetStringByStrRef(16825698), SELECTION_ESCAPE, oPC); // Attempt to escape.
                AddChoice(GetStringByStrRef(16825699), SELECTION_WAIT, oPC); // Wait here.

                MarkStageSetUp(nStage, oPC);
                SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
            }
        }
        else if(nStage == STAGE_EXIT)
        {
            // Blank header and no choices
            SetHeader("");
        }

        // Do token setup
        SetupTokens();
    }
    // End of conversation cleanup
    else if(nValue == DYNCONV_EXITED)
    {
        if(DEBUG) DoDebug("prc_maze_convo: Conversation exited");

        GoDirection(oPC, GetLocalInt(oPC, "PRC_Maze_Entry_Direction"));
        // Mark the creature as having made the choice, so the HB will know to start making checks
        DeleteLocalInt(oPC, "PRC_Maze_PC_Waiting");
    }
    // Abort conversation cleanup.
    else if(nValue == DYNCONV_ABORTED)
    {
        if(DEBUG) DoDebug("prc_maze_convo: Conversation aborted");

        // The PC chose to escape by moving (technically not possible, they should be in cutscene, but eh..
        GoDirection(oPC, GetLocalInt(oPC, "PRC_Maze_Entry_Direction"));
        // Mark the creature as having made the choice, so the HB will know to start making checks
        DeleteLocalInt(oPC, "PRC_Maze_PC_Waiting");
    }
    // Handle PC responses
    else
    {
        int nChoice = GetChoice(oPC);
        if(nChoice == SELECTION_ESCAPE)
        {
            //AssignCommand(oPC, ClearAllActions(TRUE)); // Abort the convo, triggering the movement
            //nStage = STAGE_EXIT;
            AllowExit(DYNCONV_EXIT_FORCE_EXIT);
        }

        // Store the stage value. If it has been changed, this clears out the choices
        SetStage(nStage, oPC);
    }
}