PRC8/nwn/nwnprc/trunk/scripts/prc_maze_convo.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

154 lines
5.6 KiB
Plaintext

//:://////////////////////////////////////////////
//:: 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);
}
}