2025/08/24 Update

Updated for PRC8 updates.
This commit is contained in:
Jaysyn904 2025-08-24 19:40:50 -04:00
parent 2761e40da2
commit 2dc2ec8d49
16 changed files with 210 additions and 1800 deletions

View File

@ -9,7 +9,7 @@ Repository for the development of the PRC8 version of I1 - Dwellers Of The Forbi
2.) [Original module resources](https://neverwintervault.org/project/nwn1/module/i1-dwellers-forbidden-city)
3.) [PRC8](https://gitea.raptio.us/Jaysyn/PRC8/src/branch/main/Release)
3.) [PRC8](https://gitea.raptio.us/Jaysyn/PRC8/releases)
4.) [CEP2](https://neverwintervault.org/cep)

View File

@ -1,7 +1,7 @@
[package]
name = "I1 - Dwellers Of The Forbidden City [PRC8-CEP2]"
description = "PRC8 version of I1 - Dwellers Of The Forbidden City."
version = "6.6prc8"
version = "6.7prc8"
url = "https://discord.gg/ca2ru3KxYd"
author = "Udasu & Rosie the Pup"
author = "Jaysyn904 <68194417+Jaysyn904@users.noreply.github.com>"
@ -231,7 +231,14 @@ description = "PRC8 version of I1 - Dwellers Of The Forbidden City."
filter = "prc_nui_sc_inc.nss"
filter = "prc_nui_scd_inc.nss"
filter = "prc_nui_consts.nss"
filter = "nw_inc_nui"
filter = "prc_nui_sb_inc.nss"
filter = "prc_nui_sbd_inc.nss"
filter = "prc_nui_lv_inc.nss"
filter = "prc_nui_com_inc.nss"
filter = "nw_inc_nui.nss"
filter = "inc_infusion.nss"
filter = "nw_inc_gff.nss"
filter = "prc_inc_json.nss"
filter = "xchst_inc.nss"
[target]
@ -452,7 +459,14 @@ description = "PRC8 merge hakpak for PRC8 version of I1 - Dwellers Of The Forbid
filter = "prc_nui_sc_inc.nss"
filter = "prc_nui_scd_inc.nss"
filter = "prc_nui_consts.nss"
filter = "nw_inc_nui"
filter = "prc_nui_sb_inc.nss"
filter = "prc_nui_sbd_inc.nss"
filter = "prc_nui_lv_inc.nss"
filter = "prc_nui_com_inc.nss"
filter = "nw_inc_nui.nss"
filter = "inc_infusion.nss"
filter = "nw_inc_gff.nss"
filter = "prc_inc_json.nss"
filter = "xchst_inc.nss"
[target.rules]

View File

@ -11,8 +11,6 @@
//:://////////////////////////////////////////////
//:: Created By: Brent, Andrew
//:: Created On: November - May
//::
//:: Updated for .35 by Jaysyn 2023/03/10
//:://////////////////////////////////////////////
// :: MODS
// April 23 2002: Removed animal parts. They were silly.
@ -24,65 +22,64 @@
// Moved nymph cloak +4 to treasure bracket 6
// Added Monk Enhancement items to random treasure
#include "prc_class_const"
// * ---------
// * CONSTANTS
// * ---------
// * tweaking constants
// * SIX LEVEL RANGES
const int RANGE_1_MIN = 0;
const int RANGE_1_MAX = 5;
const int RANGE_2_MIN = 6;
const int RANGE_2_MAX = 8;
int RANGE_1_MIN = 0;
int RANGE_1_MAX = 5;
int RANGE_2_MIN = 6;
int RANGE_2_MAX = 8;
const int RANGE_3_MIN = 9;
const int RANGE_3_MAX = 10;
int RANGE_3_MIN = 9;
int RANGE_3_MAX = 10;
const int RANGE_4_MIN = 11;
const int RANGE_4_MAX = 13;
int RANGE_4_MIN = 11;
int RANGE_4_MAX = 13;
const int RANGE_5_MIN = 14;
const int RANGE_5_MAX = 16;
int RANGE_5_MIN = 14;
int RANGE_5_MAX = 16;
const int RANGE_6_MIN = 17;
const int RANGE_6_MAX = 100;
int RANGE_6_MIN = 17;
int RANGE_6_MAX = 100;
// * NUMBER OF ITEMS APPEARING
const int NUMBER_LOW_ONE = 100; const int NUMBER_MED_ONE = 60; const int NUMBER_HIGH_ONE = 40; const int NUMBER_BOSS_ONE = 100;
const int NUMBER_LOW_TWO = 0; const int NUMBER_MED_TWO = 30; const int NUMBER_HIGH_TWO = 40; const int NUMBER_BOSS_TWO = 0;
const int NUMBER_LOW_THREE = 0; const int NUMBER_MED_THREE = 10; const int NUMBER_HIGH_THREE = 20; const int NUMBER_BOSS_THREE = 0;
int NUMBER_LOW_ONE = 100; int NUMBER_MED_ONE = 60; int NUMBER_HIGH_ONE = 40; int NUMBER_BOSS_ONE = 100;
int NUMBER_LOW_TWO = 0; int NUMBER_MED_TWO = 30; int NUMBER_HIGH_TWO = 40; int NUMBER_BOSS_TWO = 0;
int NUMBER_LOW_THREE = 0; int NUMBER_MED_THREE = 10; int NUMBER_HIGH_THREE = 20; int NUMBER_BOSS_THREE = 0;
const int NUMBER_BOOK_ONE = 75;
const int NUMBER_BOOK_TWO = 20;
const int NUMBER_BOOK_THREE = 5;
int NUMBER_BOOK_ONE = 75;
int NUMBER_BOOK_TWO = 20;
int NUMBER_BOOK_THREE = 5;
// * AMOUNT OF GOLD BY VALUE
const float LOW_MOD_GOLD = 0.5; const float MEDIUM_MOD_GOLD = 1.0; const float HIGH_MOD_GOLD = 3.0;
float LOW_MOD_GOLD = 0.5; float MEDIUM_MOD_GOLD = 1.0; float HIGH_MOD_GOLD = 3.0;
// * FREQUENCY OF ITEM TYPE APPEARING BY TREASURE TYPE
const int LOW_PROB_BOOK = 1; const int MEDIUM_PROB_BOOK = 1; const int HIGH_PROB_BOOK =1;
const int LOW_PROB_ANIMAL = 0; const int MEDIUM_PROB_ANIMAL = 0; const int HIGH_PROB_ANIMAL = 0;
const int LOW_PROB_JUNK = 2; const int MEDIUM_PROB_JUNK = 1; const int HIGH_PROB_JUNK = 1;
const int LOW_PROB_GOLD = 43; const int MEDIUM_PROB_GOLD = 38; const int HIGH_PROB_GOLD = 15;
const int LOW_PROB_GEM = 9; const int MEDIUM_PROB_GEM = 15; const int HIGH_PROB_GEM = 15;
const int LOW_PROB_JEWEL = 4; const int MEDIUM_PROB_JEWEL = 6; const int HIGH_PROB_JEWEL = 15;
const int LOW_PROB_ARCANE = 3; const int MEDIUM_PROB_ARCANE = 3; const int HIGH_PROB_ARCANE = 3;
const int LOW_PROB_DIVINE = 3; const int MEDIUM_PROB_DIVINE = 3; const int HIGH_PROB_DIVINE = 3;
const int LOW_PROB_AMMO = 10; const int MEDIUM_PROB_AMMO = 5; const int HIGH_PROB_AMMO = 3;
const int LOW_PROB_KIT = 5; const int MEDIUM_PROB_KIT = 5; const int HIGH_PROB_KIT = 5;
const int LOW_PROB_POTION =17; const int MEDIUM_PROB_POTION = 20; const int HIGH_PROB_POTION= 9;
const int LOW_PROB_TABLE2 = 3; const int MEDIUM_PROB_TABLE2 = 3; const int HIGH_PROB_TABLE2= 30;
int LOW_PROB_BOOK = 1; int MEDIUM_PROB_BOOK = 1; int HIGH_PROB_BOOK =1;
int LOW_PROB_ANIMAL = 0; int MEDIUM_PROB_ANIMAL = 0; int HIGH_PROB_ANIMAL = 0;
int LOW_PROB_JUNK = 2; int MEDIUM_PROB_JUNK = 1; int HIGH_PROB_JUNK = 1;
int LOW_PROB_GOLD = 43; int MEDIUM_PROB_GOLD = 38; int HIGH_PROB_GOLD = 15;
int LOW_PROB_GEM = 9; int MEDIUM_PROB_GEM = 15; int HIGH_PROB_GEM = 15;
int LOW_PROB_JEWEL = 4; int MEDIUM_PROB_JEWEL = 6; int HIGH_PROB_JEWEL = 15;
int LOW_PROB_ARCANE = 3; int MEDIUM_PROB_ARCANE = 3; int HIGH_PROB_ARCANE = 3;
int LOW_PROB_DIVINE = 3; int MEDIUM_PROB_DIVINE = 3; int HIGH_PROB_DIVINE = 3;
int LOW_PROB_AMMO = 10; int MEDIUM_PROB_AMMO = 5; int HIGH_PROB_AMMO = 3;
int LOW_PROB_KIT = 5; int MEDIUM_PROB_KIT = 5; int HIGH_PROB_KIT = 5;
int LOW_PROB_POTION =17; int MEDIUM_PROB_POTION = 20; int HIGH_PROB_POTION= 9;
int LOW_PROB_TABLE2 = 3; int MEDIUM_PROB_TABLE2 = 3; int HIGH_PROB_TABLE2= 30;
// * readability constants
const int TREASURE_LOW = 1;
const int TREASURE_MEDIUM = 2;
const int TREASURE_HIGH = 3;
const int TREASURE_BOSS = 4;
const int TREASURE_BOOK = 5;
int TREASURE_LOW = 1;
int TREASURE_MEDIUM = 2;
int TREASURE_HIGH = 3;
int TREASURE_BOSS = 4;
int TREASURE_BOOK = 5;
// * JUMP_LEVEL is used in a Specific item function
@ -91,7 +88,7 @@ const int TREASURE_BOOK = 5;
// * hit die for the purposes of the treasure evaluation.
// * May 2002: Lowered JUMP_LEVEL from 3 to 2
const int JUMP_LEVEL = 2;
int JUMP_LEVEL = 2;
//* Declarations
@ -118,13 +115,11 @@ void dbSpeak(string s)
//* made this function to help with debugging
void dbCreateItemOnObject(string sItemTemplate, object oTarget = OBJECT_SELF, int nStackSize = 1)
{
/*
if (sItemTemplate == "")
{
PrintString("blank item passed into dbCreateItemOnObject. Please report as bug to Brent.");
}
dbSpeak(sItemTemplate);
*/
//sItemTemplate = GetStringLowerCase
@ -134,14 +129,13 @@ void dbCreateItemOnObject(string sItemTemplate, object oTarget = OBJECT_SELF, in
// * it creates more
string sRoot = GetSubString(sItemTemplate, 0, 6);
//dbSpeak("ROOT: " + sRoot);
dbSpeak("ROOT: " + sRoot);
if (GetStringLowerCase(sRoot) == "nw_wth")
{
nStackSize = Random(30) + 1;
}
}
object oItem = CreateItemOnObject(sItemTemplate, oTarget, nStackSize);
/*
if (GetIsObjectValid(oItem) == FALSE && sItemTemplate != "NW_IT_GOLD001")
{
@ -154,7 +148,6 @@ void dbCreateItemOnObject(string sItemTemplate, object oTarget = OBJECT_SELF, in
PrintString("*******");
}
}
*/
}
@ -167,16 +160,16 @@ object GetLastOpener()
{
if (GetIsObjectValid(GetLastOpenedBy()) == TRUE)
{
//dbSpeak("LastOpener: GetLastOpenedBy " + GetTag(GetLastOpenedBy()));
dbSpeak("LastOpener: GetLastOpenedBy " + GetTag(GetLastOpenedBy()));
return GetLastOpenedBy();
}
else
if (GetIsObjectValid(GetLastKiller()) == TRUE)
{
//dbSpeak("LastOpener: GetLastAttacker");
dbSpeak("LastOpener: GetLastAttacker");
return GetLastKiller();
}
//dbSpeak("LastOpener: The Object is Invalid you weenie!");
dbSpeak("LastOpener: The Object is Invalid you weenie!");
return OBJECT_INVALID;
}
@ -207,9 +200,9 @@ int GetRange(int nCategory, int nHD)
case 1: nMin = RANGE_1_MIN; nMax = RANGE_1_MAX; break;
}
//dbSpeak("nMin = " + IntToString(nMin));
//dbSpeak("nMax = " + IntToString(nMax));
//dbSpeak("GetRange.nHD = " + IntToString(nHD));
dbSpeak("nMin = " + IntToString(nMin));
dbSpeak("nMax = " + IntToString(nMax));
dbSpeak("GetRange.nHD = " + IntToString(nHD));
if (nHD >= nMin && nHD <= nMax)
{
return TRUE;
@ -319,7 +312,7 @@ int GetNumberOfItems(int nTreasureType)
{
sRes = "NW_IT_BOOK0" + IntToString(nBook1);
}
//dbSpeak("Create book");
dbSpeak("Create book");
dbCreateItemOnObject(sRes, oTarget);
}
@ -334,7 +327,7 @@ int GetNumberOfItems(int nTreasureType)
case 2: sRes = "NW_IT_MMIDMISC05"; break;
case 3: sRes = "NW_IT_MMIDMISC06"; break;
}
//dbSpeak("animal");
dbSpeak("animal");
dbCreateItemOnObject(sRes, oTarget);
}
@ -353,7 +346,7 @@ int GetNumberOfItems(int nTreasureType)
case 5: sRes = "NW_IT_MPOTION022"; break; // spirits
case 6: sRes = "NW_IT_TORCH001"; break; //torch
}
//dbSpeak("CreateJunk");
dbSpeak("CreateJunk");
dbCreateItemOnObject(sRes, oTarget);
}
// *
@ -399,7 +392,7 @@ int GetNumberOfItems(int nTreasureType)
{
nAmount = 1;
}
//dbSpeak("gold");
dbSpeak("gold");
dbCreateItemOnObject("NW_IT_GOLD001", oTarget, nAmount);
}
void CreateGem(object oTarget, object oAdventurer, int nTreasureType, int nModifier = 0)
@ -483,7 +476,7 @@ int GetNumberOfItems(int nTreasureType)
case 8: sGem = "nw_it_gem012"; break;
}
}
//dbSpeak("Create Gem");
dbSpeak("Create Gem");
dbCreateItemOnObject(sGem, oTarget, 1);
}
void CreateJewel(object oTarget, object oAdventurer, int nTreasureType, int nModifier = 0)
@ -554,7 +547,7 @@ int GetNumberOfItems(int nTreasureType)
case 5: case 6: sJewel = "nw_it_mneck022"; break;
}
}
//dbSpeak("Create Jewel");
dbSpeak("Create Jewel");
dbCreateItemOnObject(sJewel, oTarget, 1);
@ -704,7 +697,7 @@ int GetNumberOfItems(int nTreasureType)
case 7: sScroll = "nw_it_spdvscr702"; break;
}
}
//dbSpeak("Divine Scroll");
dbSpeak("Divine Scroll");
dbCreateItemOnObject(sScroll, oTarget, 1);
@ -791,7 +784,7 @@ int GetNumberOfItems(int nTreasureType)
case 20: sAmmo = "nw_wammbu007"; break;
}
}
//dbSpeak("ammo");
dbSpeak("ammo");
dbCreateItemOnObject(sAmmo, oTarget, Random(30) + 1); // create up to 30 of the specified ammo type
}
@ -942,7 +935,7 @@ int GetNumberOfItems(int nTreasureType)
}
}
//dbSpeak("Create Trapkit");
dbSpeak("Create Trapkit");
dbCreateItemOnObject(sKit, oTarget, 1);
}
@ -1008,7 +1001,7 @@ int GetNumberOfItems(int nTreasureType)
}
}
//dbSpeak("Create Healing Kit");
dbSpeak("Create Healing Kit");
dbCreateItemOnObject(sKit, oTarget, 1);
@ -1083,7 +1076,7 @@ int GetNumberOfItems(int nTreasureType)
}
}
//dbSpeak("Create Lockpick");
dbSpeak("Create Lockpick");
dbCreateItemOnObject(sKit, oTarget, 1);
@ -1220,7 +1213,7 @@ int GetNumberOfItems(int nTreasureType)
case 29: sPotion = "nw_it_mpotion006"; break;
}
}
//dbSpeak("Create Potion");
dbSpeak("Create Potion");
dbCreateItemOnObject(sPotion, oTarget, 1);
}
//::///////////////////////////////////////////////
@ -1483,7 +1476,7 @@ int GetNumberOfItems(int nTreasureType)
case 30: sItem = "nw_it_mneck018"; break;
}
}
//dbSpeak("Create Misc");
dbSpeak("Create Misc");
dbCreateItemOnObject(sItem, oTarget, 1);
}
@ -1543,7 +1536,7 @@ int GetNumberOfItems(int nTreasureType)
else
if (GetLevelByClass(CLASS_TYPE_MONK, oAdventurer)>= 1)
{
//dbSpeak("in monk function");
dbSpeak("in monk function");
if (nSpecific == 0)
{
CreateGenericMonkWeapon(oTarget, oAdventurer);
@ -1638,7 +1631,7 @@ int GetNumberOfItems(int nTreasureType)
}
}
//dbSpeak("Generic Rod staff wand");
dbSpeak("Generic Rod staff wand");
dbCreateItemOnObject(sItem, oTarget, 1);
}
@ -1754,7 +1747,7 @@ int GetNumberOfItems(int nTreasureType)
case 13: sItem = "nw_waxmhn011"; break;
}
}
//dbSpeak("Generic Monk Weapon");
dbSpeak("Generic Monk Weapon");
dbCreateItemOnObject(sItem, oTarget, 1);
}
@ -1895,7 +1888,7 @@ int GetNumberOfItems(int nTreasureType)
}
}
//dbSpeak("Specific Monk Weapon");
dbSpeak("Specific Monk Weapon");
dbCreateItemOnObject(sItem, oTarget, 1);
@ -2011,7 +2004,7 @@ int GetNumberOfItems(int nTreasureType)
}
}
//dbSpeak("Generic Druid weapon");
dbSpeak("Generic Druid weapon");
dbCreateItemOnObject(sItem, oTarget, 1);
@ -2089,7 +2082,7 @@ int GetNumberOfItems(int nTreasureType)
}
}
//dbSpeak("specific druid weapon");
dbSpeak("specific druid weapon");
dbCreateItemOnObject(sItem, oTarget, 1);
@ -2175,7 +2168,7 @@ int GetNumberOfItems(int nTreasureType)
}
}
//dbSpeak("Generic Wizard or Sorcerer Weapon");
dbSpeak("Generic Wizard or Sorcerer Weapon");
dbCreateItemOnObject(sItem, oTarget, 1);
@ -2248,7 +2241,7 @@ int GetNumberOfItems(int nTreasureType)
}
}
//dbSpeak("Specific Wizard or Sorcerer Weapon");
dbSpeak("Specific Wizard or Sorcerer Weapon");
dbCreateItemOnObject(sItem, oTarget, 1);
@ -2417,7 +2410,7 @@ int GetNumberOfItems(int nTreasureType)
}
}
//dbSpeak("Create Generic SImple; Specific = " + IntToString(nModifier));
dbSpeak("Create Generic SImple; Specific = " + IntToString(nModifier));
dbCreateItemOnObject(sItem, oTarget, 1);
}
@ -2601,7 +2594,7 @@ int GetNumberOfItems(int nTreasureType)
}
//dbSpeak("Create Generic Martial");
dbSpeak("Create Generic Martial");
dbCreateItemOnObject(sItem, oTarget, 1);
}
@ -2733,7 +2726,7 @@ int GetNumberOfItems(int nTreasureType)
}
}
//dbSpeak("Create generic exotic");
dbSpeak("Create generic exotic");
dbCreateItemOnObject(sItem, oTarget, 1);
}
@ -2832,7 +2825,7 @@ int GetNumberOfItems(int nTreasureType)
}
}
//dbSpeak("Create Generic light");
dbSpeak("Create Generic light");
dbCreateItemOnObject(sItem, oTarget, 1);
}
@ -2959,7 +2952,7 @@ int GetNumberOfItems(int nTreasureType)
}
}
//dbSpeak("Create Generic medium");
dbSpeak("Create Generic medium");
dbCreateItemOnObject(sItem, oTarget, 1);
}
@ -3065,7 +3058,7 @@ int GetNumberOfItems(int nTreasureType)
}
}
// dbSpeak("Create Generic heavy");
dbSpeak("Create Generic heavy");
dbCreateItemOnObject(sItem, oTarget, 1);
}
@ -4014,7 +4007,7 @@ int GetNumberOfItems(int nTreasureType)
// * if nSpecific is = 1 then spawn in 'named' items at the higher levels
void CreateTable2Item(object oTarget, object oAdventurer, int nSpecific=0)
{
//dbSpeak("In CreateTable2Item");
dbSpeak("In CreateTable2Item");
string sItem = "";
int nProbMisc = 0;
int nProbClass = 0;
@ -4049,12 +4042,9 @@ int GetNumberOfItems(int nTreasureType)
//* SETUP probabilities based on Class
if ( nClass == CLASS_TYPE_FIGHTER || nClass == CLASS_TYPE_PALADIN || nSpecialRanger == 1
|| nClass == CLASS_TYPE_ANTI_PALADIN || nClass == CLASS_TYPE_BRAWLER || nClass == CLASS_TYPE_CRUSADER
|| nClass == CLASS_TYPE_DUSKBLADE || nClass == CLASS_TYPE_KNIGHT || nClass == CLASS_TYPE_MARSHAL
|| nClass == CLASS_TYPE_PSYWAR || nClass == CLASS_TYPE_SOHEI)
if ( nClass == CLASS_TYPE_FIGHTER || nClass == CLASS_TYPE_PALADIN || nSpecialRanger == 1)
{
//dbSpeak("I am fighter or paladin or heavy ranger");
dbSpeak("I am fighter or paladin or heavy ranger");
nProbMisc = 20;
nProbClass = 0;
nProbRodStaffWand = 5;
@ -4068,7 +4058,7 @@ int GetNumberOfItems(int nTreasureType)
else
if (nClass == CLASS_TYPE_WIZARD || nClass == CLASS_TYPE_SORCERER)
{
//dbSpeak("I am wizard or sorcerer");
dbSpeak("I am wizard or sorcerer");
nProbMisc = 40;
nProbClass = 30;
nProbRodStaffWand = 15;
@ -4080,10 +4070,9 @@ int GetNumberOfItems(int nTreasureType)
nProbHeavy = 2;
}
else
if (nClass == CLASS_TYPE_BARBARIAN || nSpecialRanger == 2 || nClass == CLASS_TYPE_BOWMAN
|| nClass == CLASS_TYPE_HEXBLADE || nClass == CLASS_TYPE_WARBLADE)
if (nClass == CLASS_TYPE_BARBARIAN || nSpecialRanger == 2)
{
//dbSpeak("I am barbarian or light ranger");
dbSpeak("I am barbarian or light ranger");
nProbMisc = 20;
nProbClass = 0;
@ -4096,97 +4085,9 @@ int GetNumberOfItems(int nTreasureType)
nProbHeavy = 3;
}
else
if (nClass == CLASS_TYPE_ARCHIVIST || nClass == CLASS_TYPE_DRAGON_SHAMAN || nClass == CLASS_TYPE_FAVOURED_SOUL
|| nClass == CLASS_TYPE_MYSTIC || nClass == CLASS_TYPE_WARMAGE || nClass == CLASS_TYPE_TEMPLAR)
{
//type 1
nProbMisc = 25;
nProbClass = 0;
nProbRodStaffWand = 15;
nProbSimple = 15;
nProbMartial = 8;
nProbExotic = 6;
nProbLight = 15;
nProbMedium = 10;
nProbHeavy = 6;
}
else
if (nClass == CLASS_TYPE_NOBLE || nClass == CLASS_TYPE_SWASHBUCKLER || nClass == CLASS_TYPE_SWORDSAGE
|| nClass == CLASS_TYPE_ULTIMATE_RANGER)
{
//type 2
nProbMisc = 27;
nProbClass = 0;
nProbRodStaffWand = 5;
nProbSimple = 15;
nProbMartial = 20;
nProbExotic = 10;
nProbLight = 10;
nProbMedium = 8;
nProbHeavy = 5;
}
else
if (nClass == CLASS_TYPE_BEGUILER || nClass == CLASS_TYPE_DREAD_NECROMANCER || nClass == CLASS_TYPE_HEALER
|| nClass == CLASS_TYPE_SCOUT || nClass == CLASS_TYPE_SHAMAN || nClass == CLASS_TYPE_SOULKNIFE
|| nClass == CLASS_TYPE_TRUENAMER || nClass == CLASS_TYPE_WARLOCK || nClass == CLASS_TYPE_WILDER)
{
//type 3
nProbMisc = 45;
nProbClass = 0;
nProbRodStaffWand = 7;
nProbSimple = 15;
nProbMartial = 5;
nProbExotic = 5;
nProbLight = 15;
nProbMedium = 4;
nProbHeavy = 4;
}
else
if (nClass == CLASS_TYPE_DRAGONFIRE_ADEPT || nClass == CLASS_TYPE_PSION || nClass == CLASS_TYPE_WITCH)
{
//type 4
nProbMisc = 50;
nProbClass = 0;
nProbRodStaffWand = 10;
nProbSimple = 20;
nProbMartial = 5;
nProbExotic = 5;
nProbLight = 4;
nProbMedium = 3;
nProbHeavy = 3;
}
else
if (nClass == CLASS_TYPE_NINJA)
{
//type 5
nProbMisc = 45;
nProbClass = 0;
nProbRodStaffWand = 2;
nProbSimple = 12;
nProbMartial = 6;
nProbExotic = 26;
nProbLight = 3;
nProbMedium = 3;
nProbHeavy = 3;
}
else
if (nClass == CLASS_TYPE_CW_SAMURAI || nClass == CLASS_TYPE_SAMURAI)
{
//type 6
nProbMisc = 25;
nProbClass = 0;
nProbRodStaffWand = 5;
nProbSimple = 5;
nProbMartial = 10;
nProbExotic = 20;
nProbLight = 10;
nProbMedium = 20;
nProbHeavy = 5;
}
else
if (nClass == CLASS_TYPE_CLERIC)
{
//dbSpeak("I am cleric");
dbSpeak("I am cleric");
nProbMisc = 20;
nProbClass = 10;
@ -4201,7 +4102,7 @@ int GetNumberOfItems(int nTreasureType)
else
if (nClass == CLASS_TYPE_DRUID)
{
//dbSpeak("I am druid");
dbSpeak("I am druid");
nProbMisc = 20;
nProbClass = 25;
@ -4216,7 +4117,7 @@ int GetNumberOfItems(int nTreasureType)
else
if (nClass == CLASS_TYPE_MONK)
{
//dbSpeak("I am monk");
dbSpeak("I am monk");
nProbMisc = 20;
nProbClass = 50;
nProbRodStaffWand = 2;
@ -4228,9 +4129,9 @@ int GetNumberOfItems(int nTreasureType)
nProbHeavy = 4;
}
else
if (nClass == CLASS_TYPE_ROGUE || nClass == CLASS_TYPE_PSYCHIC_ROGUE)
if (nClass == CLASS_TYPE_ROGUE)
{
//dbSpeak("I am rogue");
dbSpeak("I am rogue");
nProbMisc = 25;
nProbClass = 10;
@ -4245,7 +4146,7 @@ int GetNumberOfItems(int nTreasureType)
else
if (nClass == CLASS_TYPE_BARD)
{
//dbSpeak("I am bard");
dbSpeak("I am bard");
nProbMisc = 25;
nProbClass = 5;
@ -4257,11 +4158,11 @@ int GetNumberOfItems(int nTreasureType)
nProbMedium = 5;
nProbHeavy = 5;
}
//else
//{
// dbSpeak("No Valid Class");
//}
//dbSpeak("Table2Item: After Class Distribution");
else
{
dbSpeak("No Valid Class");
}
dbSpeak("Table2Item: After Class Distribution");
//* Create Items based on Probabilities
int nRandom = d100();
if (nRandom <= nProbMisc)
@ -4318,10 +4219,10 @@ int GetNumberOfItems(int nTreasureType)
if (nSpecific == 0) CreateGenericHeavyArmor(oTarget, oAdventurer);
else CreateSpecificHeavyArmor(oTarget, oAdventurer);
}
//else
//{
// dbSpeak("Generic Generic or Specific; error: 3524");
//}
else
{
dbSpeak("Generic Generic or Specific; error: 3524");
}
}
//::///////////////////////////////////////////////
@ -4350,12 +4251,12 @@ int GetNumberOfItems(int nTreasureType)
void GenerateTreasure(int nTreasureType, object oLastOpener, object oCreateOn)
{
//dbSpeak("*********************NEW TREASURE*************************");
dbSpeak("*********************NEW TREASURE*************************");
// * abort treasure if no one opened the container
if (GetIsObjectValid(oLastOpener) == FALSE)
{
//dbSpeak("Aborted. No valid Last Opener");
dbSpeak("Aborted. No valid Last Opener");
return;
}
@ -4433,7 +4334,7 @@ void GenerateTreasure(int nTreasureType, object oLastOpener, object oCreateOn)
nProbTable2 = HIGH_PROB_TABLE2;
}
else if (nTreasureType == TREASURE_BOSS)
{ //dbSpeak("boss");
{ dbSpeak("boss");
nProbTable2 = 100;
nSpecific = 1;
}
@ -4444,7 +4345,7 @@ void GenerateTreasure(int nTreasureType, object oLastOpener, object oCreateOn)
nProbDivine = 4;
}
//dbSpeak("Generate Treasure nSpecific = " + IntToString(nSpecific));
dbSpeak("Generate Treasure nSpecific = " + IntToString(nSpecific));
for (i = 1; i <= nNumberItems; i++)
{
@ -4475,8 +4376,8 @@ void GenerateTreasure(int nTreasureType, object oLastOpener, object oCreateOn)
{
CreateTable2Item(oCreateOn, oLastOpener, nSpecific); // * Weapons, Armor, Misc - Class based
}
//else
// dbSpeak("other stuff");
else
dbSpeak("other stuff");
@ -4484,23 +4385,23 @@ void GenerateTreasure(int nTreasureType, object oLastOpener, object oCreateOn)
}
void GenerateLowTreasure(object oLastOpener, object oCreateOn=OBJECT_INVALID)
{
GenerateTreasure(TREASURE_LOW, oLastOpener, oCreateOn);
//GenerateTreasure(TREASURE_LOW, oLastOpener, oCreateOn);
}
void GenerateMediumTreasure(object oLastOpener, object oCreateOn=OBJECT_INVALID)
{
GenerateTreasure(TREASURE_MEDIUM, oLastOpener, oCreateOn);
//GenerateTreasure(TREASURE_MEDIUM, oLastOpener, oCreateOn);
}
void GenerateHighTreasure(object oLastOpener, object oCreateOn=OBJECT_INVALID)
{
GenerateTreasure(TREASURE_HIGH, oLastOpener, oCreateOn);
//GenerateTreasure(TREASURE_HIGH, oLastOpener, oCreateOn);
}
void GenerateBossTreasure(object oLastOpener, object oCreateOn=OBJECT_INVALID)
{
GenerateTreasure(TREASURE_BOSS, oLastOpener, oCreateOn);
//GenerateTreasure(TREASURE_BOSS, oLastOpener, oCreateOn);
}
void GenerateBookTreasure(object oLastOpener, object oCreateOn=OBJECT_INVALID)
{
GenerateTreasure(TREASURE_BOOK, oLastOpener, oCreateOn);
//GenerateTreasure(TREASURE_BOOK, oLastOpener, oCreateOn);
}
//::///////////////////////////////////////////////
//:: GenerateNPCTreasure
@ -4542,23 +4443,23 @@ void GenerateNPCTreasure(int nTreasureValue=1, object oTreasureGetter=OBJECT_SEL
// if a creature
if (Random(100)+1 >= 75)
{
GenerateTreasure(TREASURE_LOW, oTreasureGetter, oKiller);
//GenerateTreasure(TREASURE_LOW, oTreasureGetter, oKiller);
}
}
else
if (nTreasureValue == 2)
{
GenerateTreasure(TREASURE_MEDIUM, oTreasureGetter, oKiller);
//GenerateTreasure(TREASURE_MEDIUM, oTreasureGetter, oKiller);
}
else
if (nTreasureValue == 3)
{
GenerateTreasure(TREASURE_HIGH, oTreasureGetter, oKiller);
//GenerateTreasure(TREASURE_HIGH, oTreasureGetter, oKiller);
}
else
if (nTreasureValue == 4)
{
GenerateBossTreasure(oKiller, oTreasureGetter);
//GenerateBossTreasure(oKiller, oTreasureGetter);
}
}
@ -4617,47 +4518,6 @@ void ShoutDisturbed()
}
}
int nGetIsBaseClass(int nClass)
{
return (nClass <= CLASS_TYPE_WIZARD ||
nClass == CLASS_TYPE_ANTI_PALADIN ||
nClass == CLASS_TYPE_ARCHIVIST ||
nClass == CLASS_TYPE_BEGUILER ||
nClass == CLASS_TYPE_BOWMAN ||
nClass == CLASS_TYPE_BRAWLER ||
nClass == CLASS_TYPE_CRUSADER ||
nClass == CLASS_TYPE_DRAGON_SHAMAN ||
nClass == CLASS_TYPE_DRAGONFIRE_ADEPT ||
nClass == CLASS_TYPE_DREAD_NECROMANCER ||
nClass == CLASS_TYPE_DUSKBLADE ||
nClass == CLASS_TYPE_FAVOURED_SOUL ||
nClass == CLASS_TYPE_HEALER ||
nClass == CLASS_TYPE_HEXBLADE ||
nClass == CLASS_TYPE_KNIGHT ||
nClass == CLASS_TYPE_MARSHAL ||
nClass == CLASS_TYPE_MYSTIC ||
nClass == CLASS_TYPE_NINJA ||
nClass == CLASS_TYPE_NOBLE ||
nClass == CLASS_TYPE_PSION ||
nClass == CLASS_TYPE_PSYWAR ||
nClass == CLASS_TYPE_PSYCHIC_ROGUE ||
nClass == CLASS_TYPE_SAMURAI ||
nClass == CLASS_TYPE_CW_SAMURAI ||
nClass == CLASS_TYPE_SCOUT ||
nClass == CLASS_TYPE_SHAMAN ||
nClass == CLASS_TYPE_SOHEI ||
nClass == CLASS_TYPE_SOULKNIFE ||
nClass == CLASS_TYPE_SWASHBUCKLER ||
nClass == CLASS_TYPE_SWORDSAGE ||
nClass == CLASS_TYPE_TRUENAMER ||
nClass == CLASS_TYPE_ULTIMATE_RANGER ||
nClass == CLASS_TYPE_WARBLADE ||
nClass == CLASS_TYPE_WARLOCK ||
nClass == CLASS_TYPE_WARMAGE ||
nClass == CLASS_TYPE_WILDER ||
nClass == CLASS_TYPE_WITCH ||
nClass == CLASS_TYPE_TEMPLAR);
}
//::///////////////////////////////////////////////
//:: Determine Class to Use
@ -4676,96 +4536,35 @@ int nDetermineClassToUse(object oCharacter)
{
int nClass;
int nTotal = GetHitDice(oCharacter);
//dbSpeak("Hit dice " + IntToString(nTotal));
dbSpeak("Hit dice " + IntToString(nTotal));
if (nTotal < 1)
{
nTotal = 1;
}
/*
float fTotal = IntToFloat(nTotal);
//if (GetIsObjectValid(oCharacter) == FALSE)
//{
// dbSpeak("DetermineClassToUse: This character is invalid");
//}
if (GetIsObjectValid(oCharacter) == FALSE)
{
dbSpeak("DetermineClassToUse: This character is invalid");
}
int nClass1 = GetClassByPosition(1, oCharacter);
int nState1 = FloatToInt((IntToFloat(GetLevelByClass(nClass1, oCharacter)) / fTotal) * 100);
//dbSpeak("Level 1 Class Level = " + IntToString(GetLevelByClass(nClass1,oCharacter)));
dbSpeak("Level 1 Class Level = " + IntToString(GetLevelByClass(nClass1,oCharacter)));
//PrintString("GENERIC SCRIPT DEBUG STRING ********** " + GetTag(oCharacter) + "Class 1 " + IntToString(nState1));
//dbSpeak("State 1 " + IntToString(nState1));
PrintString("GENERIC SCRIPT DEBUG STRING ********** " + GetTag(oCharacter) + "Class 1 " + IntToString(nState1));
dbSpeak("State 1 " + IntToString(nState1));
int nClass2 = GetClassByPosition(2, oCharacter);
int nState2 = FloatToInt((IntToFloat(GetLevelByClass(nClass2, oCharacter)) / fTotal) * 100) + nState1;
//PrintString("GENERIC SCRIPT DEBUG STRING ********** " + GetTag(oCharacter) + "Class 2 " + IntToString(nState2));
PrintString("GENERIC SCRIPT DEBUG STRING ********** " + GetTag(oCharacter) + "Class 2 " + IntToString(nState2));
int nClass3 = GetClassByPosition(3, oCharacter);
int nState3 = FloatToInt((IntToFloat(GetLevelByClass(nClass3, oCharacter)) / fTotal) * 100) + nState2;
//PrintString("GENERIC SCRIPT DEBUG STRING ********** " + GetTag(oCharacter) + "Class 3 " + IntToString(nState3));
*/
int nClass1 = GetClassByPosition(1, oCharacter);
int nClass2 = GetClassByPosition(2, oCharacter);
int nClass3 = GetClassByPosition(3, oCharacter);
int nClass4 = GetClassByPosition(4, oCharacter);
int nClass5 = GetClassByPosition(5, oCharacter);
int nClass6 = GetClassByPosition(6, oCharacter);
int nClass7 = GetClassByPosition(7, oCharacter);
int nClass8 = GetClassByPosition(8, oCharacter);
int nState1 = GetLevelByClass(nClass1, oCharacter) * 100 / nTotal;
int nState2 = GetLevelByClass(nClass2, oCharacter) * 100 / nTotal + nState1;
int nState3 = GetLevelByClass(nClass3, oCharacter) * 100 / nTotal + nState2;
int nState4 = GetLevelByClass(nClass4, oCharacter) * 100 / nTotal + nState3;
int nState5 = GetLevelByClass(nClass5, oCharacter) * 100 / nTotal + nState4;
int nState6 = GetLevelByClass(nClass6, oCharacter) * 100 / nTotal + nState5;
int nState7 = GetLevelByClass(nClass7, oCharacter) * 100 / nTotal + nState6;
// nState8 will always be 100 if there is an eigth class, or 0 if there isn't
//int nState8 = GetLevelByClass(nClass3, oCharacter) * 100 / nTotal + nState7;
// correct for unrecognized classes - assumes the first class will be a non-prestige player class
if(nClass2 != CLASS_TYPE_INVALID && !nGetIsBaseClass(nClass2))
{
nClass2 = CLASS_TYPE_INVALID;
nState1 = nState2;
}
if(nClass3 != CLASS_TYPE_INVALID && !nGetIsBaseClass(nClass3))
{
nClass3 = CLASS_TYPE_INVALID;
nState1 = nState3;
}
if(nClass4 != CLASS_TYPE_INVALID && !nGetIsBaseClass(nClass4))
{
nClass4 = CLASS_TYPE_INVALID;
nState1 = nState4;
}
if(nClass5 != CLASS_TYPE_INVALID && !nGetIsBaseClass(nClass5))
{
nClass5 = CLASS_TYPE_INVALID;
nState1 = nState5;
}
if(nClass6 != CLASS_TYPE_INVALID && !nGetIsBaseClass(nClass6))
{
nClass6 = CLASS_TYPE_INVALID;
nState1 = nState6;
}
if(nClass7 != CLASS_TYPE_INVALID && !nGetIsBaseClass(nClass7))
{
nClass7 = CLASS_TYPE_INVALID;
nState1 = nState7;
}
if(nClass8 != CLASS_TYPE_INVALID && !nGetIsBaseClass(nClass8))
{
nClass8 = CLASS_TYPE_INVALID;
if(nClass7 != CLASS_TYPE_INVALID)
nState7 = 100;
else nState1 = 100;
}
PrintString("GENERIC SCRIPT DEBUG STRING ********** " + GetTag(oCharacter) + "Class 3 " + IntToString(nState3));
int nUseClass = d100();
//PrintString("GENERIC SCRIPT DEBUG STRING ********** " + "D100 Roll " +IntToString(nUseClass));
PrintString("GENERIC SCRIPT DEBUG STRING ********** " + "D100 Roll " +IntToString(nUseClass));
//dbSpeak("Before comparison : " + IntToString(nClass1));
dbSpeak("Before comparison : " + IntToString(nClass1));
if(nUseClass <= nState1)
{
nClass = nClass1;
@ -4776,16 +4575,11 @@ int nDetermineClassToUse(object oCharacter)
}
else
{
// might be possible to end up here by accident because of a rounding error
// so just in case...
if(nClass3 == CLASS_TYPE_INVALID) nClass = nClass1;
else nClass = nClass3;
nClass = nClass3;
}
//dbSpeak("Class from determineClass " + IntToString(nClass));
dbSpeak("Class from determineClass " + IntToString(nClass));
return nClass;
}
//:: Test Void
//void main () {}

