diff --git a/README.md b/README.md index 14d254c..30ae327 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,6 @@ Repository for the development of the PRC8 version of TheGeorge's conversion of ## Requirements 1.) Nasher, installed in your system path. -2.) [PRC8](https://gitea.raptio.us/Jaysyn/PRC8/src/branch/main/Release) +2.) [PRC8](https://gitea.raptio.us/Jaysyn/PRC8/releases) 3.) [CEP3](https://neverwintervault.org/project/nwnee/hakpak/combined/cep-3-community-expansion-pack) \ No newline at end of file diff --git a/src/include/nw_o2_coninclude.nss b/src/include/nw_o2_coninclude.nss index 4a250bd..7dc9c81 100644 --- a/src/include/nw_o2_coninclude.nss +++ b/src/include/nw_o2_coninclude.nss @@ -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 () {} + diff --git a/src/include/prc_inc_clsfunc.nss b/src/include/prc_inc_clsfunc.nss index 3a6c251..4d1ffcb 100644 --- a/src/include/prc_inc_clsfunc.nss +++ b/src/include/prc_inc_clsfunc.nss @@ -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); diff --git a/src/include/prc_inc_combat.nss b/src/include/prc_inc_combat.nss index f5a2411..3cdbab5 100644 --- a/src/include/prc_inc_combat.nss +++ b/src/include/prc_inc_combat.nss @@ -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; @@ -1093,7 +1094,7 @@ int GetIsTwoHandedMeleeWeapon(object oWeap) { return GetIsTwoHandedMeleeWeaponType(GetBaseItemType(oWeap)); } - + int GetIsCreatureWeaponType(int iWeaponType) { // any of the three creature weapon types that produce bludgeoning, piercing or slashing damage @@ -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; diff --git a/src/include/prc_inc_fork.nss b/src/include/prc_inc_fork.nss index 3e46b83..b6b672e 100644 --- a/src/include/prc_inc_fork.nss +++ b/src/include/prc_inc_fork.nss @@ -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,7 +461,8 @@ 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_RAPIER: return FEAT_EPIC_WEAPON_SPECIALIZATION_RAPIER; + 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; case BASE_ITEM_SHORTBOW: return FEAT_EPIC_WEAPON_SPECIALIZATION_SHORTBOW; @@ -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: diff --git a/src/include/prc_inc_wpnrest.nss b/src/include/prc_inc_wpnrest.nss index 401b323..c101e78 100644 --- a/src/include/prc_inc_wpnrest.nss +++ b/src/include/prc_inc_wpnrest.nss @@ -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) diff --git a/src/include/tob_inc_tobfunc.nss b/src/include/tob_inc_tobfunc.nss index 3d74cbd..d339082 100644 --- a/src/include/tob_inc_tobfunc.nss +++ b/src/include/tob_inc_tobfunc.nss @@ -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; diff --git a/src/include/x2_inc_spellhook.nss b/src/include/x2_inc_spellhook.nss index 2785789..c21e3f1 100644 --- a/src/include/x2_inc_spellhook.nss +++ b/src/include/x2_inc_spellhook.nss @@ -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;