diff --git a/README.md b/README.md index 3e22687..1332d5e 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/nasher.cfg b/nasher.cfg index 9791adf..7dbc61c 100644 --- a/nasher.cfg +++ b/nasher.cfg @@ -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,8 +231,15 @@ 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 = "xchst_inc.nss" + 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] name = "tophak" @@ -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] 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/prc_nui_consts.nss b/src/include/prc_nui_consts.nss deleted file mode 100644 index 0cb0efa..0000000 --- a/src/include/prc_nui_consts.nss +++ /dev/null @@ -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"; \ No newline at end of file diff --git a/src/include/prc_nui_sc_inc.nss b/src/include/prc_nui_sc_inc.nss deleted file mode 100644 index a1a768e..0000000 --- a/src/include/prc_nui_sc_inc.nss +++ /dev/null @@ -1,1148 +0,0 @@ -//:://///////////////////////////////////////////// -//:: PRC Spellbook Script -//:: prc_nui_sb_inc -//::////////////////////////////////////////////// -/* - This is the script that handles some backend work for the PRC Spellbook - NUI View -*/ -//::////////////////////////////////////////////// -//:: Created By: Rakiov -//:: Created On: 24.05.2005 -//::////////////////////////////////////////////// -#include "inc_newspellbook" -#include "psi_inc_psifunc" -#include "inc_lookups" -#include "prc_nui_consts" - -// -// GetSpellListForCircle -// Gets the spell list for a specified class at the specified circle. -// -// Arguments: -// oPlayer:object the player -// nClass:int the ClassID -// circle:int the circle we want to grab for -// -// Returns: -// json:Array a list of all the spellIDs of the given circle -// -json GetSpellListForCircle(object oPlayer, int nClass, int circle); - -// -// GetSupportedNUISpellbookClasses -// Gets the list of support PRC classes that can use the NUi spellbook that -// the player has. -// -// Arguments: -// oPlayer:object the player this is being determined for -// -// Returns: -// json:int list of class ids that have the player has that can use the -// NUI spellbook. -// -json GetSupportedNUISpellbookClasses(object oPlayer); - -// -// GetCurrentSpellLevel -// Gets the current spell level the class can achieve at the current -// caster level (ranging from 0-9) -// -// Arguments: -// nClass:int the ClassID -// nLevel:int the caster level -// -// Returns: -// int the circle the class can achieve currently -// -int GetCurrentSpellLevel(int nClass, int nLevel); - -// -// GetMaxSpellLevel -// Gets the highest possible circle the class can achieve (from 0-9) -// -// Arguments: -// nClass:int the ClassID -// -// Returns: -// int the highest circle that can be achieved -// -int GetMaxSpellLevel(int nClass); - -// -// GetMinSpellLevel -// Gets the lowest possible circle the class can achieve (from 0-9) -// -// Arguments: -// nClass:int the ClassID -// -// Returns: -// int the lowest circle that can be achieved -// -int GetMinSpellLevel(int nClass); - -// -// GetHighestLevelPossibleInClass -// Given a class Id this will determine what the max level of a class can be -// achieved -// -// Arguments: -// nClass:int the ClassID -// -// Returns: -// int the highest possible level the class can achieve -// -int GetHighestLevelPossibleInClass(int nClass); - -// -// GetClassSpellbookFile -// Gets the class 2da spellbook/ability for the given class Id -// -// Arguments: -// nClass:int the classID -// -// Returns: -// string the 2da file name for the spell/abilities of the ClassID -// -string GetClassSpellbookFile(int nClass); - -// -// IsSpellKnown -// Returns whether the player with the given class, spell file, and spellbook id -// knows the spell or not -// -// Arguments: -// oPlayer;Object the player -// nClass:int the class ID -// spellId:int the spell ID to check -// -// Returns: -// int:Boolean TRUE if spell is known, FALSE otherwise -// -int IsSpellKnown(object oPlayer, int nClass, int spellId); - -// -// IsClassAllowedToUseNUISpellbook -// Takes a player and a classId and determines if thee class is allowed to -// be using the NUI spellbook. -// -// Arguments: -// oPlayer:Object the player -// nClass:int the ClassID -// -// Returns: -// int:Boolean TRUE if allowed to use the spellbook, FALSE otherwise -// -int IsClassAllowedToUseNUISpellbook(object oPlayer, int nClass); - -// -// CanClassUseMetamagicFeats -// Given a class id determines if it is allowed to use the Metamagic feats -// -// Arguments: -// nClass:int the ClassID -// -// Returns: -// int:Boolean TRUE if allowed to use the set of feats, FALSE otherwise -// -int CanClassUseMetamagicFeats(int nClass); - -// -// CanClassUseSuddenMetamagicFeats -// Given a class id determines if it is allowed to use the Sudden Metamagic feats -// -// Arguments: -// nClass:int the ClassID -// -// Returns: -// int:Boolean TRUE if allowed to use the set of feats, FALSE otherwise -// -int CanClassUseSuddenMetamagicFeats(int nClass); - -// -// CanClassUseMetaPsionicFeats -// Given a class id determines if it is allowed to use the MetaPsionic feats -// -// Arguments: -// nClass:int the ClassID -// -// Returns: -// int:Boolean TRUE if allowed to use the set of feats, FALSE otherwise -// -int CanClassUseMetaPsionicFeats(int nClass); - -// -// CanClassUseMetaMysteryFeats -// Given a class id determines if it is allowed to use the MetaMystery feats -// -// Arguments: -// nClass:int the ClassID -// -// Returns: -// int:Boolean TRUE if allowed to use the set of feats, FALSE otherwise -// -int CanClassUseMetaMysteryFeats(int nClass); - -// -// GetMetaMagicFeatList -// Gets the list of MetaMagic featIDs -// -// Returns: -// json:Array the list of FeatIDs associated with the meta feats -// -json GetMetaMagicFeatList(); - -// -// GetSuddenMetaMagicFeatList -// Gets the list of Sudden MetaMagic featIDs -// -// Returns: -// json:Array the list of FeatIDs associated with the meta feats -// -json GetSuddenMetaMagicFeatList(); - -// -// GetMetaPsionicFeatList -// Gets the list of MetaPsionic featIDs -// -// Returns: -// json:Array the list of FeatIDs associated with the meta feats -// -json GetMetaPsionicFeatList(); - -// -// GetMetaMagicMysteryList -// Gets the list of MetaMystery featIDs -// -// Returns: -// json:Array the list of FeatIDs associated with the meta feats -// -json GetMetaMysteryFeatList(); - -// -// GetTrueClassIfRHD -// Checks to make sure if the provided RHD class and player's race -// match up to give them their proper spell caster class (ie Glouras have -// bard spells and thus should be treated like a bard class) -// -// Arguments: -// oPlayer:object the player -// nClass:int the ClassID -// -// Returns: -// int the true ClassID to use, otherwise nClass -// -int GetTrueClassIfRHD(object oPlayer, int nClass); - -// -// GetBinderSpellToFeatDictionary -// Sets up the Binder Spell Dictionary that is used to match a binder's vestige -// to their feat. This is constructed based off the binder's known location of -// their feat and spell ranges in the base 2das respectivly. After constructing -// this it will be saved to the player locally as a cached result since we do -// not need to call this again. -// -// Argument: -// oPlayer:object the player -// -// Returns: -// json:Dictionary a dictionary of mapping between the SpellID -// and the FeatID of a vestige ability -// -json GetBinderSpellToFeatDictionary(object oPlayer=OBJECT_SELF); - -// -// ShouldAddSpell -// Given a spellId and a class, determines if the spell should be added to the -// spellbook (as some are added in it's own special row or for other reasons) -// -// Arguments: -// nClass:int the ClassID -// spellId:int the SpellID -// oPlayer:object the player -// -// Returns: -// int:Boolean TRUE if the spell should be added, FALSE otherwise -// -int ShouldAddSpell(int nClass, int spellId, object oPlayer=OBJECT_SELF); - -// -// GetToBStanceSpellList -// Gets the ToB Stance Spell List for the given class -// -// Arguments: -// nClass:int ClassID -// oPlayer:object the player -// -// Returns: -// json:Array the list of stances' SpellIDs -// -json GetToBStanceSpellList(int nClass, object oPlayer=OBJECT_SELF); - -// -// GetInvokerShapeSpellList -// Gets the Invoker Shapes Spell List for the given class -// -// Arguments: -// nClass:int ClassID -// oPlayer:object the player -// -// Returns: -// json:Array the list of shapes' SpellIDs -// -json GetInvokerShapeSpellList(int nClass, object oPlayer=OBJECT_SELF); - -// -// GetInvokerEssenceSpellList -// Gets the Invoker Essences Spell List for the given class -// -// Arguments: -// nClass:int ClassID -// oPlayer:object the player -// -// Returns: -// json:Array the list of essences' SpellIDs -// -json GetInvokerEssenceSpellList(int nClass, object oPlayer=OBJECT_SELF); - -// -// JsonArrayContainsInt -// A helper function that takes a json array list and sees if the int item is within i -// -// Arguments: -// list:json:Array the list of ints -// item:int the item we are looking for -// -// Returns: -// int:Boolean TRUE if item is found, FALSE otherwise -// -int JsonArrayContainsInt(json list, int item); - -json GetSpellListForCircle(object oPlayer, int nClass, int circle) -{ - json retValue = JsonArray(); - string sFile = GetClassSpellbookFile(nClass); - int totalSpells; - json binderDictKeys; - //Special case for Binder since they don't have their own spellbook 2da - if (nClass == CLASS_TYPE_BINDER) - { - json binderDict = GetBinderSpellToFeatDictionary(oPlayer); - - // we loop through the list of SpellIDs - binderDictKeys = JsonObjectKeys(binderDict); - totalSpells = JsonGetLength(binderDictKeys); - } - else - totalSpells = Get2DARowCount(sFile); - - int i; - for (i = 0; i < totalSpells; i++) - { - int currentSpell; - if (nClass == CLASS_TYPE_BINDER) - currentSpell = StringToInt(JsonGetString(JsonArrayGet(binderDictKeys, i))); - else - currentSpell = StringToInt(Get2DACache(sFile, "SpellID", i)); - - if (ShouldAddSpell(nClass, currentSpell, oPlayer)) - { - string sSpellLevel = Get2DACache("spells", "Innate", currentSpell); - int iSpellLevel = StringToInt(sSpellLevel); - - if (nClass == CLASS_TYPE_BINDER && IsSpellKnown(oPlayer, nClass, currentSpell)) - { - retValue = JsonArrayInsert(retValue, JsonInt(currentSpell)); - } - else if ((iSpellLevel == circle && IntToString(iSpellLevel) == sSpellLevel)) - { - // We add the spell if it is known and is not a radial master spell (since those don't work) - if (IsSpellKnown(oPlayer, nClass, currentSpell)) - retValue = JsonArrayInsert(retValue, JsonInt(i)); - } - } - } - - return retValue; -} - -int ShouldAddSpell(int nClass, int spellId, object oPlayer=OBJECT_SELF) -{ - int isRadialMasterSpell = StringToInt(Get2DACache("spells", "SubRadSpell1", spellId)); - // We don't add radial master spells - if (isRadialMasterSpell) - return FALSE; - // we don't add essences and shapes - if (nClass == CLASS_TYPE_WARLOCK - || nClass == CLASS_TYPE_DRAGONFIRE_ADEPT - || nClass == CLASS_TYPE_DRAGON_SHAMAN) - { - json ignoreList = GetInvokerShapeSpellList(nClass, oPlayer); - if (JsonArrayContainsInt(ignoreList, spellId)) - return FALSE; - ignoreList = GetInvokerEssenceSpellList(nClass, oPlayer); - if (JsonArrayContainsInt(ignoreList, spellId)) - return FALSE; - } - // we don't add stances - if (nClass == CLASS_TYPE_WARBLADE - || nClass == CLASS_TYPE_SWORDSAGE - || nClass == CLASS_TYPE_CRUSADER) - { - json ignoreList = GetToBStanceSpellList(nClass, oPlayer); - if (JsonArrayContainsInt(ignoreList, spellId)) - return FALSE; - } - - return TRUE; -} - -json GetBinderSpellToFeatDictionary(object oPlayer=OBJECT_SELF) -{ - // a dictionary of - json binderDict = GetLocalJson(oPlayer, NUI_SPELLBOOK_BINDER_DICTIONARY_CACHE_VAR); - // if this hasn't been created, create it now. - if (binderDict == JsonNull()) - binderDict = JsonObject(); - else - return binderDict; - - // the starting row for binder spells - int spellIndex = 19070; - // the starting row for binder feats - int featIndex = 9030; - //the end of the binder spells/feats - while (spellIndex <= 19156 && featIndex <= 9104) - { - // get the SpellID tied to the feat - int spellID = StringToInt(Get2DACache("feat", "SPELLID", featIndex)); - // if the spellID matches the current index, then this is the spell - // attached to the feat - if (spellID == spellIndex) - { - binderDict = JsonObjectSet(binderDict, IntToString(spellID), JsonInt(featIndex)); - - // move to next spell/feat - featIndex++; - spellIndex++; - } - // else we have reached a subdial spell - else - { - // loop through until we reach back at spellID - while (spellIndex < spellID) - { - int masterSpell = StringToInt(Get2DACache("spells", "Master", spellIndex)); - - // add the sub radial to the dict, tied to the master's FeatID - int featId = JsonGetInt(JsonObjectGet(binderDict, IntToString(masterSpell))); - binderDict = JsonObjectSet(binderDict, IntToString(spellIndex), JsonInt(featId)); - - spellIndex++; - } - - - // some feats overlap the same FeatID, can cause this to get stuck. - // if it happens then move on - if (spellIndex > spellID) - featIndex++; - } - } - - // cache the result - SetLocalJson(oPlayer, NUI_SPELLBOOK_BINDER_DICTIONARY_CACHE_VAR, binderDict); - return binderDict; -} - -string GetClassSpellbookFile(int nClass) -{ - string sFile; - // Spontaneous casters use a specific file name structure - if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS - || nClass == CLASS_TYPE_ARCHIVIST) - { - sFile = GetFileForClass(nClass); - } - // everyone else uses this structure - else - { - sFile = GetAMSDefinitionFileName(nClass); - - if (nClass == CLASS_TYPE_BINDER) - { - sFile = "vestiges"; - } - } - - return sFile; -} - -json GetSupportedNUISpellbookClasses(object oPlayer) -{ - json retValue = JsonArray(); - int i = 1; - while(i >= 1) - { - int classId = GetClassByPosition(i, oPlayer); - if (classId != CLASS_TYPE_INVALID) - { - if (IsClassAllowedToUseNUISpellbook(oPlayer, classId)) - { - classId = GetTrueClassIfRHD(oPlayer, classId); - retValue = JsonArrayInsert(retValue, JsonInt(classId)); - } - i++; - } - else - { - i = -1; - } - } - - return retValue; -} - -int IsSpellKnown(object oPlayer, int nClass, int spellId) -{ - // special case for Binders since they don't have a spell book 2da. - if (nClass == CLASS_TYPE_BINDER) - { - json binderDict = GetBinderSpellToFeatDictionary(oPlayer); - int featID = JsonGetInt(JsonObjectGet(binderDict, IntToString(spellId))); - return GetHasFeat(featID, oPlayer); - } - - int currentSpell = spellId; - int masterSpell = StringToInt(Get2DACache("spells", "Master", currentSpell)); - if (masterSpell) // If this is not 0 then this is a radial spell, check the radial master - currentSpell = masterSpell; - - string sFeatID = Get2DACache("spells", "FeatID", currentSpell); - int iFeatID = StringToInt(sFeatID); - - if (IntToString(iFeatID) == sFeatID) - return GetHasFeat(iFeatID, oPlayer); - - return FALSE; -} - -int GetCurrentSpellLevel(int nClass, int nLevel) -{ - int currentLevel = nLevel; - - // ToB doesn't have a concept of spell levels, but still match up to it - if(nClass == CLASS_TYPE_WARBLADE - || nClass == CLASS_TYPE_SWORDSAGE - || nClass == CLASS_TYPE_CRUSADER - || nClass == CLASS_TYPE_SHADOWCASTER) - { - return 9; - } - - - // Binders don't really have a concept of spell level - if (nClass == CLASS_TYPE_BINDER - || nClass == CLASS_TYPE_DRAGON_SHAMAN) // they can only reach 1st circle - return 1; - - //Shadowsmith has no concept of spell levels - if (nClass == CLASS_TYPE_SHADOWSMITH) - return 2; - - if (nClass == CLASS_TYPE_WARLOCK - || nClass == CLASS_TYPE_DRAGONFIRE_ADEPT) - return 4; - - // Spont casters have their own function - if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS - || nClass == CLASS_TYPE_ARCHIVIST) - { - - int maxLevel = GetMaxSpellLevelForCasterLevel(nClass, currentLevel); - return maxLevel; - } - else - { - // everyone else uses this - string spellLevel2da = GetAMSKnownFileName(nClass); - - currentLevel = nLevel - 1; // Level is 1 off of the row in the 2da - - if (nClass == CLASS_TYPE_FIST_OF_ZUOKEN - || nClass == CLASS_TYPE_PSION - || nClass == CLASS_TYPE_PSYWAR - || nClass == CLASS_TYPE_WILDER - || nClass == CLASS_TYPE_PSYCHIC_ROGUE - || nClass == CLASS_TYPE_WARMIND) - currentLevel = GetManifesterLevel(OBJECT_SELF, nClass, TRUE) - 1; - - int totalLevel = Get2DARowCount(spellLevel2da); - - // in case we somehow go over bounds just don't :) - if (currentLevel >= totalLevel) - currentLevel = totalLevel - 1; - - //Psionics have MaxPowerLevel as their column name - string columnName = "MaxPowerLevel"; - - //Invokers have MaxInvocationLevel - if (nClass == CLASS_TYPE_WARLOCK - || nClass == CLASS_TYPE_DRAGON_SHAMAN - || nClass == CLASS_TYPE_DRAGONFIRE_ADEPT) - columnName = "MaxInvocationLevel"; - - // Truenamers have 3 sets of utterances, ranging from 1-6, EvolvingMind covers the entire range - if (nClass == CLASS_TYPE_TRUENAMER) - { - columnName = "EvolvingMind"; - spellLevel2da = "cls_true_maxlvl"; //has a different 2da we want to look at - } - - if (nClass == CLASS_TYPE_BINDER) - { - columnName = "VestigeLvl"; - spellLevel2da = "cls_bind_binder"; - } - - // ToB doesn't have a concept of this, but we don't care. - - int maxLevel = StringToInt(Get2DACache(spellLevel2da, columnName, currentLevel)); - return maxLevel; - } -} - -int GetMinSpellLevel(int nClass) -{ - // again sponts have their own function - if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS - || nClass == CLASS_TYPE_ARCHIVIST) - { - return GetMinSpellLevelForCasterLevel(nClass, GetHighestLevelPossibleInClass(nClass)); - } - else - { - if (nClass == CLASS_TYPE_FIST_OF_ZUOKEN - || nClass == CLASS_TYPE_PSION - || nClass == CLASS_TYPE_PSYWAR - || nClass == CLASS_TYPE_WILDER - || nClass == CLASS_TYPE_PSYCHIC_ROGUE - || nClass == CLASS_TYPE_WARMIND - || nClass == CLASS_TYPE_WARBLADE - || nClass == CLASS_TYPE_SWORDSAGE - || nClass == CLASS_TYPE_CRUSADER - || nClass == CLASS_TYPE_WARLOCK - || nClass == CLASS_TYPE_DRAGONFIRE_ADEPT - || nClass == CLASS_TYPE_DRAGON_SHAMAN - || nClass == CLASS_TYPE_SHADOWCASTER - || nClass == CLASS_TYPE_SHADOWSMITH - || nClass == CLASS_TYPE_BINDER) - return 1; - - return GetCurrentSpellLevel(nClass, 1); - } - -} - -int GetMaxSpellLevel(int nClass) -{ - if (nClass == CLASS_TYPE_WILDER - || nClass == CLASS_TYPE_PSION) - return 9; - if (nClass == CLASS_TYPE_PSYCHIC_ROGUE - || nClass == CLASS_TYPE_FIST_OF_ZUOKEN - || nClass == CLASS_TYPE_WARMIND) - return 5; - if (nClass == CLASS_TYPE_PSYWAR) - return 6; - - return GetCurrentSpellLevel(nClass, GetHighestLevelPossibleInClass(nClass)); -} - -int GetHighestLevelPossibleInClass(int nClass) -{ - string sFile; - - //sponts have their spells in the classes.2da - if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS - || nClass == CLASS_TYPE_ARCHIVIST) - { - sFile = Get2DACache("classes", "SpellGainTable", nClass); - } - else - { - // everyone else uses this - sFile = GetAMSKnownFileName(nClass); - - if (nClass == CLASS_TYPE_TRUENAMER) - { - sFile = "cls_true_maxlvl"; //has a different 2da we want to look at - } - - if (nClass == CLASS_TYPE_BINDER) - { - sFile = "cls_bind_binder"; - } - } - - return Get2DARowCount(sFile); -} - -int IsClassAllowedToUseNUISpellbook(object oPlayer, int nClass) -{ - // This controls who can use the Spellbook NUI, if for some reason you don't - // want a class to be allowed to use this you can comment out their line here - - // Bard and Sorc are allowed if they took a PRC that makes them use the spellbook - if ((nClass == CLASS_TYPE_BARD || nClass == CLASS_TYPE_SORCERER) - && GetPrCAdjustedClassLevel(nClass, oPlayer) > GetLevelByClass(nClass, oPlayer)) - return TRUE; - - // Arcane Spont - if (nClass == CLASS_TYPE_ASSASSIN - || nClass == CLASS_TYPE_BEGUILER - || nClass == CLASS_TYPE_CELEBRANT_SHARESS - || nClass == CLASS_TYPE_DREAD_NECROMANCER - || nClass == CLASS_TYPE_DUSKBLADE - || nClass == CLASS_TYPE_HARPER - || nClass == CLASS_TYPE_HEXBLADE - || nClass == CLASS_TYPE_KNIGHT_WEAVE - || nClass == CLASS_TYPE_SHADOWLORD - || nClass == CLASS_TYPE_SUBLIME_CHORD - || nClass == CLASS_TYPE_SUEL_ARCHANAMACH - || nClass == CLASS_TYPE_WARMAGE) - return TRUE; - - // Psionics - if (nClass == CLASS_TYPE_FIST_OF_ZUOKEN - || nClass == CLASS_TYPE_PSION - || nClass == CLASS_TYPE_PSYWAR - || nClass == CLASS_TYPE_WILDER - || nClass == CLASS_TYPE_PSYCHIC_ROGUE - || nClass == CLASS_TYPE_WARMIND) - return TRUE; - - // Invokers - if (nClass == CLASS_TYPE_WARLOCK - || nClass == CLASS_TYPE_DRAGON_SHAMAN - || nClass == CLASS_TYPE_DRAGONFIRE_ADEPT) - return TRUE; - - // Divine Spont - if (nClass == CLASS_TYPE_ARCHIVIST //while technically prepared, they use the spont system of casting - || nClass == CLASS_TYPE_FAVOURED_SOUL - || nClass == CLASS_TYPE_JUSTICEWW) - return TRUE; - - // ToB Classes - if (nClass == CLASS_TYPE_WARBLADE - || nClass == CLASS_TYPE_SWORDSAGE - || nClass == CLASS_TYPE_CRUSADER) - return TRUE; - - // Mystery Classes - if (nClass == CLASS_TYPE_SHADOWCASTER - || nClass == CLASS_TYPE_SHADOWSMITH) - return TRUE; - - // Truenamers - if (nClass == CLASS_TYPE_TRUENAMER) - return TRUE; - - // RHD Casters - if ((nClass == CLASS_TYPE_SHAPECHANGER - && GetRacialType(oPlayer) == RACIAL_TYPE_ARANEA - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - || (nClass == CLASS_TYPE_OUTSIDER - && GetRacialType(oPlayer) == RACIAL_TYPE_RAKSHASA - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - || (nClass == CLASS_TYPE_ABERRATION - && GetRacialType(oPlayer) == RACIAL_TYPE_DRIDER - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - || (nClass == CLASS_TYPE_MONSTROUS - && GetRacialType(oPlayer) == RACIAL_TYPE_ARKAMOI - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - || (nClass == CLASS_TYPE_MONSTROUS - && GetRacialType(oPlayer) == RACIAL_TYPE_HOBGOBLIN_WARSOUL - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - || (nClass == CLASS_TYPE_MONSTROUS - && GetRacialType(oPlayer) == RACIAL_TYPE_REDSPAWN_ARCANISS - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - || (nClass == CLASS_TYPE_MONSTROUS - && GetRacialType(oPlayer) == RACIAL_TYPE_MARRUTACT - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - || (nClass == CLASS_TYPE_FEY - && GetRacialType(oPlayer) == RACIAL_TYPE_GLOURA - && !GetLevelByClass(CLASS_TYPE_BARD))) - return TRUE; - - // Binders - if (nClass == CLASS_TYPE_BINDER) - return TRUE; - - return FALSE; -} - -int GetTrueClassIfRHD(object oPlayer, int nClass) -{ - if (nClass == CLASS_TYPE_SHAPECHANGER - && GetRacialType(oPlayer) == RACIAL_TYPE_ARANEA) - return CLASS_TYPE_SORCERER; - if (nClass == CLASS_TYPE_OUTSIDER - && GetRacialType(oPlayer) == RACIAL_TYPE_RAKSHASA) - return CLASS_TYPE_SORCERER; - if (nClass == CLASS_TYPE_ABERRATION - && GetRacialType(oPlayer) == RACIAL_TYPE_DRIDER) - return CLASS_TYPE_SORCERER; - if (nClass == CLASS_TYPE_MONSTROUS - && GetRacialType(oPlayer) == RACIAL_TYPE_ARKAMOI) - return CLASS_TYPE_SORCERER; - if (nClass == CLASS_TYPE_MONSTROUS - && GetRacialType(oPlayer) == RACIAL_TYPE_HOBGOBLIN_WARSOUL) - return CLASS_TYPE_SORCERER; - if (nClass == CLASS_TYPE_MONSTROUS - && GetRacialType(oPlayer) == RACIAL_TYPE_REDSPAWN_ARCANISS) - return CLASS_TYPE_SORCERER; - if (nClass == CLASS_TYPE_MONSTROUS - && GetRacialType(oPlayer) == RACIAL_TYPE_MARRUTACT) - return CLASS_TYPE_SORCERER; - if (nClass == CLASS_TYPE_FEY - && GetRacialType(oPlayer) == RACIAL_TYPE_GLOURA) - return CLASS_TYPE_BARD; - - return nClass; -} - -int CanClassUseMetamagicFeats(int nClass) -{ - // I don't want to spend the time looping through each class's - // feat 2da so this is the list of all classes that are allowed to use the - // Spellbook NUI and can use Metamagic - return (nClass == CLASS_TYPE_ASSASSIN - || nClass == CLASS_TYPE_BARD - || nClass == CLASS_TYPE_SORCERER - || nClass == CLASS_TYPE_BEGUILER - || nClass == CLASS_TYPE_DREAD_NECROMANCER - || nClass == CLASS_TYPE_DUSKBLADE - || nClass == CLASS_TYPE_HEXBLADE - || nClass == CLASS_TYPE_JUSTICEWW - || nClass == CLASS_TYPE_SUBLIME_CHORD - || nClass == CLASS_TYPE_SUEL_ARCHANAMACH - || nClass == CLASS_TYPE_FAVOURED_SOUL - || nClass == CLASS_TYPE_WARMAGE); -} - -int CanClassUseSuddenMetamagicFeats(int nClass) -{ - // I don't want to spend the time looping through each class's - // feat 2da so this is the list of all classes that are allowed to use the - // Spellbook NUI and can use Sudden Metamagic - return (nClass == CLASS_TYPE_SHADOWLORD - || nClass == CLASS_TYPE_ARCHIVIST - || nClass == CLASS_TYPE_ASSASSIN - || nClass == CLASS_TYPE_BARD - || nClass == CLASS_TYPE_BEGUILER - || nClass == CLASS_TYPE_DREAD_NECROMANCER - || nClass == CLASS_TYPE_DUSKBLADE - || nClass == CLASS_TYPE_FAVOURED_SOUL - || nClass == CLASS_TYPE_HEXBLADE - || nClass == CLASS_TYPE_JUSTICEWW - || nClass == CLASS_TYPE_KNIGHT_WEAVE - || nClass == CLASS_TYPE_SUBLIME_CHORD - || nClass == CLASS_TYPE_SORCERER - || nClass == CLASS_TYPE_SUEL_ARCHANAMACH - || nClass == CLASS_TYPE_WARMAGE); -} - -int CanClassUseMetaPsionicFeats(int nClass) -{ - // I don't want to spend the time looping through each class's - // feat 2da so this is the list of all classes that are allowed to use the - // Spellbook NUI and can use Metapsionics - return (nClass == CLASS_TYPE_FIST_OF_ZUOKEN - || nClass == CLASS_TYPE_PSION - || nClass == CLASS_TYPE_PSYCHIC_ROGUE - || nClass == CLASS_TYPE_PSYWAR - || nClass == CLASS_TYPE_WARMIND - || nClass == CLASS_TYPE_WILDER); -} - -int CanClassUseMetaMysteryFeats(int nClass) -{ - // I don't want to spend the time looping through each class's - // feat 2da so this is the list of all classes that are allowed to use the - // Spellbook NUI and can use Metamysteries - return (nClass == CLASS_TYPE_SHADOWCASTER - || nClass == CLASS_TYPE_SHADOWSMITH); -} - -json GetMetaMagicFeatList() -{ - json metaFeats = JsonArray(); - int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EXTEND_SPELL_ABILITY)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EMPOWER_SPELL_ABILITY)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_MAXIMIZE_SPELL_ABILITY)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_QUICKEN_SPELL_ABILITY)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_STILL_SPELL_ABILITY)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SILENT_SPELL_ABILITY)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - - return metaFeats; -} - -json GetSuddenMetaMagicFeatList() -{ - json metaFeats = JsonArray(); - int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SUDDEN_EXTEND)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SUDDEN_EMPOWER)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SUDDEN_MAXIMIZE)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SUDDEN_WIDEN)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - - return metaFeats; -} - -json GetMetaPsionicFeatList() -{ - json metaFeats = JsonArray(); - int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EXTEND_POWER)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EMPOWER_POWER)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_MAXIMIZE_POWER)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_QUICKEN_POWER)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_WIDEN_POWER)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_CHAIN_POWER)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_TWIN_POWER)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SPLIT_PSIONIC_RAY)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - - return metaFeats; -} - -json GetMetaMysteryFeatList() -{ - json metaFeats = JsonArray(); - int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EXTEND_MYSTERY)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EMPOWER_MYSTERY)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_MAXIMIZE_MYSTERY)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_QUICKEN_MYSTERY)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_STILL_MYSTERY)); - metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); - - return metaFeats; -} - -json GetToBStanceSpellList(int nClass, object oPlayer=OBJECT_SELF) -{ - // caching - json stanceSpells = GetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_STANCES_CACHE_BASE_VAR + IntToString(nClass)); - if (stanceSpells == JsonNull()) - stanceSpells = JsonArray(); - else - return stanceSpells; - - string sFile = GetClassSpellbookFile(nClass); - int totalRows = Get2DARowCount(sFile); - - int i; - for (i = 0; i < totalRows; i++) - { - int Type = StringToInt(Get2DACache(sFile, "Type", i)); - if (Type == 1) - { - int spellId = StringToInt(Get2DACache(sFile, "SpellID", i)); - stanceSpells = JsonArrayInsert(stanceSpells, JsonInt(spellId)); - } - } - - SetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_STANCES_CACHE_BASE_VAR + IntToString(nClass), stanceSpells); - return stanceSpells; -} - -json GetInvokerShapeSpellList(int nClass, object oPlayer=OBJECT_SELF) -{ - // caching - json shapeSpells = GetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_SHAPES_CACHE_BASE_VAR + IntToString(nClass)); - if (shapeSpells == JsonNull()) - shapeSpells = JsonArray(); - else - return shapeSpells; - - string sFile = GetClassSpellbookFile(nClass); - int totalRows = Get2DARowCount(sFile); - - if (nClass == CLASS_TYPE_WARLOCK) - { - // Add the ELdritch Blast shapes - // TODO: Replace these magic SpellID ints with consts - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(INVOKE_ELDRITCH_BLAST)); - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18216)); // Eldritch Chain - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18245)); // Eldritch Cone - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18261)); // Eldritch Doom - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18172)); // Glaive - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18246)); // Eldritch Line - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18173)); // Eldritch Spear - } - - if (nClass == CLASS_TYPE_DRAGON_SHAMAN) - { - // Add the Dragon Shaman Auras - int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_ENERGY)); - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_ENERGYSHLD)); - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_INSIGHT)); - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_MAGICPOWER)); - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_POWER)); - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_PRESENCE)); - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_RESISTANCE)); - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_RESOLVE)); - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_SENSES)); - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_STAMINA)); - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_SWIFTNESS)); - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_TOUGHNESS)); - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_VIGOR)); - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); - } - - if (nClass == CLASS_TYPE_DRAGONFIRE_ADEPT) - { - // Add Dragon Adept Breaths - // TODO: Replace these magic SpellID ints with consts - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2102)); // Fire Cone - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2103)); // Fire Line - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2104)); // Frost Cone - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2105)); // Electric Line - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2106)); // Sickness Cone - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2108)); // Acid Cone - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2109)); // Acid Line - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2111)); // Slow Cone - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2112)); // Weakening Cone - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2115)); // Sleep Cone - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2116)); // Thunder Cone - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2117)); // Bahamut Line - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2118)); // Force Line - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2119)); // Paralyzation Line - shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2120)); // Tiamat Breath - } - - - SetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_SHAPES_CACHE_BASE_VAR + IntToString(nClass), shapeSpells); - return shapeSpells; -} - -json GetInvokerEssenceSpellList(int nClass, object oPlayer=OBJECT_SELF) -{ - //caching - json essenceSpells = GetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_ESSENCE_CACHE_BASE_VAR + IntToString(nClass)); - if (essenceSpells == JsonNull()) - essenceSpells = JsonArray(); - else - return essenceSpells; - - if (nClass == CLASS_TYPE_WARLOCK) - { - // Add Eldritch Essences - // TODO: Replace these magic SpellID ints with consts - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18177)); // Hideous Blow - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18189)); // Baneful Abberation - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18190)); // Baneful Beast - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18191)); // Baneful Construct - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18192)); // Baneful Dragon - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18193)); // Baneful Dwarf - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18194)); // Baneful Elemental - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18195)); // Baneful Elf - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18196)); // baneful Fey - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18197)); // Baneful Giant - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18198)); // Baneful Goblinoid - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18199)); // Baneful Gnome - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18200)); // Baneful Halfling - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18201)); // Baneful Human - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18202)); // Baneful Monsterous - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18203)); // Baneful Orc - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18204)); // Baneful Outsider - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18205)); // Baneful Plant - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18206)); // Baneful Reptilian - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18207)); // Baneful Shapechanger - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18208)); // Baneful Undead - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18209)); // Baneful Vermin - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18210)); // Beshadowed Blast - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18240)); // Bewitching Blast - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18257)); // Binding Blast - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18211)); // Brimstone Blast - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18175)); // Frightful Blast - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18176)); // Hammer Blast - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18183)); // Sickening Blast - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HEALING_BLAST)); - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_BLAST)); - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_BLOW)); - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_CHAIN)); - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_CONE)); - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_DOOM)); - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_GLAIVE)); - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_LINE)); - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_SPEAR)); - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18220)); // Hellrime Blast - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18177)); // Hideous Blow - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18249)); // Hindering Blast - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18251)); // Noxious Blast - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18253)); // Penetrating Blast - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18267)); // Utterdark Blast - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18255)); // Vitriolic Blast - } - - if (nClass == CLASS_TYPE_DRAGONFIRE_ADEPT) - { - // Add the Dragonfire Adept Shapes - int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SHAPED_ADEPTBREATH)); - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_CLOUD_ADEPTBREATH)); - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(spellId)); - spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_ENDURE_ADEPTBREATH)); - essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(spellId)); - } - - SetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_ESSENCE_CACHE_BASE_VAR + IntToString(nClass), essenceSpells); - return essenceSpells; -} - -int JsonArrayContainsInt(json list, int item) -{ - int totalCount = JsonGetLength(list); - - int i; - for (i = 0; i < totalCount; i++) - { - if (JsonGetInt(JsonArrayGet(list, i)) == item) - return TRUE; - } - - return FALSE; -} \ No newline at end of file diff --git a/src/include/prc_nui_scd_inc.nss b/src/include/prc_nui_scd_inc.nss deleted file mode 100644 index 5f14b7e..0000000 --- a/src/include/prc_nui_scd_inc.nss +++ /dev/null @@ -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)); -} diff --git a/src/include/prc_string_inc.nss b/src/include/prc_string_inc.nss deleted file mode 100644 index f590b4c..0000000 --- a/src/include/prc_string_inc.nss +++ /dev/null @@ -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; -} 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; diff --git a/src/module/itp/placeablepalcus.itp.json b/src/module/itp/placeablepalcus.itp.json index ac95ff6..2c475c8 100644 --- a/src/module/itp/placeablepalcus.itp.json +++ b/src/module/itp/placeablepalcus.itp.json @@ -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": { diff --git a/src/module/nss/strtbg.nss b/src/module/nss/strtbg.nss index aac8e5e..90aa0c4 100644 --- a/src/module/nss/strtbg.nss +++ b/src/module/nss/strtbg.nss @@ -2880,7 +2880,7 @@ void main() } } - if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE") != 0); + if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE") != 0) { return; } diff --git a/src/module/nss/usewindow.ncs b/src/module/nss/usewindow.ncs new file mode 100644 index 0000000..5d1fb90 Binary files /dev/null and b/src/module/nss/usewindow.ncs differ