View File

@ -402,6 +402,7 @@ int Vile_Feat(int iTypeWeap)
case BASE_ITEM_LONGSWORD: return GetHasFeat(FEAT_VILE_MARTIAL_LONGSWORD);
case BASE_ITEM_MORNINGSTAR: return GetHasFeat(FEAT_VILE_MARTIAL_MORNINGSTAR);
case BASE_ITEM_QUARTERSTAFF: return GetHasFeat(FEAT_VILE_MARTIAL_QUARTERSTAFF);
case BASE_ITEM_MAGICSTAFF: return GetHasFeat(FEAT_VILE_MARTIAL_QUARTERSTAFF);
case BASE_ITEM_RAPIER: return GetHasFeat(FEAT_VILE_MARTIAL_RAPIER);
case BASE_ITEM_SCIMITAR: return GetHasFeat(FEAT_VILE_MARTIAL_SCIMITAR);
case BASE_ITEM_SCYTHE: return GetHasFeat(FEAT_VILE_MARTIAL_SCYTHE);
@ -482,6 +483,7 @@ int GetSanctifedMartialFeat(int iTypeWeap)
case BASE_ITEM_LONGSWORD: return FEAT_SANCTIFY_MARTIAL_LONGSWORD;
case BASE_ITEM_MORNINGSTAR: return FEAT_SANCTIFY_MARTIAL_MORNINGSTAR;
case BASE_ITEM_QUARTERSTAFF: return FEAT_SANCTIFY_MARTIAL_QUARTERSTAFF;
case BASE_ITEM_MAGICSTAFF: return FEAT_SANCTIFY_MARTIAL_QUARTERSTAFF;
case BASE_ITEM_RAPIER: return FEAT_SANCTIFY_MARTIAL_RAPIER;
case BASE_ITEM_SCIMITAR: return FEAT_SANCTIFY_MARTIAL_SCIMITAR;
case BASE_ITEM_SCYTHE: return FEAT_SANCTIFY_MARTIAL_SCYTHE;
@ -555,6 +557,7 @@ int Sanctify_Feat(int iTypeWeap)
case BASE_ITEM_LONGSWORD: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_LONGSWORD);
case BASE_ITEM_MORNINGSTAR: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_MORNINGSTAR);
case BASE_ITEM_QUARTERSTAFF: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_QUARTERSTAFF);
case BASE_ITEM_MAGICSTAFF: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_QUARTERSTAFF);
case BASE_ITEM_RAPIER: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_RAPIER);
case BASE_ITEM_SCIMITAR: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_SCIMITAR);
case BASE_ITEM_SCYTHE: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_SCYTHE);

