Jump to content

argent77

Modders
  • Posts

    1,597
  • Joined

Posts posted by argent77

  1. I have noticed two issues with SR v4beta15:

    1. The mod fails to install in BGEE (with or without SoD) because of a missing resource SPIN203.SPL.

    2. SR seems to reset exclusion flags of all Wild Mage related spells (SPWI124, SPWI222 and SPWI723), so that they're available for all mages and sorcerers.

  2. With respect to 372

    This is used by EET for the transitions between the various campaigns. May be worth to ask K4thos about how he exactly makes use of it or whether the rest of his transition actions are all in scripts etc. See *Modder's Notes* in the docs folder of EET download.

     

    Yeah, this action looks like a quick way to switch between thematically independent parts of the story. I can imagine the next IWDEE patch will also make use of it for the HoW and TotLM expansions.

  3. 372 MoveToCampaign(S:Campaign*)
    This action reinitializes important default values and resource references based on definitions from campaign.2da, such as world scripts, save folder name or starting area. Campaign refers to the name defined in the first column of that table. It is currently used to switch from BGEE to the Siege of Dragonspear campaign.

    373 AddWorldmapAreaFlag(S:Area*,I:Type*WMPFLAG)
    This action can be used to set flags of an area on the worlmap that control visibility or accessibility. Flags are taken from wmpflag.ids.

    374 RemoveWorldmapAreaFlag(S:Area*,I:Type*WMPFLAG)
    This action can be used to clear flags of an area on the worlmap that control visibility or accessibility. Flags are taken from wmpflag.ids.

    377 SetGlobalTimerRandom(S:Name*,S:Area*,I:Min*GTimes,I:Max*GTimes)
    This action sets a global timer to a random value within the range of Min and Max specified by the 3rd and 4th parameter. Both parameters accept symbolic values from gtimes.ids. The timer is checked by the GlobalTimerExpired() and GlobalTimerNotExpired() triggers.

  4. 0x40F8 CanEquipRanged()

    Returns true only if the active creature can switch to a ranged weapon that is ready for use (e.g. a throwing weapon, such as darts, or a launcher with corresponding ammo, such as bow and arrow).

     

    0x40F9 ImmuneToSpellLevel(O:Object*,I:Level*)

    Returns true if the specified object is immune to spells of the level specified by the 2nd parameter.

     

    0x40FB IsForcedRandomEncounterActive(S:Area*)

    Returns true only if a random encounter to the specified area has been initialized by a preceding call of ForceRandomEncounter() or ForceRandomEncounterEntry().

     

    0x4103 CheckItemSlot(O:Object*,S:Item*,I:Slot*SLOTS)

    Returns true only if the item specified in the 2nd parameter can be found in the inventory slot (taken from SLOTS.IDS) of the specified object.

     

    0x4104 CurrentAmmo(S:ResRef*,O:Object*)

    Returns true only if the specified object has a ranged weapon with the ammo specified by ResRef equipped.

  5. The following triggers appear to be related to the unselectable state from script action MakeUnselectable() or effect opcode 365:

    0x406D UnselectableVariable(I:Num*)
    Returns true only if the active creature is for exactly the specified number of ticks (1/15th seconds) left under the effect of the script action MakeUnselectable() or opcode 365.
    Note: By default in BG2EE creatures stop processing scripts while under effect of the script action MakeUnselectable().

    0x406E UnselectableVariableGT(I:Num*)
    Returns true only if the active creature is for more than the specified number of ticks (1/15th seconds) left under the effect of the script action MakeUnselectable() or opcode 365.
    Note: By default in BG2EE creatures stop processing scripts while under effect of the script action MakeUnselectable().

    0x406F UnselectableVariableLT(I:Num*)
    Returns true only if the active creature is for less than the specified number of ticks (1/15th seconds) left under the effect of the script action MakeUnselectable() or opcode 365.
    Note: By default in BG2EE creatures stop processing scripts while under effect of the script action MakeUnselectable().

  6. This info is based on the GiveOrder() action description and verified by a quick test in BG1EE:

    0x0006 ReceivedOrder(O:Object*,I:Order ID*)
    This trigger is used in conjunction with the GiveOrder action, and works in a similar way to the Heard trigger. Only one creature at a time responds to an order, and creatures do not detect their own orders. The creature must be in visual range for this trigger to work.

  7. I'll start with a first batch of actions.

    376 DisplayStringNoNameDlg(O:Object*,I:StrRef*)
    This action behaves like DisplayStringNoName, except that it also works in dialogues. It displays the strref specified by the StrRef parameter in the message window, without attributing the text to an object.



    378 ExportParty(S:Name*)
    This action will export all exportable characters of the party into the "Characters" folder of the game. "Name" specifies the prefix for each exported character, which is expanded by the character's party slot number. This action creates both .CHR and .BIO files.



    387 SetCutSceneBreakable(I:Breakable*BOOLEAN)
    This action controls whether a cutscene can be skipped by pressing ESC. When set to TRUE the cutscene can be interrupted. Set it to FALSE to prevent the cutscene from being interrupted. When properly prepared a skipped cutscene can be detected and completed in a safe manner.

    Code snippet of the BG2EE opening cutscene (NEWGAME.BCS):
    IF
      True()
    THEN
      RESPONSE #100
        CutSceneId("CSJon")
        SetAreaScript("cutskip2",OVERRIDE)
        SetGlobal("BD_CUTSCENE_BREAKABLE","GLOBAL",1)
        SetCutSceneBreakable(TRUE)
        CreateCreatureEffect("M05PCSPY","",[3374.3068],S)
    
        // more script actions...
    
        SetCutSceneBreakable(FALSE)
        SetGlobal("BD_CUTSCENE_BREAKABLE","GLOBAL",0)
        SetAreaScript("",OVERRIDE)
        ActionOverride("Imoen",EndCutSceneMode())
        ActionOverride("Imoen",Dialogue(Player1))
        DestroySelf()
    END
    

    SetAreaScript("cutskip2",OVERRIDE) defines a "failsafe" script to execute when the cutscene has been skipped. The OVERRIDE slot ensures it has precedence over the default area script. SetGlobal("BD_CUTSCENE_BREAKABLE","GLOBAL",1) is used to identify the cutscene that has been interrupted (if the failsafe script handles more than one cutscene).



    388 DisplayStringHeadNoLog(O:Object*,I:StrRef*)
    This action displays the string specified by the StrRef parameter over the head of the given object on the game-screen, but not in the message log.



    389 SetItemFlags(S:ItemName*,I:Flags*INVITEM,I:SetReset*BOOLEAN)
    This action sets or resets specific item flags, such as "IDENTIFIED" or "STOLEN". Setting the third parameter to TRUE sets the bit, setting it to FALSE clears the bit.

    Example from Siege of Dragonspear (BDINTRO.BCS):
    IF
      Global("SOD_fromimport","GLOBAL",0)
      !HasItemEquiped("ring05",Player1)  // Sandthief's Ring
      InMyArea("safana")  // Safana
    THEN
      RESPONSE #100
        CutSceneId(Player1)
        GiveItemCreate("ring05","safana",7,0,0)  // Sandthief's Ring
        ActionOverride("safana",SetItemFlags("ring05",IDENTIFIED,TRUE))  // Sandthief's Ring
        XEquipItem("ring05","safana",SLOT_RING_RIGHT,EQUIP)  // Sandthief's Ring
    END
    



    412 ZoomLock(I:Lock*BOOLEAN)
    This action can be used to set zoom to 100%. When set to TRUE zoom factor is locked at 100% and can not be changed by user input. Setting it to FALSE restores the original zoom factor. The zoom lock state is not saved.
  8. IESDP does not yet provide descriptions for many script actions introduced by the more recent Enhanced Editions patches. This topic is intended to present and discuss descriptions for new or existing script actions, so that they can be added to IESDP eventually.

     

    The following BG(2)EE actions are still lacking a meaningful description:

     

    371 ResetMorale(I:Failure*BOOLEAN,I:Level*)

    No description yet.

     

    372 MoveToCampaign(S:Campaign*)

    See post #5.

     

    373 AddWorldmapAreaFlag(S:Area*,I:Type*WMPFLAG)

    See post #5.

     

    374 RemoveWorldmapAreaFlag(S:Area*,I:Type*WMPFLAG)

    See post #5.

     

    375 SetNoWaitX(I:SetReset*BOOLEAN)

    No description yet.

     

    376 DisplayStringNoNameDlg(O:Object*,I:StrRef*)

    See post #2.

     

    377 SetGlobalTimerRandom(S:Name*,S:Area*,I:Min*GTimes,I:Max*GTimes)

    See post #5.

     

    378 ExportParty(S:Name*)

    See post #2.

     

    379 TakeCreatureItems(O:Object*,I:Type*TAKEITM)

    No description yet.

     

    380 TakeObjectGoldGlobal(S:Name*,S:Area*,O:Object*)

    No description yet.

     

    381 GiveObjectGoldGlobal(S:Name*,S:Area*,O:Object*)

    No description yet.

     

    382 JoinPartyOverride()

    No description yet.

     

    384 AddXPWorth(O:Object*)

    384 AddXPWorthOnce(O:Object*,I:ClearStat*BOOLEAN)

    No description yet.

     

    385 XEquipItem(S:Item*,O:Object*,I:Slot*Slots,I:EquipUnEquip*XEQUIP)

    No description yet.

     

    386 MoveToObjectOffset(O:Target*,P:Offset*)

    No description yet.

     

    387 SetCutSceneBreakable(I:Breakable*BOOLEAN)

    See post #2.

     

    388 DisplayStringHeadNoLog(O:Object*,I:StrRef*)

    See post #2.

     

    389 SetItemFlags(S:ItemName*,I:Flags*INVITEM,I:SetReset*BOOLEAN)

    See post #2.

     

    390 DisableAI(O:Object*,I:Disable*BOOLEAN)

    No description yet.

     

    406 ContinueGame(I:State*Boolean)

    No description yet.

     

    408 DisplayStringPointLog(I:Strref*,P:Location*)

    No description yet.

     

    409 ResetPlayerAI()

    No description yet.

     

    410 RandomWalkTime(I:Time*)

    No description yet.

     

    411 RandomWalkContinuousTime(I:Time*)

    No description yet.

     

    412 ZoomLock(I:Lock*BOOLEAN)

    See post #2.

     

     

    The following PSTEE actions are not listed on IESDP yet:

     

    413 ForceAttack(O:Object*,O:Target*)

    No description yet.

     

    414 GenerateModronMaze()

    See post #3.

     

    415 RandomFace()

    No description yet.

     

    416 GeneratePartyMember(P:Location,I:Value*Specific)

    No description yet.

     

    417 SetNamelessDisguise(I:DisguiseNum*Disguise)

    No description yet.

     

    418 StickySinisterPoof(S:BamResRef*,O:Object*,I:Iterations*)

    No description yet.

     

    419 SetNamelessClass(I:Value*Class)

    No description yet.

     

    420 DisableFogDither()

    No description yet.

     

    421 EnableFogDither()

    No description yet.

     

    422 DisableSpriteDither()

    No description yet.

     

    423 EnableSpriteDither()

    No description yet.

     

    424 Damage(O:Target*,I:Delta*Delta,I:Modifier*Bones)

    No description yet.

     

    425 FloatMessage(O:Object*,I:StrRef*)

    No description yet.

     

    426 FloatMessageFixed(P:Location*,I:StrRef*)

    No description yet.

     

    427 FloatMessageRnd(O:Object*,S:Pool*)

    No description yet.

     

    428 FloatMessageFixedRnd(P:Location*,S:Pool*)

    No description yet.

     

    429 KillFloatMessage(O:Object*)

    No description yet.

     

    430 PermanentStatChange(O:Object*,I:StadID*Stats,I:Delta*Delta,I:Modifier*Bones)

    No description yet.

     

    431 DestroyPartyItem(S:Object*,I:All*Boolean)

    No description yet.

     

    432 TransformPartyItem(S:OldObject*,S:NewObject*,I:Charge1*,I:Charge2*,I:Charge3*)

    No description yet.

     

    433 ForceAIScript(S:ScriptFile*,O:Target*,I:Level*Scrlev)

    No description yet.

     

    434 QuitGame(I:Value*MovVal,I:Value*MovVal,I:Value*MovVal)

    No description yet.

     

    435 ExploreMapChunk(P:Center*,I:Radius*,I:Mode*)

    No description yet.

     

    436 PlaySequenceTimed(I:Anim*Seq,I:Seconds*)

    No description yet.

     

    437 FloatRebus(O:Target*)

    No description yet.

     

    438 ChangeDialog(O:Object*,S:ResRef*)

    No description yet.

     

    439 SetDoorLocked(O:Object*,I:Locked*Boolean)

    No description yet.

     

    440 ChangeColor(I:Range*ClownRge,I:Color*ClownClr)

    No description yet.

     

    441 IncrementProficiency(O:Target*,I:SlotNum*WProf,I:Modifier*)

    No description yet.

     

    442 IncrementExtraProficiency(O:Target*,I:Modifier*)

    No description yet.

     

    443 ForceFacing(O:Object*,I:Dir*)

    No description yet.

     

    444 SinisterPoof(S:BamResRef*,P:Location*,I:Itterations*)

    No description yet.

     

    445 CreateCreatureAtFeet(S:ResRef*)

    No description yet.

     

    446 IncrementGlobalOnce(S:Name1*,S:Area1*,S:Name2*,S:Area2*,I:Val*)

    No description yet.

     

    446 IncrementGlobalOnceEx(S:Var1*,S:Var2*,I:Val*)

    No description yet.

     

    447 TimedMoveToPoint(P:Point*,I:Time*)

    No description yet.

     

    448 SavePlace()

    No description yet.

     

    449 ReturnToSavedPlace()

    No description yet.

     

    450 FullHeal(O:Object*)

    No description yet.

     

    451 FullHealEx(O:Object*)

    No description yet.

     

    452 SetNoOneOnTrigger(O:Trigger*)

    No description yet.

     

    453 SetAnimState(O:Object*,I:Anim*Seq)

    No description yet.

     

    454 PlaySequence(I:Anim*Seq)

    No description yet.

     

    455 DestroyItemObject(S:Object*,O:Target*,I:All*Boolean)

    No description yet.

     

    456 FixEngineRoom()

    No description yet.

     

    457 PlaySoundNotRanged(S:Sound*)

    No description yet.

     

    458 DestroyPartyGold(I:Amount*)

    No description yet.

     

    459 StartCutScenePST(S:CutScene*,I:Value*)

    No description yet.

     

    460 RunToSavedPlace()

    No description yet.

     

    461 SetCorpseEnabled(S:Name*,I:State*)

    No description yet.

     

    462 GiveExperience(O:Object*,I:Amount*)

    No description yet.

     

    463 SetZoomViewport(P:Point*)

    No description yet.

     

    464 StoreZoomLevel()

    No description yet.

     

    465 RestoreZoomLevel()

    No description yet.

     

    466 ForceSpellRESNoFeedback(S:RES*,O:Target)

    No description yet.

     

    467 SetRenderable(O:Target*,I:Renderable*Boolean)

    No description yet.

     

    468 ShowFirstTimeHelp()

    No description yet.

     

    469 WaitSync(I:Amount*)

    No description yet.

     

    470 WaitForVoiceChannel()

    No description yet.

     

    471 PlaySoundThroughVoice(S:Sound*)

    No description yet.

     

     

  9. IESDP does not yet provide descriptions for a number of script triggers. This topic is intended to present and discuss descriptions for new or existing script triggers, so that they can be added to IESDP eventually.

     

    The following BG(2)EE triggers are still lacking a meaningful description:

     

    0x0006 ReceivedOrder(O:Object*,I:Order ID*)

    See post #7.

     

    0x0007 Said(O:Object*,I:Dialog ID*)

    No description yet.

     

    0x406D UnselectableVariable(I:Num*)

    See post #8.

     

    0x406E UnselectableVariableGT(I:Num*)

    See post #8.

     

    0x406F UnselectableVariableLT(I:Num*)

    See post #8.

     

    0x40B5 RealGlobalTimerExact(S:Name*,S:Area*)

    No description yet.

     

    0x40C6 G(S:ResRef*,I:Num*)

    See post #2.

     

    0x40C7 GGT(S:ResRef*,I:Num*)

    See post #2.

     

    0x40C8 GLT(S:ResRef*,I:Num*)

    See post #2.

     

    0x40ED INI(S:Name*,I:Number*)

    No description yet.

     

    0x40F1 ModalStateObject(O:Object*,I:ModalState*Modal)

    See post #4.

     

    0x40F8 CanEquipRanged()

    See post #9.

     

    0x40F9 ImmuneToSpellLevel(O:Object*,I:Level*)

    See post #9.

     

    0x40FB IsForcedRandomEncounterActive(S:Area*)

    See post #9.

     

    0x4103 CheckItemSlot(O:Object*,S:Item*,I:Slot*SLOTS)

    See post #9.

     

    0x4104 CurrentAmmo(S:ResRef*,O:Object*)

    See post #9.

     

     

    The following PSTEE triggers are not listed on IESDP yet:

     

    0x40ee Faction(O:Object*,I:Faction*Faction)

    No description yet.

     

    0x40ef Team(O:Object*,I:Team*Team)

    No description yet.

     

    0x40f0 IsLocked(O:Object*)

    No description yet.

     

    0x40f7 BitCheck(S:Name*,S:Area*,I:Bit*Bits)

    No description yet.

     

    0x40fc PartyScriptsActive()

    No description yet.

     

    0x0101 WasInDialog()

    No description yet.

     

    0x4105 TimerActive(I:ID*)

    No description yet.

     

    0x0106 NamelessBitTheDust()

    No description yet.

     

    0x4107 NearbyDialog(S:DialogFile*)

    No description yet.

     

    0x4109 StuffGlobalRandom(S:Name*,S:Scope*,I:Range*)

    No description yet.

     

    0x0108 FailedToOpen(O:Object*)

    No description yet.

     

    0x410a Proficiency(O:Object*,I:Slot*WProf,I:Value*)

    No description yet.

     

    0x410b ProficiencyGT(O:Object*,I:Slot*WProf,I:Value*)

    No description yet.

     

    0x410c ProficiencyLT(O:Object*,I:Slot*WProf,I:Value*)

    No description yet.

     

    0x010d NullDialog(O:Object*)

    No description yet.

     

    0x410d ExtraProficiency(O:Object*,I:Value*)

    No description yet.

     

    0x410e ExtraProficiencyGT(O:Object*,I:Value*)

    No description yet.

     

    0x410f ExtraProficiencyLT(O:Object*,I:Value*)

    No description yet.

     

    0x4110 LastPersonTalkedTo(O:Object*)

    No description yet.

     

    0x4111 NearSavedLocationPST(I:Range*)

    No description yet.

     

    0x0112 Vacant()

    No description yet.

     

    0x0113 HarmlessOpened(O:Object*)

    No description yet.

     

    0x0114 HarmlessClosed(O:Object*)

    No description yet.

     

    0x0115 HarmlessEntered(O:Object*)

    No description yet.

     

     

  10.  

    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.

  11.  

    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

     

  12. BGEE and BG2EE don't provide any options to adjust brightness or contrast on their own (yet). You can install the Lighting Pack to remedy this issue though.

     

    Alternatively, the games allow you to choose between two different graphics backends. The default is OpenGL, but you can also select DirectX on Windows, which might work better on some machines.

  13. 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.

  14. 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.

  15. I have noticed a (cosmetic) issue regarding invisible creatures. They are used a lot in SoD to simulate all kinds of activity. In SoD their name uses strref 0 which should essentially be an empty string. However, EET uses strref -1 instead which causes the invisible creatures to display random party member names when using TAB.

    Example: BD5200.ARE contains many instances of BDTARGET.CRE (see archer training near southern entrance).

  16. 0x401 appears to be unused. WBM does use 0x3ff.

    0x44c is supposed to be the resource type for BAH. I've never seen a BAH file nor do I know anything about its file format or what it could be used for. The only mention of it (that I remember) comes from the game executable itself. Maybe it's a remnant from an earlier Infinity Engine development stage.

    You can find a more complete list of known resource types in the Near Infinity sources.

×
×
  • Create New...