OlvynChuru, I think your UI.MENU patching code could be improved. A single whitespace difference makes portions of it fail and there is no warning when the text is not replaced correctly. Consider using this function for patching UI.MENU. It ignores whitespaces, prints warnings, supports variables (the same way as REPLACE_EVALUATE), regexp or strict mode, and multiline strings: https://github.com/K4thos/IE-code-repository/blob/master/replace_multiline.tpa
considering there is a high risk that the extended skills code will conflict with custom GUIs (I see lua console warnings (exec run with batch file) with IWD2 GUI that I'm currently working on, also had problems with IWD:EE GUI ported to BG2:EE – warnings when pressing on thief skill buttons, missing accept character button), I'm not sure if including UI.MENU related changes by default with EEex is the right approach. To me it seems like something that should be handled by mods that actually add those new skills (in such cases limited compatibility is less of a problem)
Hey guys, I installed EEex for the first time on my BGEE to be able to use Use Poison component of OlvynChuru's Epic Thieving mod. However, the game started crashing to desktop occasionally. I checked EEex log, and these lines seem to be looped over and over many times:
INFO: [string "function variant06ADD8B8 () return characters..."]:1: attempt to index field 'second' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
function variant06ADD8B8 () return characters[currentID].classlevel.second.xp .. ' / ' .. characters[currentID].classlevel.second.nextLvlXp .. ' XP' end:1: in function <[string "function variant06ADD8B8 () return characters..."]:1>
INFO: [string "function variant06ADD998 () return characters..."]:1: attempt to index field 'third' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
function variant06ADD998 () return characters[currentID].classlevel.third.xp .. ' / ' .. characters[currentID].classlevel.third.nextLvlXp .. ' XP' end:1: in function <[string "function variant06ADD998 () return characters..."]:1>
INFO: [string "menu"]:610: attempt to index field 'second' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:610: in function 'getClassString2'
function variant06ADE2B8 () return getClassString2() .. ' - ' .. Infinity_FetchString(7192) .. ' ' .. getLevelString2() .. ': ' end:1: in function <[string "function variant06ADE2B8 () return getClassSt..."]:1>
INFO: [string "menu"]:616: attempt to index field 'third' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:616: in function 'getClassString3'
function variant06ADE818 () return getClassString3() .. ' - ' .. Infinity_FetchString(7192) .. ' ' .. getLevelString3() .. ': ' end:1: in function <[string "function variant06ADE818 () return getClassSt..."]:1>
My Weidu log is attached, in case it is relevant:
// Log of Currently Installed WeiDU Mods
// The top of the file is the 'oldest' mod
// ~TP2_File~ #language_number #component_number // [Subcomponent Name -> ] Component Name [ : Version]
~DLCMERGER/SETUP-DLCMERGER.TP2~ #0 #1 // Merge DLC into game -> "Siege of Dragonspear" DLC: 1.2
~DRAGONSPEAR_UI++/DRAGONSPEAR_UI++.TP2~ #0 #1 // Install SoD GUI Overhaul Core Component: v2.41
~DRAGONSPEAR_UI++/DRAGONSPEAR_UI++.TP2~ #0 #2 // Add Transparent Tooltip Background: v2.41
~DRAGONSPEAR_UI++/DRAGONSPEAR_UI++.TP2~ #0 #3 // Update several strings in Dialog.tlk: v2.41
~DRAGONSPEAR_UI++/DRAGONSPEAR_UI++.TP2~ #0 #9 // Select Number of Quicksave Slots -> 6: v2.41
~DRAGONSPEAR_UI++/DRAGONSPEAR_UI++.TP2~ #0 #10 // Update portrait Picker: v2.41
~HIDDENGAMEPLAYOPTIONS/SETUP-HIDDENGAMEPLAYOPTIONS.TP2~ #0 #0 // Install Hidden Gameplay Options -> All available options: 2.2
~AC_QUEST/AC_QUEST.TP2~ #1 #0 // Ascalon's Questpack: 2.05
~BG1NPC/BG1NPC.TP2~ #0 #0 // The BG1 NPC Project: Required Modifications: v24.0
~BG1NPC/BG1NPC.TP2~ #0 #10 // The BG1 NPC Project: Banters, Quests, and Interjections: v24.0
~BG1NPC/BG1NPC.TP2~ #0 #120 // The BG1 NPC Project: Bardic Reputation Adjustment: v24.0
~BG1NPC/BG1NPC.TP2~ #0 #130 // The BG1 NPC Project: Sarevok's Diary Adjustments -> SixofSpades Extended Sarevok's Diary: v24.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #0 // Ice Island Level Two Restoration: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #11 // Scar and the Sashenstar's Daughter: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #12 // Quoningar, the Cleric: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #13 // Shilo Chen and the Ogre-Magi: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #14 // Edie, the Merchant League Applicant: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #19 // Minor Dialogue Restorations: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #21 // Store, Tavern and Inn Fixes and Restorations: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #22 // Item Corrections and Restorations: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #29 // Duke Eltan in the Harbor Master's Building: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #30 // Nim Furlwing Encounter: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #32 // Svlast, the Fallen Paladin Encounter: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #33 // Mal-Kalen, the Ulcaster Ghost: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #34 // Chapter 6 Dialogue Restorations: v16.0
~BGEENPCPACK/SETUP-BGEENPCPACK.TP2~ #0 #0 // BGEE NPC Pack for BG:EE
~MSFM/MSFM.TP2~ #0 #0 // Add Wizard's Staff -> Add Wizard's Staff with 7 old color sets: v1.56
~MSFM/MSFM.TP2~ #0 #10 // Add circlets: v1.56
~MSFM/MSFM.TP2~ #0 #11 // Add Circlet of Revelation: v1.56
~RR/SETUP-RR.TP2~ #0 #1 // Thief kit revisions: v4.92
~RR/SETUP-RR.TP2~ #0 #6 // Proper spell progression for Bards: v4.92
~RR/SETUP-RR.TP2~ #0 #7 // Additional equipment for Thieves and Bards: v4.92
~RR/SETUP-RR.TP2~ #0 #999 // BG2-style icons for RR content: v4.92
~RELIEVEWIZARDSLAYER/RELIEVEWIZARDSLAYER.TP2~ #0 #0 // Relieve Wizard Slayer: 1.6
~PALEMASTER/SETUP-PALEMASTER.TP2~ #0 #0 // Pale Master Kit for BG:EE, BG2:EE and IWD:EE: v1.4.3
~PALEMASTER/SETUP-PALEMASTER.TP2~ #0 #2 // Evermemory Fix for BG:EE: v1.4.3
~LOST DRUID KIT/SETUP-LOST DRUID KIT.TP2~ #0 #0 // Install Lost Druid Kit for BG2:EE?
~PPE/SETUP-PPE.TP2~ #0 #0 // Portraits Portraits Everywhere (PPE) - core component: 1.01
~PPE/SETUP-PPE.TP2~ #0 #100 // Category Portraits (Recommended) -> Sequenced: 1.01
~PPE/SETUP-PPE.TP2~ #0 #10 // Isandir's CHARNAME Portraits: 1.01
~S9SOUNDSETSVOL1/SETUP-S9SOUNDSETSVOL1.TP2~ #0 #110 // Ajantis Ilvarstarr: 1.1
~S9SOUNDSETSVOL1/SETUP-S9SOUNDSETSVOL1.TP2~ #0 #140 // Coran: 1.1
~S9SOUNDSETSVOL1/SETUP-S9SOUNDSETSVOL1.TP2~ #0 #190 // Garrick: 1.1
~S9SOUNDSETSVOL1/SETUP-S9SOUNDSETSVOL1.TP2~ #0 #300 // Skie Silvershield: 1.1
~S9SOUNDSETSVOL1/SETUP-S9SOUNDSETSVOL1.TP2~ #0 #340 // Xzar: 1.1
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #100 // FThief1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #110 // FThief2: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #120 // F_Barb: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #130 // F_Bard: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #140 // F_Drow: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #150 // F_Fgt01: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #160 // F_Fgt02: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #170 // F_Fgt03: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #180 // F_Fgt04: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #190 // F_Fgt05: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #200 // F_HOrc1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #210 // F_HoW1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #220 // F_HoW2: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #230 // F_HoW3: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #240 // F_Mage1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #250 // F_Mage2: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #260 // F_Mage3: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #270 // F_Mage4: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #280 // F_Mage5: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #290 // F_Monk1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #300 // F_Sorc1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #310 // MThief1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #320 // MThief2: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #330 // M_Barb: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #340 // M_Bard: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #350 // M_Drow: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #360 // M_Fgt01: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #370 // M_Fgt02: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #380 // M_Fgt03: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #390 // M_Fgt04: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #400 // M_Fgt05: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #410 // M_HOrc1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #420 // M_HoW1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #430 // M_HoW2: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #440 // M_HoW3: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #450 // M_Mage1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #460 // M_Mage2: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #470 // M_Mage3: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #480 // M_Mage4: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #490 // M_Mage5: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #500 // M_Monk1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #510 // M_Sorc1: 1.01
~BGEECLASSICMOVIES/SETUP-BGEECLASSICMOVIES.TP2~ #0 #0 // Restore BG1 movies to BG:EE -> Replace all movies: v2.2.0
~BGEECLASSICMOVIES/SETUP-BGEECLASSICMOVIES.TP2~ #0 #3 // Restore BG1 Chapter and Dream Screens: v2.2.0
~35WEAPONSTYLE/SETUP-35WEAPONSTYLE.TP2~ #0 #0 // (3.5 Edition) Weapon Style Rebalance: beta
~35WEAPONSTYLE/SETUP-35WEAPONSTYLE.TP2~ #0 #1 // Expanded Weapon Styles for non-Warriors: beta
~35WEAPONSTYLE/SETUP-35WEAPONSTYLE.TP2~ #0 #2 // Quarterstaves Cannot Backstab: beta
~35WEAPONSTYLE/SETUP-35WEAPONSTYLE.TP2~ #0 #3 // Rangers Have No Offhand to-hit Penalty: beta
~35THAC0/SETUP-35THAC0.TP2~ #0 #0 // 3.5 Thac0
~PNP_WIS_BONUS/PNP_WIS_BONUS.TP2~ #0 #0 // AD&D PnP WIS bonus
~BIGGER_BARD_SONG/SETUP-BIGGER_BARD_SONG.TP2~ #0 #0 // Bigger Bard Songs
~EEEX/EEEX.TP2~ #0 #0 // EEex: 0.6.0
~EPICTHIEVING/EPICTHIEVING.TP2~ #0 #400 // Epic Detect Illusions
~EPICTHIEVING/EPICTHIEVING.TP2~ #0 #600 // New Skill: Use Poison
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #60 // Weapon Animation Tweaks: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #110 // Icon Improvements: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #130 // Force All Dialogue to Pause Game: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #140 // Fix Boo's Squeak: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #160 // Make Magic Shields Glow (plainab/grogerson): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #181 // Unique Containers -> Unique icons only: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #200 // Remove Blur Effect from Items, e.g. Cloack of Displacement: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2010 // Separate Resist Fire/Cold Icon into Separate Icons (Angel): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #1010 // More Interjections: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #1036 // Make Cloakwood Areas Available Before Completing the Bandit Camp -> All of Cloakwood Except the Mines: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #1060 // Breakable Iron Nonmagical Shields, Helms, and Armor: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #1075 // Send BioWare NPCs to an Inn (DavidW/Zed Nocear): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #1080 // Add Bags of Holding: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #1090 // Exotic Item Pack: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #1100 // Reveal City Maps When Entering Area: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2090 // Change Experience Point Cap -> Remove Experience Cap: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2152 // Wear Multiple Protection Items -> Allow Armor Plus One Protection Item (Angel): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2160 // Alter Weapon Proficiency System -> Rebalanced Weapon Proficiencies: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2339 // Remove Summoning Cap for Regular Summons: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2371 // Alter Dual-class Restrictions -> Allow non-humans to dual-class: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2390 // Paladins Use Icewind Dale-Heart of Winter Spell Tables (grogerson): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2400 // Rangers Use Icewind Dale-Heart of Winter Spell Tables (grogerson): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2999 // Max HP at Level One: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3010 // Maximum HP for NPCs (the bigg) -> For All Creatures in Game: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3060 // Remove "You Must Gather Your Party..." Sound (Weimer): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3083 // Increase Ammo Stack Size -> Stacks of 120: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3125 // Neutral Characters Make Happy Comments at Mid-Range Reputation: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3130 // No Traps or Locks (Weimer): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3196 // Alter Hostile Rest Spawns -> Increase frequency by 50%: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3200 // Sellable Items (Icelus): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3230 // Taerom Makes Additional Ankheg Armor (Icendoan/grogerson): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3280 // Give Every Class/Kit Four Weapon Slots: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3300 // Death Cam: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3310 // Start New Games with Party AI Turned Off: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3330 // Make party members less likely to die irreversibly: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4000 // Adjust Evil joinable NPC reaction rolls: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4025 // Allow NPC pairs to separate: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4031 // Consistent Stats: Edwin -> Use BG2 Values: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4041 // Consistent Stats: Jaheira -> Use BG2 Values: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4061 // Consistent Stats: Minsc -> Use BG2 Values: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4071 // Consistent Stats: Viconia -> Use BG2 Values: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4090 // Make Montaron an Assassin (Andyr): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4170 // Ensure Shar-Teel doesn't die in the original challenge: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4140 // Don't Auto-Assign Advanced AI Scripting to Party: v9
~EET_TWEAKS/EET_TWEAKS.TP2~ #0 #2052 // XP for killing creatures -> Decrease to 50%: 1.12
~EET_TWEAKS/EET_TWEAKS.TP2~ #0 #4050 // Books/Scrolls categorization: 1.12
~EET_TWEAKS/EET_TWEAKS.TP2~ #0 #4060 // Wand Case: 1.12
~EET_TWEAKS/EET_TWEAKS.TP2~ #0 #4070 // Key Ring: 1.12
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #1500 // Include arcane spells from Icewind Dale: Enhanced Edition: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #1510 // Include divine spells from Icewind Dale: Enhanced Edition: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #3010 // Replace +1 arrows and other projectiles with nonmagical "fine" ones: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #3022 // Replace many +1 magic weapons with nonmagical "fine" ones -> Fine weapons are affected by the iron crisis: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #3041 // Reduce the number of Arrows of Dispelling in stores -> Stores sell a maximum of 5 Arrows of Dispelling: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #3505 // Wider selection of random scrolls: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #3540 // Reduce the power of Inquisitors' Dispel Magic -> Inquisitors dispel at 1.5 x their level (not twice their level): v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #3550 // Increase the power of Cure Wounds and Cause Wounds spells to the level found in 3rd Edition D&D -> Spells heal or inflict a random amount of damage (1d8 per level of the spell, plus 1 point per caster level, to a maximum of 5 points per spell level): v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #3580 // Restoration and Lesser Restoration spells heal ability-score damage: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #4000 // Faster Bears: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #4051 // Decrease the rate at which reputation improves -> Reputation increases at about 1/2 the normal rate: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #4115 // Thieves assign skill points in multiples of five: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #4145 // Skip the Candlekeep tutorial sections -> Remove the tutorial NPCs from Candlekeep: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #4250 // Make spell sequencers and contingencies into innate abilities: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #5000 // Ease-of-use party AI: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #5900 // Initialise AI components (required for all tactical and AI components): v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6000 // Smarter general AI: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6010 // Better calls for help: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6030 // Smarter Mages: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6040 // Smarter Priests: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6200 // Improved Spiders: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6300 // Smarter sirines and dryads: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6310 // Slightly smarter carrion crawlers: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6320 // Smarter basilisks: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7000 // Improved doppelgangers: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7010 // Tougher Black Talons and Iron Throne guards: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7020 // Improved deployment for parties of assassins: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7030 // Improved kobolds: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7040 // Relocated bounty hunters: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7050 // Improved Ulcaster: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7060 // Improved Balduran's Isle: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7070 // Improved Durlag's Tower: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7090 // Improved Cloakwood Druids: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7100 // Improved Bassilus: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7110 // Improved Drasus party: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7130 // Improved Red Wizards: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7140 // Improved Undercity assassins: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7200 // Tougher chapter-two end battle: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7210 // Tougher chapter-three end battle: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7220 // Tougher chapter-four end battle: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7230 // Tougher chapter-five end battle: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7250 // Improved final battle: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7900 // Improved minor encounters: v32.6
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #101 // Prevent skeletal and incorporeal undead from being affected by Illithids' Devour Brain attack: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #105 // PnP Dimension Door: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #120 // Restore innate disease immunity to Paladins: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #125 // Rangers' Animal Empathy improves with experience: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #201 // Instant casting for warrior innates: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #203 // Make druidic shapeshifting uninterruptable: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #211 // Make Death Ward protect against Vorpal Hits: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #213 // Expanded saving throw bonus tables for Dwarves, Gnomes and Halflings: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #220 // Simple Thief script: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #230 // Simple Bard script: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #239 // Simple Cleric/Paladin script: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #300 // Use Icewind Dale's Dimension Door animation -> Fast animation speed (matches IWD): v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #310 // Distinctive creature coloring: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #315 // Distinctive creature soundsets: v4.53
~JIMFIX/SETUP-JIMFIX.TP2~ #0 #201 // Add spell school notifications to the combat log -> All spells with a casting time greater than 1: v2.5
~JIMFIX/SETUP-JIMFIX.TP2~ #0 #300 // Add expiration notifications for buffs: v2.5
~JIMFIX/SETUP-JIMFIX.TP2~ #0 #600 // Add expiration notifications for item buffs: v2.5
~JIMFIX/SETUP-JIMFIX.TP2~ #0 #500 // Reveal all hidden doors: v2.5
~JIMFIX/SETUP-JIMFIX.TP2~ #0 #700 // Allow Spell Shield to block Wish Breach and Mordenkainen's Disjunction: v2.5
It might not have been the best idea, but I used the latest state in master branch for EEex mod, I didn't use the release version.
Does anyone have any ideas why this is happening?
Also, does installing EEex earlier or later in the install order change anything?
Thanks
Edit: I also see these lines looped over a lot too inside EEex.log:
INFO: [string "menu"]:138: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:138: in function 'getItemSlot1'
function valid066EFF68 () return getItemSlot1(6).valid end:1: in function <[string "function valid066EFF68 () return getItemSlot1..."]:1>
INFO: [string "menu"]:142: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:142: in function 'getItemSlot2'
function valid066F05C8 () return getItemSlot2(6).valid end:1: in function <[string "function valid066F05C8 () return getItemSlot2..."]:1>
INFO: [string "menu"]:146: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:146: in function 'getItemSlot3'
function valid066F09A8 () return getItemSlot3(6).valid end:1: in function <[string "function valid066F09A8 () return getItemSlot3..."]:1>
INFO: [string "menu"]:150: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:150: in function 'getItemSlot4'
function valid066F1368 () return getItemSlot4(6).valid end:1: in function <[string "function valid066F1368 () return getItemSlot4..."]:1>
INFO: [string "menu"]:154: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:154: in function 'getItemSlot5'
function valid066F1BA8 () return getItemSlot5(6).valid end:1: in function <[string "function valid066F1BA8 () return getItemSlot5..."]:1>
INFO: [string "menu"]:158: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:158: in function 'getItemSlot6'
function valid066F1F48 () return getItemSlot6(6).valid end:1: in function <[string "function valid066F1F48 () return getItemSlot6..."]:1>
INFO: [string "menu"]:162: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:162: in function 'getItemSlot7'
function valid066F2788 () return getItemSlot7(6).valid end:1: in function <[string "function valid066F2788 () return getItemSlot7..."]:1>
INFO: [string "menu"]:166: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:166: in function 'getItemSlot8'
function valid066F2DC8 () return getItemSlot8(6).valid end:1: in function <[string "function valid066F2DC8 () return getItemSlot8..."]:1>
INFO: [string "menu"]:170: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:170: in function 'getItemSlot9'
function valid066E3008 () return getItemSlot9(6).valid end:1: in function <[string "function valid066E3008 () return getItemSlot9..."]:1>
INFO: [string "menu"]:174: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:174: in function 'getItemSlot10'
function valid066E3A48 () return getItemSlot10(6).valid end:1: in function <[string "function valid066E3A48 () return getItemSlot1..."]:1>
INFO: [string "menu"]:178: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:178: in function 'getItemSlot11'
function valid066E43A8 () return getItemSlot11(6).valid end:1: in function <[string "function valid066E43A8 () return getItemSlot1..."]:1>
INFO: [string "menu"]:182: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:182: in function 'getItemSlot12'
function valid066E4608 () return getItemSlot12(6).valid end:1: in function <[string "function valid066E4608 () return getItemSlot1..."]:1>
INFO: [string "menu"]:186: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:186: in function 'getItemSlot13'
function valid066E4CE8 () return getItemSlot13(6).valid end:1: in function <[string "function valid066E4CE8 () return getItemSlot1..."]:1>
INFO: [string "menu"]:190: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:190: in function 'getItemSlot14'
function valid066E5788 () return getItemSlot14(6).valid end:1: in function <[string "function valid066E5788 () return getItemSlot1..."]:1>
INFO: [string "menu"]:194: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:194: in function 'getItemSlot15'
function valid066E59A8 () return getItemSlot15(6).valid end:1: in function <[string "function valid066E59A8 () return getItemSlot1..."]:1>
INFO: [string "menu"]:198: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:198: in function 'getItemSlot16'
function valid066E63A8 () return getItemSlot16(6).valid end:1: in function <[string "function valid066E63A8 () return getItemSlot1..."]:1>
Tired of a mixture of hardcoded and unhardcoded priest/mage spellbooks functionality I've decided to reimplement spellbook screen from scratch with EEex. The problem is that EEex_MemorizeWizardSpell, EEex_MemorizeClericSpell, EEex_UnmemorizeWizardSpell, EEex_UnmemorizeClericSpell functions don't seem to work (or maybe I just don't know how to use them properly)
Here is a test code (tested on Cleric with free memorization slots and the SPPR104 spell available within his Known spells)
EEex_MemorizeClericSpell(id, 1, 'SPPR104')
local t = EEex_GetMemorizedClericSpells(id)
local found = false
for k, v in ipairs(t[1]) do
if v.resref == 'SPPR104' then
EEex_MessageBox('spell memorization succesfull')
found = true
break
end
end
if not found then
EEex_MessageBox('spell memorization failed')
end
Tested from within UI and by running the code via invoke lua opcode - in both cases memorization failed. I've also checked for SPPR104 presence with NI and the spell definatetly has not been memorized. Both EEex_GetMemorizedClericSpells and EEex_GetMemorizedWizardSpells work fine.
@Ludwig_II: The errors spamming in your log are from a UI mod. The only way this could crash the game outright is if the UI mod uses EEex, and is attempting to call an EEex function after an error has occurred on their end. In any case, when the game crashed it should have generated a crash dmp - could you please send that my way?
@swit: The level indexing starts at 0, not at 1 like you would think, (since it wraps an internal function where it uses the level to do an array access). If the provided level doesn't properly match the array-accessed spell level the internal function returns without doing anything, as what you are seeing in your test.
To memorize 1st level spells, level should be 0
To memorize 2nd level spells, level should be 1
etc.
@Ludwig_II: Thanks, it's an EEex_GetActorStat() call that's not being supplied a valid sprite id. I'll look into where the call is coming from and see if i can't get it straightened out.
thanks for the reply, Bubb, I've successfully reimplemented bookspell menu to work exactly the same as in IWD2, without using any of the hardcoded functions or relying on the automatic table updates. https://www.dropbox.com/s/q2gvo8jx98b4kh0/Baldr015.png
btw. with this code spellbook screen is no longer restricted to classes with hardcoded access to cleric/mage spells, so for the purpose of my mod I'm no longer forced to highjack F/M/C class (or any other of the vanilla classes)
I'm wondering if there is a way to detect if "Cast Spell" actionbar menu is currently opened (actionbar icons replaced with spell icons/arrows). I've tried detecting it via buttonArray:GetButtonType(0) == 31 but this is also true for "Special Abilities" and "Use Item" actionbar menus.
What are the valid arguments for EEex_SetActionbarState? If "state" here means what I'm asking for above than I'd like to request EEex_GetActionbarState function :P
edit: @Bubb, I think I found a reliable way to detect spellcasting state and when it ends without dedicated function. Here it is in case someone needs it for their mod:
1. Function call that replaces all buttonArray:OnLButtonPressed(x) lines in actionbar action sections:
function actionbarLButtonPressed(num)
if buttonArray:GetButtonType(num) == 3 then
actionbarCastSpell = true
elseif actionbarCastSpell and buttonArray:GetButtonType(0) ~= 31 and buttonArray:GetButtonType(0) ~= 43 then
actionbarCastSpell = false
end
buttonArray:OnLButtonPressed(num)
end
2. global code (should run constantly while in-game, so for example added as a dummy mos lua function code)
if actionbarCastSpell and buttonArray:GetButtonType(0) ~= 31 and buttonArray:GetButtonType(0) ~= 43 then
actionbarCastSpell = false
end
It catches situations like changing the characters via portrait click, exiting the sub-menu via ESC, casting the spell, or clicking somewhere on the gameworld (which also closes the submenu). From what I tested the only thing not covered here is opening the spell menu via keyboard shortcut, but that can be handled with the existing EEex_AddKeyPressedListener() function.
"Unique Config" refers to the button types that eventually get set from the state(s) on the right. In a few instances the engine reuses the same button configuration for multiple purposes. You can see this in the Spells config; one state is for setting a quick button, while another is actually for casting.
Actionbar listeners now pass the state as the second param, like this:
function B3DebugPrintActionbar(config, state)
Infinity_DisplayString("config: "..config..", state: "..state)
end
EEex_AddActionbarListener(B3DebugPrintActionbar)
Edit: You can catch the "Cast Spell" actionbar state like this:
function B3DetectCastSpell(config, state)
if state == 103 then
-- Cast Spell opened, no matter the source
end
end
EEex_AddActionbarListener(B3DetectCastSpell)
And also, EEex_GetActionbarState() is now in master - if you still need it
sweet, my proposed implementation couldn't differentiate between "Cast Spell" submenu and "Internal List" (Opcode #214), so in the end it wouldn't work reliably for the purpose I need it for (displaying and triggering "Cast Spell" icons without relying on the hardcoded implementation, or need to pause the game / requiring additional click to close the submenu). EEex_AddActionbarListener / EEex_GetActionbarState solves this issue. Thank you very much for the quick addition and documentation.
@Ludwig_II: Interestingly enough, I started encountering random crashes as you were describing. I believe I've fixed the cause - try updating your EEex to the latest master version and see if the crashes persist.
(And for the source of the crashes, turns out about 1 in every 7,500 calls to EEex_WriteLString() could crash the game.)
@swit Hey, sorry if it's way too early to ask anything about the IWD2 UI for the EEs thing you're working on, but have you gotten anywhere with the inventory screen yet?
Keep in mind though that this is not a GUI mod for vanilla EE games but part of a project that brings whole IWD2 content into EE engine using Lua and EEex (currently intended only for EET platform, but in future standalone version installed on top of IWD:EE is also planned). There is tons of custom code related to this project here. For example whole character creation, levelling up screen and spellbook don't use a single hardcoded function (for characters that follow custom rules). Thanks to EEex, I've re-implemented hardcoded functionality from scratch instead, in order to make it work with 3E style multi-class system, character progression and other IWD2 features introduced by this mod (for example feats, subraces, sorcerer style spellcasting working alongside preparation spellcasting, and much more, most of it coded in UI.MENU). Turning it into a simple GUI mod for EE games would be extra work, and currently has very low priority.
@Ludwig_II: Interestingly enough, I started encountering random crashes as you were describing. I believe I've fixed the cause - try updating your EEex to the latest master version and see if the crashes persist.
(And for the source of the crashes, turns out about 1 in every 7,500 calls to EEex_WriteLString() could crash the game.)
Based on my limited testing, it looks like it's indeed fixed. I haven't encountered any more crashes so far. Thank you.
However, I've encountered another issue. Whenever I click on a weapon in my quick slot items, the Thac0 changes. The same weapon shows different Thac0 values each time I click on it. To demonstrate, I'm attaching two screenshots showing the same weapon equipped:
I'm also attaching my weidu.log and a stripped version of my EEex.log. I've only kept potential points of interest in the EEex.log file, where it was showing UI string not found messages or nil value error messages. Nil value error messages for getItemSlotxx functions are looped over thousands of times, that's why I removed most of those duplicate messages. Even if I open the inventory screen once and click on a quick slot weapon 1 time, these messages are written a thousand times to the logs.
@Ludwig_II: The errors spamming in the log are from Dragonspear UI++. Seems to be harmless; the only difference is that EEex logs all Lua output to a file, so you actually see it. It could create a huge log file after a while, though.
The underlying problem is that the engine, when the game is simultaneously paused + an effect is added, resolves all effects on the creature.
The resolving process rerolls all effect-specific probabilities before it does any resolving. So, if the game is paused while a spell is cast, every effect in that spell will roll its own probabilities, instead of using one unified set.
A simple fix is to stop the engine from resolving whole effects lists in the above scenario. I'm not sure why the engine is doing this in the first place, because it intentionally doesn't do it when time is flowing.
We just found one drawback to disabling the above. Part of what it does, (and I don't even know if this is intentional), is make sure items instantly update character state. What you're encountering is the weapon's enchantment modifier not being applied until the game is unpaused. There's actually a flaw here in the engine - an item will only instantly update character state if it has at least one effect attached.
I might be able to rig the engine to only do the character-wide update if the effect source is an item. I don't want to outright revert my change, as it fixes a ton of nasty bugs with pausing while casting spells. We'll see what I come up with.
After seeing your message, I tested it further and just as you said, once I unpause the game, I realized that it modifies the Thac0 calculation back to its correct value. So I just came back here to respond to you with that it's no big deal, and noticed that you already fixed it!
I downloaded the new version and yeah it's working perfectly now. Calculates Thac0 correctly every time. Amazing work Bubb, and thanks a lot again for the very quick fix.
The only issue I have left now is that my dragon disciple is begging me to take leave from work and spend time with him
I'm finishing up the Lua code that re-writes hardcoded portion of the engine related to character creation and level-up progression. When character is created without using hardcoded functions we're getting a pure CHARBASE.CRE, without any modifications (I'm patching data set during chargen right after the game is started). This approach has some limitations:
- It's not possible to generate "CHR" file during chargen (which means no support for "Pregenerate character" button that exports the character when chargen is done)
- There is no way to dynamically change paperdoll during chargen (displayed via 'paperdoll x') since the correct one matches what's currently set for CHARBASE.CRE (gender and class). Since we're not modifying CHARBASE until we're already in-game, the paperdoll animation remains static.
- vanilla Infinity_SetHairColor, Infinity_SetSkinColor, Infinity_SetMajorColor, Infinity_SetMinorColor functions accepts values that are not matching color values present in CRE file, but rather those used by color sliders (I think). In the mod some subraces are meant to have very limited selection of hair and skin colors - for example drows and duergars. Even though these functions are providing visual feedback for paperdoll during chargen, I don't know how to calculate the correct color value.
- I don't think there is a way to display the limited color selection like it was possible in pre-2.0 patch - the engine now only use full RGB color sliders. Since 'colordisplay x' values 51-84 are unused by the engine (I think, see the screenshot - https://i.imgur.com/yVEoU2e.png), it would be nice to be able to assign above mentioned color values to them on the fly, so that they could display limited color selection properly during chargen
- Currently I'm using rather awkward way to patch in character sounds chosen during chargen, since there is no dedicated opcode - SetPlayerSound actions used in a temporary assigned script via opcode 400.
Considering the CHARBASE.CRE seems to be loaded during chargen and modified on the fly via hardcoded functions (assumption based on the 'paperdoll x' displaying the data that matches what's present in the CHARBASE.CRE), I'm wondering if it would be viable to edit CHARBASE on the fly via EEex too during chargen. Do the offsets in memory match CREv1 structure, which would allow patching it without dedicated functions? Or maybe the loaded data can already support EEex CRE patching functions like EEex_ApplyEffectToActor? This would solve most of the above mentioned limitations (patching character colors, sounds, have the correct paperdoll displayed during chargen and be able to export the character before starting the game)
Unrelated to it, there is one more feature from IWD2, that I have trouble implementing:
- https://i.imgur.com/CGUMnIJ.png
- https://i.imgur.com/MEOmjWG.png
As you can see in the screenshots, I've partially made the select party feature work via already present engine functionality that loads CRE files mentioned in 2DA file - startEngine:OnCampaignButtonClick('X',true) (where X matches the CAMPAIGN.2DA row label) loads 2da file under the CAMPAIGN.2DA "TBPPARTY" column.
It would be nice to have a way to set different 2DA file without need to change currently loaded CAMPAIGN.2DA row (so that a single campaign could support more than 1 pre-made party)
The Black Pits seems to use the TBPPARTY column, Shadows of Amn uses IWDPARTY, and Throne of Bhaal uses HOWPARTY column. OnCampaignButtonClick appears to be called from CScreenStart::TimerAsynchronousUpdate and/or tolua_BaldurLUA_CScreenStart_OnCampaignButtonClick00, i guess it passes the column based on which button was clicked. I guess it would be possible to change that column text to use some other 2da file for any of those buttons - might have to wait for Bubb to take a look at it.
@OlvynChuru Great news! Ideally both - the games seem to need a bit of variety in the ways you can mitigate damage, but the first one if I had to choose.
EXDAMRED() => As requested by @Shin , this function, called by a Screen Effects opcode, gives the creature 3e-like damage resistance, preventing the first parameter1 damage of the damage types specified by parameter2. It can prevent a total of parameter3 damage before the effect ends.
If parameter3 is 0, then the total damage preventable is unlimited.
You can also make parameter1 negative, increasing damage dealt of the chosen damage types by a flat amount.
There is a flag you can set to disable the damage prevention messages.
EXDAMAGE() => This function, called by an Invoke Lua opcode, deals damage to the target, and there are options to increase the damage dealt based on the source's Strength, proficiencies, and damage bonus effects. This could be used to make a weapon that deals non-physical damage that scales with the wielder's damage bonuses.
Comments
considering there is a high risk that the extended skills code will conflict with custom GUIs (I see lua console warnings (exec run with batch file) with IWD2 GUI that I'm currently working on, also had problems with IWD:EE GUI ported to BG2:EE – warnings when pressing on thief skill buttons, missing accept character button), I'm not sure if including UI.MENU related changes by default with EEex is the right approach. To me it seems like something that should be handled by mods that actually add those new skills (in such cases limited compatibility is less of a problem)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
function variant06ADD8B8 () return characters[currentID].classlevel.second.xp .. ' / ' .. characters[currentID].classlevel.second.nextLvlXp .. ' XP' end:1: in function <[string "function variant06ADD8B8 () return characters..."]:1>
INFO: [string "function variant06ADD998 () return characters..."]:1: attempt to index field 'third' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
function variant06ADD998 () return characters[currentID].classlevel.third.xp .. ' / ' .. characters[currentID].classlevel.third.nextLvlXp .. ' XP' end:1: in function <[string "function variant06ADD998 () return characters..."]:1>
INFO: [string "menu"]:610: attempt to index field 'second' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:610: in function 'getClassString2'
function variant06ADE2B8 () return getClassString2() .. ' - ' .. Infinity_FetchString(7192) .. ' ' .. getLevelString2() .. ': ' end:1: in function <[string "function variant06ADE2B8 () return getClassSt..."]:1>
INFO: [string "menu"]:616: attempt to index field 'third' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:616: in function 'getClassString3'
function variant06ADE818 () return getClassString3() .. ' - ' .. Infinity_FetchString(7192) .. ' ' .. getLevelString3() .. ': ' end:1: in function <[string "function variant06ADE818 () return getClassSt..."]:1>
My Weidu log is attached, in case it is relevant:
// The top of the file is the 'oldest' mod
// ~TP2_File~ #language_number #component_number // [Subcomponent Name -> ] Component Name [ : Version]
~DLCMERGER/SETUP-DLCMERGER.TP2~ #0 #1 // Merge DLC into game -> "Siege of Dragonspear" DLC: 1.2
~DRAGONSPEAR_UI++/DRAGONSPEAR_UI++.TP2~ #0 #1 // Install SoD GUI Overhaul Core Component: v2.41
~DRAGONSPEAR_UI++/DRAGONSPEAR_UI++.TP2~ #0 #2 // Add Transparent Tooltip Background: v2.41
~DRAGONSPEAR_UI++/DRAGONSPEAR_UI++.TP2~ #0 #3 // Update several strings in Dialog.tlk: v2.41
~DRAGONSPEAR_UI++/DRAGONSPEAR_UI++.TP2~ #0 #9 // Select Number of Quicksave Slots -> 6: v2.41
~DRAGONSPEAR_UI++/DRAGONSPEAR_UI++.TP2~ #0 #10 // Update portrait Picker: v2.41
~HIDDENGAMEPLAYOPTIONS/SETUP-HIDDENGAMEPLAYOPTIONS.TP2~ #0 #0 // Install Hidden Gameplay Options -> All available options: 2.2
~AC_QUEST/AC_QUEST.TP2~ #1 #0 // Ascalon's Questpack: 2.05
~BG1NPC/BG1NPC.TP2~ #0 #0 // The BG1 NPC Project: Required Modifications: v24.0
~BG1NPC/BG1NPC.TP2~ #0 #10 // The BG1 NPC Project: Banters, Quests, and Interjections: v24.0
~BG1NPC/BG1NPC.TP2~ #0 #120 // The BG1 NPC Project: Bardic Reputation Adjustment: v24.0
~BG1NPC/BG1NPC.TP2~ #0 #130 // The BG1 NPC Project: Sarevok's Diary Adjustments -> SixofSpades Extended Sarevok's Diary: v24.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #0 // Ice Island Level Two Restoration: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #11 // Scar and the Sashenstar's Daughter: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #12 // Quoningar, the Cleric: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #13 // Shilo Chen and the Ogre-Magi: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #14 // Edie, the Merchant League Applicant: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #19 // Minor Dialogue Restorations: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #21 // Store, Tavern and Inn Fixes and Restorations: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #22 // Item Corrections and Restorations: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #29 // Duke Eltan in the Harbor Master's Building: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #30 // Nim Furlwing Encounter: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #32 // Svlast, the Fallen Paladin Encounter: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #33 // Mal-Kalen, the Ulcaster Ghost: v16.0
~BG1UB/SETUP-BG1UB.TP2~ #0 #34 // Chapter 6 Dialogue Restorations: v16.0
~BGEENPCPACK/SETUP-BGEENPCPACK.TP2~ #0 #0 // BGEE NPC Pack for BG:EE
~MSFM/MSFM.TP2~ #0 #0 // Add Wizard's Staff -> Add Wizard's Staff with 7 old color sets: v1.56
~MSFM/MSFM.TP2~ #0 #10 // Add circlets: v1.56
~MSFM/MSFM.TP2~ #0 #11 // Add Circlet of Revelation: v1.56
~RR/SETUP-RR.TP2~ #0 #1 // Thief kit revisions: v4.92
~RR/SETUP-RR.TP2~ #0 #6 // Proper spell progression for Bards: v4.92
~RR/SETUP-RR.TP2~ #0 #7 // Additional equipment for Thieves and Bards: v4.92
~RR/SETUP-RR.TP2~ #0 #999 // BG2-style icons for RR content: v4.92
~RELIEVEWIZARDSLAYER/RELIEVEWIZARDSLAYER.TP2~ #0 #0 // Relieve Wizard Slayer: 1.6
~PALEMASTER/SETUP-PALEMASTER.TP2~ #0 #0 // Pale Master Kit for BG:EE, BG2:EE and IWD:EE: v1.4.3
~PALEMASTER/SETUP-PALEMASTER.TP2~ #0 #2 // Evermemory Fix for BG:EE: v1.4.3
~LOST DRUID KIT/SETUP-LOST DRUID KIT.TP2~ #0 #0 // Install Lost Druid Kit for BG2:EE?
~PPE/SETUP-PPE.TP2~ #0 #0 // Portraits Portraits Everywhere (PPE) - core component: 1.01
~PPE/SETUP-PPE.TP2~ #0 #100 // Category Portraits (Recommended) -> Sequenced: 1.01
~PPE/SETUP-PPE.TP2~ #0 #10 // Isandir's CHARNAME Portraits: 1.01
~S9SOUNDSETSVOL1/SETUP-S9SOUNDSETSVOL1.TP2~ #0 #110 // Ajantis Ilvarstarr: 1.1
~S9SOUNDSETSVOL1/SETUP-S9SOUNDSETSVOL1.TP2~ #0 #140 // Coran: 1.1
~S9SOUNDSETSVOL1/SETUP-S9SOUNDSETSVOL1.TP2~ #0 #190 // Garrick: 1.1
~S9SOUNDSETSVOL1/SETUP-S9SOUNDSETSVOL1.TP2~ #0 #300 // Skie Silvershield: 1.1
~S9SOUNDSETSVOL1/SETUP-S9SOUNDSETSVOL1.TP2~ #0 #340 // Xzar: 1.1
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #100 // FThief1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #110 // FThief2: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #120 // F_Barb: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #130 // F_Bard: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #140 // F_Drow: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #150 // F_Fgt01: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #160 // F_Fgt02: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #170 // F_Fgt03: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #180 // F_Fgt04: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #190 // F_Fgt05: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #200 // F_HOrc1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #210 // F_HoW1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #220 // F_HoW2: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #230 // F_HoW3: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #240 // F_Mage1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #250 // F_Mage2: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #260 // F_Mage3: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #270 // F_Mage4: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #280 // F_Mage5: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #290 // F_Monk1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #300 // F_Sorc1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #310 // MThief1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #320 // MThief2: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #330 // M_Barb: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #340 // M_Bard: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #350 // M_Drow: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #360 // M_Fgt01: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #370 // M_Fgt02: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #380 // M_Fgt03: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #390 // M_Fgt04: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #400 // M_Fgt05: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #410 // M_HOrc1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #420 // M_HoW1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #430 // M_HoW2: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #440 // M_HoW3: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #450 // M_Mage1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #460 // M_Mage2: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #470 // M_Mage3: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #480 // M_Mage4: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #490 // M_Mage5: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #500 // M_Monk1: 1.01
~S9SOUNDSETSVOL2/SETUP-S9SOUNDSETSVOL2.TP2~ #0 #510 // M_Sorc1: 1.01
~BGEECLASSICMOVIES/SETUP-BGEECLASSICMOVIES.TP2~ #0 #0 // Restore BG1 movies to BG:EE -> Replace all movies: v2.2.0
~BGEECLASSICMOVIES/SETUP-BGEECLASSICMOVIES.TP2~ #0 #3 // Restore BG1 Chapter and Dream Screens: v2.2.0
~35WEAPONSTYLE/SETUP-35WEAPONSTYLE.TP2~ #0 #0 // (3.5 Edition) Weapon Style Rebalance: beta
~35WEAPONSTYLE/SETUP-35WEAPONSTYLE.TP2~ #0 #1 // Expanded Weapon Styles for non-Warriors: beta
~35WEAPONSTYLE/SETUP-35WEAPONSTYLE.TP2~ #0 #2 // Quarterstaves Cannot Backstab: beta
~35WEAPONSTYLE/SETUP-35WEAPONSTYLE.TP2~ #0 #3 // Rangers Have No Offhand to-hit Penalty: beta
~35THAC0/SETUP-35THAC0.TP2~ #0 #0 // 3.5 Thac0
~PNP_WIS_BONUS/PNP_WIS_BONUS.TP2~ #0 #0 // AD&D PnP WIS bonus
~BIGGER_BARD_SONG/SETUP-BIGGER_BARD_SONG.TP2~ #0 #0 // Bigger Bard Songs
~EEEX/EEEX.TP2~ #0 #0 // EEex: 0.6.0
~EPICTHIEVING/EPICTHIEVING.TP2~ #0 #400 // Epic Detect Illusions
~EPICTHIEVING/EPICTHIEVING.TP2~ #0 #600 // New Skill: Use Poison
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #60 // Weapon Animation Tweaks: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #110 // Icon Improvements: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #130 // Force All Dialogue to Pause Game: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #140 // Fix Boo's Squeak: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #160 // Make Magic Shields Glow (plainab/grogerson): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #181 // Unique Containers -> Unique icons only: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #200 // Remove Blur Effect from Items, e.g. Cloack of Displacement: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2010 // Separate Resist Fire/Cold Icon into Separate Icons (Angel): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #1010 // More Interjections: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #1036 // Make Cloakwood Areas Available Before Completing the Bandit Camp -> All of Cloakwood Except the Mines: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #1060 // Breakable Iron Nonmagical Shields, Helms, and Armor: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #1075 // Send BioWare NPCs to an Inn (DavidW/Zed Nocear): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #1080 // Add Bags of Holding: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #1090 // Exotic Item Pack: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #1100 // Reveal City Maps When Entering Area: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2090 // Change Experience Point Cap -> Remove Experience Cap: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2152 // Wear Multiple Protection Items -> Allow Armor Plus One Protection Item (Angel): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2160 // Alter Weapon Proficiency System -> Rebalanced Weapon Proficiencies: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2339 // Remove Summoning Cap for Regular Summons: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2371 // Alter Dual-class Restrictions -> Allow non-humans to dual-class: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2390 // Paladins Use Icewind Dale-Heart of Winter Spell Tables (grogerson): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2400 // Rangers Use Icewind Dale-Heart of Winter Spell Tables (grogerson): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #2999 // Max HP at Level One: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3010 // Maximum HP for NPCs (the bigg) -> For All Creatures in Game: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3060 // Remove "You Must Gather Your Party..." Sound (Weimer): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3083 // Increase Ammo Stack Size -> Stacks of 120: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3125 // Neutral Characters Make Happy Comments at Mid-Range Reputation: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3130 // No Traps or Locks (Weimer): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3196 // Alter Hostile Rest Spawns -> Increase frequency by 50%: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3200 // Sellable Items (Icelus): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3230 // Taerom Makes Additional Ankheg Armor (Icendoan/grogerson): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3280 // Give Every Class/Kit Four Weapon Slots: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3300 // Death Cam: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3310 // Start New Games with Party AI Turned Off: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #3330 // Make party members less likely to die irreversibly: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4000 // Adjust Evil joinable NPC reaction rolls: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4025 // Allow NPC pairs to separate: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4031 // Consistent Stats: Edwin -> Use BG2 Values: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4041 // Consistent Stats: Jaheira -> Use BG2 Values: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4061 // Consistent Stats: Minsc -> Use BG2 Values: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4071 // Consistent Stats: Viconia -> Use BG2 Values: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4090 // Make Montaron an Assassin (Andyr): v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4170 // Ensure Shar-Teel doesn't die in the original challenge: v9
~CDTWEAKS/SETUP-CDTWEAKS.TP2~ #0 #4140 // Don't Auto-Assign Advanced AI Scripting to Party: v9
~EET_TWEAKS/EET_TWEAKS.TP2~ #0 #2052 // XP for killing creatures -> Decrease to 50%: 1.12
~EET_TWEAKS/EET_TWEAKS.TP2~ #0 #4050 // Books/Scrolls categorization: 1.12
~EET_TWEAKS/EET_TWEAKS.TP2~ #0 #4060 // Wand Case: 1.12
~EET_TWEAKS/EET_TWEAKS.TP2~ #0 #4070 // Key Ring: 1.12
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #1500 // Include arcane spells from Icewind Dale: Enhanced Edition: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #1510 // Include divine spells from Icewind Dale: Enhanced Edition: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #3010 // Replace +1 arrows and other projectiles with nonmagical "fine" ones: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #3022 // Replace many +1 magic weapons with nonmagical "fine" ones -> Fine weapons are affected by the iron crisis: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #3041 // Reduce the number of Arrows of Dispelling in stores -> Stores sell a maximum of 5 Arrows of Dispelling: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #3505 // Wider selection of random scrolls: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #3540 // Reduce the power of Inquisitors' Dispel Magic -> Inquisitors dispel at 1.5 x their level (not twice their level): v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #3550 // Increase the power of Cure Wounds and Cause Wounds spells to the level found in 3rd Edition D&D -> Spells heal or inflict a random amount of damage (1d8 per level of the spell, plus 1 point per caster level, to a maximum of 5 points per spell level): v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #3580 // Restoration and Lesser Restoration spells heal ability-score damage: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #4000 // Faster Bears: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #4051 // Decrease the rate at which reputation improves -> Reputation increases at about 1/2 the normal rate: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #4115 // Thieves assign skill points in multiples of five: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #4145 // Skip the Candlekeep tutorial sections -> Remove the tutorial NPCs from Candlekeep: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #4250 // Make spell sequencers and contingencies into innate abilities: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #5000 // Ease-of-use party AI: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #5900 // Initialise AI components (required for all tactical and AI components): v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6000 // Smarter general AI: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6010 // Better calls for help: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6030 // Smarter Mages: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6040 // Smarter Priests: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6200 // Improved Spiders: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6300 // Smarter sirines and dryads: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6310 // Slightly smarter carrion crawlers: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #6320 // Smarter basilisks: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7000 // Improved doppelgangers: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7010 // Tougher Black Talons and Iron Throne guards: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7020 // Improved deployment for parties of assassins: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7030 // Improved kobolds: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7040 // Relocated bounty hunters: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7050 // Improved Ulcaster: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7060 // Improved Balduran's Isle: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7070 // Improved Durlag's Tower: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7090 // Improved Cloakwood Druids: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7100 // Improved Bassilus: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7110 // Improved Drasus party: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7130 // Improved Red Wizards: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7140 // Improved Undercity assassins: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7200 // Tougher chapter-two end battle: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7210 // Tougher chapter-three end battle: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7220 // Tougher chapter-four end battle: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7230 // Tougher chapter-five end battle: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7250 // Improved final battle: v32.6
~STRATAGEMS/SETUP-STRATAGEMS.TP2~ #0 #7900 // Improved minor encounters: v32.6
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #101 // Prevent skeletal and incorporeal undead from being affected by Illithids' Devour Brain attack: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #105 // PnP Dimension Door: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #120 // Restore innate disease immunity to Paladins: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #125 // Rangers' Animal Empathy improves with experience: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #201 // Instant casting for warrior innates: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #203 // Make druidic shapeshifting uninterruptable: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #211 // Make Death Ward protect against Vorpal Hits: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #213 // Expanded saving throw bonus tables for Dwarves, Gnomes and Halflings: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #220 // Simple Thief script: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #230 // Simple Bard script: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #239 // Simple Cleric/Paladin script: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #300 // Use Icewind Dale's Dimension Door animation -> Fast animation speed (matches IWD): v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #310 // Distinctive creature coloring: v4.53
~ATWEAKS/SETUP-ATWEAKS.TP2~ #0 #315 // Distinctive creature soundsets: v4.53
~JIMFIX/SETUP-JIMFIX.TP2~ #0 #201 // Add spell school notifications to the combat log -> All spells with a casting time greater than 1: v2.5
~JIMFIX/SETUP-JIMFIX.TP2~ #0 #300 // Add expiration notifications for buffs: v2.5
~JIMFIX/SETUP-JIMFIX.TP2~ #0 #600 // Add expiration notifications for item buffs: v2.5
~JIMFIX/SETUP-JIMFIX.TP2~ #0 #500 // Reveal all hidden doors: v2.5
~JIMFIX/SETUP-JIMFIX.TP2~ #0 #700 // Allow Spell Shield to block Wish Breach and Mordenkainen's Disjunction: v2.5
It might not have been the best idea, but I used the latest state in master branch for EEex mod, I didn't use the release version.
Does anyone have any ideas why this is happening?
Also, does installing EEex earlier or later in the install order change anything?
Thanks
Edit: I also see these lines looped over a lot too inside EEex.log:
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:138: in function 'getItemSlot1'
function valid066EFF68 () return getItemSlot1(6).valid end:1: in function <[string "function valid066EFF68 () return getItemSlot1..."]:1>
INFO: [string "menu"]:142: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:142: in function 'getItemSlot2'
function valid066F05C8 () return getItemSlot2(6).valid end:1: in function <[string "function valid066F05C8 () return getItemSlot2..."]:1>
INFO: [string "menu"]:146: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:146: in function 'getItemSlot3'
function valid066F09A8 () return getItemSlot3(6).valid end:1: in function <[string "function valid066F09A8 () return getItemSlot3..."]:1>
INFO: [string "menu"]:150: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:150: in function 'getItemSlot4'
function valid066F1368 () return getItemSlot4(6).valid end:1: in function <[string "function valid066F1368 () return getItemSlot4..."]:1>
INFO: [string "menu"]:154: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:154: in function 'getItemSlot5'
function valid066F1BA8 () return getItemSlot5(6).valid end:1: in function <[string "function valid066F1BA8 () return getItemSlot5..."]:1>
INFO: [string "menu"]:158: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:158: in function 'getItemSlot6'
function valid066F1F48 () return getItemSlot6(6).valid end:1: in function <[string "function valid066F1F48 () return getItemSlot6..."]:1>
INFO: [string "menu"]:162: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:162: in function 'getItemSlot7'
function valid066F2788 () return getItemSlot7(6).valid end:1: in function <[string "function valid066F2788 () return getItemSlot7..."]:1>
INFO: [string "menu"]:166: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:166: in function 'getItemSlot8'
function valid066F2DC8 () return getItemSlot8(6).valid end:1: in function <[string "function valid066F2DC8 () return getItemSlot8..."]:1>
INFO: [string "menu"]:170: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:170: in function 'getItemSlot9'
function valid066E3008 () return getItemSlot9(6).valid end:1: in function <[string "function valid066E3008 () return getItemSlot9..."]:1>
INFO: [string "menu"]:174: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:174: in function 'getItemSlot10'
function valid066E3A48 () return getItemSlot10(6).valid end:1: in function <[string "function valid066E3A48 () return getItemSlot1..."]:1>
INFO: [string "menu"]:178: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:178: in function 'getItemSlot11'
function valid066E43A8 () return getItemSlot11(6).valid end:1: in function <[string "function valid066E43A8 () return getItemSlot1..."]:1>
INFO: [string "menu"]:182: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:182: in function 'getItemSlot12'
function valid066E4608 () return getItemSlot12(6).valid end:1: in function <[string "function valid066E4608 () return getItemSlot1..."]:1>
INFO: [string "menu"]:186: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:186: in function 'getItemSlot13'
function valid066E4CE8 () return getItemSlot13(6).valid end:1: in function <[string "function valid066E4CE8 () return getItemSlot1..."]:1>
INFO: [string "menu"]:190: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:190: in function 'getItemSlot14'
function valid066E5788 () return getItemSlot14(6).valid end:1: in function <[string "function valid066E5788 () return getItemSlot1..."]:1>
INFO: [string "menu"]:194: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:194: in function 'getItemSlot15'
function valid066E59A8 () return getItemSlot15(6).valid end:1: in function <[string "function valid066E59A8 () return getItemSlot1..."]:1>
INFO: [string "menu"]:198: attempt to index field '?' (a nil value)
stack traceback:
return debug.traceback():1: in main chunk
=[C]: in function '__index'
menu:198: in function 'getItemSlot16'
function valid066E63A8 () return getItemSlot16(6).valid end:1: in function <[string "function valid066E63A8 () return getItemSlot1..."]:1>
Here is a test code (tested on Cleric with free memorization slots and the SPPR104 spell available within his Known spells) Tested from within UI and by running the code via invoke lua opcode - in both cases memorization failed. I've also checked for SPPR104 presence with NI and the spell definatetly has not been memorized. Both EEex_GetMemorizedClericSpells and EEex_GetMemorizedWizardSpells work fine.
edit: typo fix in the test code
@swit: The level indexing starts at 0, not at 1 like you would think, (since it wraps an internal function where it uses the level to do an array access). If the provided level doesn't properly match the array-accessed spell level the internal function returns without doing anything, as what you are seeing in your test.
To memorize 1st level spells, level should be 0
To memorize 2nd level spells, level should be 1
etc.
https://www.dropbox.com/s/q2gvo8jx98b4kh0/Baldr015.png
btw. with this code spellbook screen is no longer restricted to classes with hardcoded access to cleric/mage spells, so for the purpose of my mod I'm no longer forced to highjack F/M/C class (or any other of the vanilla classes)
I'm wondering if there is a way to detect if "Cast Spell" actionbar menu is currently opened (actionbar icons replaced with spell icons/arrows). I've tried detecting it via buttonArray:GetButtonType(0) == 31 but this is also true for "Special Abilities" and "Use Item" actionbar menus.
What are the valid arguments for EEex_SetActionbarState? If "state" here means what I'm asking for above than I'd like to request EEex_GetActionbarState function :P
edit: @Bubb, I think I found a reliable way to detect spellcasting state and when it ends without dedicated function. Here it is in case someone needs it for their mod:
1. Function call that replaces all buttonArray:OnLButtonPressed(x) lines in actionbar action sections:
2. global code (should run constantly while in-game, so for example added as a dummy mos lua function code) It catches situations like changing the characters via portrait click, exiting the sub-menu via ESC, casting the spell, or clicking somewhere on the gameworld (which also closes the submenu). From what I tested the only thing not covered here is opening the spell menu via keyboard shortcut, but that can be handled with the existing EEex_AddKeyPressedListener() function.
Here's the possible values for actionbar state:
"Unique Config" refers to the button types that eventually get set from the state(s) on the right. In a few instances the engine reuses the same button configuration for multiple purposes. You can see this in the Spells config; one state is for setting a quick button, while another is actually for casting.
Actionbar listeners now pass the state as the second param, like this:
Edit: You can catch the "Cast Spell" actionbar state like this:
And also, EEex_GetActionbarState() is now in master - if you still need it
(And for the source of the crashes, turns out about 1 in every 7,500 calls to EEex_WriteLString() could crash the game.)
https://imgur.com/a/teitafp
Keep in mind though that this is not a GUI mod for vanilla EE games but part of a project that brings whole IWD2 content into EE engine using Lua and EEex (currently intended only for EET platform, but in future standalone version installed on top of IWD:EE is also planned). There is tons of custom code related to this project here. For example whole character creation, levelling up screen and spellbook don't use a single hardcoded function (for characters that follow custom rules). Thanks to EEex, I've re-implemented hardcoded functionality from scratch instead, in order to make it work with 3E style multi-class system, character progression and other IWD2 features introduced by this mod (for example feats, subraces, sorcerer style spellcasting working alongside preparation spellcasting, and much more, most of it coded in UI.MENU). Turning it into a simple GUI mod for EE games would be extra work, and currently has very low priority.
Based on my limited testing, it looks like it's indeed fixed. I haven't encountered any more crashes so far. Thank you.
However, I've encountered another issue. Whenever I click on a weapon in my quick slot items, the Thac0 changes. The same weapon shows different Thac0 values each time I click on it. To demonstrate, I'm attaching two screenshots showing the same weapon equipped:
I'm also attaching my weidu.log and a stripped version of my EEex.log. I've only kept potential points of interest in the EEex.log file, where it was showing UI string not found messages or nil value error messages. Nil value error messages for getItemSlotxx functions are looped over thousands of times, that's why I removed most of those duplicate messages. Even if I open the inventory screen once and click on a quick slot weapon 1 time, these messages are written a thousand times to the logs.
The THAC0 is very well spotted. About that...
We just found one drawback to disabling the above. Part of what it does, (and I don't even know if this is intentional), is make sure items instantly update character state. What you're encountering is the weapon's enchantment modifier not being applied until the game is unpaused. There's actually a flaw here in the engine - an item will only instantly update character state if it has at least one effect attached.
I might be able to rig the engine to only do the character-wide update if the effect source is an item. I don't want to outright revert my change, as it fixes a ton of nasty bugs with pausing while casting spells. We'll see what I come up with.
I downloaded the new version and yeah it's working perfectly now. Calculates Thac0 correctly every time. Amazing work Bubb, and thanks a lot again for the very quick fix.
The only issue I have left now is that my dragon disciple is begging me to take leave from work and spend time with him
- It's not possible to generate "CHR" file during chargen (which means no support for "Pregenerate character" button that exports the character when chargen is done)
- There is no way to dynamically change paperdoll during chargen (displayed via 'paperdoll x') since the correct one matches what's currently set for CHARBASE.CRE (gender and class). Since we're not modifying CHARBASE until we're already in-game, the paperdoll animation remains static.
- vanilla Infinity_SetHairColor, Infinity_SetSkinColor, Infinity_SetMajorColor, Infinity_SetMinorColor functions accepts values that are not matching color values present in CRE file, but rather those used by color sliders (I think). In the mod some subraces are meant to have very limited selection of hair and skin colors - for example drows and duergars. Even though these functions are providing visual feedback for paperdoll during chargen, I don't know how to calculate the correct color value.
- I don't think there is a way to display the limited color selection like it was possible in pre-2.0 patch - the engine now only use full RGB color sliders. Since 'colordisplay x' values 51-84 are unused by the engine (I think, see the screenshot - https://i.imgur.com/yVEoU2e.png), it would be nice to be able to assign above mentioned color values to them on the fly, so that they could display limited color selection properly during chargen
- Currently I'm using rather awkward way to patch in character sounds chosen during chargen, since there is no dedicated opcode - SetPlayerSound actions used in a temporary assigned script via opcode 400.
Considering the CHARBASE.CRE seems to be loaded during chargen and modified on the fly via hardcoded functions (assumption based on the 'paperdoll x' displaying the data that matches what's present in the CHARBASE.CRE), I'm wondering if it would be viable to edit CHARBASE on the fly via EEex too during chargen. Do the offsets in memory match CREv1 structure, which would allow patching it without dedicated functions? Or maybe the loaded data can already support EEex CRE patching functions like EEex_ApplyEffectToActor? This would solve most of the above mentioned limitations (patching character colors, sounds, have the correct paperdoll displayed during chargen and be able to export the character before starting the game)
Unrelated to it, there is one more feature from IWD2, that I have trouble implementing:
- https://i.imgur.com/CGUMnIJ.png
- https://i.imgur.com/MEOmjWG.png
As you can see in the screenshots, I've partially made the select party feature work via already present engine functionality that loads CRE files mentioned in 2DA file - startEngine:OnCampaignButtonClick('X',true) (where X matches the CAMPAIGN.2DA row label) loads 2da file under the CAMPAIGN.2DA "TBPPARTY" column.
It would be nice to have a way to set different 2DA file without need to change currently loaded CAMPAIGN.2DA row (so that a single campaign could support more than 1 pre-made party)
I had a look at the CScreenStart class, and updated the EEex docs for that as well: CScreenStart methods and CScreenCreateChar class: CScreenCreateChar methods
The Black Pits seems to use the TBPPARTY column, Shadows of Amn uses IWDPARTY, and Throne of Bhaal uses HOWPARTY column. OnCampaignButtonClick appears to be called from CScreenStart::TimerAsynchronousUpdate and/or tolua_BaldurLUA_CScreenStart_OnCampaignButtonClick00, i guess it passes the column based on which button was clicked. I guess it would be possible to change that column text to use some other 2da file for any of those buttons - might have to wait for Bubb to take a look at it.
- create a reduction/increase by X points for any/every incoming damage type, akin to 3.5E damage reduction/vulnerability?
- absorb x amount of damage before being negated, i.e. like stoneskin but based on damage amount rather than number of skins?
New functions:
EXDAMRED() => As requested by @Shin , this function, called by a Screen Effects opcode, gives the creature 3e-like damage resistance, preventing the first parameter1 damage of the damage types specified by parameter2. It can prevent a total of parameter3 damage before the effect ends.
If parameter3 is 0, then the total damage preventable is unlimited.
You can also make parameter1 negative, increasing damage dealt of the chosen damage types by a flat amount.
There is a flag you can set to disable the damage prevention messages.
EXDAMAGE() => This function, called by an Invoke Lua opcode, deals damage to the target, and there are options to increase the damage dealt based on the source's Strength, proficiencies, and damage bonus effects. This could be used to make a weapon that deals non-physical damage that scales with the wielder's damage bonuses.
@Grammarsalad had been making documentation for EEex here. It's slightly outdated, but it still includes most of the functions of EEex.