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.
362 lines
16 KiB
Plaintext
362 lines
16 KiB
Plaintext
//:://////////////////////////////////////////////
|
|
//:: Teleport options dialog
|
|
//:: prc_telep_optdlg
|
|
//:://////////////////////////////////////////////
|
|
/** @file
|
|
This file builds the entries for the teleport
|
|
locations management dialog when used with the
|
|
dynamic conversation system.
|
|
|
|
|
|
@author Ornedan
|
|
@date Created - 2005.06.18
|
|
@date Modified - 2005.09.23
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "inc_dynconv"
|
|
#include "prc_inc_teleport"
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Constant defintions */
|
|
//////////////////////////////////////////////////
|
|
|
|
const int STAGE_MAIN = 0;
|
|
const int STAGE_LOCATION_LIST = 1;
|
|
const int STAGE_LOCATION_ACTION_SELECTION = 2;
|
|
const int STAGE_QUICKSLOT_SELECTION = 3;
|
|
const int STAGE_QUICKSLOT_LIST = 4;
|
|
//const int STAGE_QUICKSLOT_ACTION_SELECTION = 5;
|
|
const int STAGE_OPTIONS_LIST = 6;
|
|
const int STAGE_LISTENER_TIME = 7;
|
|
const int STAGE_MAPPIN = 8;
|
|
const int STAGE_ONREST_MARKLOCATION = 9;
|
|
|
|
const int CHOICE_BACK_TO_MAIN = -1;
|
|
|
|
const int CHOICE_STORE_QUICKSELECT = 1;
|
|
const int CHOICE_DELETE_LOCATION = 2;
|
|
|
|
const int CHOICE_0S = 0;
|
|
const int CHOICE_5S = 5;
|
|
const int CHOICE_10S = 10;
|
|
const int CHOICE_15S = 15;
|
|
const int CHOICE_20S = 20;
|
|
|
|
const int CHOICE_YES = 1;
|
|
const int CHOICE_NO = 0;
|
|
|
|
const int STRREF_BACK_TO_MAIN = 16824794; // "Back to main menu"
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Function defintions */
|
|
//////////////////////////////////////////////////
|
|
|
|
|
|
|
|
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_MAIN)
|
|
{
|
|
SetHeader(GetStringByStrRef(16825272)); // "Select a list to view"
|
|
|
|
AddChoice(GetStringByStrRef(16825273), STAGE_LOCATION_LIST); // "List stored locations."
|
|
AddChoice(GetStringByStrRef(16825274), STAGE_QUICKSLOT_LIST); // "List quickselections."
|
|
AddChoice(GetStringByStrRef(16825275), STAGE_OPTIONS_LIST); // "Show options."
|
|
|
|
SetDefaultTokens();
|
|
}
|
|
else if(nStage == STAGE_LOCATION_LIST)
|
|
{
|
|
SetHeader(GetStringByStrRef(16825276)); // "Select a location to manipulate."
|
|
AddChoice(GetStringByStrRef(STRREF_BACK_TO_MAIN), CHOICE_BACK_TO_MAIN);
|
|
|
|
// List all stored locations
|
|
int i, nMax = GetNumberOfStoredTeleportTargetLocations(oPC);
|
|
string sToken;
|
|
struct metalocation mlocL;
|
|
object oArea;
|
|
for(i = 0; i < nMax; i++)
|
|
{
|
|
mlocL = GetNthStoredTeleportTargetLocation(oPC, i);
|
|
AddChoice(MetalocationToString(mlocL), i);
|
|
}
|
|
|
|
MarkStageSetUp(STAGE_LOCATION_LIST, oPC);
|
|
}
|
|
else if(nStage == STAGE_LOCATION_ACTION_SELECTION)
|
|
{
|
|
SetHeader(GetStringByStrRef(16825277) + // "Select action to perform on the location."
|
|
"\n" + MetalocationToString(GetNthStoredTeleportTargetLocation(oPC, GetLocalInt(oPC, "ManipulatedTeleportTargetLocationIndex"))));
|
|
AddChoice(GetStringByStrRef(STRREF_BACK_TO_MAIN), CHOICE_BACK_TO_MAIN);
|
|
|
|
AddChoice(GetStringByStrRef(16825278), CHOICE_STORE_QUICKSELECT); // "Store location in a quickslot."
|
|
AddChoice(GetStringByStrRef(16825279), CHOICE_DELETE_LOCATION); // "Delete location."
|
|
}
|
|
else if(nStage == STAGE_QUICKSLOT_SELECTION)
|
|
{
|
|
SetHeader(GetStringByStrRef(16825280)); // "Select quickslot to store the location in."
|
|
AddChoice(GetStringByStrRef(STRREF_BACK_TO_MAIN), CHOICE_BACK_TO_MAIN);
|
|
|
|
int i;
|
|
struct metalocation mlocL;
|
|
string sToken;
|
|
for(i = 1; i <= PRC_NUM_TELEPORT_QUICKSELECTS; i++)
|
|
{// Quickselection
|
|
sToken = GetStringByStrRef(16825271) + " " + IntToString(i) + ": ";
|
|
if(GetHasTeleportQuickSelection(oPC, i))
|
|
{
|
|
mlocL = GetTeleportQuickSelection(oPC, i);
|
|
sToken += MetalocationToString(mlocL);
|
|
}
|
|
else
|
|
sToken += GetStringByStrRef(16825282); // "Blank"
|
|
|
|
AddChoice(sToken, i);
|
|
}
|
|
}
|
|
else if(nStage == STAGE_QUICKSLOT_LIST)
|
|
{
|
|
SetHeader(GetStringByStrRef(16825281)); // "A list of the contents of your quickslots. Selecting a quickslot empties it."
|
|
AddChoice(GetStringByStrRef(STRREF_BACK_TO_MAIN), CHOICE_BACK_TO_MAIN);
|
|
|
|
int i;
|
|
struct metalocation mlocL;
|
|
string sToken;
|
|
for(i = 1; i <= PRC_NUM_TELEPORT_QUICKSELECTS; i++)
|
|
{// Quickselection
|
|
sToken = GetStringByStrRef(16825271) + " " + IntToString(i) + ": ";
|
|
if(GetHasTeleportQuickSelection(oPC, i))
|
|
{
|
|
mlocL = GetTeleportQuickSelection(oPC, i);
|
|
sToken += MetalocationToString(mlocL);
|
|
AddChoice(sToken, i);
|
|
}
|
|
}
|
|
}
|
|
else if(nStage == STAGE_OPTIONS_LIST)
|
|
{
|
|
SetHeader(GetStringByStrRef(16825283)); // "Select option to modify"
|
|
AddChoice(GetStringByStrRef(STRREF_BACK_TO_MAIN), CHOICE_BACK_TO_MAIN);
|
|
|
|
// Listener duration
|
|
AddChoice(GetStringByStrRef(16825284) + ": " + IntToString(FloatToInt(GetLocalFloat(oPC, "PRC_Teleport_NamingListenerDuration"))) + "s", STAGE_LISTENER_TIME);
|
|
// Create map pins for marked locations Yes No
|
|
AddChoice(GetStringByStrRef(16825299) + ": " + (GetLocalInt(oPC, PRC_TELEPORT_CREATE_MAP_PINS) ? GetStringByStrRef(4752) : GetStringByStrRef(4753)), STAGE_MAPPIN);
|
|
// Mark resting locations
|
|
AddChoice(GetStringByStrRef(16825204) + ": " + (GetLocalInt(oPC, PRC_TELEPORT_ONREST_MARKLOCATION) ? GetStringByStrRef(4752) : GetStringByStrRef(4753)), STAGE_ONREST_MARKLOCATION);
|
|
}
|
|
else if(nStage == STAGE_LISTENER_TIME)
|
|
{
|
|
SetHeader(GetStringByStrRef(16825290)); // "Select how long the game will wait for you to speak a name when marking a location."
|
|
AddChoice(GetStringByStrRef(STRREF_BACK_TO_MAIN), CHOICE_BACK_TO_MAIN);
|
|
|
|
AddChoice(GetStringByStrRef(16825285), CHOICE_0S); // "0 seconds - Do not name at all"
|
|
AddChoice(GetStringByStrRef(16825286), CHOICE_5S); // "5 seconds"
|
|
AddChoice(GetStringByStrRef(16825287), CHOICE_10S); // "10 seconds"
|
|
AddChoice(GetStringByStrRef(16825288), CHOICE_15S); // "15 seconds"
|
|
AddChoice(GetStringByStrRef(16825289), CHOICE_20S); // "20 seconds"
|
|
}
|
|
else if(nStage == STAGE_MAPPIN)
|
|
{
|
|
SetHeader(GetStringByStrRef(16825301)); // "Select whether you want map pins to be automatically to be created at locations you mark. Note that they may not appear immediately, but only after you re-enter the area."
|
|
AddChoice(GetStringByStrRef(STRREF_BACK_TO_MAIN), CHOICE_BACK_TO_MAIN);
|
|
|
|
AddChoice(GetStringByStrRef(4752), CHOICE_YES); // "Yes"
|
|
AddChoice(GetStringByStrRef(4753), CHOICE_NO); // "No"
|
|
}
|
|
else if(nStage == STAGE_ONREST_MARKLOCATION)
|
|
{
|
|
SetHeader(GetStringByStrRef(16825205)); // "Select whether you want that whenever you rest, the location will be automatically marked.\nWARNING: The location is always stored in the first slot, so if you delete it, next time you rest whatever is now in the first slot will be overwritten."
|
|
AddChoice(GetStringByStrRef(STRREF_BACK_TO_MAIN), CHOICE_BACK_TO_MAIN);
|
|
|
|
AddChoice(GetStringByStrRef(4752), CHOICE_YES); // "Yes"
|
|
AddChoice(GetStringByStrRef(4753), CHOICE_NO); // "No"
|
|
}
|
|
}
|
|
|
|
// Do token setup
|
|
SetupTokens();
|
|
}
|
|
else if(nValue == DYNCONV_EXITED)
|
|
{
|
|
// End of conversation cleanup
|
|
DeleteLocalInt(oPC, "ManipulatedTeleportTargetLocationIndex");
|
|
}
|
|
else if(nValue == DYNCONV_ABORTED)
|
|
{
|
|
// Abort conversation cleanup
|
|
DeleteLocalInt(oPC, "ManipulatedTeleportTargetLocationIndex");
|
|
}
|
|
// Handle PC responses
|
|
else
|
|
{
|
|
int nChoice = GetChoice(oPC);
|
|
|
|
if(nStage == STAGE_MAIN)
|
|
{
|
|
// Stage to move to is the value of the choice
|
|
nStage = nChoice;
|
|
}
|
|
else if(nStage == STAGE_LOCATION_LIST)
|
|
{
|
|
if(nChoice == CHOICE_BACK_TO_MAIN)
|
|
nStage = STAGE_MAIN;
|
|
else
|
|
{
|
|
// Move to take action on the selected location
|
|
nStage = STAGE_LOCATION_ACTION_SELECTION;
|
|
// Store the index of the selected location
|
|
SetLocalInt(oPC, "ManipulatedTeleportTargetLocationIndex", nChoice);
|
|
}
|
|
|
|
MarkStageNotSetUp(STAGE_LOCATION_LIST, oPC);
|
|
}
|
|
else if(nStage == STAGE_LOCATION_ACTION_SELECTION)
|
|
{
|
|
if(nChoice == CHOICE_BACK_TO_MAIN)
|
|
{
|
|
DeleteLocalInt(oPC, "ManipulatedTeleportTargetLocationIndex");
|
|
nStage = STAGE_MAIN;
|
|
}
|
|
else if(nChoice == CHOICE_STORE_QUICKSELECT)
|
|
{
|
|
nStage = STAGE_QUICKSLOT_SELECTION;
|
|
}
|
|
else if(nChoice == CHOICE_DELETE_LOCATION)
|
|
{
|
|
RemoveNthTeleportTargetLocation(oPC, GetLocalInt(oPC, "ManipulatedTeleportTargetLocationIndex"));
|
|
DeleteLocalInt(oPC, "ManipulatedTeleportTargetLocationIndex");
|
|
nStage = STAGE_MAIN;
|
|
}
|
|
}
|
|
else if(nStage == STAGE_QUICKSLOT_SELECTION)
|
|
{
|
|
if(nChoice != CHOICE_BACK_TO_MAIN)
|
|
{
|
|
SetTeleportQuickSelection(oPC, GetNthStoredTeleportTargetLocation(oPC, GetLocalInt(oPC, "ManipulatedTeleportTargetLocationIndex")), nChoice);
|
|
}
|
|
|
|
DeleteLocalInt(oPC, "ManipulatedTeleportTargetLocationIndex");
|
|
nStage = STAGE_MAIN;
|
|
}
|
|
else if(nStage == STAGE_QUICKSLOT_LIST)
|
|
{
|
|
if(nChoice != CHOICE_BACK_TO_MAIN)
|
|
{
|
|
RemoveTeleportQuickSelection(oPC, nChoice);
|
|
}
|
|
|
|
nStage = STAGE_MAIN;
|
|
}
|
|
else if(nStage == STAGE_OPTIONS_LIST)
|
|
{
|
|
if(nChoice == CHOICE_BACK_TO_MAIN)
|
|
nStage = STAGE_MAIN;
|
|
else
|
|
nStage = nChoice;
|
|
}
|
|
else if(nStage == STAGE_LISTENER_TIME)
|
|
{
|
|
if(nChoice != CHOICE_BACK_TO_MAIN)
|
|
{
|
|
SetLocalFloat(oPC, "PRC_Teleport_NamingListenerDuration", IntToFloat(nChoice));
|
|
}
|
|
|
|
nStage = STAGE_MAIN;
|
|
}
|
|
else if(nStage == STAGE_MAPPIN)
|
|
{
|
|
SetLocalInt(oPC, PRC_TELEPORT_CREATE_MAP_PINS, nChoice);
|
|
|
|
// Create map pins from existing teleport locations.
|
|
if(nChoice)
|
|
TeleportLocationsToMapPins(oPC);
|
|
|
|
nStage = STAGE_MAIN;
|
|
}
|
|
else if(nStage == STAGE_ONREST_MARKLOCATION)
|
|
{
|
|
if(nChoice != CHOICE_BACK_TO_MAIN)
|
|
{
|
|
// Do not move locations if the option is already active
|
|
if(nChoice == CHOICE_YES && GetLocalInt(oPC, PRC_TELEPORT_ONREST_MARKLOCATION) != CHOICE_YES)
|
|
{
|
|
// Array size check. If no limit is defined via switch, default to 50.
|
|
int nNum = GetPersistantLocalInt(oPC, PRC_TELEPORT_ARRAY_NAME); // Array elements begin at index 0
|
|
int nMax = GetPRCSwitch(PRC_TELEPORT_MAX_TARGET_LOCATIONS) ?
|
|
GetPRCSwitch(PRC_TELEPORT_MAX_TARGET_LOCATIONS) :
|
|
50;
|
|
if(nNum >= nMax)
|
|
// You have reached the maximum allowed teleport locations ( ).\nYou must remove at least one stored location before you can add new locations.
|
|
SendMessageToPC(oPC, GetStringByStrRef(16825294) + IntToString(nMax) + GetStringByStrRef(16825295));
|
|
|
|
// Move all the existing locations up by one
|
|
int i;
|
|
for(i = nNum; i > 0; i--)
|
|
{
|
|
SetPersistantLocalMetalocation(oPC, PRC_TELEPORT_ARRAY_NAME + "_" + IntToString(i),
|
|
GetPersistantLocalMetalocation(oPC, PRC_TELEPORT_ARRAY_NAME + "_" + IntToString(i - 1))
|
|
);
|
|
// Move the map pin existence marker if it's present
|
|
if(GetLocalInt(oPC, PRC_TELEPORT_ARRAY_NAME + "_HasMapPin_" + IntToString(i - 1)))
|
|
SetLocalInt(oPC, PRC_TELEPORT_ARRAY_NAME + "_HasMapPin_" + IntToString(i), TRUE);
|
|
}
|
|
|
|
// Store a null metalocation in the first slot
|
|
SetPersistantLocalMetalocation(oPC, PRC_TELEPORT_ARRAY_NAME + "_0", GetNullMetalocation());
|
|
|
|
// Store the increased array size
|
|
SetPersistantLocalInt(oPC, PRC_TELEPORT_ARRAY_NAME, nNum + 1);
|
|
|
|
// Hook into OnRest-Finished event
|
|
AddEventScript(oPC, EVENT_ONPLAYERREST_FINISHED, "prc_telep_mrkrst", TRUE, FALSE);
|
|
}
|
|
else if(nChoice == CHOICE_NO)
|
|
{
|
|
// Delete the location and unhook from OnRest
|
|
RemoveNthTeleportTargetLocation(oPC, 0);
|
|
RemoveEventScript(oPC, EVENT_ONPLAYERREST_FINISHED, "prc_telep_mrkrst", TRUE, FALSE);
|
|
}
|
|
|
|
SetLocalInt(oPC, PRC_TELEPORT_ONREST_MARKLOCATION, nChoice);
|
|
}
|
|
|
|
nStage = STAGE_MAIN;
|
|
}
|
|
|
|
// Store the stage value. If it has been changed, this clears out the choices
|
|
SetStage(nStage, oPC);
|
|
}
|
|
}
|