Jump to content

argent77

Modders
  • Posts

    1,578
  • Joined

Posts posted by argent77

  1. [IWD] Brother Harken and Sister Incylia are initially positioned after a delay and reset their positions after a certain amount of time in the Fallen Temple area

    Brother Harken and Sister Incylia are positioned by script, based on the entrance the party uses to enter the area, to ensure that Brother Harken is always closest to the initial party location. This method introduces a delay of up to several seconds before the positioning is performed. Moreover, it causes their positions to reset after a certain amount of time (24 hours?).

    If you entered from Marketh's Palace - Myconid area then both characters will stand next to each other or (in rare cases) on top of each other. If you entered from the Lower Dorn's Deep Forge area then Sister Incylia's will return to her original position near the blocked staircase.

    I can think of two options how to fix these issues:

    1. Adding a MoveToPoint() action after the JumpToPoint() action in the script seems to prevent their positions from resetting but does not fix the delay before their initial positioning.
    2. Defining their positions in the INI file of the area solves both issues at the same time but may potentially conflict with mods that attempt to modify their positioning behavior (if there are any).

    Any suggestions?

  2. Thank you!

    I have created several more (zipped) PKG files with JDK packages from different distributors. Could you test whether any of them actually works?

    installer-macos-arm64-corretto.zip
    installer-macos-arm64-oracle.zip
    installer-macos-arm64-temurin.zip

  3. 12 minutes ago, critto said:

    Hey argent77. So, the new release seems to be crashing on arm64:

    Application Specific Information:
    References to Carbon menus are disallowed with AppKit menu system (see rdar://101002625). Use instances of NSMenu and NSMenuItem directly instead.

    I can send you a whole stack-trace if you wish, but it looks like generic Apple crash report stuff. I did my own build locally, using the latest jar, and it runs fine.

    Interesting. I couldn't find out much about this error except for this thread. It isn't very clear but it seems to be caused by a deprecation of an API in macOS 14 that is used by some Java Runtime packages.

    Could you test whether this version runs on your system: NearInfinity-macos-arm64-2.4.20240424.pkg

  4. Near Infinity v2.4-20240424

    Near Infinity is a resource browser and editor for Infinity Engine games, such as Baldur's Gate or Icewind Dale. It is written in Java and available for Windows, macOS and Linux.

    This release introduces a greatly improved TIS converter, new syntax highlighting options for MENU resources and action/triggers in the dialog tree viewer, as well as many more improvements and bugfixes.

    Near Infinity is available as a platform-independent Java JAR file, Windows installer and macOS PKG installer, as well as a Flatpak application from Flathub for Linux.

    More information as well as a detailed Changelog can be found in the respective topics at Spellhold Studios, Beamdog Forums, and GitHub Discussions.

    Download:

    • GitHub (Java JAR file, Windows and macOS installers)
    • Flathub (Linux Flatpak archive)
  5. On 5/14/2023 at 2:50 AM, Sam. said:

    PVRZ files are Z-Lib compressed versions of the PowerVR container file format (PVR).  This file format supports a large number of texture compression algorithms, but the EEs use the Block Compression (BC) aka DXT family of LOSSY texture compression algorithms.  A side effect of the nature of these compression algorithms is that the color of a pixel will “bleed” into the pixels that surround it.
    ...
    It is EXTREMELY important to note that once a tileset has been packed improperly and stray colors have bled into your overlay tiles, the damage has already been done.  You can’t simply rearrange them after the fact and expect the graphical artifacts to go away!!!

    The color bleeding effect of DXT encoding is actually less of a problem than the way how the EE engine assembles the tiles to generate the map background in the game. Moreover, the bleeding effect occurs only if adjacent pixels lie inside a single DXT-encoded block of 4x4 pixels.

    Reconverting a "problematic" tileset with NI can fix these issues in most cases. (There will still be edge cases where the lossy nature of DXT compression can produce visible artifacts, but they are rare.)

    Example conversion of the High Hedge interior crystal animation with the very noticeable horizontal line:

    Spoiler

    BGEE-TIS-example.thumb.jpg.3b8af968b4791d68dfefcaa564367ac4.jpg

     

  6. [PST] Trias is vulnerable to several spell effects that make it impossible to finish the game

    Abilities like Morte's Litany of Curses or spells like Abyssal Fury that can apply death effects can prevent Trias from triggering the conversation that allows you to return back to Sigil and finish the game.

  7. [BG1] The animated crystal in the High Hedge interior map has a darker shade and visual artifacts

    The darker shade is an oBG1 issue that is also present in BGEE. The visual artifacts are caused by the way how animated or secondary tiles are rendered in the game.

    Spoiler

    Baldr028a.thumb.jpg.302163bb8fea7f04c372aabcbf55387e.jpg

    The shade effect is even more noticeable in the game where the crystal is animated.

     

  8. Btw, next release of Near Infinity provides a greatly improved TIS conversion feature that takes care of visual artifacts on PVRZ-based tilesets, handles overlay conversions between oBG2 and EE engine, and more. (Select "Export... > as PVRZ/palette-based TIS" from an opened TIS resource to test this feature.)

    A preview version can already be tested from the Nightly Releases: https://github.com/Argent77/NearInfinity/releases/tag/nightly

    Spoiler

    tis_convert_settings.thumb.jpg.b64e9546ddae6cbbf8f81ff32b8f09db.jpg

     

  9. 4 minutes ago, paladin84 said:

    Is there a way to accelerate accepting this PR?

    Good question. Maybe @CamDawg can answer that question?

    With every new PR it becomes more difficult to merge them with the repo since several PRs conflict with each other.

  10. 1 hour ago, szef said:

    Ok, test area, fragment with water. The texture is from BG2 (WTLAKE.TIS), different from the screenshot, but the problem is the same.

    First I created everything in dltcep, then 'tis2ovl bb#000.wed', then in NI 'export TIS as PVRZ based'. And that's all.

    (I have not yet experimented with a different background under the water texture....)

    I agree with Acifer that the water overlays work as expected in your test sample. Since the background of the water tiles are mostly solid black you'll see a very strong overlay effect from the water tileset. Adding some background to the water tiles will probably reduce the effect somewhat. In that case you could also tweak the "Overlay transparency" field in the ARE file (formerly known as 'Wind Speed') to adjust overlay transparency.

    Alternatively, do it the SoD way and use WBM video overlays instead:

    Spoiler

    Baldr057.thumb.jpg.d49f71c73c60be630adc467b9ef25848.jpg

  11. 32 minutes ago, Bubb said:

    From what I've seen actions / triggers generally only accept one version of the encoding, and if they encounter the other version the "no matching global" behavior will be used, which itself seems to be undefined for some of these.

    I think you're right. My test script had some flaws which lead to misleading results. The outcome of these actions is indeed random when an unsupported parameter encoding is used. But in that case WeiDU compiles both script actions incorrectly for oIWD and (possibly) oPST.

  12. 18 hours ago, Bubb said:

    @argent77 Looks like GivePartyGoldGlobal() also doesn't concatenate its strings.

    I stepped through what the in-engine encoder does, and aside from GivePartyGoldGlobal(), it aligns with Near Infinity's hardcoded list:

      Reveal hidden contents
    //////////////
    // Triggers //
    //////////////
    
    Decode type - 0xD: param2 + param1 => string1
    
        Match Requirements:
            has param1
            param1 type annotation != 'P'
            param1 type annotation != 'O'
            param1 type annotation != 'I' (parsed as string)
            param2 type annotation == 'S'
            param3 type annotation == 'I'
            no param4
    
        TRIGGER.IDS Matches:
    		0x400F Global(S:Name*,S:Area*,I:Value*)
    		0x4034 GlobalGT(S:Name*,S:Area*,I:Value*)
    		0x4035 GlobalLT(S:Name*,S:Area*,I:Value*)
    		0x40F7 BitCheck(S:Name*,S:Area*,I:Bit*Bits) // BUG - The trigger expects both string1 and string2 to be used
    
    
    
    Decode type - 0x21: param2 + param1 => string1
    
        Match Requirements:
            has param1
            param1 type annotation != 'P'
            param1 type annotation != 'O'
            param1 type annotation != 'I' (parsed as string)
            param2 type annotation == 'S'
            param3 type annotation == 'I'
            param4 type annotation == 'I'
            no param5
            param1 == "name*" (case insensitive)
            param2 == "area*" (case insensitive)
    
        TRIGGER.IDS Matches:
        	None
    
    
    
    /////////////
    // Actions //
    /////////////
    
    Decode type - 0xD: param2 + param1 => string1
    
        Match Requirements:
            has param1
            param1 type annotation != 'P'
            param1 type annotation != 'O'
            param1 type annotation != 'I' (parsed as string)
            param2 type annotation == 'S'
            param3 type annotation == 'I'
            no param4
    
        ACTION.IDS Matches:
            30 SetGlobal(S:Name*,S:Area*,I:Value*)
            109 IncrementGlobal(S:Name*,S:Area*,I:Value*)
            115 SetGlobalTimer(S:Name*,S:Area*,I:Time*GTimes)
            268 RealSetGlobalTimer(S:Name*,S:Area*,I:Time*GTimes)
    
    
    
    Decode type - 0x1D: <first 6 characters of param2, padded with spaces if less than 6> + param1 => string1
    
        Match Requirements:
            has param1
            param1 type annotation != 'P'
            param1 type annotation != 'O'
            param1 type annotation != 'I' (parsed as string)
            param2 type annotation == 'S'
            param3 type annotation == 'S'
            param4 type annotation == 'O'
    
        ACTION.IDS Matches:
            None
    
    
    
    Decode type - 0x1E: <first 6 characters of param2, padded with spaces if less than 6> + param1 => string1
    
        Match Requirements:
            has param1
            param1 type annotation != 'P'
            param1 type annotation != 'O'
            param1 type annotation != 'I' (parsed as string)
            param2 type annotation == 'S'
            param3 type annotation == 'S'
            no param4
    
        ACTION.IDS Matches:
            246 CreateCreatureAtLocation(S:GLOBAL*,S:Area*,S:ResRef*)
            256 CreateItemGlobal(S:Global*,S:Area*,S:ResRef*)
            335 SetTokenGlobal(S:GLOBAL*,S:Area*,S:Token*)
    
    
    
    Decode type - 0x21: param2 + param1 => string1
    
        Match Requirements:
            has param1
            param1 type annotation != 'P'
            param1 type annotation != 'O'
            param1 type annotation != 'I' (parsed as string)
            param2 type annotation == 'S'
            param3 type annotation == 'I'
            param4 type annotation == 'I'
            no param5
            param1 == "name*" (case insensitive)
            param2 == "area*" (case insensitive)
    
        ACTION.IDS Matches:
            364 SetGlobalRandom(S:Name*,S:Area*,I:Count*,I:Size*)
            377 SetGlobalTimerRandom(S:Name*,S:Area*,I:Min*GTimes,I:Max*GTimes)
    
    
    
    Decode type - 0x25: param2 + param1 => string1
    
        Match Requirements:
            has param1
            param1 type annotation != 'P'
            param1 type annotation != 'O'
            param1 type annotation != 'I' (parsed as string)
            param2 type annotation == 'S'
            param3 type annotation == 'I'
            param4 type annotation == 'I'
            param5 type annotation == 'I'
            param1 == "name*" (case insensitive)
            param2 == "area*" (case insensitive)
    
        ACTION.IDS Matches:
            364 SetGlobalRandomPlus(S:Name*,S:Area*,I:Count*,I:Size*,I:Plus*)
    
    
    
    Decode type - 0x26: param2 + param1 => string1
    
        Match Requirements:
            action id == 297
            has param1
            param1 type annotation != 'P'
            param1 type annotation != 'O'
            param1 type annotation != 'I' (parsed as string)
            param2 type annotation == 'S'
            no param3
    
        ACTION.IDS Matches:
            297 MoveToSavedLocation(S:GLOBAL*,S:Area*)
    
    
    
    Decode type - 0x29: param2 + param1 => string1, param4 + param3 => string2
    
        Match Requirements:
            has param1
            param1 type annotation != 'P'
            param1 type annotation != 'O'
            param1 type annotation != 'I' (parsed as string)
            param2 type annotation == 'S'
            param3 type annotation == 'S'
            param4 type annotation != 'O' (parsed as int)
    
        ACTION.IDS Matches:
            446 IncrementGlobalOnce(S:Name1*,S:Area1*,S:Name2*,S:Area2*,I:Val*)

     

    Interestingly, BitCheck() is incorrectly matched by the engine for string merging – which causes it to always return false in dialog conditions.

    Thank you. It looks like the game engine can actually handle both parameter encoding variants correctly. However, NI has to use the same encoding as WeiDU is using to prevent the bug mentioned in my previous comment. (And WeiDU made some arbitrary choices regarding parameter encoding for some engine variants.) See comments below.

  13. OP asked specifically about AddexperiencePartyGlobal() which isn't actually used in any of the games.

    @squiros It looks like you stumbled upon a bug in NearInfinity's script (de)compiler which encodes and decodes the parameters for this script action incorrectly in some of the game engine variants. It'll be fixed in the next release. In the meantime only use WeiDU to compile or decompile your script that contains this action.

    Edit: The issue in NI has been fixed and can already be tested in the nightly release: https://github.com/Argent77/NearInfinity/releases/tag/nightly

  14. Wares of the Planes is a mod that introduces a large number of weapons and accessories from Planescape: Torment to the Baldur's Gate series. The items can be purchased from a unique travelling merchant who is available throughout the whole game series. The mod is available for BG:EE, SoD, BG2:EE and EET.

    Version 1.1 improves the merchant portrait, adds a new subcomponent to restore the original PsT portrait and introduces several more unique items.

    You can grab the mod from the download link below.

    Download: GitHub

    Discussion: G3, Beamdog

    Readme

  15. This is how it's done in the Spellhold Irenicus encounter:

    Spoiler
    IF
      See(NearestEnemyOf(Myself))
      Global("AsylumPlot","GLOBAL",54)
      Global("Sim","LOCALS",0)
    THEN
      RESPONSE #100
        CloseDoor("Door11")
        Lock("Door11")
        ForceSpell(Myself,DO_NOTHING)  // SPIN905.SPL (No such index)
        DisplayString(Myself,48812)  // Spawn Clones
        CreateVisualEffectObject("SPPROIMG",Player1)
        CreateVisualEffectObject("SPPROIMG",Player2)
        CreateVisualEffectObject("SPPROIMG",Player3)
        CreateVisualEffectObject("SPPROIMG",Player4)
        CreateVisualEffectObject("SPPROIMG",Player5)
        CreateVisualEffectObject("SPPROIMG",Player6)
        Wait(2)
        CreateCreatureObjectCopy("jclone01",Player1,0,0,0)  // Calahan
        CreateCreatureObjectCopy("jclone01",Player2,0,0,0)  // Calahan
        CreateCreatureObjectCopy("jclone01",Player3,0,0,0)  // Calahan
        CreateCreatureObjectCopy("jclone01",Player4,0,0,0)  // Calahan
        CreateCreatureObjectCopy("jclone01",Player5,0,0,0)  // Calahan
        CreateCreatureObjectCopy("jclone01",Player6,0,0,0)  // Calahan
        MoveToPoint([937.976])
        SetGlobal("Sim","LOCALS",1)
    END

     

    There are actually two different clone actions:

    CreateCreatureObjectCopy(S:ResRef*,O:Object*,I:Usage1*,I:Usage2*,I:Usage3*)
    CreateCreatureCopyPoint(S:ResRef*,O:Object*,P:Dest*)

    The second variant is probably more useful since you can simply choose a coordinate outside of the current viewport to hide the cloning process.

  16. 2 hours ago, suy said:

    Why would it be a lot of extra work? The external script can easily just add to the TLK file(s). Is is because of the backup?

    WeiDU caches strings (and other stuff) internally for performance reasons. Reading or modifying the dialog.tlk externally while a mod installation is in progress may not work as intended.

×
×
  • Create New...