View File

@ -1082,6 +1082,7 @@ int GetIsTwoHandedMeleeWeaponType(int iWeaponType)
case BASE_ITEM_HEAVYFLAIL: return TRUE;
case BASE_ITEM_SCYTHE: return TRUE;
case BASE_ITEM_QUARTERSTAFF: return TRUE;
case BASE_ITEM_MAGICSTAFF: return TRUE;
case BASE_ITEM_ELVEN_COURTBLADE: return TRUE;
case BASE_ITEM_MAUL: return TRUE;
case BASE_ITEM_FALCHION: return TRUE;
@ -1130,6 +1131,7 @@ int GetIsSimpleWeaponType(int iWeaponType)
{
case BASE_ITEM_MORNINGSTAR: return 1;
case BASE_ITEM_QUARTERSTAFF: return 1;
case BASE_ITEM_MAGICSTAFF: return 1;
case BASE_ITEM_SHORTSPEAR: return 1;
case BASE_ITEM_HEAVYCROSSBOW: return 1;
case BASE_ITEM_INVALID: return 1;
@ -1562,6 +1564,19 @@ struct WeaponFeat GetAllFeatsOfWeaponType(int iWeaponType)
sFeat.VileMartialStrike = FEAT_VILE_MARTIAL_QUARTERSTAFF;
break;
}
case BASE_ITEM_MAGICSTAFF: {
sFeat.Focus = FEAT_WEAPON_FOCUS_STAFF;
sFeat.Specialization = FEAT_WEAPON_SPECIALIZATION_STAFF;
sFeat.EpicFocus = FEAT_EPIC_WEAPON_FOCUS_QUARTERSTAFF;
sFeat.EpicSpecialization = FEAT_EPIC_WEAPON_SPECIALIZATION_QUARTERSTAFF;
sFeat.ImprovedCritical = FEAT_IMPROVED_CRITICAL_STAFF;
sFeat.OverwhelmingCritical = FEAT_EPIC_OVERWHELMING_CRITICAL_QUARTERSTAFF;
sFeat.DevastatingCritical = FEAT_EPIC_DEVASTATING_CRITICAL_QUARTERSTAFF;
sFeat.WeaponOfChoice = FEAT_WEAPON_OF_CHOICE_QUARTERSTAFF;
sFeat.SanctifyMartialStrike = FEAT_SANCTIFY_MARTIAL_QUARTERSTAFF;
sFeat.VileMartialStrike = FEAT_VILE_MARTIAL_QUARTERSTAFF;
break;
}
case BASE_ITEM_RAPIER: {
sFeat.Focus = FEAT_WEAPON_FOCUS_RAPIER;
sFeat.Specialization = FEAT_WEAPON_SPECIALIZATION_RAPIER;

View File

@ -248,6 +248,7 @@ int GetFocusFeatOfWeaponType(int iWeaponType)
case BASE_ITEM_LONGSWORD: return FEAT_WEAPON_FOCUS_LONG_SWORD;
case BASE_ITEM_MORNINGSTAR: return FEAT_WEAPON_FOCUS_MORNING_STAR;
case BASE_ITEM_QUARTERSTAFF: return FEAT_WEAPON_FOCUS_STAFF;
case BASE_ITEM_MAGICSTAFF: return FEAT_WEAPON_FOCUS_STAFF;
case BASE_ITEM_RAPIER: return FEAT_WEAPON_FOCUS_RAPIER;
case BASE_ITEM_SCIMITAR: return FEAT_WEAPON_FOCUS_SCIMITAR;
case BASE_ITEM_SCYTHE: return FEAT_WEAPON_FOCUS_SCYTHE;
@ -318,6 +319,7 @@ int GetSpecializationFeatOfWeaponType(int iWeaponType)
case BASE_ITEM_LONGSWORD: return FEAT_WEAPON_SPECIALIZATION_LONG_SWORD;
case BASE_ITEM_MORNINGSTAR: return FEAT_WEAPON_SPECIALIZATION_MORNING_STAR;
case BASE_ITEM_QUARTERSTAFF: return FEAT_WEAPON_SPECIALIZATION_STAFF;
case BASE_ITEM_MAGICSTAFF: return FEAT_WEAPON_SPECIALIZATION_STAFF;
case BASE_ITEM_RAPIER: return FEAT_WEAPON_SPECIALIZATION_RAPIER;
case BASE_ITEM_SCIMITAR: return FEAT_WEAPON_SPECIALIZATION_SCIMITAR;
case BASE_ITEM_SCYTHE: return FEAT_WEAPON_SPECIALIZATION_SCYTHE;
@ -388,6 +390,7 @@ int GetEpicFocusFeatOfWeaponType(int iWeaponType)
case BASE_ITEM_LONGSWORD: return FEAT_EPIC_WEAPON_FOCUS_LONGSWORD;
case BASE_ITEM_MORNINGSTAR: return FEAT_EPIC_WEAPON_FOCUS_MORNINGSTAR;
case BASE_ITEM_QUARTERSTAFF: return FEAT_EPIC_WEAPON_FOCUS_QUARTERSTAFF;
case BASE_ITEM_MAGICSTAFF: return FEAT_EPIC_WEAPON_FOCUS_QUARTERSTAFF;
case BASE_ITEM_RAPIER: return FEAT_EPIC_WEAPON_FOCUS_RAPIER;
case BASE_ITEM_SCIMITAR: return FEAT_EPIC_WEAPON_FOCUS_SCIMITAR;
case BASE_ITEM_SCYTHE: return FEAT_EPIC_WEAPON_FOCUS_SCYTHE;
@ -458,6 +461,7 @@ int GetEpicSpecializationFeatOfWeaponType(int iWeaponType)
case BASE_ITEM_LONGSWORD: return FEAT_EPIC_WEAPON_SPECIALIZATION_LONGSWORD;
case BASE_ITEM_MORNINGSTAR: return FEAT_EPIC_WEAPON_SPECIALIZATION_MORNINGSTAR;
case BASE_ITEM_QUARTERSTAFF: return FEAT_EPIC_WEAPON_SPECIALIZATION_QUARTERSTAFF;
case BASE_ITEM_MAGICSTAFF: return FEAT_EPIC_WEAPON_SPECIALIZATION_QUARTERSTAFF;
case BASE_ITEM_RAPIER: return FEAT_EPIC_WEAPON_SPECIALIZATION_RAPIER;
case BASE_ITEM_SCIMITAR: return FEAT_EPIC_WEAPON_SPECIALIZATION_SCIMITAR;
case BASE_ITEM_SCYTHE: return FEAT_EPIC_WEAPON_SPECIALIZATION_SCYTHE;
@ -528,6 +532,7 @@ int GetImprovedCriticalFeatOfWeaponType(int iWeaponType)
case BASE_ITEM_LONGSWORD: return FEAT_IMPROVED_CRITICAL_LONG_SWORD;
case BASE_ITEM_MORNINGSTAR: return FEAT_IMPROVED_CRITICAL_MORNING_STAR;
case BASE_ITEM_QUARTERSTAFF: return FEAT_IMPROVED_CRITICAL_STAFF;
case BASE_ITEM_MAGICSTAFF: return FEAT_IMPROVED_CRITICAL_STAFF;
case BASE_ITEM_RAPIER: return FEAT_IMPROVED_CRITICAL_RAPIER;
case BASE_ITEM_SCIMITAR: return FEAT_IMPROVED_CRITICAL_SCIMITAR;
case BASE_ITEM_SCYTHE: return FEAT_IMPROVED_CRITICAL_SCYTHE;
@ -598,6 +603,7 @@ int GetOverwhelmingCriticalFeatOfWeaponType(int iWeaponType)
case BASE_ITEM_LONGSWORD: return FEAT_EPIC_OVERWHELMING_CRITICAL_LONGSWORD;
case BASE_ITEM_MORNINGSTAR: return FEAT_EPIC_OVERWHELMING_CRITICAL_MORNINGSTAR;
case BASE_ITEM_QUARTERSTAFF: return FEAT_EPIC_OVERWHELMING_CRITICAL_QUARTERSTAFF;
case BASE_ITEM_MAGICSTAFF: return FEAT_EPIC_OVERWHELMING_CRITICAL_QUARTERSTAFF;
case BASE_ITEM_RAPIER: return FEAT_EPIC_OVERWHELMING_CRITICAL_RAPIER;
case BASE_ITEM_SCIMITAR: return FEAT_EPIC_OVERWHELMING_CRITICAL_SCIMITAR;
case BASE_ITEM_SCYTHE: return FEAT_EPIC_OVERWHELMING_CRITICAL_SCYTHE;
@ -668,6 +674,7 @@ int GetDevastatingCriticalFeatOfWeaponType(int iWeaponType)
case BASE_ITEM_LONGSWORD: return FEAT_EPIC_DEVASTATING_CRITICAL_LONGSWORD;
case BASE_ITEM_MORNINGSTAR: return FEAT_EPIC_DEVASTATING_CRITICAL_MORNINGSTAR;
case BASE_ITEM_QUARTERSTAFF: return FEAT_EPIC_DEVASTATING_CRITICAL_QUARTERSTAFF;
case BASE_ITEM_MAGICSTAFF: return FEAT_EPIC_DEVASTATING_CRITICAL_QUARTERSTAFF;
case BASE_ITEM_RAPIER: return FEAT_EPIC_DEVASTATING_CRITICAL_RAPIER;
case BASE_ITEM_SCIMITAR: return FEAT_EPIC_DEVASTATING_CRITICAL_SCIMITAR;
case BASE_ITEM_SCYTHE: return FEAT_EPIC_DEVASTATING_CRITICAL_SCYTHE;
@ -729,6 +736,7 @@ int GetWeaponOfChoiceFeatOfWeaponType(int iWeaponType)
case BASE_ITEM_LONGSWORD: return FEAT_WEAPON_OF_CHOICE_LONGSWORD;
case BASE_ITEM_MORNINGSTAR: return FEAT_WEAPON_OF_CHOICE_MORNINGSTAR;
case BASE_ITEM_QUARTERSTAFF: return FEAT_WEAPON_OF_CHOICE_QUARTERSTAFF;
case BASE_ITEM_MAGICSTAFF: return FEAT_WEAPON_OF_CHOICE_QUARTERSTAFF;
case BASE_ITEM_RAPIER: return FEAT_WEAPON_OF_CHOICE_RAPIER;
case BASE_ITEM_SCIMITAR: return FEAT_WEAPON_OF_CHOICE_SCIMITAR;
case BASE_ITEM_SCYTHE: return FEAT_WEAPON_OF_CHOICE_SCYTHE;
@ -787,6 +795,7 @@ int GetWeaponSize(object oWeapon)
case BASE_ITEM_GREATAXE:
case BASE_ITEM_HEAVYFLAIL:
case BASE_ITEM_QUARTERSTAFF:
case BASE_ITEM_MAGICSTAFF:
case BASE_ITEM_SCYTHE:
case BASE_ITEM_SHORTSPEAR:
case BASE_ITEM_ELVEN_COURTBLADE:
@ -823,6 +832,7 @@ int PRCLargeWeaponCheck(int iBaseType, int nSize)
case BASE_ITEM_GREATAXE:
case BASE_ITEM_HEAVYFLAIL:
case BASE_ITEM_QUARTERSTAFF:
case BASE_ITEM_MAGICSTAFF:
case BASE_ITEM_SCYTHE:
case BASE_ITEM_SHORTSPEAR:
case BASE_ITEM_ELVEN_COURTBLADE:

View File

@ -156,6 +156,11 @@ int IsProficient(object oPC, int nBaseItem)
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oPC)
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_WIZARD, oPC);
case BASE_ITEM_MAGICSTAFF:
return GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oPC)
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oPC)
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_WIZARD, oPC);
case BASE_ITEM_RAPIER:
return GetHasFeat(FEAT_WEAPON_PROFICIENCY_RAPIER, oPC)
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oPC)

