418 lines
16 KiB
Plaintext
418 lines
16 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Name
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
If this is the first time the client is entering this area - he's coming
|
|
from Cutscene 1 - so spawn in the assassin in the First room.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Keith Warner
|
|
//:: Created On: Oct 30/02
|
|
//:://////////////////////////////////////////////
|
|
// Updated July 2/03 - Several changes to script to accomodate low level
|
|
// characters. Further comments in body of this script.
|
|
//UPDATED JAN 6/03 - Changed to - On entry of hero PC - strip of all equipment.
|
|
// Place equipment in the chest at the foot of the PCs bed. Create key for
|
|
// chest on the PC and initiate dialog with prologue object
|
|
|
|
//UPDATED June 20/03 While removing all the item, total the value of their equipment.
|
|
//If they have less than 15000 gp in items, spawn a longsword +3
|
|
//(or quarterstaff +3 if wizard, monk, druid) and a ring of protection +3.
|
|
|
|
//UPDATE AUGUST 11/03 - Now the plan is to have the drow 'thief' steal the chest with
|
|
//the PCs stuff (which may turn up later on)..So store all the stuff in a box in the
|
|
//Random Treasure area.. Spawn in the assassin when the area is first entered..
|
|
|
|
#include "prc_alterations"
|
|
#include "inc_ecl"
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: ExcludeItem
|
|
//:: Copyright (c) 2003 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
A function just to return true if this
|
|
item should not be allowed when the player first enters
|
|
the game.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Brent
|
|
//:: Created On: June 2003
|
|
//:://////////////////////////////////////////////
|
|
|
|
|
|
int ExcludeItem(object oGear)
|
|
{
|
|
string sTag = GetTag(oGear);
|
|
// * don't filter Tynan out. Is an easter egg in c2
|
|
if (sTag == "PortableDoor" || sTag == "x0_spellstaff" || sTag == "x0_powerstone"
|
|
||sTag == "golemmakerkey" || sTag == "Library_Pen" || sTag == "Library_Inkwell"
|
|
|| sTag=="q1monkitem" || sTag == "q1sorcereritem" || sTag == "q1rangeritem"
|
|
|| sTag == "q1clericitem" || sTag == "q1rogueitem" || sTag == "q1barbitem"
|
|
|| sTag == "q1paladinitem" || sTag == "q1barditem" || sTag == "q1mageitem"
|
|
|| sTag == "q1fighteritem" || sTag == "q1druiditem"
|
|
|| sTag == "q1footstagtrophy" || sTag == "TempleRites" || sTag == "x1dragontooth"
|
|
|| sTag == "x1mask" || sTag == "xp1_pcjournal" || sTag == "ShadowGem"
|
|
|| sTag == "NW_MSMLMISC23" || sTag == "NW_MSMLMISC10" || sTag == "NW_MSMLMISC19"
|
|
|| sTag == "NW_MSMISC17" || sTag == "Q2_KEY_PUZZLE_ROOM" || sTag == "q3_promissary"
|
|
|| sTag == "Q2_PROTECTIVE_HELMET"
|
|
)
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
|
|
}
|
|
void DeMagnitizePC(object oPC)
|
|
{
|
|
effect eEffect = GetFirstEffect(oPC);
|
|
while (GetIsEffectValid(eEffect) == TRUE)
|
|
{
|
|
RemoveEffect(oPC, eEffect);
|
|
eEffect = GetNextEffect(oPC);
|
|
}
|
|
}
|
|
void main()
|
|
{
|
|
|
|
//Level character up to 15, if character is below level 15
|
|
object oPC = GetEnteringObject();
|
|
if (GetIsPC(oPC) == FALSE)
|
|
return;
|
|
|
|
|
|
// * Oct 1
|
|
// * Brent
|
|
// *
|
|
// * If started with a low level character, saved, then
|
|
// * reloaded, restart the "level me up" dialog
|
|
// *
|
|
// * LOGIC: If in the start "second floor room"
|
|
// * and still I am not level 15, then try starting the conversation again
|
|
string sArea = GetTag(GetArea(oPC));
|
|
int nHitDie = GetECL(oPC);
|
|
// SendMessageToPC(oPC, sArea);
|
|
// SendMessageToPC(oPC, IntToString(nHitDie));
|
|
if (sArea == "q2a_yprooms" && nHitDie <12)
|
|
{
|
|
//variable for rest message for the room door
|
|
SetLocalInt(oPC, "X2_Q2ARestMessage", 1);
|
|
|
|
AssignCommand(oPC, ClearAllActions());
|
|
DelayCommand(2.0, AssignCommand(oPC, ActionStartConversation(OBJECT_SELF, "bk_levelup", FALSE, FALSE)));
|
|
return;
|
|
}
|
|
|
|
|
|
// *************************
|
|
// * If less than level 12
|
|
// * then entering this area
|
|
// * as a newbie. Should not
|
|
// * get the assassin until the
|
|
// * next day
|
|
// * BRENT
|
|
// *************************
|
|
|
|
/* BRENT MODIFICATION
|
|
|
|
For low level characters this conversation will not play the first time
|
|
|
|
*/
|
|
if (GetECL(oPC) < 12)
|
|
{
|
|
return; // * This will be ran when they return from the other cutscene
|
|
}
|
|
|
|
//Check to make sure enterer is a PC and assassin has never spawned (and that the PC has been to the cutscene and hasn't just saved and loaded in the rooms)
|
|
if (GetIsPC(oPC) && (GetLocalInt(GetModule(), "nAssassin") != 1 || GetLocalInt(GetModule(), "INIT_IMMOBILIZE_REMOVED") == 0)
|
|
&& GetLocalInt(oPC, "X2_Q2ASpawnTheAssassin") == 1)
|
|
{
|
|
if(GetLocalInt(GetModule(), "INIT_IMMOBILIZE_REMOVED") == 0 && GetLocalInt(GetModule(), "nAssassin") == 1)
|
|
{
|
|
object oDialog = GetObjectByTag("q2aprologue");
|
|
DelayCommand(1.5, AssignCommand(oDialog, ActionStartConversation(oPC, "pre_awake1")));
|
|
return;
|
|
|
|
}
|
|
//variable for rest message for the room door
|
|
SetLocalInt(oPC, "X2_Q2ARestMessage", 0);
|
|
|
|
BlackScreen(oPC);
|
|
DeMagnitizePC(oPC);
|
|
// * September 2003: Disable relic of reaper from working
|
|
// * until this variable is turned off (after the rogue is dead)
|
|
SetLocalInt(GetModule(), "x2_g_disabled", 10);
|
|
|
|
AddJournalQuestEntry("portalstone", 20, oPC, FALSE);
|
|
|
|
object oContainer = GetObjectByTag("x2_chapter1pcequip"); //NEW CONTAINER -
|
|
// This container is in the final area of Chapter 1!
|
|
|
|
// * pick up any equipment lying on the ground
|
|
// * Thanks Mr. Cheater!
|
|
object oArea = OBJECT_INVALID;
|
|
object oItem = GetFirstObjectInArea(oArea);
|
|
while (GetIsObjectValid(oItem) == TRUE)
|
|
{
|
|
if (GetObjectType(oItem) == OBJECT_TYPE_ITEM)
|
|
{
|
|
CopyItem(oItem, oContainer);
|
|
SetPlotFlag(oItem, FALSE);
|
|
DestroyObject(oItem, 0.1);
|
|
}
|
|
oItem = GetNextObjectInArea(oArea);
|
|
}
|
|
|
|
//if this is the main PC - who has had the dream
|
|
if (GetLocalInt(oPC, "nPCNumber") == 1)
|
|
{
|
|
|
|
//if this is the case, strip PC of all equipment, place
|
|
//it on the weapons rack ("q2a_pc_equip" and
|
|
//spawn in the assassin ("q2adrowassassin")
|
|
// Removing PC's equipment.
|
|
object oGear = GetItemInSlot(INVENTORY_SLOT_ARMS, oPC);
|
|
object oGear2;
|
|
//object oContainer = GetObjectByTag("q2a_pc_equip");//OLD CONTAINER - IN PC START ROOM
|
|
int nGold = 0;
|
|
|
|
if(GetIsObjectValid(oGear))
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
oGear = GetItemInSlot(INVENTORY_SLOT_BELT, oPC);
|
|
if(GetIsObjectValid(oGear))
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
oGear = GetItemInSlot(INVENTORY_SLOT_BOLTS, oPC);
|
|
if(GetIsObjectValid(oGear))
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
oGear = GetItemInSlot(INVENTORY_SLOT_BOOTS, oPC);
|
|
if(GetIsObjectValid(oGear))
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
oGear = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
|
|
if(GetIsObjectValid(oGear))
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
|
|
oGear = GetItemInSlot(INVENTORY_SLOT_CLOAK, oPC);
|
|
if(GetIsObjectValid(oGear))
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
oGear = GetItemInSlot(INVENTORY_SLOT_HEAD, oPC);
|
|
if(GetIsObjectValid(oGear))
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
oGear = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);
|
|
if(GetIsObjectValid(oGear))
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
oGear = GetItemInSlot(INVENTORY_SLOT_LEFTRING, oPC);
|
|
if(GetIsObjectValid(oGear))
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
oGear = GetItemInSlot(INVENTORY_SLOT_NECK, oPC);
|
|
if(GetIsObjectValid(oGear) && GetTag(oGear) != "lichamulet" )
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
oGear = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
|
if(GetIsObjectValid(oGear))
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
|
|
oGear = GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oPC);
|
|
if(GetIsObjectValid(oGear))
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
oGear = GetItemInSlot(INVENTORY_SLOT_ARROWS, oPC);
|
|
if(GetIsObjectValid(oGear))
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
oGear = GetItemInSlot(INVENTORY_SLOT_BOLTS, oPC);
|
|
if(GetIsObjectValid(oGear))
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
oGear = GetItemInSlot(INVENTORY_SLOT_BULLETS, oPC);
|
|
if(GetIsObjectValid(oGear))
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
|
|
//Empty all items from the PCs inventory
|
|
//Destroy any XP1 specific items
|
|
//UPDATE 08/11/03 - Keep XP1 items for now
|
|
oGear = GetFirstItemInInventory(oPC);
|
|
while (oGear != OBJECT_INVALID)
|
|
{
|
|
//Don't destroy the reaper stone, rogue stone or Deekin's book
|
|
//if (GetTag(oGear) != "x2_p_reaper" && GetTag(oGear) != "x2_p_rogue" && GetTag(oGear) != "bookoflegends")
|
|
//{
|
|
|
|
// don't destroy PRC items
|
|
// Lich's Phylactery or soul stones
|
|
// Shifters spark of life archfocusofpower
|
|
// Archmage Focus Power
|
|
if(GetTag(oGear) != "soul_gem" &&
|
|
GetTag(oGear) != "sparkoflife" &&
|
|
GetTag(oGear) != "lichamulet" &&
|
|
GetTag(oGear) != "archfocusofpower" &&
|
|
GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oPC) != oGear &&
|
|
GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC) != oGear &&
|
|
GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oPC) != oGear &&
|
|
GetItemInSlot(INVENTORY_SLOT_CARMOUR, oPC) != oGear
|
|
)
|
|
{
|
|
nGold = nGold + GetGoldPieceValue(oGear);
|
|
oGear2 = CopyItem(oGear, oContainer);
|
|
SetPlotFlag(oGear, FALSE);
|
|
DestroyObject(oGear);
|
|
}
|
|
|
|
oGear = GetNextItemInInventory(oPC);
|
|
}
|
|
|
|
//Get Rid of Gold
|
|
TakeGoldFromCreature(GetGold(oPC), oPC, TRUE);
|
|
// ******************************
|
|
// * EXTRA ITEM SPAWNING
|
|
// ******************************
|
|
|
|
|
|
//If they have less than 15000 gp in items, spawn a longsword +3
|
|
//(or quarterstaff +3 if wizard, monk, druid) and a ring of protection +3.
|
|
if (nGold < 15000)
|
|
{
|
|
if (GetLevelByClass(CLASS_TYPE_WIZARD, oPC) > 5 ||
|
|
GetLevelByClass(CLASS_TYPE_SHADOWCASTER, oPC) > 5 ||
|
|
GetLevelByClass(CLASS_TYPE_MONK, oPC) > 5 ||
|
|
GetLevelByClass(CLASS_TYPE_DRUID, oPC) > 5)
|
|
{
|
|
//create quarterstaff
|
|
CreateItemOnObject("nw_wdbmqs009", oContainer);
|
|
}
|
|
else
|
|
{
|
|
//create longsword
|
|
CreateItemOnObject("nw_wswmls012", oContainer);
|
|
}
|
|
//Create ring of protection
|
|
CreateItemOnObject("nw_it_mring018", oContainer);
|
|
}
|
|
|
|
object oDialog = GetObjectByTag("q2aprologue");
|
|
DelayCommand(1.5, AssignCommand(oDialog, ActionStartConversation(oPC, "pre_awake1")));
|
|
|
|
|
|
// * July 2 2003: Spawn in reaper stone - BK
|
|
//if (GetIsObjectValid(GetItemPossessedBy(oPC, "x2_p_reaper")) == FALSE)
|
|
//{
|
|
object oStone = CreateItemOnObject("x2_p_reaper", oPC);
|
|
SetItemCursedFlag(oStone, TRUE);
|
|
// * create one rogue stone
|
|
CreateItemOnObject("x2_p_rogue", oPC, 1);
|
|
|
|
//}
|
|
|
|
|
|
// * Spawn Deekin's book on the player
|
|
CreateItemOnObject("bookoflegends", oPC);
|
|
}
|
|
else
|
|
{
|
|
|
|
//destroy any portal stones held by other players
|
|
if (GetIsObjectValid(GetItemPossessedBy(oPC, "x2_p_reaper")) == TRUE)
|
|
{
|
|
object oStone = GetItemPossessedBy(oPC, "x2_p_reaper");
|
|
DestroyObject(oStone);
|
|
}
|
|
}
|
|
|
|
//Do the following only the first time the area is entered
|
|
if (GetLocalInt(OBJECT_SELF, "nSaved") == 1)
|
|
return;
|
|
|
|
SetLocalInt(OBJECT_SELF, "nSaved", 1);
|
|
DoSinglePlayerAutoSave();
|
|
|
|
object oKiller = CreateObject(OBJECT_TYPE_CREATURE, "q2adrowassassin", GetLocation(GetWaypointByTag("wp_q2a_assassin")));
|
|
|
|
object oChest = GetObjectByTag("q2a_pc_equip");
|
|
AssignCommand(oKiller, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 60.0));
|
|
SetLocalInt(GetModule(), "nAssassin", 1);
|
|
|
|
|
|
// * Spawn and add the new complementary dagger
|
|
object oDagger = CreateItemOnObject("x2_newdag", oPC);
|
|
AssignCommand(oPC, ActionEquipItem(oDagger, INVENTORY_SLOT_RIGHTHAND));
|
|
|
|
// Added by: Brad Prince. This was done to cover the naked PC bumping that
|
|
// happened before drow assassin. Looked unpolished.
|
|
|
|
DelayCommand(1.0, FadeFromBlack(oPC, FADE_SPEED_MEDIUM));
|
|
}
|
|
|
|
|
|
}
|