Jump to content

Bubb

Modders
  • Posts

    198
  • Joined

Posts posted by Bubb

  1. 8 hours ago, argent77 said:

    It looks like the game engine can actually handle both parameter encoding variants correctly.

    I think I'm missing something; in what cases does the engine handle both? 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.

  2. @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:

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

  3. I unintentionally broke how pointers are passed around in EEex's Lua bindings. In particular it's dereferencing the sprite's terrain table one too many times in EEex_Sprite_ForAllOfTypeInRange(). I'll try to get a fix up somewhat quickly, though bindings errors have a habit of being tricky.

  4. Bubb’s Spell Menu

    This mod aims to overhaul the spell-selection interface to provide a more convenient experience for the player. The primary enhancements over the default spell selection include:

    • Displaying all available spells at once – categorized by level.
    • A searchable spell list.

    v5.0 adds Overlay Mode – which displays the selected character’s spells in a widget that hovers over the world screen, similar to NWN2’s quick cast menu.

    Note: Requires EEex v0.10.1.1-alpha+, which is Windows only – can be run on Linux using Wine. Compatible with BG:EE v2.6.6.0, BG2:EE v2.6.6.0, and IWD:EE v2.6.6.0.

    Links:

  5. engine.lua is read before the engine has even loaded in the normal game resources, so yeah, engine_mode has to stay in engine.lua to have any effect.

    Also, bear in mind that changing engine_mode will tell the engine to act like IWD:EE in all respects, (which includes over 100 special-casings in the code) – so there would be many side-effects, many of which probably breaking a non-IWD:EE game in some way.

  6. oIWD rest interruptions are indeed simpler:

    • If [+0xA6] is 0 rest interruptions are disabled.
    • Roll [0-99], if this roll is  the relevant probability field (day – [+0xA8], night – [+0xAA]) the rest is interrupted by a single spawn pass.
    • If [+0x98] or [+0xA4] is 0 the rest interruption is cancelled.
    • Time is randomly advanced between 0 and 7.5 minutes.
    • A random CRE resref + feedback string is selected using rand[0–[+0x98]-1]
    • The number of spawn attempts is max(1, [+0xA4] + rand[-2–2]) + (bHeartOfFury ? 1 : 0)
    • If the position randomization ends up putting a creature in an invalid spot the creature can be dropped.
  7. Thanks, I've fixed the issue in v4.7. The main component number of Dragonspear UI++ changed between some of the forks, and the spell menu was only detecting the newer number.

    v4.5.4:

    • Added Spanish translation, (thanks Davoker!).

    v4.6:

    • Added Infinity UI++ compatibility.
    • The spell menu now responds to spell casting hotkeys when the search bar is unfocused.
    • Pressing Left Ctrl toggles the search bar's focus when the "Automatically Focus Search Bar" option is disabled.
       
    • Note: This release requires a recent EEex version: v0.9.20-alpha+.

    v4.7:

    • Fixed some versions of Dragonspear UI++ not being detected due to differing main component numbers.
  8. 21 hours ago, Guest moe23 said:

    Thank you very much for this genuis mod!

    I installed it with EET and Dragonspear UI++ using Project Infinity and it always installs the BG2EE theme.

    I think the BGEE-SOD theme would look more consistent with the color scheme of Dragonspear UI++?

    Is it possible to change the theme after installation? or force to install BGEE-SOD theme?

    I already tried to copy the files from \bubb_spell_menu_extended\copy\bgee-sod into my override folder after installation but that doesn’t work. 

    Hello, glad you like the mod! It's not possible to completely update the skin after installation, (unless you want to dive into the game files and update dozens of values). The way you copied bgee-sod into the override folder should have changed the slots to their SoD variant, so I'm unsure why that didn't work. The code is responsible for tweaking other UI elements.

    Did you install the spell menu after Dragonspear UI++? The installer should have detected dragonspear and changed its skin automatically.

×
×
  • Create New...