View File

@ -1,113 +0,0 @@
//::///////////////////////////////////////////////
//:: NUI Constants
//:: prc_nui_consts
//:://////////////////////////////////////////////
/*
This file holds all the constants used by the various PRC NUI scripts.
*/
//:://////////////////////////////////////////////
//:: Created By: Rakiov
//:: Created On: 24.05.2005
//:://////////////////////////////////////////////
const int NUI_PAYLOAD_BUTTON_LEFT_CLICK = 0;
const int NUI_PAYLOAD_BUTTON_MIDDLE_CLICK = 1;
const int NUI_PAYLOAD_BUTTON_RIGHT_CLICK = 2;
//////////////////////////////////////////////////
// //
// NUI Spellbook //
// //
//////////////////////////////////////////////////
// This is the NUI Spellbook window ID
const string PRC_SPELLBOOK_NUI_WINDOW_ID = "prcSpellbookNui";
// This is the base Id for the Class buttons in the NUI Spellbook, the ID will
// have the ClassID attached to it (i.e. spellbookClassButton_123)
const string PRC_SPELLBOOK_NUI_CLASS_BUTTON_BASEID = "spellbookClassButton_";
// This is the base Id for the Spell Circle buttons in the NUI Spellbook, the ID will
// have the Circle attached to it (i.e. spellbookCircleButton__6)
const string PRC_SPELLBOOK_NUI_CIRCLE_BUTTON_BASEID = "spellbookCircleButton_";
// This is the base Id for the Spell Buttons in the NUI Spellbook, the ID will
// have the SpellbookId (the row of the class's spell's 2da or equivalent)
// attached to it (i.e. spellbookSpellButton_6)
const string PRC_SPELLBOOK_NUI_SPELL_BUTTON_BASEID = "spellbookSpellButton_";
// This is the base Id for the Meta Feat buttons in the NUI Spellbook, the ID will
// have the FeatID attached to it (i.e. spellbookMetaButton_12345)
const string PRC_SPELLBOOK_NUI_META_BUTTON_BASEID = "spellbookMetaButton_";
// This is the selected ClassID var used to store what class was selected to the Player
// locally
const string PRC_SPELLBOOK_SELECTED_CLASSID_VAR = "prcSpellbookSelectedClassID";
// This is the selected Circle var used to store what spell circle was selected
// to the Player locally
const string PRC_SPELLBOOK_SELECTED_CIRCLE_VAR = "prcSpellbookSelectedCircle";
// This is the Spellbook NUI geomeotry var, used to allow the location and sizing
// of the NUI to be remembered if it is ever rerendered.
const string PRC_SPELLBOOK_NUI_GEOMETRY_VAR = "sbNuiGeometry";
// This is the Selected SpellID Var, used to tell the OnTarget script what spell
// we are using after manual targetting
const string NUI_SPELLBOOK_SELECTED_SPELLID_VAR = "NUI_Spellbook_SpellId";
// This is the Selected FeatID Var, used to tell the OnTarget script what feat
// we are using after manual targetting
const string NUI_SPELLBOOK_SELECTED_FEATID_VAR = "NUI_Spellbook_FeatID";
// This is the Selected SubSpellID Var, used in conjuncture with the Selected FeatID
// to allow radial spells to work (it needs the master spell's featID and the sub spell's
// SpellID for it to work.
const string NUI_SPELLBOOK_SELECTED_SUBSPELL_SPELLID_VAR = "NUI_Spellbook_SubSpellID";
// This is the OnTarget action var saved to the player locally to say if we are
// using the NUI Spellbook spell or not.
const string NUI_SPELLBOOK_ON_TARGET_ACTION_VAR = "ONPLAYERTARGET_ACTION";
// This is a Boolean to tell the target script if the selected feat is a persoanl feat
// and can only be used on the executing object.
const string NUI_SPELLBOOK_ON_TARGET_IS_PERSONAL_FEAT = "NUI_Spellbook_IsPersonalFeat";
const string NUI_SPELL_DESCRIPTION_WINDOW_ID = "NUI_Spell_Description";
const string NUI_SPELL_DESCRIPTION_OK_BUTTON = "NUIDescriptionOKButton";
// This is the limit of how many spell buttons we can have in a row before we
// need to start a new row on the NUI Spellbook.
const int NUI_SPELLBOOK_SPELL_BUTTON_LENGTH = 9;
const string NUI_SPELLBOOK_BINDER_DICTIONARY_CACHE_VAR = "NUI_Spellbook_GetBinderSpellToFeatDictionaryCache";
const string NUI_SPELLBOOK_CLASS_STANCES_CACHE_BASE_VAR = "NUI_Spellbook_GetToBStanceSpellListCache_";
const string NUI_SPELLBOOK_CLASS_SHAPES_CACHE_BASE_VAR = "NUI_Spellbook_GetInvokerShapeSpellListCache_";
const string NUI_SPELLBOOK_CLASS_ESSENCE_CACHE_BASE_VAR = "NUISpellbookClassEssence_";
//////////////////////////////////////////////////
// //
// NUI Power Attack //
// //
//////////////////////////////////////////////////
// The Window ID for the Power Attack NUI
const string NUI_PRC_POWER_ATTACK_WINDOW = "nui_prc_power_attack_window";
// LocalVar for the geometry of the Power Attack NUI window
const string NUI_PRC_PA_GEOMETRY_VAR = "paNuiGeometry";
// Event For Left "-" button of the Power Attack NUI
const string NUI_PRC_PA_LEFT_BUTTON_EVENT = "nui_prc_pa_left_button_event";
// Event For Right "+" Button of the Power Attack NUI
const string NUI_PRC_PA_RIGHT_BUTTON_EVENT = "nui_prc_pa_right_button_event";
// Bind for Text of the Power Attack NUI saying what the current Power Attack level is
const string NUI_PRC_PA_TEXT_BIND = "nui_prc_pa_text_bind";
// Left Button Enabled Bind for Power Attack NUI
const string NUI_PRC_PA_LEFT_BUTTON_ENABLED_BIND = "leftButtonEnabled";
// Right Button Enabled Bind for Power Attack NUI
const string NUI_PRC_PA_RIGHT_BUTTON_ENABLED_BIND = "rightButtonEnabled";

