Jump to content

argent77

Modders
  • Posts

    1,675
  • Joined

Posts posted by argent77

  1. [All] Fix incorrect creature animation definitions

    Several creature animation (INI) files contain incorrect definitions which causes the game engine to use hardcoded defaults.

    BGEE, BG2EE, IWDEE:

    • 1200.INI - DRAGON_RED (found: multi_new, expected: monster_multi)
    • 1201.INI - DRAGON_BLACK (found: multi_new, expected: monster_multi)
    • 1202.INI - DRAGON_SILVER (found: multi_new, expected: monster_multi)
    • 1203.INI - DRAGON_GREEN (found: multi_new, expected: monster_multi)
    • 1204.INI - DRAGON_AQUA (found: multi_new, expected: monster_multi)
    • 1205.INI - DRAGON_BLUE (found: multi_new, expected: monster_multi)
    • 1206.INI - DRAGON_BROWN (found: multi_new, expected: monster_multi)
    • 1207.INI - DRAGON_MULTICOLOR (found: multi_new, expected: monster_multi)
    • 1208.INI - DRAGON_PURPLE (found: multi_new, expected: monster_multi)
    • 2000.INI - SIRINE (found: monster_layered, expected: monster_layered_spell)
    • 2100.INI - VOLO (found: monster_layered, expected: monster_layered_spell)
    • 2200.INI - OGRE_MAGE (found: monster_layered, expected: monster_layered_spell)
    • 2300.INI - DEATH_KNIGHT (found: monster_layered, expected: monster_layered_spell)

    Due to an engine bug the dragon animation definitions cannot be fixed without also providing fixed sets of associated BAM files.

    PSTEE:

    • F00C.INI: Remove bogus ini section "[12]"
    • F04A.INI: Remove bogus ini section "[74]"

    These are probably leftovers from oPST's RESDATA.INI.

  2. I don't know if this is intended or a loophole. M'Khiin's weapons, armor and shields are coded (via ITEM_USE.2DA) so that they cannot be removed without being replaced by another item of the same type. It was probably made that way to ensure that the creature animation reflects the equipped items.

    However, it looks like you can equip her with regular items (e.g. axe, buckler or leather armor) which then can be removed normally without having to place something else into the slot. It also works with items that cannot be represented by her creature animation (e.g. daggers or clubs). This behavior makes the whole ITEM_USE.2DA restriction pointless.

  3. [SoD] MKHIIN_BOW animation lacks the "Get Up" animation sequence (MGO7GU.BAM)

    Only the eastern variant (MGO7GUE.BAM) exists in the game.

    The reversed "DE" animation sequence could be used as a substitute. It seems to differ slightly from the original "Get Up" animation, but the difference should be minimal.

  4. @1 = ~~~~~~~~~~~~ // (12x)
    seems to work because WeiDU interprets it as two consecutive string literals (male and female string) without having any whitespace in between.

    It is functionally identical to
    @1 = ~~~~~~~~~~""
    or
    @1 = ""~~~~~~~~~~
    or even
    @1 = ~~~~~~~~~~[]~~[]  // two strings with empty sound references

  5. 1 hour ago, mickabouille said:

    Wait does that mean you can do that too?

    @2 = @1 ^ @109 ^ #234

    @1 = @2 ^ @109

    No, you can only concatenate strings. E.g.

    @1 = "This is" ^ ~ a string.~
    @2 = %This is% ^ ~~~~~ another string.~~~~~

  6. 1 hour ago, mickabouille said:

    - strings enclosed in tildas (with no tildas inside) or double quotes (with no double quotes inside)

    That's not all. Strings can also be enclosed in percent signs (%) or five consecutive tildes (~~~~~). And string concatenation is most likely also supported (string1 ^ string2).

    The translation string syntax is mostly covered in the WeiDU D format description (see the Text and String subsections).

  7. 1 minute ago, mickabouille said:

    17 will have support until 2027, 21 will cross 2030. Compare that to jdk20, released in march 2023 that already EOL'ed in spetember of jdk22, release in march this year, that will EOL this september.

    Maybe it's also worth considering that Java 17 is the last LTS version that provides 32-bit packages for Windows. 32-bit support has been marked as deprecated for removal in Java 21.

  8. Congratulations on the release! 👍

    The current version is already fast and responsive (thanks to the snappier JavaFX framework). The area renderer works great. In the EE games even the water overlays were rendered correctly. Overlays in oBG1 are only shown as green regions though. I couldn't test with oBG2 (see issues below).

    Issues I have noticed:
    The baldur.ini reader for original BG2 had trouble parsing the biff location paths in the [Alias] section. At least with my disc version of oBG2 the installer adds a duplicate path string to the CD2 definition in baldur.ini where the second path is added as comment (after a semicolon). This is the "Alias" section in my baldur.ini:

    [Alias]
    HD0:=D:\Games\Baldurs Gate II\
    CD1:=D:\Games\Baldurs Gate II\CD1\
    CD2:=D:\Games\Baldurs Gate II\CD2\;D:\Games\Baldurs Gate II\CD2\
    CD3:=D:\Games\Baldurs Gate II\CD3\
    CD4:=D:\Games\Baldurs Gate II\CD4\
    CD5:=D:\Games\Baldurs Gate II\CD5\

    The parser failed to load with this error:

    Spoiler
    java.nio.file.InvalidPathException: Illegal char <:> at index 31: D:\Games\Baldurs Gate II\CD2\;D:\Games\Baldurs Gate II\CD2\
        java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:204)
        java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:175)
        java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
        java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92)
        java.base/sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:231)
        java.base/java.nio.file.Path.of(Path.java:148)
        java.base/java.nio.file.Paths.get(Paths.java:69)
        com.github.bubb13.infinityareas.game.Game.parseINIPath(Game.java:570)
        com.github.bubb13.infinityareas.game.Game.parseClassicINI(Game.java:557)
        com.github.bubb13.infinityareas.game.Game.loadInternal(Game.java:370)
        com.github.bubb13.infinityareas.misc.TaskTracker.subtask(TaskTracker.java:47)
        com.github.bubb13.infinityareas.misc.StackTaskTracker.subtask(StackTaskTracker.java:40)
        com.github.bubb13.infinityareas.misc.TrackedTask.subtask(TrackedTask.java:106)
        com.github.bubb13.infinityareas.game.Game$1.doTask(Game.java:84)
        com.github.bubb13.infinityareas.game.Game$1.doTask(Game.java:80)
        com.github.bubb13.infinityareas.misc.TrackedTask.run(TrackedTask.java:158)
        java.base/java.lang.Thread.run(Thread.java:1583)

    After removing the duplicate path the tool failed with this message:

    Spoiler
    java.lang.NullPointerException: Cannot invoke "java.nio.file.Path.resolve(String)" because "rootPath" is null
        com.github.bubb13.infinityareas.util.FileUtil.resolvePathSafe(FileUtil.java:35)
        com.github.bubb13.infinityareas.game.Game.readBifs(Game.java:641)
        com.github.bubb13.infinityareas.game.Game.loadInternal(Game.java:371)
        com.github.bubb13.infinityareas.misc.TaskTracker.subtask(TaskTracker.java:47)
        com.github.bubb13.infinityareas.misc.StackTaskTracker.subtask(StackTaskTracker.java:40)
        com.github.bubb13.infinityareas.misc.TrackedTask.subtask(TrackedTask.java:106)
        com.github.bubb13.infinityareas.game.Game$1.doTask(Game.java:84)
        com.github.bubb13.infinityareas.game.Game$1.doTask(Game.java:80)
        com.github.bubb13.infinityareas.misc.TrackedTask.run(TrackedTask.java:158)
        java.base/java.lang.Thread.run(Thread.java:1583)

    I could work around this error by pointing the CD1-CD5 entries to a non-existing CD drive (e.g. CD1:=N:\CD1\), but then the tool couldn't find some of the biff files anymore.

    Some suggestions:

    • Add a button for toggling the opened/closed state of doors and tiled objects.
    • Clicking on unoccupied space should unselect an object.
    • There should be a way to select regions that are overlapped by other regions (thats a common occurrence with doors but also with many wall polygons).
    • Handles for vertices could be slightly bigger.
    • I can't seem to find a way to turn off "Draw Region Polygon" mode when it had been activated.
    • How is the "Bisect Segment" supposed to work? All it does is triggering a "Ping" sound on my system.
    • An "Undo" feature is badly needed. ;)
    • The game selection dialog should use the last selected game directory as the initial directory in the "Open File Dialog".
    • For the TIS viewer you could find a matching WED file to retrieve the correct tileset dimensions.

     

    2 hours ago, suy said:

    It printed some JavaFX warning, so in my immense ignorance of the Java ecosystem, I assume it's not likely to be integrated in NearInfinity, right? I think NI uses some other GUI tech.

    NI uses the Swing UI framework which is rather old and clunky. JavaFX is a newer UI framework that is still actively developed. This and the fundamental design differences between the tools prevent it from being integrated in NI.

  9. 2 hours ago, jmerry said:

    The last row of itemcat.ids (BGEE version), with the highest number, is "37 BROKEN2". The list of item types in NI includes entries such as "Books (37)" and "Hats (72)". These are clearly not the same list. There are item types that the game supports which do not have entries in the IDS at all.

    Yes, I do know what I'm talking about here. The list of names that includes such things as "Eyeballs (74)" is somewhere in Near Infinity itself, not in the game files.

    NI currently uses a hardcoded list for displaying item categories. I'll see if I can somehow incorporate custom ITEMTYPE.2DA definitions into the list for EE games.

  10. 42 minutes ago, Morgoth said:

    From Artisan's discord: the game replaces King Ixilthetocal with a weaker version of himself if you decide to help the rebels, which I knew, what I didn't know until I decided to Analyze for the heck of it was that for some reason this version of the king is not just weaker but is in fact internally only level 2, making him completely vulnerable to Death Spell or even just Sleep.

    Not only the king is a level 2 creature. Everyone, including the baron, seems to be level 2.

    The only exception is Captain Alyittyl who is spawned by a cutscene. This is odd since there are three instances of his creature file (SAHCAPT0.CRE, SAHCAPT1.CRE and SAHCPT01.CRE). The first two instances are also level 2 creatures and appear to be unused. The third instance, which is actually used in the game, is level 18, however.

    I'd rather suggest to spawn one of the level 2 creature instances of the captain to make the whole encounter more consistent (or increase the levels of everyone who is involved).

  11. 22 minutes ago, lynx said:

    Are you doing this for speed? It's much more complicated compared to just reserving some space and creating a file to hold desirable filesystem that you can then loop mount.

    Speed is one reason, but the fact that a ram disk is discarded after a system reboot or a manual reset can be an advantage if you want to go wild with modding the games.

    I've been using a similar option on Windows for years and with my switch to Linux I wanted something like that for Linux, too. The scripts above are a bit verbose because I avoided the use of systemd-related tools to create a ram disk. It could be more compact otherwise.

  12. How to use a Ram Disk to modify and play the games

    Using ext4 casefolding as described in the post linked above may not be feasible for everyone since it requires a specially formatted non-system partition to work. Other methods, like using ciopfs, work in user space and are therefore slow and cumbersome.

    The approach described in this post offers an alternative option to modify and play EE games without having to tinker with your disks at all, using a ram disk instead, provided you have enough RAM to spare. I would recommend this option for systems with 16 GB or more available RAM.

     

    Overview

    Ram disks are by definition a type of non-persistent storage, which means that any data will be lost after a reboot. For that reason it is necessary to restore the data on the ram disk after each start or reboot of the system. Moreover, to preserve any changes made to data on the ram disk they must be backed up on persistent storage.

    The general steps for using a ram disk can be outlined like this:

    1. Set up the ram disk (requires root privileges)
    2. Copy the game(s) from persistent storage to the ram disk
    3. (Only if needed) Back up changes made to the game(s) on persistent storage
    4. (Optional) Set up an autorun script to automate initialization of the ram disk whenever the system starts up

     

    Setting up the ram disk

    The Linux kernel provides a feature, known as zram, that allows us to set up RAM-based block devices. We can use it to create our ram disk. Zram-based block devices only allocate as much space as needed, and they are compressed by default, which helps to minimize the required amount of RAM.

    There are several ways to initialize a ram disk. Some of the options require systemd which is not available on every Linux system. The scripts listed in this post use a more direct approach that doesn't require any special libraries or tools.

    As the scripts for setting up and removing ram disks require root privileges, they will be placed in "/usr/local/sbin". The path should already exist on the system. However, in the case it's missing you can create it with this command in the terminal:

    sudo install -v -d /usr/local/sbin

     

    The script for setting up a ram disk performs several task:

    • Finding a free zram device
    • Allocating the desired max. amount of memory
    • Formatting the zram device with a filesystem that support case-insensitive filenames. I've chosen ext4 with casefolding, but any filesystem can be used that matches the criteria.
    • Setting up a basic folder structure for the games

    Create a new script file "/usr/local/sbin/init_ramdisk.sh" as root with the following content and make it executable:

    Spoiler
    #!/bin/bash -e
    
    if test $EUID -ne 0; then
      echo "Script must be executed with root privileges."
      exit 1
    fi
    
    # RAM disk mount point
    PATH_BASE=/mnt/ramdisk
    
    # Path of the casefolded directory on the RAM disk where you want to install the game(s)
    PATH_GAMES=$PATH_BASE/games
    
    # Owner and group names associated with your profile
    OWNER_NAME=$(sed -nr '/:1000:/ s,^([^:]*).*$,\1,p' /etc/passwd)
    GROUP_NAME=$(id -gn $OWNER_NAME)
    
    # Default RAM size if no argument is specified: 6 GB
    RAM_SIZE=6G
    
    # Checking command line arguments
    if [ $# -gt 0 ]; then
      if [[ $1 == +([0-9])?([GKM]) ]]; then
        RAM_SIZE=$1
      else
        echo "Invalid RAM disk size: $1"
        echo "Specify a numeric value, followed by an optional suffix for the unit size (K, M, or G)."
        exit
      fi
    fi
    
    echo "Initializing ram disk (size: $RAM_SIZE)..."
    modprobe zram num_devices=1
    
    # Getting next available zram device
    shopt -s extglob
    zram_dev=$(ls -v /dev/zram+([0-9]) | tail -n1)
    zram_id=$(echo $zram_dev | sed 's@/dev/zram@@')
    if [ $(cat /sys/block/zram${zram_id}/disksize) -ne 0 ]; then
      # Requesting a new zram device
      zram_id=$(cat /sys/class/zram-control/hot_add)
      zram_dev="/dev/zram${zram_id}"
    fi
    test -b $zram_dev || (echo "No zram devices available."; exit 1)
    
    # Allocating ram disk size
    echo $RAM_SIZE > /sys/block/zram$zram_id/disksize
    echo $RAM_SIZE > /sys/block/zram$zram_id/mem_limit
    
    # Formatting device: ext4 with casefold attribute turned on
    mkfs.ext4 -q -O casefold $zram_dev || (echo "Could not format zram device."; exit 1)
    
    mkdir -p "$PATH_BASE" || (echo "Could not create mount point: $PATH_BASE"; exit 1)
    mount $zram_dev "$PATH_BASE" || (echo "Could not mount: $PATH_BASE"; exit 1)
    
    # Creating "games" folder with full user access
    install -o $OWNER_NAME -g $GROUP_NAME -d "$PATH_GAMES" || (echo "Could not create \"games\" folder."; exit 1)
    
    # Enabling casefolding only for the "games" folder
    chattr +F "$PATH_GAMES" || (echo "Could not enable casefolding: $PATH_GAMES"; exit 1)
    
    echo "Done."

     

    The comments in the script outline the individual operations. There are a few lines you might want or have to adjust, however:
    Line 15: Adjust the OWNER_NAME assignment if your user name doesn't resolve to id=1000.
    Line 19: (optional) Adjust the default ram disk size. It's currently set to 6 GB which is enough to store one or two EE games. But if you intend to mod the game or plan to install more than one game on the ram disk then the value should be increased accordingly. Alternatively you can call this script with the desired ram disk size.

    As a rule of thumb, ram disk size shouldn't be higher than your total amount of RAM minus 8 GB. For instance:
    - with 16 GB RAM the ram disk size should be 8 GB or less which is enough to store a modded BGEE or BG2EE game.
    - with 32 GB RAM (or more) the ram disk size could be up to 24 GB which is usually enough to store all EE games at once.

    When this script completed successfully a new device is mounted (by default on /mnt/ramdisk) and can be treated like every other mounted disk device of the system.

     

    A ram disk can also be removed if needed. This operation also requires root privileges, so it should be created in the same folder as the ram disk creation script. Create a new script file "/usr/local/sbin/remove_ramdisk.sh" as root with the following content and make it executable:

    Spoiler
    #!/bin/bash -e
    
    if test $EUID -ne 0; then
      echo "Script must be executed with root privileges."
      exit 1
    fi
    
    # RAM disk mount point
    PATH_BASE=/mnt/ramdisk
    
    echo "Removing ram disk..."
    zram_dev=$(cat /proc/mounts | grep "$PATH_BASE" | sed 's/^\(\/dev\/zram[[:digit:]]\+\).*/\1/')  # 'e.g. /dev/zram1
    test -z $zram_dev && (echo "Device not mounted"; exit 0)
    umount "$PATH_BASE" || (echo "Could not unmount ${PATH_BASE}"; exit 1)
    
    zram_id=$(echo $zram_dev | sed 's@/dev/zram@@')
    echo 1 > /sys/block/zram$zram_id/reset || (echo "Resetting zram device failed."; exit 1)
    
    # Optional: Remove the mount point (only if empty)
    if [ -z $(find $PATH_BASE -mindepth 1 -maxdepth 1) ]; then
      rm -r $PATH_BASE
    fi
    
    echo "Done."

    Both scripts assume that the mount point of the ram disk is /mnt/ramdisk. To change this path, adjust the PATH_BASE variable definition in both scripts.

     

    The following step is optional but recommended. "manage_ramdisk.sh" is a wrapper script that calls either "init_ramdisk.sh" or "remove_ramdisk.sh" depending on the desired operation. Create a new script file "/usr/local/sbin/manage_ramdisk.sh" as root with the following content and make it executable:

    Spoiler
    #!/bin/bash -e
    
    USER_NAME=$(sed -nr '/:1000:/ s,^([^:]*).*$,\1,p' /etc/passwd)
    
    start() {
        echo "Calling: init_ramdisk.sh $@"
        # Use either of the following commands:
        /usr/local/sbin/init_ramdisk.sh "$@"
        #/usr/local/sbin/init_ramdisk.sh "$@" && /home/$USER_NAME/.local/bin/install_games.sh
    }
    
    stop () {
        echo "Calling: remove_ramdisk.sh $@"
        /usr/local/sbin/remove_ramdisk.sh "$@"
    }
    
    case $1 in
        start|stop)
            func="$1"
            shift
            "$func" "$@"
        ;;
    esac

     

    In line 3 adjust USER_NAME assignment if needed.
    There are two options present in the "start" block of the script. The second (currently disabled) option will also install the games to the ram disk with a script that is listed further below.

    To initialize and release a ram disk you can call this script with different parameters:

    # Initialize a ram disk
    sudo manage_ramdisk.sh start
    
    # Release an existing ram disk
    sudo manage_ramdisk.sh stop

     

    Setting up the game installation script

    With the ram disk in place it can now be populated with games. You can either copy them manually into the games folder on the ram disk, or use a script to automate the task.

    For this installation script create a new script file "$HOME/.local/bin/install_games.sh" without root privileges, add the following content, and make it executable. Create the folder "$HOME/.local/bin" if needed.

    Spoiler
    #!/bin/bash -e
    
    USER_NAME=$(sed -nr '/:1000:/ s,^([^:]*).*$,\1,p' /etc/passwd)
    
    # Path of the games folder on the mounted RAM disk
    DST_PATH="/mnt/ramdisk/games"
    test -d "$DST_PATH" || (echo "Ram disk not available."; exit 1)
    
    # Base path of the installed game(s) on disk
    SRC_PATH_BASE="/home/$USER_NAME/backup/games/ie_games"
    test -d "$SRC_PATH_BASE" || (echo "Source directory not available: $SRC_PATH_BASE"; exit 1)
    
    # Folder names of the game(s) to install on the ram disk
    # !!! Make sure the ram disk is big enough to hold all the games listed below !!!
    GAME_FOLDERS=(
      "Baldur's Gate Siege of Dragonspear"
      "Baldur's Gate II Enhanced Edition"
      "Icewind Dale Enhanced Edition"
      "Planescape Torment Enhanced Edition"
    )
    
    for game in "${GAME_FOLDERS[@]}"; do
      echo "Caching ${game}..."
      cp -rpu "$SRC_PATH_BASE/$game" "$DST_PATH" || (echo "Could not cache game: $game"; exit 1)
    done
    
    echo "Done."

     

    The script assumes that all EE games you want to install to the ram disk are located in the same directory. You'll have to adjust the SRC_PATH_BASE variable that contains the base path to the EE games on disk, and probably the GAME_FOLDERS array with the folder names of the games you want to install to the ram disk as well.

    Note: If you changed the mount point in the ram disk scripts above then you'll also have to adjust the DST_PATH variable in this script accordingly.

    I won't provide a script for saving changes made to the game instance on the ram disk back to disk, as that is better done manually.

     

    Optional: Create an autorun script to initialize the ram disk at system start

    This is an optional step that allows you to automate the whole procedure on system startup. The following script requires systemd but can be easily adapted to work on more traditional init systems.

    To notify systemd to run the script on startup, create a new file "/etc/systemd/system/init_ramdisk.service" as root with the following content:

    Spoiler
    [Unit]
    Description=Initialize RAM Disk
    
    [Service]
    Type=oneshot
    ExecStart=/usr/local/sbin/manage_ramdisk.sh start
    ExecStop=/usr/local/sbin/manage_ramdisk.sh stop
    RemainAfterExit=yes
    
    [Install]
    WantedBy=multi-user.target

    This service initializes the ram disk whenever the system starts up and removes the ram disk on a shutdown or reboot operation.

    See the "Testing" chapter below how to enable or disable this service.

     

    Testing

    Before enabling the autorun script it is strongly suggest to test the created scripts first:

    sudo manage_ramdisk.sh start

    This command will initialize the ram disk (and install the games if you chose to use the second command in the start section of "manage_ramdisk.sh").

     

    sudo manage_ramdisk.sh stop

    This command should unmount the ram disk and release all allocated memory.

     

    If you followed the advice in the previous chapter and created an autorun script, then execute this command to register it for systemd:

    sudo systemctl enable --now init_ramdisk.service

    The optional "--now" parameter can be used to instruct systemd to execute the service immediately.

     

    If you want to disable the autorun script, execute this command in a terminal:

    sudo systemctl disable --now init_ramdisk.service

    As with the previous command, the optional "--now" parameter can be used to execute the stop operation of the systemd service immediately.

     

    tl;dr

    For convenience I have also attached a "ramdisk_installer.sh" script that generates all the scripts listed above except for the steps described in the "Testing" chapter.

     

    ramdisk_installer.sh

  13. Spellhold Studios

    PS:T Unfinished Business - Reloaded

    This mod is a continuation of Qwinn's original PS:T Unfinished Business (PST-UB), based on version 4.12, that has been completely overhauled and made compatible with Planescape Torment: Enhanced Edition (PST:EE).

    Version 2.3 provides an updated Simplified Chinese translation.

     

    Download: SHS, GitHub

    Discussion: SHS, Beamdog

    Readme

  14. Thank you, that was very helpful.

    14 minutes ago, RoyalProtector said:

    Entropic Blade +3: I thinks it's a bit too much to have it deal a maximum of 23 weapon damage. I think I understand the idea of the item, which is always shifting shape and therefore with unpredictable results damage-wise. I believe in vanilla game the maximum damage dealers are... Carsomyr +6 and Staff of the Ram... both with a max weapon damage of 18. Maybe it could just be reworked as an item that deals a random extra damage of a random physical type. Something like... 1d4+5,  plus 2d6 (random physical damage). Just off the top of my head. I'm already thinking of things this item could be used to cheese the game, so that's why it stood up to me.

    Since it deals 1d20+3 damage it averages around 10+3 damage. However, it currently adds strength bonus to the damage output. I think that's not really appropriate for a shapeshifting weapon. Without the strength bonus the actual damage output would be more unpredictable and would more suit the nature of this weapon. The dagger is only available in ToB though, so it should stand out somewhat.

    22 minutes ago, RoyalProtector said:

    Heartgrinder +3: I feel like 1d6 electrical damage plus 1d6 slashing against corporeal (and most enemies would be corporeal) is a tad unbalanced for an item that you can get in chapter 2. If you compare it with the other +3 axes you can buy, the elemental damage is more modest. Perhaps 2 electrical, 1d4 against corporeal would be okay? Or perhaps just make it available later (or perhaps upgradable later? I don't know if that's in the scope of what you would want to do with this)

    The bonus damage is more or less taken from PsT. I agree that it's too much for a BG weapon, especially since it becomes available already in early SoA.

    27 minutes ago, RoyalProtector said:

    Final Judgment +3: it does 2d6+3 which is more base damage than other one-handed weapons... Additionally it says it does double damage against chaotic targets, I assume another tick of 2d6+3. If this was a two-handed axe, and that existed in BG2, I would think it was fine though. Perhaps, make it 1d8+3 and make the second damage tick deal with same, sort of like Peridan does. In this case in particular I don't think the weapon curse is too meaningful, so the drawbacks are too small to be concerned.

    That was originally Vhailor's weapon in PsT. While in that campaign setting the weapon was probably fueled by Vhailor's strong belief in order, this is not the case in Baldur's Gate. Reducing the weapon's base damage to 1d6+3 would be more sensible.

    34 minutes ago, RoyalProtector said:

    Bolts of Whistling Doom +2 and Bolts of Whistling +1: 4d4 damage for a bolt is pretty huge, though if it was implemented as a effect on hit and not part of the header, then it's probably okay. As for the bolts of wincing's extra damage, considering the +15% extra critical chance, I think the second tick of damage should be moderated a bit, at least, maybe make it 4 slashing damage, similar to arrows of piercing?

    These bolts are limited and/or are available rather late in SoA or ToB. However, outside of some basic tests I haven't really checked how they behave in regular gameplay. I think I'll leave the Bolts of Whistling Doom unchanged, but reduce their availability some more. I agree that damage of the Bolts of Wincing is indeed very high. That is actually the original damage in PsT, but I should tone it down somewhat for BG.

    44 minutes ago, RoyalProtector said:

    Bolts of Kessek the Devourer +2: similar treatment to Bolts of Whistling, I would say.

    For these bolts I admit that I got carried away a bit when I defined their attributes. I based them more on their lore rather than their original attributes in PsT. They are rare though, so I'll probably just make some minor adjustments.

    49 minutes ago, RoyalProtector said:

    Celestial Fire +3: same concern as the entropic blade

    Again this weapon uses the original stats from its PsT counterpart, which are quite high (even by PsT standards). It was the personal weapon of a deva after all. I had originally planned to make a 2h weapon, but it ended up as a regular longsword. In the former case the power wouldn't have stood out as much as it does now as a 1h longsword. This is probably the most expensive item available for sale, so it should be somewhat more "special" though.

    1 hour ago, RoyalProtector said:

    Side note... I never played Planescape... but I'm extremely intrigued by Moridor's Box though. 

    The effects of the box depend quite a bit on the power of the party. It can be worthwhile, or not, depending on when you open it.

  15. Wares of the Planes is a mod that introduces a large number of weapons and accessories from the Planescape universe 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.3 introduces a number of new items, including the infamous artifact "Grimoire of Pestilential Thought" from PsT, as well as several exotic magic spells of planar origin.

    You can grab the mod from the download link below.

    Download: GitHub

    Discussion: G3, Beamdog

    Readme

  16. New release: Wares of the Planes 1.3

    This version introduces a number of new items as well as several exotic magic spells of planar origin.

    A notable artifact for sale is the Grimoire of Pestilential Thought which tempts the owner with wealth and power - for a price.

    Changelog:

    • Added new items for sale: Grimoire of Pestilential Thought, Cowl of Deepest Shadows, Skeletal Key, Tear of Salieru-Dei
    • Added new spell scrolls for sale: Tasha's Unbearable Derisive Laughter, Modron Mind, Vrock's Screech
    • Fixed a resource name conflict with the "Skip Chateau Irenicus" mod
×
×
  • Create New...