Jump to content

argent77

Modders
  • Posts

    1,583
  • Joined

Posts posted by argent77

  1. 27 minutes ago, suy said:

    If you can use a native file system with case insensitive functionality, that's even better. It is covered in this forum post (but you'll have to find in which page it is done, as I don't remember where it was; the first pages shows the NTFS approach)

    The ext4 casefold method is described here:

     

  2. Spellhold Studios

    Test Your Mettle!

    Test Your Mettle! is a mod for BG2:EE and EET that provides you with a unique dungeon crawling experience.

    Version 1.5 provides Simplified Chinese translation as well as various improvements and bugfixes.

    Full changelog:

    • Added Simplified Chinese translation (thanks yoshimo0417)
    • Improved event of unsealing the boss chamber
    • Improved several visual effects
    • Improved general mod compatibility
    • Fixed missing spell effect of a Drone penalty on heavy damage
    • Minor creature fixes

    Links:

  3. 17 minutes ago, subtledoctor said:

    The only fly in that ointment is that, just like last time I played EET, I started out in Irenicus' Dungeon with a huge amount of fatigue.

    That has been fixed last year in one of the commits among many other issues. In general, EET has been greatly improved since the latest official release. By now I would always suggest to download and play the latest master branch version instead of the (outdated) release version.

  4. I have recently coded an improved version of the "FIND_FREE_ANIMATION_SLOT" function for my own mods which returns a free animation slot for a specified animation type as well as other useful values for installing new animations (such as ini filename and ANIMATE.IDS entry). The function code is attached below.

    This version takes animation types into account that are only available for very specific subranges (like monster/monster_old or monster_quadrant/monster_multi/multi_new), based on IESDP information, and provides several more parameters for customizing slot detection.

    Example code for a typical creature animation installation of type "monster":

    INCLUDE "%MOD_FOLDER%/lib/a7#anim_slots.tph"
    
    LAF FIND_FREE_ANIMATION_SLOT
      INT_VAR
        // slot_index = 0x7300     // optional: alternate method for requesting a type-specific animation slot
                                   //           in place of the "type" parameter below.
        // min_index  = 0x7350     // optional: further restrict available slot range (lower limit)
        // max_index  = 0x7390     // optional: further restrict available slot range (upper limit)
        // silent     = 1          // optional: suppress (warning) messages
      STR_VAR
        type       = "monster"  // supported animation types are listed in the a7#anim_slots.tph script file
        symbol     = "PET_CORNUGON_IN_PINK"
      RET
        slot            // the free animation slot number
        ini_file        // filename of the associated INI file
        animate_entry   // configured ANIMATE.IDS entry
    END
    // Returned values:
    // slot:          0x7002
    // ini_file:      7002.ini
    // animate_entry: 0x7002 PET_CORNUGON_IN_PINK
    
    COPY "%MOD_FOLDER%/pet_cornugon/7xxx.ini" "override/%ini_file%"
    APPEND "ANIMATE.IDS" "%animate_entry%"
    
    COPY "%MOD_FOLDER%/pet_cornugon/petcornu.cre" "override"
      WRITE_LONG 0x28 slot  // updating animation slot

     

    a7#anim_slots-v1.1.zip

  5. [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?

  6. I have updated the auto-build scripts for NI which should produce working macOS binaries in future releases (unless Apple deprecates even more APIs in future macOS versions.)

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

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

  9. 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)
  10. 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

     

  11. [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.

  12. [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.

     

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

     

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

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

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

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

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

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

×
×
  • Create New...