File diff suppressed because it is too large Load Diff

View File

@ -1,98 +0,0 @@
//::///////////////////////////////////////////////
//:: PRC Spellbook Description NUI
//:: prc_nui_scd_inc
//:://////////////////////////////////////////////
/*
This is the view for the Spell Description NUI
*/
//:://////////////////////////////////////////////
//:: Created By: Rakiov
//:: Created On: 29.05.2005
//:://////////////////////////////////////////////
#include "nw_inc_nui"
#include "prc_nui_consts"
#include "inc_2dacache"
//
// CreateSpellDescriptionNUI
// Creates a Spell Description NUI mimicing the description GUI of NWN
//
// Arguments:
// oPlayer:Object the player object
// featID:int the FeatID
// spellId:int the SpellID
// realSpellId:int the RealSpellID
//
void CreateSpellDescriptionNUI(object oPlayer, int featID, int spellId=0, int realSpellId=0);
void CreateSpellDescriptionNUI(object oPlayer, int featID, int spellId=0, int realSpellId=0)
{
// look for existing window and destroy
int nPreviousToken = NuiFindWindow(OBJECT_SELF, NUI_SPELL_DESCRIPTION_WINDOW_ID);
if(nPreviousToken != 0)
{
NuiDestroy(OBJECT_SELF, nPreviousToken);
}
// in order of accuracy for names it goes RealSpellID > SpellID > FeatID
string spellName;
if (realSpellId)
spellName = GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", realSpellId)));
else if (spellId)
spellName = GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", spellId)));
else
spellName = GetStringByStrRef(StringToInt(Get2DACache("feat", "FEAT", featID)));
// Descriptions and Icons are accuratly stored on the feat
string spellDesc = GetStringByStrRef(StringToInt(Get2DACache("feat", "DESCRIPTION", featID)));
string spellIcon = Get2DACache("feat", "ICON", featID);
json jRoot = JsonArray();
json jGroup = JsonArray();
json jRow = JsonArray();
json jImage = NuiImage(JsonString(spellIcon), JsonInt(NUI_ASPECT_EXACT), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_TOP));
jImage = NuiWidth(jImage, 32.0f);
jRow = JsonArrayInsert(jRow, jImage);
jRow = NuiCol(jRow);
jGroup = JsonArrayInsert(jGroup, jRow);
jRow = JsonArray();
json jText = NuiText(JsonString(spellDesc), FALSE, NUI_SCROLLBARS_AUTO);
jRow = JsonArrayInsert(jRow, jText);
jRow = NuiCol(jRow);
jGroup = JsonArrayInsert(jGroup, jRow);
jGroup = NuiRow(jGroup);
jGroup = NuiGroup(jGroup, TRUE, NUI_SCROLLBARS_NONE);
jRoot = JsonArrayInsert(jRoot, jGroup);
jRow = JsonArray();
jRow = JsonArrayInsert(jRow, NuiSpacer());
json jButton = NuiId(NuiButton(JsonString("OK")), NUI_SPELL_DESCRIPTION_OK_BUTTON);
jButton = NuiWidth(jButton, 175.0f);
jButton = NuiHeight(jButton, 48.0f);
jRow = JsonArrayInsert(jRow, jButton);
jRow = NuiRow(jRow);
jRoot = JsonArrayInsert(jRoot, jRow);
jRoot = NuiCol(jRoot);
// This is the main window with jRoot as the main pane. It includes titles and parameters (more on those later)
json nui = NuiWindow(jRoot, JsonString(spellName), NuiBind("geometry"), NuiBind("resizable"), JsonBool(FALSE), NuiBind("closable"), NuiBind("transparent"), NuiBind("border"));
// finally create it and it'll return us a non-zero token.
int nToken = NuiCreate(oPlayer, nui, NUI_SPELL_DESCRIPTION_WINDOW_ID);
// get the geometry of the window in case we opened this before and have a
// preference for location
json geometry = NuiRect(893.0f,346.0f, 426.0f, 446.0f);
// Set the binds to their default values
NuiSetBind(oPlayer, nToken, "geometry", geometry);
NuiSetBind(oPlayer, nToken, "resizable", JsonBool(FALSE));
NuiSetBind(oPlayer, nToken, "closable", JsonBool(FALSE));
NuiSetBind(oPlayer, nToken, "transparent", JsonBool(FALSE));
NuiSetBind(oPlayer, nToken, "border", JsonBool(TRUE));
}

