Kaliesto Posted September 5, 2017 Share Posted September 5, 2017 (edited) Now is a good time to ask since much time has passed, what can be said about how stable EET is at this point? It seems there has been less and less reports of bad bugs except for lesser ones. Also was the separate patches for Ascension ever been integrated into EET? I thought it was odd someone on BG Forums not too long ago didn't have the patches installed. Edited September 5, 2017 by Kaliesto Quote Link to comment
argent77 Posted September 5, 2017 Share Posted September 5, 2017 I've got another issue, concerning Imoen. At the start of SoA, when Imoen joins you, her experience is set to 500k. This may be too high if you dual-classed her in BG1, since it doesn't appear to take XP of the original class into account.In my case I dual-classed her right before the final Sarevok encounter, so she was around level 3 (second class) at the end. In SoA she got the full 500k XP for the second class in addition to 220k from her original class, which amounts to 720k XP and is only a single level away from reactivating her original class. It's not a big deal since she'll leave again after the initial dungeon, but it would be great if it could be fixed anyway. Quote Link to comment
argent77 Posted September 5, 2017 Share Posted September 5, 2017 Breakable non-enchanted weapons don't stop breaking after BG1 reaching chapter 6. This is caused by missing chapter check entries in SPLPROT.2DA that are available in BGEE/SoD, but not in EET. Quote Link to comment
K4thos Posted September 12, 2017 Author Share Posted September 12, 2017 (edited) I think 0 might not be an empty string in BG2EE... that's just going off the top of my head, but I have a vague recollection of that being the reason I use -1 instead of 0 for empty strings in all my mods... Strref 0 ("<NO TEXT>") will be resolved as an empty string that isn't displayed when used as creature name. Behavior of BG1EE and BG2EE are identical in this regard. Setting name to strref 0 solves the issue in EET. Edit: The random name issue when using strref -1 is most likely a game bug and has to be fixed by Beamdog. added additional check for 0 value during resource importation, thanks. ---------------- Breakable non-enchanted weapons don't stop breaking after BG1 reaching chapter 6. This is caused by missing chapter check entries in SPLPROT.2DA that are available in BGEE/SoD, but not in EET. nice find, fixed locally. splprot.2da is now read during installation and remapped if needed (not in this case since both missing rows will get the same row number as in BG:EE) What I'm not sure about is this part of CamDawg's post: splprot.2da: Borrowed from GemRB, this table externalizes spell protections. Every row is a protection type indexed by opcode 318/324/326 or a projectile's ids field What projectile's ids field? 0x3e and 0x42? NI shows normal IDS files there, not SPLPROT.2DA references. IESDP doesn't have any info about it either (from what I see the documentation is outdated since it doesn't list anything after 0x2a offset). --------------- I've got another issue, concerning Imoen. At the start of SoA, when Imoen joins you, her experience is set to 500k. This may be too high if you dual-classed her in BG1, since it doesn't appear to take XP of the original class into account. In my case I dual-classed her right before the final Sarevok encounter, so she was around level 3 (second class) at the end. In SoA she got the full 500k XP for the second class in addition to 220k from her original class, which amounts to 720k XP and is only a single level away from reactivating her original class. It's not a big deal since she'll leave again after the initial dungeon, but it would be great if it could be fixed anyway. here is vanilla game code that handles Imoen's XP at the start of SoA (EET just resets BD_JOINXP variable since it's also set in BG1): IF Global("BD_JOINXP","LOCALS",0) InParty(Myself) XPGT(Player1,1249999) XPLT(Myself,1250000) THEN RESPONSE #100 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",1) ChangeStat(Myself,XP,1250000,SET) SetInterrupt(TRUE) END IF Global("BD_JOINXP","LOCALS",0) InParty(Myself) XPGT(Player1,999999) XPLT(Myself,1000000) THEN RESPONSE #100 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",1) ChangeStat(Myself,XP,1000000,SET) SetInterrupt(TRUE) END IF Global("BD_JOINXP","LOCALS",0) InParty(Myself) XPGT(Player1,749999) XPLT(Myself,750000) THEN RESPONSE #100 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",1) ChangeStat(Myself,XP,750000,SET) SetInterrupt(TRUE) END IF Global("BD_JOINXP","LOCALS",0) InParty(Myself) XPGT(Player1,499999) XPLT(Myself,500000) THEN RESPONSE #100 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",1) ChangeStat(Myself,XP,500000,SET) SetInterrupt(TRUE) END IF Global("BD_JOINXP","LOCALS",0) InParty(Myself) XPGT(Player1,249999) XPLT(Myself,250000) THEN RESPONSE #100 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",1) ChangeStat(Myself,XP,250000,SET) SetInterrupt(TRUE) END IF Global("BD_JOINXP","LOCALS",0) InParty(Myself) XPGT(Player1,124999) XPLT(Myself,125000) THEN RESPONSE #100 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",1) ChangeStat(Myself,XP,125000,SET) SetInterrupt(TRUE) END IF Global("BD_JOINXP","LOCALS",0) InParty(Myself) XPLT(Player1,89001) THEN RESPONSE #100 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",1) SetInterrupt(TRUE) END Not sure how to handle it if XP trigger can't read original class experience. Any ideas? edit: maybe CheckStat / CheckStatGT / CheckStatLT triggers will take original class XP into account. Will test it soon (sooner if you can upload your save from the end of SoD ) Edited September 12, 2017 by K4thos Quote Link to comment
Blash2 Posted September 12, 2017 Share Posted September 12, 2017 Just leave her XP as it was when you left her? Shouldn't take long for her to adjust. Quote Link to comment
argent77 Posted September 12, 2017 Share Posted September 12, 2017 (edited) Breakable non-enchanted weapons don't stop breaking after BG1 reaching chapter 6. This is caused by missing chapter check entries in SPLPROT.2DA that are available in BGEE/SoD, but not in EET.nice find, fixed locally. splprot.2da is now read during installation and remapped if needed (not in this case since both missing rows will get the same row number as in BG:EE)What I'm not sure about is this part of IESDP documentation: splprot.2da: Borrowed from GemRB, this table externalizes spell protections. Every row is a protection type indexed by opcode 318/324/326 or a projectile's ids field What projectile's ids field? 0x3e and 0x42? NI shows normal IDS files there, not SPLPROT.2DA references. IESDP doesn't have any info about it either (from what I see the documentation is outdated since it doesn't list anything after 0x2a offset). Yeah, IESDP's PRO format description doesn't include features added by EE patch 2.0 yet. Projectiles will use offsets 0x3e and 0x42 for splprot.2da entries when extended flags bit 30 (IWD-style check) is set. I've got another issue, concerning Imoen. At the start of SoA, when Imoen joins you, her experience is set to 500k. This may be too high if you dual-classed her in BG1, since it doesn't appear to take XP of the original class into account. In my case I dual-classed her right before the final Sarevok encounter, so she was around level 3 (second class) at the end. In SoA she got the full 500k XP for the second class in addition to 220k from her original class, which amounts to 720k XP and is only a single level away from reactivating her original class. It's not a big deal since she'll leave again after the initial dungeon, but it would be great if it could be fixed anyway. here is vanilla game code that handles Imoen's XP at the start of SoA (EET just resets BD_JOINXP variable since it's also set in BG1): IF Global("BD_JOINXP","LOCALS",0) InParty(Myself) XPGT(Player1,1249999) XPLT(Myself,1250000) THEN RESPONSE #100 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",1) ChangeStat(Myself,XP,1250000,SET) SetInterrupt(TRUE) END IF Global("BD_JOINXP","LOCALS",0) InParty(Myself) XPGT(Player1,999999) XPLT(Myself,1000000) THEN RESPONSE #100 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",1) ChangeStat(Myself,XP,1000000,SET) SetInterrupt(TRUE) END IF Global("BD_JOINXP","LOCALS",0) InParty(Myself) XPGT(Player1,749999) XPLT(Myself,750000) THEN RESPONSE #100 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",1) ChangeStat(Myself,XP,750000,SET) SetInterrupt(TRUE) END IF Global("BD_JOINXP","LOCALS",0) InParty(Myself) XPGT(Player1,499999) XPLT(Myself,500000) THEN RESPONSE #100 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",1) ChangeStat(Myself,XP,500000,SET) SetInterrupt(TRUE) END IF Global("BD_JOINXP","LOCALS",0) InParty(Myself) XPGT(Player1,249999) XPLT(Myself,250000) THEN RESPONSE #100 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",1) ChangeStat(Myself,XP,250000,SET) SetInterrupt(TRUE) END IF Global("BD_JOINXP","LOCALS",0) InParty(Myself) XPGT(Player1,124999) XPLT(Myself,125000) THEN RESPONSE #100 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",1) ChangeStat(Myself,XP,125000,SET) SetInterrupt(TRUE) END IF Global("BD_JOINXP","LOCALS",0) InParty(Myself) XPLT(Player1,89001) THEN RESPONSE #100 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",1) SetInterrupt(TRUE) END Not sure how to handle it if XP trigger can't read original class experience. Any ideas? edit: maybe CheckStat / CheckStatGT / CheckStatLT triggers will take original class XP into account. Will test it soon (sooner if you can upload your save from the end of SoD ) Like I mentioned, it's not a big issue. Especially since it's apparently vanilla game behavior. I couldn't find an easy way to check for inactive class levels either. Edit: My SoD end save: 000000058-SoD finished.zip Edited September 12, 2017 by argent77 Quote Link to comment
K4thos Posted September 12, 2017 Author Share Posted September 12, 2017 (edited) Yeah, IESDP's PRO format description doesn't include features added by EE patch 2.0 yet. Projectiles will use offsets 0x3e and 0x42 for splprot.2da entries when extended flags bit 30 (IWD-style check) is set. thanks, it's now implemented locally. Like I mentioned, it's not a big issue. Especially since it's apparently vanilla game behavior. I couldn't find an easy way to check for inactive class levels either. Edit: My SoD end save: 000000058-SoD finished.zip 1.18MB 1 downloads Following test code seems to do the job when extended bottom in Imoen's override script (tested with your save): IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) OR(2) !Class(Myself,MAGE) ClassLevelLT(Myself,ROGUE,2) THEN RESPONSE #100 SetGlobal("BD_JOINXP","LOCALS",2) END IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) Class(Myself,MAGE) ClassLevel(Myself,ROGUE,2) THEN RESPONSE #100 SetGlobal("K#OriginalClass","LOCALS",2) END IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) Class(Myself,MAGE) ClassLevel(Myself,ROGUE,3) THEN RESPONSE #100 SetGlobal("K#OriginalClass","LOCALS",3) END IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) Class(Myself,MAGE) ClassLevel(Myself,ROGUE,4) THEN RESPONSE #100 SetGlobal("K#OriginalClass","LOCALS",4) END IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) Class(Myself,MAGE) ClassLevel(Myself,ROGUE,5) THEN RESPONSE #100 SetGlobal("K#OriginalClass","LOCALS",5) END IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) Class(Myself,MAGE) ClassLevel(Myself,ROGUE,6) THEN RESPONSE #100 SetGlobal("K#OriginalClass","LOCALS",6) END IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) Class(Myself,MAGE) ClassLevel(Myself,ROGUE,7) THEN RESPONSE #100 SetGlobal("K#OriginalClass","LOCALS",7) END IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) Class(Myself,MAGE) ClassLevel(Myself,ROGUE,8) THEN RESPONSE #100 SetGlobal("K#OriginalClass","LOCALS",8) END IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) Class(Myself,MAGE) ClassLevel(Myself,ROGUE,9) THEN RESPONSE #100 SetGlobal("K#OriginalClass","LOCALS",9) END IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) Class(Myself,MAGE) ClassLevel(Myself,ROGUE,10) THEN RESPONSE #100 SetGlobal("K#OriginalClass","LOCALS",10) END IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) Class(Myself,MAGE) ClassLevel(Myself,ROGUE,11) THEN RESPONSE #100 SetGlobal("K#OriginalClass","LOCALS",11) END IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) Class(Myself,MAGE) ClassLevel(Myself,ROGUE,12) THEN RESPONSE #100 SetGlobal("K#OriginalClass","LOCALS",12) END IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) Class(Myself,MAGE) ClassLevelGT(Myself,ROGUE,12) THEN RESPONSE #100 SetGlobal("K#OriginalClass","LOCALS",13) END IF Global("BD_JOINXP","LOCALS",1) Switch("K#OriginalClass","LOCALS") THEN RESPONSE #2 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",2) ChangeStat(Myself,XP,-1250,ADD) SetInterrupt(TRUE) Continue() RESPONSE #3 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",2) ChangeStat(Myself,XP,-2500,ADD) SetInterrupt(TRUE) Continue() RESPONSE #4 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",2) ChangeStat(Myself,XP,-5000,ADD) SetInterrupt(TRUE) Continue() RESPONSE #5 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",2) ChangeStat(Myself,XP,-10000,ADD) SetInterrupt(TRUE) Continue() RESPONSE #6 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",2) ChangeStat(Myself,XP,-20000,ADD) SetInterrupt(TRUE) Continue() RESPONSE #7 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",2) ChangeStat(Myself,XP,-40000,ADD) SetInterrupt(TRUE) Continue() RESPONSE #8 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",2) ChangeStat(Myself,XP,-70000,ADD) SetInterrupt(TRUE) Continue() RESPONSE #9 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",2) ChangeStat(Myself,XP,-110000,ADD) SetInterrupt(TRUE) Continue() RESPONSE #10 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",2) ChangeStat(Myself,XP,-160000,ADD) SetInterrupt(TRUE) Continue() RESPONSE #11 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",2) ChangeStat(Myself,XP,-220000,ADD) SetInterrupt(TRUE) Continue() RESPONSE #12 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",2) ChangeStat(Myself,XP,-440000,ADD) SetInterrupt(TRUE) Continue() RESPONSE #13 SetInterrupt(FALSE) SetGlobal("BD_JOINXP","LOCALS",2) ChangeStat(Myself,XP,-660000,ADD) SetInterrupt(TRUE) Continue() END It subtracts XP from the active class after vanilla XP adjustment. So in your example, argent, Imoen ends up with 280 000 XP for mage class and 220 000 XP for thief instead of 500 000 + 220 000. This is inteded value considering Player1 has > 500k XP. Edited September 12, 2017 by K4thos Quote Link to comment
Blash2 Posted September 12, 2017 Share Posted September 12, 2017 Multiclassed Imoen will not generate issues? Quote Link to comment
K4thos Posted September 12, 2017 Author Share Posted September 12, 2017 Multiclassed Imoen will not generate issues? that depends if Class(Myself,MAGE) trigger also detects multiclass character - needs to be tested. We can add !Class(Myself,MAGE_THIEF) trigger if needed. Quote Link to comment
Blash2 Posted September 12, 2017 Share Posted September 12, 2017 I think it is needed.. at least two mods turn Imoen into a multiclass mage/thief: Sandrah's Saga and NPCs Enhanced for Everyone. Quote Link to comment
K4thos Posted September 12, 2017 Author Share Posted September 12, 2017 (edited) it's not needed unless I missed something. Here are results of my tests: Class(Myself,MAGE) - returns true if CRE is dual-classed to mage with thief class innactive - returns false if CRE is dual-classed to mage with both classes active - returns false if CRE is multi-classed Class(Myself,MAGE_THIEF) - returns false if CRE is dual-classed to mage with thief class innactive - returns true if CRE is dual-classed to mage with both classes active - returns true if CRE is multi-classed Now the question is if "XP" / "CheckStat" trigger will correctly count total XP when both classes are active. Guess more tests are needed... Edited September 12, 2017 by K4thos Quote Link to comment
Roxanne Posted September 12, 2017 Share Posted September 12, 2017 I think it is needed.. at least two mods turn Imoen into a multiclass mage/thief: Sandrah's Saga and NPCs Enhanced for Everyone. Correct wording at least two mods turn allow the player to turn Imoen into a multiclass mage/thief: Sandrah's Saga and NPCs Enhanced for Everyone I think it is needed Even if done, there is no imminent requirement to do any xp updates at this point nor later in Spellhold. The multiclass Imoen has undergone her own development during SoD already. Quote Link to comment
argent77 Posted September 12, 2017 Share Posted September 12, 2017 Multiclassed Imoen will not generate issues?that depends if Class(Myself,MAGE) trigger also detects multiclass character - needs to be tested. We can add !Class(Myself,MAGE_THIEF) trigger if needed. Dualclass with active thief class has the same problem of getting too much XP as with inactive thief class. You can probably use OriginalClass(Myself,THIEF) to better distinguish between dual- and multi-class. IF Global("BD_JOINXP","LOCALS",1) Global("K#OriginalClass","LOCALS",0) Class(Myself,MAGE_ALL) OriginalClass(Myself,THIEF) ClassLevel(Myself,ROGUE,2) THEN RESPONSE #100 SetGlobal("K#OriginalClass","LOCALS",2) END It should catch all valid dualclass states and skip multiclass variants at the same time. Quote Link to comment
NdranC Posted September 16, 2017 Share Posted September 16, 2017 I hope this is not the wrong place to post about this. I'm currently trying to install EET on linux with all the required setup listed here (http://gibberlings3.net/forums/index.php?showtopic=28516) Everything was going fine until I had to install EET and I keep getting this issue: Skipping SPELL.IDS reference: SPCL923 4923 PALADIN_SUMMON_DEVA Skipping SPELL.IDS reference: SPCL924 4924 DRUID_IMMUNE_POISON Skipping SPELL.IDS reference: SPCL925 4925 DRUID_RESISTS Skipping SPELL.IDS reference: SPCL940 4940 SHAMAN_SPIRIT_FORM Skipping SPELL.IDS reference: SPCL941 4941 SHAMAN_FAVORED_OF_THE_SPIRITS Copying 1 file ... Copying 1 file ... Copying 1 file ... Copying 1 file ... Copying 1 file ... Copying 1 file ... ERROR: COPY ~EET/TEMP/PATCH/SPL/ADD_SPELL/SPCL101.SPL~ ~EET/temp/patch/spl/SPCL101.SPL~ FAILED: cannot open target Stopping installation because of error. Stopping installation because of error. Stopping installation because of error. ERROR Installing [EET core - resource importation], rolling back to previous state Will uninstall 231 files for [eet/eet.tp2] component 0. Uninstalled 231 files for [eet/eet.tp2] component 0. ERROR: Sys_error("eet/temp/patch/spl/spcl101.spl: No such file or directory") PLEASE email the file setup-eet.debug to K4thos (swit) Using Language [English] Install Component [EET core - resource importation]? [I]nstall, or [N]ot Install or [Q]uit? q [./lang/en_us/dialog.tlk] created, 299409 string entries NOT INSTALLED DUE TO ERRORS EET core - resource importation This seems to be very similar to what was happening to grodriguez in this post (http://gibberlings3.net/forums/index.php?showtopic=28614) but unfortunately nobody seemed to know the answer to this problem. The debug file is quite big but i uploaded the relevant info to pastebin here (https://pastebin.com/cimXEydb) I was able to test install other mods for both bg1 and bg2 and they all seem to install fine. So I assume my case insensitive ntfs partition is mounted and configured correctly. Thanks. Quote Link to comment
K4thos Posted September 17, 2017 Author Share Posted September 17, 2017 (edited) Nothing comes to my mind other than problem with case sensitivity. "EET/temp/patch/spl" directory exists for sure. Dunno how to help Maybe unifying everything in EET to upper case would do the job (so that there are no instances of mixed cases in a single weidu COPY command), although not sure considering you're already using case insensitive partition on linux. What's strange is that this file is always handled during installation (it's from vanilla game) and there were people who successfully installed the mod on linux IIRC. Edited September 17, 2017 by K4thos Quote Link to comment
Recommended Posts
Join the conversation
You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.