//:://////////////////////////////////////////////
//:: Conjunctive Gate Conversation
//:: true_gate_conv
//:://////////////////////////////////////////////
/** @file
    This allows you to choose which summon to get using Conjuctive Gate (and normal Gate)

    @author Stratovarius
    @date   Created  - 29.10.2005
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////

//#include "prc_alterations"
#include "true_inc_trufunc"
#include "inc_dynconv"

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

const int STAGE_SUMMON_CHOICE = 0;
const int STAGE_CONFIRMATION  = 1;

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

int NameToInt(string sSummon)
{
        // Celestials
        if      (sSummon == "Astral Deva"           ) return 1;
        else if (sSummon == "Bralani Eladrin"       ) return 2;
        else if (sSummon == "Celestial Avenger"     ) return 3;
        else if (sSummon == "Hound Archon"          ) return 4;
        else if (sSummon == "Lantern Archon"        ) return 5;
        else if (sSummon == "Word Archon"           ) return 6;
        // Demons/Devils
        else if (sSummon == "Balor"                 ) return 7;
        else if (sSummon == "Bezekira"              ) return 8;
        else if (sSummon == "Cornugon"              ) return 9;
        else if (sSummon == "Erinyes"               ) return 10;
        else if (sSummon == "Gelugon"               ) return 11;
        else if (sSummon == "Glabrezu"              ) return 12;
        else if (sSummon == "Hamatula"              ) return 13;
        else if (sSummon == "Imp"                   ) return 14;
        //else if (sSummon == "Marilith"              ) return 15;
        else if (sSummon == "Osyluth"               ) return 16;
        else if (sSummon == "Succubus"              ) return 17;
        else if (sSummon == "Vrock"                 ) return 18;
        // Elementals
        else if (sSummon == "Elder Air Elemental"   ) return 19;
        else if (sSummon == "Elder Earth Elemental" ) return 20;
        else if (sSummon == "Elder Fire Elemental"  ) return 21;
        else if (sSummon == "Elder Water Elemental" ) return 22;
        else if (sSummon == "Steam Mephit"          ) return 23;
        // Slaadi
        else if (sSummon == "Green Slaad"           ) return 24;
        else if (sSummon == "Red Slaadi"            ) return 25;
        else if (sSummon == "Death Slaadi"          ) return 26;
	
	// on Error
	return -1;
}

string IntToName(int nChoice)
{
        // Celestials
        if      (nChoice == 1 ) return "Astral Deva";
        else if (nChoice == 2 ) return "Bralani Eladrin";
        else if (nChoice == 3 ) return "Celestial Avenger";
        else if (nChoice == 4 ) return "Hound Archon";
        else if (nChoice == 5 ) return "Lantern Archon";
        else if (nChoice == 6 ) return "Word Archon";
        // Demons/Devils
        else if (nChoice == 7 ) return "Balor";
        else if (nChoice == 8 ) return "Bezekira";
        else if (nChoice == 9 ) return "Cornugon";
        else if (nChoice == 10) return "Erinyes";
        else if (nChoice == 11) return "Gelugon";
        else if (nChoice == 12) return "Glabrezu";
        else if (nChoice == 13) return "Hamatula";
        else if (nChoice == 14) return "Imp";
        //else if (nChoice == 15) return "Marilith";
        else if (nChoice == 16) return "Osyluth";
        else if (nChoice == 17) return "Succubus";
        else if (nChoice == 18) return "Vrock";
        // Elementals
        else if (nChoice == 19) return "Elder Air Elemental";
        else if (nChoice == 20) return "Elder Earth Elemental";
        else if (nChoice == 21) return "Elder Fire Elemental";
        else if (nChoice == 22) return "Elder Water Elemental";
        else if (nChoice == 23) return "Steam Mephit";
        // Slaadi
        else if (nChoice == 24) return "Green Slaad";
        else if (nChoice == 25) return "Red Slaadi";
        else if (nChoice == 26) return "Death Slaadi";

    // on Error
    return "";
}

int SummonResrefToInt(string sSummon)
{
        // Celestials
        if      (sSummon == "true_deva")         return 1;
        else if (sSummon == "true_bralan")       return 2;
        else if (sSummon == "NW_S_CTRUMPET")     return 3;
        else if (sSummon == "NW_S_CHOUND")       return 4;
        else if (sSummon == "NW_S_CLANTERN")     return 5;
        else if (sSummon == "true_wordarch")     return 6;
        // Demons/Devils
        else if (sSummon == "NW_S_BALOR")        return 7;
        else if (sSummon == "prc_doa_hellcat")   return 8;
        else if (sSummon == "prc_sum_cornugon")  return 9;
        else if (sSummon == "erinyes")           return 10;
        else if (sSummon == "prc_sum_gelugon")   return 11;
        else if (sSummon == "prc_sum_glabrezu")  return 12;
        else if (sSummon == "prc_sum_hamatula")  return 13;
        else if (sSummon == "NW_S_IMP")          return 14;
        //else if (sSummon == "tog_marilith")      return 15;
        else if (sSummon == "prc_sum_osyluth")   return 16;
        else if (sSummon == "NW_S_SUCCUBUS")     return 17;
        else if (sSummon == "NW_S_VROCK")        return 18;
        // Elementals
        else if (sSummon == "nw_s_airelder")     return 19;
        else if (sSummon == "nw_s_earthelder")   return 20;
        else if (sSummon == "nw_s_fireelder")    return 21;
        else if (sSummon == "nw_s_waterelder")   return 22;
        else if (sSummon == "nw_s_mepsteam")     return 23;
        // Slaadi
        else if (sSummon == "NW_S_SLAADGRN")     return 24;
        else if (sSummon == "NW_S_SLAADRED")     return 25;
        else if (sSummon == "NW_S_SLAADDETH")    return 26;
	
	// on Error
	return -1;
}

string IntToSummonResref(int nChoice)
{
	// Celestials
        if      (nChoice == 1 ) return "true_deva";
        else if (nChoice == 2 ) return "true_bralan";
        else if (nChoice == 3 ) return "NW_S_CTRUMPET";
        else if (nChoice == 4 ) return "NW_S_CHOUND";
        else if (nChoice == 5 ) return "NW_S_CLANTERN";
        else if (nChoice == 6 ) return "true_wordarch";
        // Demons/Devils
        else if (nChoice == 7 ) return "NW_S_BALOR";
        else if (nChoice == 8 ) return "prc_doa_hellcat";
        else if (nChoice == 9 ) return "prc_sum_cornugon";
        else if (nChoice == 10) return "erinyes";
        else if (nChoice == 11) return "prc_sum_gelugon";
        else if (nChoice == 12) return "prc_sum_glabrezu";
        else if (nChoice == 13) return "prc_sum_hamatula";
        else if (nChoice == 14) return "NW_S_IMP";
        // else if (nChoice == 15) return "tog_marilith";
        else if (nChoice == 16) return "prc_sum_osyluth";
        else if (nChoice == 17) return "NW_S_SUCCUBUS";
        else if (nChoice == 18) return "NW_S_VROCK";
        // Elementals
        else if (nChoice == 19) return "nw_s_airelder";
        else if (nChoice == 20) return "nw_s_earthelder";
        else if (nChoice == 21) return "nw_s_fireelder";
        else if (nChoice == 22) return "nw_s_waterelder";
        else if (nChoice == 23) return "nw_s_mepsteam";
        // Slaadi
        else if (nChoice == 24) return "NW_S_SLAADGRN";
        else if (nChoice == 25) return "NW_S_SLAADRED";
        else if (nChoice == 26) return "NW_S_SLAADDETH";
	
	// on Error
	return "";
}


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

void main()
{
    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)
    {
        // Check if this stage is marked as already set up
        // This stops list duplication when scrolling
        if(!GetIsStageSetUp(nStage, oPC))
        {
            // variable named nStage determines the current conversation node
            // Function SetHeader to set the text displayed to the PC
            // Function AddChoice to add a response option for the PC. The responses are show in order added
            if(nStage == STAGE_SUMMON_CHOICE)
            {
                // Set the header
                SetHeader("Select the creature you would like to summon.");

                // Add responses for the PC
                // Celestials
                AddChoice("Astral Deva",           SummonResrefToInt("true_deva"),        oPC);
                AddChoice("Bralani Eladrin",       SummonResrefToInt("true_bralan"),      oPC);
                AddChoice("Celestial Avenger",     SummonResrefToInt("NW_S_CTRUMPET"),    oPC);
                AddChoice("Hound Archon",          SummonResrefToInt("NW_S_CHOUND"),      oPC);
                AddChoice("Lantern Archon",        SummonResrefToInt("NW_S_CLANTERN"),    oPC);
                AddChoice("Word Archon",           SummonResrefToInt("true_wordarch"),    oPC);
                // Demons/Devils
                AddChoice("Balor",                 SummonResrefToInt("NW_S_BALOR"),       oPC);
                AddChoice("Bezekira",              SummonResrefToInt("prc_doa_hellcat"),  oPC);
                AddChoice("Cornugon",              SummonResrefToInt("prc_sum_cornugon"), oPC);
                AddChoice("Erinyes",               SummonResrefToInt("erinyes"),          oPC);
                AddChoice("Gelugon",               SummonResrefToInt("prc_sum_gelugon"),  oPC);
                AddChoice("Glabrezu",              SummonResrefToInt("prc_sum_glabrezu"), oPC);
                AddChoice("Hamatula",              SummonResrefToInt("prc_sum_hamatula"), oPC);
                AddChoice("Imp",                   SummonResrefToInt("NW_S_IMP"),         oPC);
                // AddChoice("Marilith",              SummonResrefToInt("tog_marilith"),     oPC);
                AddChoice("Osyluth",               SummonResrefToInt("prc_sum_osyluth"),  oPC);
                AddChoice("Succubus",              SummonResrefToInt("NW_S_SUCCUBUS"),    oPC);
                AddChoice("Vrock",                 SummonResrefToInt("NW_S_VROCK"),       oPC);
                // Elementals
                AddChoice("Elder Air Elemental",   SummonResrefToInt("nw_s_airelder"),    oPC);
                AddChoice("Elder Earth Elemental", SummonResrefToInt("nw_s_earthelder"),  oPC);
                AddChoice("Elder Fire Elemental",  SummonResrefToInt("nw_s_fireelder"),   oPC);
                AddChoice("Elder Water Elemental", SummonResrefToInt("nw_s_waterelder"),  oPC);
                AddChoice("Steam Mephit",          SummonResrefToInt("nw_s_mepsteam"),    oPC);
                // Slaadi
                AddChoice("Green Slaad",           SummonResrefToInt("NW_S_SLAADGRN"),    oPC);
                AddChoice("Red Slaadi",            SummonResrefToInt("NW_S_SLAADRED"),    oPC);
                AddChoice("Death Slaadi",          SummonResrefToInt("NW_S_SLAADDETH"),   oPC);

                MarkStageSetUp(STAGE_SUMMON_CHOICE, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
                SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
            }
            else if(nStage == STAGE_CONFIRMATION)//confirmation
            {
                int nChoice = GetLocalInt(oPC, "TrueGateChoice");
                AddChoice(GetStringByStrRef(4752), TRUE); // "Yes"
                AddChoice(GetStringByStrRef(4753), FALSE); // "No"

                string sName = IntToName(nChoice);
                string sText = "You have selected " + sName + " as the creature to summon.\n";

                sText += "Is this correct?";

                SetHeader(sText);
                MarkStageSetUp(STAGE_CONFIRMATION, oPC);
            }
        }

        // Do token setup
        SetupTokens();
    }
    // End of conversation cleanup
    else if(nValue == DYNCONV_EXITED)
    {
        // End of conversation cleanup
        DeleteLocalInt(oPC, "TrueGateChoice");
        DeleteLocalFloat(oPC, "TrueGateDuration");
        DeleteLocalInt(oPC, "TrueGateCastLevel");
    }
    // Abort conversation cleanup.
    // NOTE: This section is only run when the conversation is aborted
    // while aborting is allowed. When it isn't, the dynconvo infrastructure
    // handles restoring the conversation in a transparent manner
    else if(nValue == DYNCONV_ABORTED)
    {
        // End of conversation cleanup
        DeleteLocalInt(oPC, "TrueGateChoice");
        DeleteLocalFloat(oPC, "TrueGateDuration");
        DeleteLocalInt(oPC, "TrueGateCastLevel");
    }
    // Handle PC responses
    else
    {
        // variable named nChoice is the value of the player's choice as stored when building the choice list
        // variable named nStage determines the current conversation node
        int nChoice = GetChoice(oPC);
        if(nStage == STAGE_SUMMON_CHOICE)
        {
            nStage = STAGE_CONFIRMATION;
            SetLocalInt(oPC, "TrueGateChoice", nChoice);
        }
        else if(nStage == STAGE_CONFIRMATION)//confirmation
        {
            if(nChoice == TRUE)
            {
                int nVis;
                // Get the choice
                int nSummon = GetLocalInt(oPC, "TrueGateChoice");
                if (DEBUG)
                {
                    DoDebug("true_gate_conv: Summon is " + IntToSummonResref(nSummon));
                    DoDebug("true_gate_conv: Duration is " + FloatToString(GetLocalFloat(oPC, "TrueGateDuration")));
                }

                if(nSummon < 7)
                    nVis = VFX_FNF_SUMMON_CELESTIAL;
                else if(nSummon > 6 && nSummon < 19)
                    nVis = VFX_FNF_SUMMON_GATE;
                else
                {
                    nVis = VFX_FNF_SUMMON_MONSTER_3;
                }

                // Convert to Resref and setup effect
                effect eSummon = EffectSummonCreature(IntToSummonResref(nSummon), nVis);
                // Do Multisummon
                MultisummonPreSummon();
                // Bring in the creature
                ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSummon, oPC, GetLocalFloat(oPC, "TrueGateDuration"));

                // And we're all done
                AllowExit(DYNCONV_EXIT_FORCE_EXIT);
            }
            else // Reset
            {
                nStage = STAGE_SUMMON_CHOICE;
                MarkStageNotSetUp(STAGE_SUMMON_CHOICE, oPC);
                MarkStageNotSetUp(STAGE_CONFIRMATION, oPC);
            }

            DeleteLocalInt(oPC, "TrueGateChoice");
        }

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