View File

@ -1,74 +0,0 @@
//::///////////////////////////////////////////////
//:: String Util
//:: prc_string_inc
//:://////////////////////////////////////////////
/*
A util class for providing useful string functions.
*/
//:://////////////////////////////////////////////
//:: Created By: Rakiov
//:: Created On: 22.05.2005
//:://////////////////////////////////////////////
#include "inc_utility"
//
// StringSplit
// Takes a string and splits it by " " into a json list of strings
// i.e. "this is a test" returns
// {
// "this",
// "is",
// "a",
// "test"
// }
//
// Parameters:
// string input the string input
//
// Returns:
// json the json list of words
//
json StringSplit(string input);
json StringSplit(string input)
{
json retValue = JsonArray();
string subString = "";
//trim any whitespace characters first
string currString = PRCTrimString(input);
// loop until we process the whole string
while(currString != "")
{
string currChar = GetStringLeft(currString, 1);
if (currChar != "" && currChar != " ")
{
// if the current character isn't nothing or whitespace, then add it
// to the current sub string.
subString += currChar;
}
else
{
// otherwise if the substring is not empty, then add it to the list
// of words to return
if(subString != "")
{
retValue = JsonArrayInsert(retValue, JsonString(subString));
subString = "";
}
}
// pop and move to next character
currString = GetStringRight(currString, GetStringLength(currString)-1);
}
// if there is any sub string left at the end of the loop, add it to the list
if(subString != "")
{
retValue = JsonArrayInsert(retValue, JsonString(subString));
}
return retValue;
}

