Jump to content

EET v13.4 released


Recommended Posts

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 by Kaliesto
Link to comment

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.

Link to comment

 

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 :p)

Edited by K4thos
Link to comment

 

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 :p)

 

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 by argent77
Link to comment
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: zip.gif 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 by K4thos
Link to comment

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 by K4thos
Link to comment

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.

Link to comment

 

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.

Link to comment

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.

Link to comment

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 by K4thos
Link to comment

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...