From 619b7c62c949ce4f2023a5cdcfcd9092d411c971 Mon Sep 17 00:00:00 2001 From: Jaysyn904 <68194417+Jaysyn904@users.noreply.github.com> Date: Tue, 3 Jun 2025 23:13:56 -0400 Subject: [PATCH] 2025/06/03 Update Updated NUI spellcast menu (@Rakiov) Updated Tornado Throw. Updated Midnight Augmentation. Updated Lucky Dice's tlk entries. Fixed Heartwarder's marker feat. --- nwn/nwnprc/trunk/2das/classes.2da | 2 +- nwn/nwnprc/trunk/2das/cls_bfeat_heartw.2da | 2 +- nwn/nwnprc/trunk/2das/cls_bfeat_sod.2da | 122 ++++++------- nwn/nwnprc/trunk/2das/cls_feat_sod.2da | 170 ++++++++++++++++-- nwn/nwnprc/trunk/2das/feat.2da | 8 +- nwn/nwnprc/trunk/2das/spells.2da | 6 +- nwn/nwnprc/trunk/include/prc_feat_const.nss | 3 + nwn/nwnprc/trunk/include/prc_inc_function.nss | 1 + nwn/nwnprc/trunk/include/prc_inc_unarmed.nss | 12 +- nwn/nwnprc/trunk/include/prc_nui_sb_inc.nss | 74 +++++--- nwn/nwnprc/trunk/include/x2_inc_spellhook.nss | 4 +- .../trunk/newspellbook/moi_midnightcnv.nss | 8 +- .../trunk/newspellbook/tob_stsn_trnthr.nss | 3 +- nwn/nwnprc/trunk/scripts/prc_nui_sb_event.nss | 8 +- nwn/nwnprc/trunk/scripts/prc_nui_sb_trggr.nss | 12 +- nwn/nwnprc/trunk/scripts/prc_nui_sb_view.nss | 75 ++++++-- nwn/nwnprc/trunk/tlk/prc8_consortium.tlk | Bin 12125475 -> 12125476 bytes nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml | 2 +- nwn/nwnprc/trunk/tlk/prc_consortium.tlk | Bin 12125475 -> 12125476 bytes 19 files changed, 375 insertions(+), 137 deletions(-) diff --git a/nwn/nwnprc/trunk/2das/classes.2da b/nwn/nwnprc/trunk/2das/classes.2da index 8bf0ee75..71b4ed0b 100644 --- a/nwn/nwnprc/trunk/2das/classes.2da +++ b/nwn/nwnprc/trunk/2das/classes.2da @@ -222,7 +222,7 @@ 218 Warmind 16790702 16825724 16825725 16825726 16825727 IR_ELDKNI 10 CLS_ATK_1 CLS_FEAT_WARMND CLS_SAVTHR_WILD CLS_SKILL_WARMND CLS_BFEAT_WARMND 2 **** **** 1 0 14 12 14 16 10 10 WIS 0X04 0X1 0 CLASS_TYPE_WARMIND 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_WARMND 40 0 0 0 10 2 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 219 IronMind 16790703 16822552 16822553 16822554 16822555 IC_IRONMIND 10 CLS_ATK_2 CLS_FEAT_IRNMND CLS_SAVTHR_WIZ CLS_SKILL_IRNMND CLS_BFEAT_IRNMND 2 **** **** 1 0 15 9 14 13 10 15 WIS 0X00 0X0 0 CLASS_TYPE_IRONMIND 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_IRNMND 10 0 0 0 10 2 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 220 SanctifiedMind 16790704 16822568 16822569 16822570 16822571 IR_THRALLHERD 8 CLS_ATK_1 CLS_FEAT_SNCMND CLS_SAVTHR_CLER CLS_SKILL_SNCMND CLS_BFEAT_SNCMND 4 **** **** 1 0 15 9 14 13 10 15 WIS 0X10 0X2 0 CLASS_TYPE_SANCTIFIED_MIND 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SNCMND 6 0 0 1 6 2 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** -221 SlayerOfDomiel 16790705 16827566 16827567 16827568 16827569 IR_HEIRONEOUS 6 CLS_ATK_2 CLS_FEAT_SOD CLS_SAVTHR_ROG CLS_SKILL_SOD CLS_BFEAT_SOD 4 CLS_SPGN_SOD **** 1 1 15 9 14 13 10 15 WIS 0X15 0X3 0 CLASS_TYPE_SLAYER_OF_DOMIEL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SOD 10 0 0 0 10 2 0 **** 1 0 0 0 0 0 0 WIS Domiel 1 1 255 0 0 +221 SlayerOfDomiel 16790705 16827566 16827567 16827568 16827569 IR_HEIRONEOUS 6 CLS_ATK_2 CLS_FEAT_SOD CLS_SAVTHR_ROG CLS_SKILL_SOD CLS_BFEAT_SOD 4 CLS_SPGN_SOD **** 1 1 15 9 14 13 10 15 WIS 0X15 0X3 0 CLASS_TYPE_SLAYER_OF_DOMIEL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SOD 40 0 0 0 10 2 0 **** 1 0 0 0 0 0 0 WIS Domiel 1 1 255 0 0 222 DiscipleOfAsmodeus 16790706 16822624 16822625 16822626 16822627 IR_SOULEATER 6 CLS_ATK_2 CLS_FEAT_DOA CLS_SAVTHR_WIZ CLS_SKILL_DOA CLS_BFEAT_DOA 4 **** **** 1 0 15 9 14 13 10 15 WIS 0X09 0X2 0 CLASS_TYPE_DISCIPLE_OF_ASMODEUS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DOA 10 0 2 0 10 2 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 223 Dirgesinger 16790707 16822584 16822585 16822586 16822587 IR_PALEMA 6 CLS_ATK_2 CLS_FEAT_DIRGE CLS_SAVTHR_WIZ CLS_SKILL_DIRGE CLS_BFEAT_DIRGE 4 **** **** 1 0 15 9 14 13 10 15 WIS 0X08 0X2 0 CLASS_TYPE_DIRGESINGER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DIRGE 5 0 0 0 5 2 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 224 Suel_Archanamach 16790708 16822598 16822599 16822600 16822601 IR_HAVOCMAGE 8 CLS_ATK_2 CLS_FEAT_SUEL CLS_SAVTHR_BARD CLS_SKILL_SUEL CLS_BFEAT_SUEL 4 CLS_SPGN_SUEL CLS_SPKN_SUEL 1 1 14 14 14 15 10 10 WIS 0X00 0X0 0 CLASS_TYPE_SUEL_ARCHANAMACH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SUEL 10 0 0 0 10 10 131 **** **** **** **** **** **** **** **** **** Suel **** **** **** **** **** diff --git a/nwn/nwnprc/trunk/2das/cls_bfeat_heartw.2da b/nwn/nwnprc/trunk/2das/cls_bfeat_heartw.2da index c9579e16..85058153 100644 --- a/nwn/nwnprc/trunk/2das/cls_bfeat_heartw.2da +++ b/nwn/nwnprc/trunk/2das/cls_bfeat_heartw.2da @@ -1,7 +1,7 @@ 2DA V2.0 Bonus -0 0 +0 1 1 0 2 0 3 0 diff --git a/nwn/nwnprc/trunk/2das/cls_bfeat_sod.2da b/nwn/nwnprc/trunk/2das/cls_bfeat_sod.2da index 89d5a6c3..26289906 100644 --- a/nwn/nwnprc/trunk/2das/cls_bfeat_sod.2da +++ b/nwn/nwnprc/trunk/2das/cls_bfeat_sod.2da @@ -1,63 +1,63 @@ 2DA V2.0 - Bonus -0 1 -1 0 -2 0 -3 0 -4 0 -5 0 -6 0 -7 0 -8 0 -9 0 -10 0 -11 0 -12 0 -13 0 -14 0 -15 0 -16 0 -17 0 -18 0 -19 0 -20 0 -21 0 -22 0 -23 0 -24 0 -25 0 -26 0 -27 0 -28 0 -29 0 -30 0 -31 0 -32 0 -33 0 -34 0 -35 0 -36 0 -37 0 -38 0 -39 0 -40 0 -41 0 -42 0 -43 0 -44 0 -45 0 -46 0 -47 0 -48 0 -49 0 -50 0 -51 0 -52 0 -53 0 -54 0 -55 0 -56 0 -57 0 -58 0 -59 0 + Bonus +0 0 +1 0 +2 0 +3 0 +4 0 +5 0 +6 0 +7 0 +8 0 +9 0 +10 0 +11 0 +12 0 +13 1 +14 0 +15 0 +16 0 +17 1 +18 0 +19 0 +20 0 +21 1 +22 0 +23 0 +24 0 +25 1 +26 0 +27 0 +28 0 +29 1 +30 0 +31 0 +32 0 +33 1 +34 0 +35 0 +36 0 +37 1 +38 0 +39 0 +40 0 +41 1 +42 0 +43 0 +44 0 +45 1 +46 0 +47 0 +48 0 +49 1 +50 0 +51 0 +52 0 +53 1 +54 0 +55 0 +56 0 +57 1 +58 0 +59 0 diff --git a/nwn/nwnprc/trunk/2das/cls_feat_sod.2da b/nwn/nwnprc/trunk/2das/cls_feat_sod.2da index ebe6b5bc..5c0be5f6 100644 --- a/nwn/nwnprc/trunk/2das/cls_feat_sod.2da +++ b/nwn/nwnprc/trunk/2das/cls_feat_sod.2da @@ -1,16 +1,158 @@ 2DA V2.0 - FeatLabel FeatIndex List GrantedOnLevel OnMenu -0 SlayerOfDomielDeathTouch1 2282 3 1 1 -1 SlayerOfDomielDeathTouch2 2284 3 3 1 -2 SlayerOfDomielDeathTouch3 2286 3 8 1 -3 SlayerOfDomielDeathTouch4 2299 3 10 1 -4 SlayerOfDomielDivineGrace 2264 3 2 0 -5 ImprovedEvasion 212 3 6 0 -6 SlayerOfDomielDetectEvil 2461 3 1 1 -7 FEAT_DRAGONFIRE_STRIKE 3949 0 -1 1 -8 SuddenEmpower 2830 0 -1 1 -9 SuddenExtend 2831 0 -1 1 -10 SuddenMaximize 2832 0 -1 1 -11 SuddenWiden 2833 0 -1 1 -12 FEAT_ESCHEW_MATERIALS 2596 0 1 0 + FeatLabel FeatIndex List GrantedOnLevel OnMenu +0 SlayerOfDomielDeathTouch 2282 3 1 1 +1 SlayerOfDomielDivineGrace 2264 3 2 0 +2 ImprovedEvasion 212 3 6 0 +3 SlayerOfDomielDetectEvil 2461 3 1 1 +4 EPIC_SLAYER_OF_DOMIEL 25101 3 11 0 +5 FEAT_EPIC_ARMOR_SKIN 490 1 -1 0 +6 FEAT_EPIC_BLINDING_SPEED 491 1 -1 1 +7 FEAT_EPIC_PROWESS 584 1 -1 0 +8 FEAT_EPIC_WEAPON_FOCUS_CLUB 619 1 -1 0 +9 FEAT_EPIC_WEAPON_FOCUS_DAGGER 620 1 -1 0 +10 FEAT_EPIC_WEAPON_FOCUS_DART 621 1 -1 0 +11 FEAT_EPIC_WEAPON_FOCUS_HEAVYCROSSBOW 622 1 -1 0 +12 FEAT_EPIC_WEAPON_FOCUS_LIGHTCROSSBOW 623 1 -1 0 +13 FEAT_EPIC_WEAPON_FOCUS_LIGHTMACE 624 1 -1 0 +14 FEAT_EPIC_WEAPON_FOCUS_MORNINGSTAR 625 1 -1 0 +15 FEAT_EPIC_WEAPON_FOCUS_QUARTERSTAFF 626 1 -1 0 +16 FEAT_EPIC_WEAPON_FOCUS_SHORTSPEAR 627 1 -1 0 +17 FEAT_EPIC_WEAPON_FOCUS_SICKLE 628 1 -1 0 +18 FEAT_EPIC_WEAPON_FOCUS_SLING 629 1 -1 0 +19 FEAT_EPIC_WEAPON_FOCUS_UNARMED 630 1 -1 0 +20 FEAT_EPIC_WEAPON_FOCUS_LONGBOW 631 1 -1 0 +21 FEAT_EPIC_WEAPON_FOCUS_SHORTBOW 632 1 -1 0 +22 FEAT_EPIC_WEAPON_FOCUS_SHORTSWORD 633 1 -1 0 +23 FEAT_EPIC_WEAPON_FOCUS_RAPIER 634 1 -1 0 +24 FEAT_EPIC_WEAPON_FOCUS_SCIMITAR 635 1 -1 0 +25 FEAT_EPIC_WEAPON_FOCUS_LONGSWORD 636 1 -1 0 +26 FEAT_EPIC_WEAPON_FOCUS_GREATSWORD 637 1 -1 0 +27 FEAT_EPIC_WEAPON_FOCUS_HANDAXE 638 1 -1 0 +28 FEAT_EPIC_WEAPON_FOCUS_THROWINGAXE 639 1 -1 0 +29 FEAT_EPIC_WEAPON_FOCUS_BATTLEAXE 640 1 -1 0 +30 FEAT_EPIC_WEAPON_FOCUS_GREATAXE 641 1 -1 0 +31 FEAT_EPIC_WEAPON_FOCUS_HALBERD 642 1 -1 0 +32 FEAT_EPIC_WEAPON_FOCUS_LIGHTHAMMER 643 1 -1 0 +33 FEAT_EPIC_WEAPON_FOCUS_LIGHTFLAIL 644 1 -1 0 +34 FEAT_EPIC_WEAPON_FOCUS_WARHAMMER 645 1 -1 0 +35 FEAT_EPIC_WEAPON_FOCUS_HEAVYFLAIL 646 1 -1 0 +36 FEAT_EPIC_WEAPON_FOCUS_KAMA 647 1 -1 0 +37 FEAT_EPIC_WEAPON_FOCUS_KUKRI 648 1 -1 0 +38 FEAT_EPIC_WEAPON_FOCUS_SHURIKEN 649 1 -1 0 +39 FEAT_EPIC_WEAPON_FOCUS_SCYTHE 650 1 -1 0 +40 FEAT_EPIC_WEAPON_FOCUS_KATANA 651 1 -1 0 +41 FEAT_EPIC_WEAPON_FOCUS_BASTARDSWORD 652 1 -1 0 +42 FEAT_EPIC_WEAPON_FOCUS_DIREMACE 653 1 -1 0 +43 FEAT_EPIC_WEAPON_FOCUS_DOUBLEAXE 654 1 -1 0 +44 FEAT_EPIC_WEAPON_FOCUS_TWOBLADEDSWORD 655 1 -1 0 +45 EPIC_WEAPON_FOCUS_LANCE 24613 1 -1 0 +46 EPIC_WEAPON_FOCUS_HEAVY_PICK 24614 1 -1 0 +47 EPIC_WEAPON_FOCUS_LIGHT_PICK 24615 1 -1 0 +48 EPIC_WEAPON_FOCUS_SAI 24616 1 -1 0 +49 EPIC_WEAPON_FOCUS_NUNCHAKU 24617 1 -1 0 +50 EPIC_WEAPON_FOCUS_FALCHION 24618 1 -1 0 +51 EPIC_WEAPON_FOCUS_SAP 24619 1 -1 0 +52 EPIC_WEAPON_FOCUS_KATAR 24620 1 -1 0 +53 EPIC_WEAPON_FOCUS_HEAVY_MACE 24621 1 -1 0 +54 EPIC_WEAPON_FOCUS_MAUL 24622 1 -1 0 +55 EPIC_WEAPON_FOCUS_DBL_SCIMITAR 24623 1 -1 0 +56 EPIC_WEAPON_FOCUS_GOAD 24624 1 -1 0 +57 EPIC_WEAPON_FOCUS_ELVEN_LIGHTBLADE 24698 1 -1 0 +58 EPIC_WEAPON_FOCUS_ELVEN_THINBLADE 24706 1 -1 0 +59 EPIC_WEAPON_FOCUS_ELVEN_COURTBLADE 24714 1 -1 0 +60 FEAT_EPIC_WEAPON_FOCUS_DWAXE 956 1 -1 0 +61 FEAT_EPIC_WEAPON_FOCUS_WHIP 997 1 -1 0 +62 FEAT_EPIC_SUPERIOR_INITIATIVE 753 1 -1 0 +63 Epic_WeaponFocus_Mindblade 3618 1 -1 0 +64 FEAT_EPIC_LEADERSHIP 4366 1 -1 0 +65 FEAT_LEGENDARY_COMMANDER 4367 1 -1 0 +66 FEAT_EPIC_SKILL_FOCUS_APPRAISE 588 1 -1 0 +67 FEAT_EPIC_SKILL_FOCUS_CONCENTRATION 589 1 -1 0 +68 FEAT_EPIC_SKILL_FOCUS_CRAFT_TRAP 590 1 -1 0 +69 FEAT_EPIC_SKILL_FOCUS_DISABLETRAP 591 1 -1 0 +70 FEAT_EPIC_SKILL_FOCUS_DISCIPLINE 592 1 -1 0 +71 FEAT_EPIC_SKILL_FOCUS_HEAL 593 1 -1 0 +72 FEAT_EPIC_SKILL_FOCUS_HIDE 594 1 -1 0 +73 FEAT_EPIC_SKILL_FOCUS_LISTEN 595 1 -1 0 +74 FEAT_EPIC_SKILL_FOCUS_LORE 596 1 -1 0 +75 FEAT_EPIC_SKILL_FOCUS_MOVESILENTLY 597 1 -1 0 +76 FEAT_EPIC_SKILL_FOCUS_OPENLOCK 598 1 -1 0 +77 FEAT_EPIC_SKILL_FOCUS_PARRY 599 1 -1 0 +78 FEAT_EPIC_SKILL_FOCUS_PERSUADE 601 1 -1 0 +79 FEAT_EPIC_SKILL_FOCUS_PICKPOCKET 602 1 -1 0 +80 FEAT_EPIC_SKILL_FOCUS_SEARCH 603 1 -1 0 +81 FEAT_EPIC_SKILL_FOCUS_SETTRAP 604 1 -1 0 +82 FEAT_EPIC_SKILL_FOCUS_SPELLCRAFT 605 1 -1 0 +83 FEAT_EPIC_SKILL_FOCUS_SPOT 606 1 -1 0 +84 FEAT_EPIC_SKILL_FOCUS_TAUNT 607 1 -1 0 +85 FEAT_EPIC_SKILL_FOCUS_TUMBLE 608 1 -1 0 +86 FEAT_EPIC_SKILL_FOCUS_CRAFT_ARMOR 913 1 -1 0 +87 FEAT_EPIC_SKILL_FOCUS_CRAFT_WEAPON 914 1 -1 0 +88 FEAT_EPIC_SKILL_FOCUS_BLUFF 917 1 -1 0 +89 FEAT_EPIC_SKILL_FOCUS_INTIMIDATE 918 1 -1 0 +90 FEAT_LINGERING_DAMAGE 3099 1 -1 0 +91 FEAT_EPIC_SKILL_FOCUS_RIDE 3038 1 -1 0 +92 FEAT_EPIC_SKILL_FOCUS_JUMP 3040 1 -1 0 +93 FEAT_EPIC_SKILL_FOCUS_SENSE_MOTIVE 3042 1 -1 0 +94 FEAT_EPIC_SKILL_FOCUS_MARTIAL_LORE 3044 1 -1 0 +95 FEAT_EPIC_SKILL_FOCUS_BALANCE 3046 1 -1 0 +96 FEAT_EPIC_SKILL_FOCUS_CRAFT_POISON 3048 1 -1 0 +97 FEAT_EPIC_SKILL_FOCUS_PSICRAFT 3050 1 -1 0 +98 FEAT_EPIC_SKILL_FOCUS_CLIMB 3052 1 -1 0 +99 FEAT_EPIC_SKILL_FOCUS_CRAFT_GENERAL 3054 1 -1 0 +100 FEAT_EPIC_REPUTATION 586 1 -1 0 +101 FEAT_EPIC_SELF_CONCEALMENT_10 748 1 -1 0 +102 FEAT_EPIC_SELF_CONCEALMENT_20 749 1 -1 0 +103 FEAT_EPIC_SELF_CONCEALMENT_30 750 1 -1 0 +104 FEAT_EPIC_SELF_CONCEALMENT_40 751 1 -1 0 +105 FEAT_EPIC_SELF_CONCEALMENT_50 752 1 -1 0 +106 FEAT_EPIC_SUPERIOR_INITIATIVE 753 1 -1 0 +107 FEAT_EPIC_GREAT_DEXTERITY_1 784 1 -1 0 +108 FEAT_EPIC_GREAT_DEXTERITY_2 785 1 -1 0 +109 FEAT_EPIC_GREAT_DEXTERITY_3 786 1 -1 0 +110 FEAT_EPIC_GREAT_DEXTERITY_4 787 1 -1 0 +111 FEAT_EPIC_GREAT_DEXTERITY_5 788 1 -1 0 +112 FEAT_EPIC_GREAT_DEXTERITY_6 789 1 -1 0 +113 FEAT_EPIC_GREAT_DEXTERITY_7 790 1 -1 0 +114 FEAT_EPIC_GREAT_DEXTERITY_8 791 1 -1 0 +115 FEAT_EPIC_GREAT_DEXTERITY_9 792 1 -1 0 +116 FEAT_EPIC_GREAT_DEXTERITY_10 793 1 -1 0 +117 FEAT_EPIC_IMPROVED_SNEAK_ATTACK_1 834 1 -1 0 +118 FEAT_EPIC_IMPROVED_SNEAK_ATTACK_2 835 1 -1 0 +119 FEAT_EPIC_IMPROVED_SNEAK_ATTACK_3 836 1 -1 0 +120 FEAT_EPIC_IMPROVED_SNEAK_ATTACK_4 837 1 -1 0 +121 FEAT_EPIC_IMPROVED_SNEAK_ATTACK_5 838 1 -1 0 +122 FEAT_EPIC_IMPROVED_SNEAK_ATTACK_6 839 1 -1 0 +123 FEAT_EPIC_IMPROVED_SNEAK_ATTACK_7 840 1 -1 0 +124 FEAT_EPIC_IMPROVED_SNEAK_ATTACK_8 841 1 -1 0 +125 FEAT_EPIC_IMPROVED_SNEAK_ATTACK_9 842 1 -1 0 +126 FEAT_EPIC_IMPROVED_SNEAK_ATTACK_10 843 1 -1 0 +127 FEAT_EPIC_SKILL_FOCUS_USEMAGICDEVICE 609 1 -1 0 +128 FEAT_EPIC_DODGE 856 1 -1 0 +129 FEAT_EPIC_GREAT_CHARISMA_1 764 1 -1 0 +130 FEAT_EPIC_GREAT_CHARISMA_2 765 1 -1 0 +131 FEAT_EPIC_GREAT_CHARISMA_3 766 1 -1 0 +132 FEAT_EPIC_GREAT_CHARISMA_4 767 1 -1 0 +133 FEAT_EPIC_GREAT_CHARISMA_5 768 1 -1 0 +134 FEAT_EPIC_GREAT_CHARISMA_6 769 1 -1 0 +135 FEAT_EPIC_GREAT_CHARISMA_7 770 1 -1 0 +136 FEAT_EPIC_GREAT_CHARISMA_8 771 1 -1 0 +137 FEAT_EPIC_GREAT_CHARISMA_9 772 1 -1 0 +138 FEAT_EPIC_GREAT_CHARISMA_10 773 1 -1 0 +139 FEAT_EPIC_GREAT_WISDOM_1 804 1 -1 0 +140 FEAT_EPIC_GREAT_WISDOM_2 805 1 -1 0 +141 FEAT_EPIC_GREAT_WISDOM_3 806 1 -1 0 +142 FEAT_EPIC_GREAT_WISDOM_4 807 1 -1 0 +143 FEAT_EPIC_GREAT_WISDOM_5 808 1 -1 0 +144 FEAT_EPIC_GREAT_WISDOM_6 809 1 -1 0 +145 FEAT_EPIC_GREAT_WISDOM_7 810 1 -1 0 +146 FEAT_EPIC_GREAT_WISDOM_8 811 1 -1 0 +147 FEAT_EPIC_GREAT_WISDOM_9 812 1 -1 0 +148 FEAT_EPIC_GREAT_WISDOM_10 813 1 -1 0 +149 FEAT_DRAGONFIRE_STRIKE 3949 0 -1 1 +150 SuddenEmpower 2830 0 -1 1 +151 SuddenExtend 2831 0 -1 1 +152 SuddenMaximize 2832 0 -1 1 +153 SuddenWiden 2833 0 -1 1 +154 FEAT_ESCHEW_MATERIALS 2596 0 1 0 diff --git a/nwn/nwnprc/trunk/2das/feat.2da b/nwn/nwnprc/trunk/2das/feat.2da index 13c52f56..af0ddf75 100644 --- a/nwn/nwnprc/trunk/2das/feat.2da +++ b/nwn/nwnprc/trunk/2das/feat.2da @@ -2343,10 +2343,10 @@ 2339 FEAT_GREATER_IRON_HEWS 16826150 16826151 ife_x2critomsta **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2765 **** 1 1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_GREATER_IRON_HEWS 4 **** **** **** **** **** 0 1 2340 FEAT_IRON_SKIN 16826152 16826153 ife_x2arskin **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2766 **** 1 1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_IRON_SKIN 4 **** **** **** **** **** 0 1 2341 FEAT_IRON_BODY 16826154 16826155 ife_x2epdivcha **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2767 **** 1 1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_IRON_BODY 4 **** **** **** **** **** 0 1 -2342 FEAT_PAIN_TOUCH 16826160 16826161 ife_x2wfunar **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2768 2343 **** 11 **** **** **** **** **** **** **** **** **** **** **** FEAT_PAIN_TOUCH **** **** **** **** **** **** **** 1 -2343 FEAT_AURA_OF_FEAR 16826162 16826163 ife_x1spdrkbls **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2770 2346 **** 11 **** 1 **** **** **** **** **** **** **** **** **** FEAT_AURA_OF_FEAR **** **** **** **** **** **** **** 1 -2344 FEAT_CRUELEST_CUT 16826164 16826165 ife_x2kicrit **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2769 2349 **** 11 **** **** **** **** **** **** **** **** **** **** **** FEAT_CRUELEST_CUT **** **** **** **** **** **** **** 1 -2345 FEAT_VISAGE_OF_TERROR 16826166 16826167 ife_x2mightrage **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2771 2391 **** 9 **** **** **** **** **** **** **** **** **** **** **** FEAT_VISAGE_OF_TERROR **** **** **** **** **** **** **** 1 +2342 FEAT_PAIN_TOUCH 16826160 16826161 ife_x2wfunar **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** 2768 **** **** 11 **** **** **** **** **** **** **** **** **** **** **** FEAT_PAIN_TOUCH 3 1 **** **** **** **** 0 1 +2343 FEAT_AURA_OF_FEAR 16826162 16826163 ife_x1spdrkbls **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** 2770 **** **** 11 **** 1 **** **** **** **** **** **** **** **** **** FEAT_AURA_OF_FEAR 1 **** **** **** **** **** 0 1 +2344 FEAT_CRUELEST_CUT 16826164 16826165 ife_x2kicrit **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** 2769 **** **** 11 **** **** **** **** **** **** **** **** **** **** **** FEAT_CRUELEST_CUT 3 1 **** **** **** **** 0 1 +2345 FEAT_VISAGE_OF_TERROR 16826166 16826167 ife_x2mightrage **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** 2771 **** **** 9 **** **** **** **** **** **** **** **** **** **** **** FEAT_VISAGE_OF_TERROR 1 **** **** **** **** **** 0 1 2346 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 2347 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 2348 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 diff --git a/nwn/nwnprc/trunk/2das/spells.2da b/nwn/nwnprc/trunk/2das/spells.2da index eae4ac00..7fd6e560 100644 --- a/nwn/nwnprc/trunk/2das/spells.2da +++ b/nwn/nwnprc/trunk/2das/spells.2da @@ -18936,9 +18936,9 @@ 18932 LightningGauntletsZap 16836844 is_ChLightn V T 0 **** 0x02 moi_mld_lghtgnzp **** **** **** **** **** **** 6 1500 hand **** vco_mebalelec01 **** sco_mebalelec01 vs_chant_evoc_hm vs_chant_evoc_hf area 1000 **** **** **** **** 0 **** linked hand **** path Electricity 1 **** **** **** **** **** 1 **** 1 6110 0 0 **** 1 **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 18933 LightningGauntletsHandsBind 16836845 is_ShadShld T P 0 **** 0x01 moi_mld_lghtgnhn **** **** **** **** **** **** 8 1500 hand **** **** vco_lgrinodd01 sco_lgrinodd01 vs_chant_illu_hm vs_chant_illu_hf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 12 **** 1 16836717 0 0 **** 0 **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 18934 LuckyDice_RadialMaster 16836093 **** T P 0 **** 0x01 moi_mld_lckydcft **** **** **** **** **** **** 2 1500 hand **** vco_smhanelec01 **** sco_mehanelec01 vs_chant_conj_lm vs_chant_conj_lf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 18935 18936 18937 **** **** 12 **** 1 16825537 0 0 **** 0 8834 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** -18935 LuckyDice_AttackDamage 16836095 fot_knowalign T P 0 **** 0x01 moi_mld_lckydcft **** **** **** **** **** **** 2 1500 hand **** vco_smhanelec01 **** sco_mehanelec01 vs_chant_conj_lm vs_chant_conj_lf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 12 18934 1 16825537 0 0 **** 0 556926050 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** -18936 LuckyDice_SavingThrows 16836096 fot_exped T P 0 **** 0x01 moi_mld_lckydcft **** **** **** **** **** **** 2 1500 hand **** vco_smhanelec01 **** sco_mehanelec01 vs_chant_conj_lm vs_chant_conj_lf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 12 18934 1 16825537 0 0 **** 0 557384801 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** -18937 LuckyDice_SkillAbilities 16836097 fot_minorseq T P 0 **** 0x01 moi_mld_lckydcft **** **** **** **** **** **** 2 1500 hand **** vco_smhanelec01 **** sco_mehanelec01 vs_chant_conj_lm vs_chant_conj_lf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 12 18934 1 16825537 0 0 **** 0 557515872 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** +18935 LuckyDice_AttackDamage 16836848 fot_knowalign T P 0 **** 0x01 moi_mld_lckydcft **** **** **** **** **** **** 2 1500 hand **** vco_smhanelec01 **** sco_mehanelec01 vs_chant_conj_lm vs_chant_conj_lf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 12 18934 1 16825537 0 0 **** 0 556926050 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** +18936 LuckyDice_SavingThrows 16836849 fot_exped T P 0 **** 0x01 moi_mld_lckydcft **** **** **** **** **** **** 2 1500 hand **** vco_smhanelec01 **** sco_mehanelec01 vs_chant_conj_lm vs_chant_conj_lf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 12 18934 1 16825537 0 0 **** 0 557384801 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** +18937 LuckyDice_SkillAbilities 16836850 fot_minorseq T P 0 **** 0x01 moi_mld_lckydcft **** **** **** **** **** **** 2 1500 hand **** vco_smhanelec01 **** sco_mehanelec01 vs_chant_conj_lm vs_chant_conj_lf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 12 18934 1 16825537 0 0 **** 0 557515872 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 18938 MagesSpectaclesBrowBind 16836853 is_ReadMagic D T 0 **** 0x28 moi_mld_mgspctft **** **** **** **** **** **** 2 1500 hand **** vco_smhanelec01 **** sco_mehanelec01 vs_chant_illu_lm vs_chant_illu_lf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 16789529 0 0 **** 0 **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 18939 ManticoreBeltTotemBind 16836856 ife_X1EmbuArr V L 0 **** 0x02 moi_mld_mntcrbft **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** attack 1000 **** **** **** **** 1 wamar_001 homing hand **** path **** 0 **** **** **** **** **** 3 **** 2 **** 0 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 18940 MantleOfFlameShouldersBind 16836859 is_Fireball V P 0 **** 0x01 moi_mld_mntlflft **** **** **** **** **** **** 3 1500 hand **** vco_mehanfire03 **** sco_mehanfire03 vs_chant_evoc_lm vs_chant_evoc_lf area 1000 **** **** **** **** 1 vpr_fireball homing hand spr_fireball path Fire 1 **** **** **** **** **** 11 **** 1 6155 0 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** diff --git a/nwn/nwnprc/trunk/include/prc_feat_const.nss b/nwn/nwnprc/trunk/include/prc_feat_const.nss index 9028a024..83a0544f 100644 --- a/nwn/nwnprc/trunk/include/prc_feat_const.nss +++ b/nwn/nwnprc/trunk/include/prc_feat_const.nss @@ -760,6 +760,9 @@ const int FEAT_ED_PROTECTIVE_AURA = 23526; const int FEAT_ED_STRENGTH_OF_WILL = 23527; const int FEAT_ED_WILD_FRENZY = 23528; +//:: Slayer of Domiel +const int FEAT_SOD_DEATH_TOUCH = 2282; + //Passive Feats const int FEAT_ETERNAL_FREEDOM = 4298; const int FEAT_INTUITIVE_ATTACK = 3166; diff --git a/nwn/nwnprc/trunk/include/prc_inc_function.nss b/nwn/nwnprc/trunk/include/prc_inc_function.nss index 690cdb90..8fbb486b 100644 --- a/nwn/nwnprc/trunk/include/prc_inc_function.nss +++ b/nwn/nwnprc/trunk/include/prc_inc_function.nss @@ -2166,6 +2166,7 @@ void FeatSpecialUsePerDay(object oPC) FeatUsePerDay(oPC, FEAT_LIPS_RAPTUR); FeatUsePerDay(oPC, FEAT_COMMAND_SPIDERS, ABILITY_CHARISMA, 3); FeatUsePerDay(oPC, FEAT_FM_FOREST_DOMINION, ABILITY_CHARISMA, 3); + FeatUsePerDay(oPC, FEAT_SOD_DEATH_TOUCH, -1, (GetLevelByClass(CLASS_TYPE_SLAYER_OF_DOMIEL, oPC)+4)/4); FeatDiabolist(oPC); FeatAlaghar(oPC); ShadowShieldUses(oPC); diff --git a/nwn/nwnprc/trunk/include/prc_inc_unarmed.nss b/nwn/nwnprc/trunk/include/prc_inc_unarmed.nss index e745829f..a08f912d 100644 --- a/nwn/nwnprc/trunk/include/prc_inc_unarmed.nss +++ b/nwn/nwnprc/trunk/include/prc_inc_unarmed.nss @@ -250,9 +250,9 @@ int FindUnarmedDamage(object oCreature) // Ronove is in place of monk, does not stack if (iRonove > iMonk) iMonk = iRonove; - - // monks damage progesses every four levels, starts at 1d6 - if (iMonk > 0) + + // monks damage progesses every four levels, starts at 1d6 + if (iMonk > 0) iMonkDamage = iMonk / 4 + 3; // For medium monks in 3.0e skip 2d8 and go to 1d20 @@ -263,6 +263,7 @@ int FindUnarmedDamage(object oCreature) // without stacking. if (iShou > 0) iShouDamage = iShou + 2; // Lv. 1: 1d6, Lv. 2: 1d8, Lv. 3: 1d10 if (iShou > 3) iShouDamage--; // Lv. 4: 1d10, Lv. 5: 2d6 + iShouDamage = StringToInt(Get2DACache("unarmed_dmg","size" + IntToString(iSize), iShouDamage)); // Frostrager does not stack with other damage types if (iFrost > 0) iFrostDamage = IP_CONST_MONSTERDAMAGE_1d6; // Lv. 1: 1d6 @@ -326,10 +327,15 @@ int FindUnarmedDamage(object oCreature) iBrawlerDamage += iDieIncrease; iFrostDamage += iDieIncrease; iSUSDamage += iDieIncrease; + + //FloatingTextStringOnCreature("prc_inc_unarmed: Size is: "+IntToString(iSize)+".", oCreature); + //FloatingTextStringOnCreature("prc_inc_unarmed: Pre 2DA Lookup >> iMonkDamage = "+IntToString(iMonkDamage)+".", oCreature); // now, read the damage from the table in unarmed_dmg.2da iMonkDamage = StringToInt(Get2DACache("unarmed_dmg","size" + IntToString(iSize), iMonkDamage)); iShouDamage = StringToInt(Get2DACache("unarmed_dmg","size" + IntToString(iSize), iShouDamage)); + + //FloatingTextStringOnCreature("prc_inc_unarmed: Post 2DA Lookup >> iMonkDamage = "+IntToString(iMonkDamage)+".", oCreature); // Medium+ monks have some special values on the table in 3.0: if (iSize >= 5 && !GetPRCSwitch(PRC_3_5e_FIST_DAMAGE)) diff --git a/nwn/nwnprc/trunk/include/prc_nui_sb_inc.nss b/nwn/nwnprc/trunk/include/prc_nui_sb_inc.nss index 81768b61..a1a768e2 100644 --- a/nwn/nwnprc/trunk/include/prc_nui_sb_inc.nss +++ b/nwn/nwnprc/trunk/include/prc_nui_sb_inc.nss @@ -533,24 +533,22 @@ int GetCurrentSpellLevel(int nClass, int 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_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) + || 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; - //Shadowcaster has no concept of spell levels - if (nClass == CLASS_TYPE_SHADOWCASTER) - return 9; - if (nClass == CLASS_TYPE_WARLOCK || nClass == CLASS_TYPE_DRAGONFIRE_ADEPT) return 4; @@ -570,6 +568,20 @@ int GetCurrentSpellLevel(int nClass, int nLevel) 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"; @@ -584,13 +596,13 @@ int GetCurrentSpellLevel(int nClass, int nLevel) { columnName = "EvolvingMind"; spellLevel2da = "cls_true_maxlvl"; //has a different 2da we want to look at - } + } - if (nClass == CLASS_TYPE_BINDER) - { + if (nClass == CLASS_TYPE_BINDER) + { columnName = "VestigeLvl"; spellLevel2da = "cls_bind_binder"; - } + } // ToB doesn't have a concept of this, but we don't care. @@ -601,21 +613,6 @@ int GetCurrentSpellLevel(int nClass, int nLevel) int GetMinSpellLevel(int nClass) { - - // 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 //Shadowsmiths doesn't have a progression 2da :) - || nClass == CLASS_TYPE_SHADOWSMITH //Shadowcasters doesn't have a progression 2da :) - || nClass == CLASS_TYPE_BINDER // Binders don't really have a concept of spell level - || nClass == CLASS_TYPE_DRAGON_SHAMAN //Invokers have an issue with tracking accurate spell levels, so this is a work around - || nClass == CLASS_TYPE_DRAGONFIRE_ADEPT - || nClass == CLASS_TYPE_WARLOCK) - { - return 1; - } - // again sponts have their own function if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS || nClass == CLASS_TYPE_ARCHIVIST) @@ -624,6 +621,23 @@ int GetMinSpellLevel(int 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); } @@ -631,6 +645,16 @@ int GetMinSpellLevel(int nClass) 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)); } diff --git a/nwn/nwnprc/trunk/include/x2_inc_spellhook.nss b/nwn/nwnprc/trunk/include/x2_inc_spellhook.nss index 2651c3fb..201364e1 100644 --- a/nwn/nwnprc/trunk/include/x2_inc_spellhook.nss +++ b/nwn/nwnprc/trunk/include/x2_inc_spellhook.nss @@ -1660,7 +1660,7 @@ int BardSorcPrCCheck(object oCaster, int nCastingClass, object oSpellCastItem) { if (CheckSecondaryPrC(oCaster) == TRUE) { - FloatingTextStringOnCreature("x2_inc_spellhook: BardSorcPrCCheck >>> Sorcerer w/RHD found.", oCaster); + if (DEBUG) DoDebug("x2_inc_spellhook: BardSorcPrCCheck >>> Sorcerer w/RHD found.", oCaster); return TRUE; } //no need to check further if new spellbooks are disabled @@ -1683,7 +1683,7 @@ int BardSorcPrCCheck(object oCaster, int nCastingClass, object oSpellCastItem) } if (CheckSecondaryPrC(oCaster) == TRUE) { - if (DEBUG) DoDebug("x2_inc_spellhook: BardSorcPrCCheck >>> Bard w/RHD found.", oCaster); + if (DEBUG) DoDebug("x2_inc_spellhook: BardSorcPrCCheck >>> Sorcerer w/RHD found.", oCaster); FloatingTextStringOnCreature("You must use the new spellbook on the class radial.", oCaster, FALSE); return FALSE; } diff --git a/nwn/nwnprc/trunk/newspellbook/moi_midnightcnv.nss b/nwn/nwnprc/trunk/newspellbook/moi_midnightcnv.nss index 47743cc3..cb1e34f6 100644 --- a/nwn/nwnprc/trunk/newspellbook/moi_midnightcnv.nss +++ b/nwn/nwnprc/trunk/newspellbook/moi_midnightcnv.nss @@ -163,7 +163,7 @@ void main() int i, nPowerLevel; int nMaxLevel = GetMaxEssentiaCapacityFeat(oMeldshaper); string sFeatID; - for(i = 14001; i < 14260 ; i++) + for(i = 14001; i < 14260 ; i++) { nPowerLevel = StringToInt(Get2DACache("spells", "Innate", i)); @@ -180,7 +180,9 @@ void main() if(SORT) AddToTempList(oMeldshaper, GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", i))), i); else AddChoice(GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", i))), i, oMeldshaper); } - } + } + + TransferTempList(oMeldshaper); } else if(nStage == STAGE_SELECT_ESSENTIA_POWER) { @@ -267,4 +269,4 @@ void main() // Store the stage value. If it has been changed, this clears out the choices SetStage(nStage, oMeldshaper); } -} +} \ No newline at end of file diff --git a/nwn/nwnprc/trunk/newspellbook/tob_stsn_trnthr.nss b/nwn/nwnprc/trunk/newspellbook/tob_stsn_trnthr.nss index 2993efd4..2dfd7e57 100644 --- a/nwn/nwnprc/trunk/newspellbook/tob_stsn_trnthr.nss +++ b/nwn/nwnprc/trunk/newspellbook/tob_stsn_trnthr.nss @@ -77,7 +77,8 @@ void main() // No hitting yourself or your friends if(GetIsEnemy(oAreaTarget, oInitiator)) { - fDist += MetersToFeet(GetDistanceBetween(oInitiator, oAreaTarget)); + //fDist += MetersToFeet(GetDistanceBetween(oInitiator, oAreaTarget)); + fDist += PRCMax(10, FloatToInt(MetersToFeet(GetDistanceBetween(oInitiator, oAreaTarget)))); AssignCommand(oInitiator, ClearAllActions(TRUE)); AssignCommand(oInitiator, JumpToLocation(GetLocation(oAreaTarget))); nBonus = (FloatToInt(fDist) / 5) * 2; // Bonus is +2 for every 5 feet moved diff --git a/nwn/nwnprc/trunk/scripts/prc_nui_sb_event.nss b/nwn/nwnprc/trunk/scripts/prc_nui_sb_event.nss index 85c428e1..f4e0931c 100644 --- a/nwn/nwnprc/trunk/scripts/prc_nui_sb_event.nss +++ b/nwn/nwnprc/trunk/scripts/prc_nui_sb_event.nss @@ -179,10 +179,10 @@ void main() if (masterSpellId) { SetLocalInt(oPlayer, NUI_SPELLBOOK_SELECTED_SUBSPELL_SPELLID_VAR, spellId); - spellId = masterSpellId; + featId = StringToInt(Get2DACache("spells", "FeatID", masterSpellId)); } - - featId = StringToInt(Get2DACache("spells", "FeatID", spellId)); + else + featId = StringToInt(Get2DACache("spells", "FeatID", spellId)); } } @@ -193,11 +193,13 @@ void main() if (nButton == NUI_PAYLOAD_BUTTON_RIGHT_CLICK) { CreateSpellDescriptionNUI(oPlayer, featId, spellId, realSpellId); + DeleteLocalInt(oPlayer, NUI_SPELLBOOK_SELECTED_SUBSPELL_SPELLID_VAR); return; } // If left click, operate normally if (nButton == NUI_PAYLOAD_BUTTON_LEFT_CLICK) { + // We use the spell's FeatID to do actions, and we set the OnTarget action // to PRC_NUI_SPELLBOOK so the handler knows what the action is being done SetLocalInt(oPlayer, NUI_SPELLBOOK_SELECTED_FEATID_VAR, featId); diff --git a/nwn/nwnprc/trunk/scripts/prc_nui_sb_trggr.nss b/nwn/nwnprc/trunk/scripts/prc_nui_sb_trggr.nss index ef087c3f..8c0b317f 100644 --- a/nwn/nwnprc/trunk/scripts/prc_nui_sb_trggr.nss +++ b/nwn/nwnprc/trunk/scripts/prc_nui_sb_trggr.nss @@ -19,20 +19,21 @@ void main() // Get the selected PRC spell we are going to cast int featId = GetLocalInt(OBJECT_SELF, NUI_SPELLBOOK_SELECTED_FEATID_VAR); + // if the spell has a master feat this is it. This will return 0 if not set. + int subSpellID = GetLocalInt(OBJECT_SELF, NUI_SPELLBOOK_SELECTED_SUBSPELL_SPELLID_VAR); + int isPersonalFeat = GetLocalInt(OBJECT_SELF, NUI_SPELLBOOK_ON_TARGET_IS_PERSONAL_FEAT); // if this is a personal feat then this was called directly since we never entered // targetting and this should be applied immediatly to the executing player. if (isPersonalFeat) { - ActionUseFeat(featId); + ActionUseFeat(featId, OBJECT_SELF, subSpellID); // we want to remove this just in case of weird cases. DeleteLocalInt(OBJECT_SELF, NUI_SPELLBOOK_ON_TARGET_IS_PERSONAL_FEAT); } else { - // if the spell has a master feat this is it. This will return 0 if not set. - int subSpellID = GetLocalInt(OBJECT_SELF, NUI_SPELLBOOK_SELECTED_SUBSPELL_SPELLID_VAR); // Get the target and location data we are casting at object oTarget = GetLocalObject(OBJECT_SELF, "TARGETING_OBJECT"); @@ -47,4 +48,7 @@ void main() ActionUseFeat(featId, oTarget, subSpellID, spellLocation); } -} + + DeleteLocalInt(OBJECT_SELF, NUI_SPELLBOOK_SELECTED_FEATID_VAR); + DeleteLocalInt(OBJECT_SELF, NUI_SPELLBOOK_SELECTED_SUBSPELL_SPELLID_VAR); +} \ No newline at end of file diff --git a/nwn/nwnprc/trunk/scripts/prc_nui_sb_view.nss b/nwn/nwnprc/trunk/scripts/prc_nui_sb_view.nss index 03c5489d..8135a305 100644 --- a/nwn/nwnprc/trunk/scripts/prc_nui_sb_view.nss +++ b/nwn/nwnprc/trunk/scripts/prc_nui_sb_view.nss @@ -119,6 +119,21 @@ string GetSpellLevelToolTip(int spellLevel); // json GetSpellIcon(int spellId, int nClass=0); +// +// HighlightButton +// Takes NUI Button along with it's width and height and heighlights it with a drawn +// colored rectangle to represent it's been selected. +// +// Arguments: +// jButton:json the NUI Button +// w:float the width of the button +// h:float the height of the button +// +// Returns: +// json the NUI button highlighted +// +json HighlightButton(json jButton, float w, float h); + void main() { // look for existing window and destroy @@ -187,6 +202,12 @@ void main() { geometry = NuiRect(893.0f,346.0f, 489.0f, 351.0f); } + else + { + float x = JsonGetFloat(JsonObjectGet(geometry, "x")); + float y = JsonGetFloat(JsonObjectGet(geometry, "y")); + geometry = NuiRect(x, y, 489.0f, 351.0f); + } // Set the binds to their default values NuiSetBind(OBJECT_SELF, nToken, "geometry", geometry); @@ -218,11 +239,14 @@ json CreateSpellBookClassButtons() selectedClassId = classId; SetLocalInt(OBJECT_SELF, PRC_SPELLBOOK_SELECTED_CLASSID_VAR, selectedClassId); } - + float width = 32.0f; + float height = 32.0f; // Get the class icon from the classes.2da json jClassButton = NuiId(NuiButtonImage(JsonString(Get2DACache("classes", "Icon", classId))), PRC_SPELLBOOK_NUI_CLASS_BUTTON_BASEID + IntToString(classId)); - jClassButton = NuiWidth(jClassButton, 32.0f); - jClassButton = NuiHeight(jClassButton, 32.0f); + if (classId == selectedClassId) + jClassButton = HighlightButton(jClassButton, width, height); + jClassButton = NuiWidth(jClassButton, width); + jClassButton = NuiHeight(jClassButton, height); // Get the class name from the classes.2da and set it to the tooltip jClassButton = NuiTooltip(jClassButton, JsonString(GetStringByStrRef(StringToInt(Get2DACache("classes", "Name", classId))))); @@ -250,6 +274,7 @@ json CreateSpellbookCircleButtons(int nClass) { // get what is the highest circle the class can cast at int currentMaxSpellLevel = GetCurrentSpellLevel(nClass, casterLevel); + // Get what the max circle the class can reach at is int totalMaxSpellLevel = GetMaxSpellLevel(nClass); @@ -273,21 +298,21 @@ json CreateSpellbookCircleButtons(int nClass) { json enabled; json jButton = NuiId(NuiButtonImage(JsonString(GetSpellLevelIcon(i))), PRC_SPELLBOOK_NUI_CIRCLE_BUTTON_BASEID + IntToString(i)); - jButton = NuiWidth(jButton, 42.0f); - jButton = NuiHeight(jButton, 42.0f); + float width = 42.0f; + float height = 42.0f; + jButton = NuiWidth(jButton, width); + jButton = NuiHeight(jButton, height); jButton = NuiTooltip(jButton, JsonString(GetSpellLevelToolTip(i))); // if the current circle is selected or if the person can't cast at // that circle yet then disable the button. - if (currentCircle == i || i > currentMaxSpellLevel) - { + if (i > currentMaxSpellLevel) enabled = JsonBool(FALSE); - } else - { enabled = JsonBool(TRUE); - } jButton = NuiEnabled(jButton, enabled); + if (i == currentCircle) + jButton = HighlightButton(jButton, width, height); jRow = JsonArrayInsert(jRow, jButton); } @@ -480,6 +505,34 @@ json GetSpellIcon(int spellId,int nClass=0) return JsonString(Get2DACache("feat", "Icon", featId)); } +json HighlightButton(json jButton, float w, float h) +{ + json retValue = jButton; + + json jBorders = JsonArray(); + + // set the points of the button shape + json jPoints = JsonArray(); + jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0)); + jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0)); + + jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0)); + jPoints = JsonArrayInsert(jPoints, JsonFloat(h)); + + jPoints = JsonArrayInsert(jPoints, JsonFloat(w)); + jPoints = JsonArrayInsert(jPoints, JsonFloat(h)); + + jPoints = JsonArrayInsert(jPoints, JsonFloat(w)); + jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0)); + + jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0)); + jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0)); + + jBorders = JsonArrayInsert(jBorders, NuiDrawListPolyLine(JsonBool(TRUE), NuiColor(71, 140, 32), JsonBool(FALSE), JsonFloat(2.0), jPoints)); + + return NuiDrawList(jButton, JsonBool(FALSE), jBorders); +} + string GetSpellLevelIcon(int spellLevel) { switch (spellLevel) @@ -516,4 +569,4 @@ string GetSpellLevelToolTip(int spellLevel) } return ""; -} +} \ No newline at end of file diff --git a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk index f28479bec83fc9d7348849d4e94be4ab08104b1b..79c5b364a8cab78f2f12bab47f22a6c4f58d2b93 100644 GIT binary patch delta 124414 zcmeI%e{dA#9mnxqa+_cvK!_SGf#h-_rzXUlkgX{q9u#bWTGCjoBG8}~shT!G1=~Ui zeq#Uyj99)P{<=y*XhCDa;B-nSI&>7o5)sE~r=7W}gKdWyo3?bOGtlrpgVHmT59wJ})z5rraoBkT1$CnJshVOLCKZS>{TUd_|h& zX8EejlUw9#a;w}X^W}C~APZ%Yd|g^(vD_hd%3bmeSt57KQu(IbBlpUE(kkDQZ%dmj zljX8Pz9aX`N?9cj$am#?^8JIWYo`v`9@7IGsuS8Yb#*fT&yz#1Hqa5x1(p7#nu)5K zbm;94+&2ADab{-dwZ(Md2g!t{Z?NLt*`c>G(BGe}OK4YA{Bv&Ty*;p(ax(AIIy2(T0GsV_En*`VxT&wEm1Y}2cb7D zrkSG!rTXI0f}#AwYry+}(*O#P5DAeG36T&9kq`-y5DAeG36T&9kq`-y5DAeG2|qm& z7U=oB!ZLrBcHL)RWi5Iz^jh6lStm4WO@7vzS-$&Lszy_-woyYz=ymb!64wf@69Kwsc_A5ZMVkXr19f6yp)>-Z`yjbTmNfrAt+rRHJPIYrJNp|9v{Q$@yR=6bi(^n zwD+W)cXw(_pAGA^I2!i5Szm4l&e^FqR`>t9x=OpF)k$ucr~cb^Dlgv+qG}xx@54&R!_Rsl^P$l zE}7r)aOj=$b@St66WSIPk8BFPi+rtXEKg`}RP5RudZ{4@0S=$MGnHq==OR8AapQ;W zNcjIFVS(oEFi&esh27I-9}T@FdZMYq?jmiTe@9p76?uB3Z$d)-xNXq5E%e5?o4%X1 zDQZ?&bFpjIYbI)*vZl;6uV{bNylc(CXUh*YU1?3R4(_K`yR7l&XewdD-I|ToJ8XSm zuRC%J!69n~K5hP1+ila}oHeEHIK#Csdhi4-9&f`8jaS+F!tK%e@BT8TO51GiZ*jw3 z?Tuz9avS+)at{gqW!skNFG>olv?ba_y&Gm~x6OjPc0`|qR}Zt7#jm#cZks3Ek>Aj! zsCnO-%Up9_Gf`9dMCgro&5hb0HH)knxCvjQ>7*THs~euzE}I3f+PXc%1y@yR*5-M! zouSUpB&&N;SFHPGp5LJTHTEl+zBBaxnD;+!q1|sXsCg#zM!Vxq(XLwC@7#}?#hSIo z-=nDsHXL!oX*ZnJ_NW}DebG?uhO`@Q*La;B`~Kbbykk0|xuDYDp>0 z8~jBN*W#<~;B_xVpG$IotC+1V*7!@^(5c-v%g@+)<-jgqQ@`Fe$ZC@ffp_q~FIP}* zKNh>4)N3YMeD+Z2UE-QU+8;gYxEr#XPT6kH+WPf*x+W1%XqOd1<13*z%Kd>P8_m04 z8+?Nu)zme%gWtH}Lv6QN{smiqI;J;`u1RQLw0yt~y}2QH=k>u?`HZ$rv>lE<7J4Jx z|ENNHqh{Oj&?|AxUM-$v&3kVSK94_XOVmt$EA&RXZDwhA)O=t~k!$|m={KyiJZKS1 zhvgwlr)9lmgJq-TVap?yO_t4;EtW?uU6#izTP=@UerVZdQOkDA4$Bjkot7spPg$O} zJY#v*lCk{A@|x5-u54mNb(2( delta 124417 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 delta 124417 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