View File

@ -1154,6 +1154,7 @@ int GetIsDisciplineWeapon(object oWeapon, int nDiscipline)
// Invalid is empty handed / Unarmed strike
if(nType == BASE_ITEM_INVALID
|| nType == BASE_ITEM_QUARTERSTAFF
|| nType == BASE_ITEM_MAGICSTAFF
|| nType == BASE_ITEM_SHORTSWORD
|| nType == BASE_ITEM_NUNCHAKU)
return TRUE;

View File

@ -1542,6 +1542,7 @@ int CheckSecondaryPrC(object oPC = OBJECT_SELF)
}
else if (bSorcerer)
{
if(DEBUG) DoDebug("x2_inc_spellhook: CheckSecondaryPrC >>> Entering Sorcerer", oPC);
if (GetHasFeat(FEAT_ABERRATION_SPELLCASTING_DRIDER)) return TRUE;
if (GetHasFeat(FEAT_MONSTROUS_SPELLCASTING_ARKAMOI)) return TRUE;
if (GetHasFeat(FEAT_MONSTROUS_SPELLCASTING_MARRUTACT)) return TRUE;

View File

@ -20919,22 +20919,22 @@
"__struct_id": 0,
"RESREF": {
"type": "resref",
"value": "zep_tree034"
"value": "zep_tree028"
},
"STRREF": {
"type": "dword",
"value": 16813282
"value": 16813284
}
},
{
"__struct_id": 0,
"RESREF": {
"type": "resref",
"value": "zep_tree028"
"value": "zep_tree034"
},
"STRREF": {
"type": "dword",
"value": 16813284
"value": 16813282
}
},
{
@ -20981,17 +20981,6 @@
"value": 16813296
}
},
{
"__struct_id": 0,
"RESREF": {
"type": "resref",
"value": "zep_tree035"
},
"STRREF": {
"type": "dword",
"value": 16813298
}
},
{
"__struct_id": 0,
"RESREF": {
@ -21007,11 +20996,11 @@
"__struct_id": 0,
"RESREF": {
"type": "resref",
"value": "zep_tree038"
"value": "zep_tree035"
},
"STRREF": {
"type": "dword",
"value": 16813306
"value": 16813298
}
},
{
@ -21025,6 +21014,17 @@
"value": 16813308
}
},
{
"__struct_id": 0,
"RESREF": {
"type": "resref",
"value": "zep_tree038"
},
"STRREF": {
"type": "dword",
"value": 16813306
}
},
{
"__struct_id": 0,
"RESREF": {
@ -21398,17 +21398,6 @@
"value": 16813264
}
},
{
"__struct_id": 0,
"RESREF": {
"type": "resref",
"value": "zep_tree036"
},
"STRREF": {
"type": "dword",
"value": 16813286
}
},
{
"__struct_id": 0,
"RESREF": {
@ -21424,11 +21413,11 @@
"__struct_id": 0,
"RESREF": {
"type": "resref",
"value": "zep_tree093"
"value": "zep_tree036"
},
"STRREF": {
"type": "dword",
"value": 16813302
"value": 16813286
}
},
{
@ -21442,6 +21431,17 @@
"value": 16813304
}
},
{
"__struct_id": 0,
"RESREF": {
"type": "resref",
"value": "zep_tree093"
},
"STRREF": {
"type": "dword",
"value": 16813302
}
},
{
"__struct_id": 0,
"RESREF": {

View File

@ -2880,7 +2880,7 @@ void main()
}
}
if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE") != 0);
if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE") != 0)
{
return;
}

Binary file not shown.