Jump to content

Galactygon

Modders
  • Posts

    827
  • Joined

  • Last visited

Posts posted by Galactygon

  1. Thanks, edited original post for accuracy. Is targettype 9-original caster properly used on reflection by spell turning? In that case, original caster should switch to the creature doing the reflection. Some existing spells use the parent spell to affect turning/deflection (nonzero power values) while others have their nonzero resist/dispel/power values used in the child .spls.

    I will report this inconsistency in Redmine on a good repro case.

  2. It appears that targettypes of effects within a .spl applied via opcodes 326 or 333 is treated as follows:

    • 1-Self is applied regardless of the projectile within that .spl and is applied instantly to the target of the parent spell using opcode 326/333
    • 2-Pre-target is applied via the projectile within that .spl. If projectile 1-none is used then effects using this targettype are applied to the target of the parent effect opcode 326/333 after any effects using 1-self are used.
    • 9-Original Caster is known to be used by SPWI631B.spl (i.e. soul eater in IWD:EE) and applies effects to the original caster (unlike targettype 1-Self if used in this context).

    Opcode 333 (static charge) may use the resource field to specify the .spl to be cast. Otherwise, a default -B is added to the parent spell's name.

  3.  

    Another oddity I noticed some time ago: if a spell contains effects in multiple probability ranges (e.g. 0-9, 10-19, 20-29, ...), you might experience effects triggering from two or more (or zero) independent ranges on rare occasions. This is caused by a quirk in the game engine if auto-pause conditions "Spell cast" or "End of round" are active.

    Oh right, forgot to mention this as well. Yeah, auto-pause on spell cast can do two fairly bad things--one, as you've already mentioned, is that it can re-roll the probabilities so that not every effect gets the same roll (for further reading, any old thread about the duration of the Friends spell in the Fixpack). Another, but lesser known problem, is that it can sometimes cause the engine to apply spell effects out of order, which can cause all sorts of bad things for spells like Otiluke's where the order is necessary for the proper functioning of the spell.

     

    edit: I should note that while auto-pause on spell cast is the most common way to experience these bugs, *any* pause at the critical moment can produce the same result.

     

    Yes, many of the EE spells and especially the ones in IWD:EE are dependant on immunity effects placed at the beginning of the effects list. They are negated if you use autopause on hit or happen to pause the game at the wrong time.

  4. Something I just remembered to mention now is when cloning spells as different filenames, instances of immunity spell opcodes (318/324) need to be updated so that they self-block the effects of the new spell rather than the original copied spell. SCS liberally clones spells, so I would integrate this change into the clone spells macros or whatever they are called.

  5. I've updated/clarified the differences between bit0 and bit3. I can confirm that bit3 is the noncumulative version of hp transfer in that if the recipient carries any instance of opcode 18 with special set to 1, then no current and maximum hitpoints are added.

  6. I went ahead and wrote a function that can handle .ssl => .baf => .bcs compilation in one go. The modder has to specify the following 3 things:

    1. The path of SSL.exe (default is %MOD_FOLDER%/SSL/ssl.exe)

    2. The name of the array with a list of .ssl libraries with their file paths specified (valid format either .slb or .ssl). Default value is "SSL_LIB".

    3. The name of the associative array with of individual .ssl files compiled as .bcs files in the override folder. Default value is "SSL_LIST".

    4. (optional) Any ssl variables can be defined in STR_VAR ssl_variables. Default value is "".

     

    All filepaths are relative to Setup-MyMod.exe, including any INCLUDE() syntaxes within any of the .ssl files. The code generates a valid list of .ssl files and libraries, runs ssl.exe, and compiles the resulting .baf files into the override folder.

     

    See the full code below with an example application:

    // Compile a list of .ssl files into .baf format and then proceed to .bcs format in the override folder
     
    // Example usage:
    //ACTION_DEFINE_ARRAY "SSL_LIB" BEGIN
      // list of .slb files
    //  "%MOD_FOLDER%/SSL/testlib"
      // list of .ssl files (i.e. to define actions)
    //  "%MOD_FOLDER%/SSL/testactions"
    //END
    //ACTION_DEFINE_ASSOCIATIVE_ARRAY "SSL_LIST" BEGIN
      // Compiles test1.ssl into override/testssl.bcs
    //  "%MOD_FOLDER%/SSL/test1.ssl" => "testssl"
      // Compiles test2.ssl into override/testtwo.bcs
    //  "%MOD_FOLDER%/SSL/test2" => "testtwo.bcs"
      // Compiles test3.ssl into %MOD_FOLDER%/SSL/ssl_out/test3.baf without compiling into the override as a .bcs
      // useful for patching (i.e. EXTEND_TOP)
    //  "%MOD_FOLDER%/SSL/test3" => ""
    //END
    //LAF "SSL"
    //  STR_VAR  ssl_lib = "SSL_LIB" // List of arrays
    //    ssl_files = "SSL_LIST" // List of associative arrays
    //    ssl_exe = EVAL "%MOD_FOLDER%/SSL/ssl.exe" // directory to where ssl.exe is located
    //END
     
    DEFINE_ACTION_FUNCTION "SSL"
      STR_VAR  ssl_lib = "SSL_LIB" // name of the array array (default: "SSL_LIB")
        ssl_files = "SSL_LIST" // name of the associative array (default: "SSL_LIST")
        ssl_variables = "" // List of variables
        ssl_exe = EVAL "%MOD_FOLDER%/SSL/ssl.exe" // directory to where ssl.exe is located (default is in an ssl folder within %MOD_FOLDER%)
    BEGIN
      OUTER_SPRINT ssl_execute_ssl ""
      OUTER_SPRINT ssl_execute_lib ""
      ACTION_IF "%ssl_variables%" STRING_CONTAINS_REGEXP "[0-9A-Za-z]+=[0-9A-Za-z]+" = 0 BEGIN
        OUTER_PATCH_SAVE ssl_variables "%ssl_variables%" BEGIN
          REPLACE_TEXTUALLY "[ %TAB%,;|]*=[ %TAB%,;|]*" "="
          REPLACE_TEXTUALLY "[ %TAB%,;|]*" "&"
          REPLACE_TEXTUALLY "^&" ""
          REPLACE_TEXTUALLY "&$" ""
        END
        OUTER_SPRINT ssl_variables " %ssl_variables%"
      END ELSE BEGIN
        OUTER_SPRINT ssl_variables ""
      END
     
      ACTION_IF FILE_EXISTS "%ssl_exe%" AND "%ssl_exe%" STRING_MATCHES_REGEXP "^.*ssl\.exe$" = 0 BEGIN // If ssl.exe exists
        // Record information
        ACTION_PHP_EACH "%ssl_lib%" AS ssl_lib_index => ssl_lib_src BEGIN
          // Add .slb or .ssl at the end if no file extension is given (attempt to find .slb file first then do the same for .ssl)
          ACTION_IF NOT "%ssl_lib_src%" STRING_MATCHES_REGEXP "^.+\.[0-9A-Za-z]+$" = 0 AND NOT "%ssl_lib_src%" STRING_MATCHES_REGEXP "^.+\.\(slb\|ssl\)$" = 0 BEGIN
            ACTION_IF FILE_EXISTS "%ssl_lib_src%.slb" BEGIN
              OUTER_SPRINT ssl_lib_src "%ssl_lib_src%.slb"
            END ELSE
            ACTION_IF FILE_EXISTS "%ssl_lib_src%.ssl" BEGIN
              OUTER_SPRINT ssl_lib_src "%ssl_lib_src%.ssl"
            END
          END
          ACTION_IF FILE_EXISTS "%ssl_lib_src%" AND "%ssl_lib_src%" STRING_MATCHES_REGEXP "^.+\.slb$" = 0 BEGIN // If valid .slb file
            // Append %ssl_execute_lib% with file path
            ACTION_IF "%ssl_execute_lib%" STRING_EQUAL_CASE "" BEGIN // If first item in list
              OUTER_SPRINT ssl_execute_lib "%ssl_lib_src%"
            END ELSE BEGIN // If not first item in list
              OUTER_SPRINT ssl_execute_lib "%ssl_lib_src% %ssl_execute_lib%"
            END
          END
          ACTION_IF FILE_EXISTS "%ssl_lib_src%" AND "%ssl_lib_src%" STRING_MATCHES_REGEXP "^.+\.ssl$" = 0 BEGIN // If valid .ssl file
            // Append %ssl_execute_ssl% with file path
            ACTION_IF "%ssl_execute_ssl%" STRING_EQUAL_CASE "" BEGIN // If first item in list
              OUTER_SPRINT ssl_execute_ssl "%ssl_lib_src%"
            END ELSE BEGIN // If not first item in list
              OUTER_SPRINT ssl_execute_ssl "%ssl_execute_ssl% %ssl_lib_src%"
            END
            // Make directory "ssl_out" in same folder as .ssl file & copy blank .baf file to destination
            OUTER_PATCH_SAVE ssl_out "%ssl_lib_src%" BEGIN
              REPLACE_TEXTUALLY "^\(.+\)/[^/]+\.ssl$" "\1/ssl_out"
            END
            MKDIR ~%ssl_out%/~
            OUTER_PATCH_SAVE ssl_out_res "%ssl_lib_src%" BEGIN
              REPLACE_TEXTUALLY "^\(.+\)/\([^/]+\)\.ssl$" "\2"
            END
    <<<<<<<< .../%MOD_FOLDER%-Inlined/blank.txt
    >>>>>>>>
            COPY ".../%MOD_FOLDER%-Inlined/blank.txt" "%ssl_out%/%ssl_out_res%.baf"
          END
        END
        ACTION_PHP_EACH "%ssl_files%" AS ssl_src => ssl_dest BEGIN
          // Add .ssl at the end if no file extension is given
          ACTION_IF NOT "%ssl_src%" STRING_MATCHES_REGEXP "^.+\.[0-9A-Za-z]+$" = 0 AND NOT "%ssl_src%" STRING_MATCHES_REGEXP "^.+\.ssl$" = 0 BEGIN
            OUTER_SPRINT ssl_src "%ssl_src%.ssl"
          END
          ACTION_IF FILE_EXISTS EVAL "%ssl_src%" AND "%ssl_src%" STRING_MATCHES_REGEXP "^.+\.ssl$" = 0 BEGIN // If valid .ssl file
            // Append %ssl_execute_ssl% with file path
            ACTION_IF "%ssl_execute_ssl%" STRING_EQUAL_CASE "" BEGIN // If first item in list
              OUTER_SPRINT ssl_execute_ssl "%ssl_src%"
            END ELSE BEGIN // If not first item in list
              OUTER_SPRINT ssl_execute_ssl "%ssl_execute_ssl% %ssl_src%"
            END
            // Make directory "ssl_out" in same folder as .ssl file & copy blank .baf file to destination
            OUTER_PATCH_SAVE ssl_out "%ssl_src%" BEGIN
              REPLACE_TEXTUALLY "^\(.+\)/[^/]+\.ssl$" "\1/ssl_out"
            END
            MKDIR ~%ssl_out%/~
            OUTER_PATCH_SAVE ssl_out_res "%ssl_src%" BEGIN
              REPLACE_TEXTUALLY "^\(.+\)/\([^/]+\)\.ssl$" "\2"
            END
    <<<<<<<< .../%MOD_FOLDER%-Inlined/blank.txt
    >>>>>>>>
            COPY ".../%MOD_FOLDER%-Inlined/blank.txt" "%ssl_out%/%ssl_out_res%.baf"
          END
        END
     
        // Launch ssl.exe if there are valid library and ssl files & generate .baf files
        ACTION_IF NOT "%ssl_execute_ssl%" STRING_EQUAL_CASE "" AND NOT "%ssl_execute_lib%" STRING_EQUAL_CASE "" BEGIN
          AT_NOW ~%ssl_exe% "%ssl_execute_ssl% -l %ssl_execute_lib%%ssl_variables%"~
        END
        
        // Compile generated .baf files
        ACTION_PHP_EACH "%ssl_files%" AS ssl_src => ssl_dest BEGIN
          // Get ssl_out/xxx.baf path
          // Add .ssl at the end if no file extension is given
          ACTION_IF NOT "%ssl_src%" STRING_MATCHES_REGEXP "^.+\.[0-9A-Za-z]+$" = 0 AND NOT "%ssl_src%" STRING_MATCHES_REGEXP "^.+\.ssl$" = 0 BEGIN
            OUTER_SPRINT ssl_src "%ssl_src%.ssl"
          END
          // Get location of resulting .baf file
          OUTER_PATCH_SAVE ssl_out "%ssl_src%" BEGIN
            REPLACE_TEXTUALLY "^\(.+\)/[^/]+\.ssl$" "\1/ssl_out"
          END
          OUTER_PATCH_SAVE ssl_out_res "%ssl_src%" BEGIN
            REPLACE_TEXTUALLY "^\(.+\)/\([^/]+\)\.ssl$" "\2"
          END
          // Generate new .bcs if valid input at => "%ssl_dest%"
          ACTION_IF "%ssl_dest%" STRING_MATCHES_REGEXP "^[-_!@#a-zA-Z0-9]+\(\.baf\|\.bcs\)?$" = 0 BEGIN
            ACTION_IF FILE_EXISTS "%ssl_out%/%ssl_out_res%.baf" BEGIN
              // Record contents of resulting .baf file in %ssl_out_contents%
              COPY - "%ssl_out%/%ssl_out_res%.baf" ""
                READ_ASCII 0 ssl_out_contents (BUFFER_LENGTH)
     
              // truncate file extensions
              OUTER_PATCH_SAVE ssl_dest "%ssl_dest%" BEGIN
                REPLACE_TEXTUALLY "^\(.+\)\..+$" "\1"
              END
              // Generate temporary .baf file (in case original .ssl/.baf and destination .bcs resnames do not match)
    <<<<<<<< .../%MOD_FOLDER%-Inlined/SSL_DEST/%ssl_dest%.baf
    %ssl_out_contents%
    >>>>>>>>
              COMPILE EVAL ".../%MOD_FOLDER%-Inlined/SSL_DEST/%ssl_dest%.baf"
            END
          END
        END
      END
    END
    
    
  7. When I try to compile ssl scripts from a .bat file run from the main game directory I am unable to specify a directory if ssl.exe is located somewhere else relative to the .bat file in the manner of:

    LCTests/SSL/ssl.exe "LCTests/SSL/testactions.ssl LCTests/SSL/testssl.ssl -l LCTests/SSL/testlib.slb IsLich=True&CreType=Undead"

    I get the message "LCTests is not recognized as an internal or external command"

     

    I do manage to compile them if ssl.exe is located in the same folder as the .bat file and use the following instead.

    ssl.exe "LCTests/SSL/testactions.ssl LCTests/SSL/testssl.ssl -l LCTests/SSL/testlib.slb IsLich=True&CreType=Undead"

    Is this intentional or is it an oversight? I guess one could either COPY ssl.exe to the main (game) directory or generate the .bat file in the folder where ssl.exe is located.

     

    EDIT: Using AT_NOW in the manner below works:

    AT_NOW ~LCTests/SSL/ssl.exe "LCTests/SSL/testactions.ssl LCTests/SSL/testssl.ssl -l LCTests/SSL/testlib.slb IsLich=True&CreType=Undead"~
  8. Thanks for the help, Wisp. That was the issue. I was now able to generate the desired .baf file.

     

    Now I've got yet even more questions to ask you:

    1. Why did you choose not to run ssl.exe? Is it a hassle to account for the different operating systems?

    2. You have written a python script make_baf.pl which I couldn't find in any of the SCS folders. What does it do? Is it something specific for aTweaks rather than ssl?

  9. Thanks for your reply, Wisp. I've been looking into pregenerating .baf blocks but you do not seem to have ssl.exe in aTweaks; I am speculating that the scripts distributed in aTweaks are already "ready-made" complete .baf files and the .ssl blocks are there for reference. SCS pregenerates so much with different scripts that it's difficult to boil it down to a simple example of a .tph launching an .ssl compiler with the most basic features and libraries.

     

    I've been trying to generate one .baf file from the single block of .ssl code above by running ssl.exe via a .bat but keep getting the error

    Input file is testssl.ssl
    Error near line 7: Spell is not a recognised action type at <directory>\ssl.exe line 634.
    

    Can someone with experience in ssl look at this? Simply run the .bat after downloading the folder:

    https://drive.google.com/open?id=0ByYA3DEzP-QMUWZnVFU3ZlI3WUU

  10. Question: what does Combine() do? Here's an example from aTweaks/ssl/mage/chaos.ssl:

     

     

    IF TRIGGER
      TargetBlock(PCsInOrder)
      TriggerBlock(Disabled|Enemy|MR50|Confusion|SIEnc)
    THEN DO
        Combine()
        Action(Spell,WIZARD_CHAOS|100|50)
    END
    

     

    My initial guess is that it generates a series of False() targeting blocks with all the "scstarget"s followed up by a LastSeenBy(Myself) block but I could be wrong.

  11. Much of this is already known: EE expands the use of this opcode so that the special field can be used. In this case, the special field acts as a bitfield as described below.

     

     

    Known values for the 'Special' field:
    1 - Drain HP to Caster
    2 - Transfer HP to Target
    4 - Fist Damage Only
    0x100 - Save for Half
    0x200 - Made save
    0x400 - Doesn't wake sleepers

     

     

    ----------------

    Here is a more detailed explanation on life drain functionality (bits 1 and 2). In all cases, the healing amount is identical to the damage inflicted, so resistance against a certain damage type may reduce or even eliminate the amount of hitpoints gained. Damage and healing is not affected by the amount of hitpoints remaining if the creature is killed. For example you can inflict and gain 20 hit points with a Vampiric Touch even if the target has 1 hitpoint remaining.

    ----------------

    If bit0 is set (1 - drain hp to caster) then the effects increases the caster's current and/or maximum hitpoints in the following manner:

    • if the the timing mode is permanent with no duration value specified (at dword 0xe) only the caster's current hp is increased, up to his/her normal maximum.
    • if a duration value is specified (at dword 0xe) then the caster's maximum hitpoints are temporarily increased by the same amount for a number of real time seconds that matches the duration value specified at 0xe. Current and maximum hitpoints are increased by the same amount regardless of injured/uninjured status of the caster.

    The temporary maximum hitpoint increase is stored on the caster as an instance of opcode 18 with the special field set to 1.

     

    These added maximum hitpoints do not carry any parent resource so you cannot use opcode 321 to dispel/remove previous instances of added max hitpoints. Also note that the added hitpoints are not dispellable (dispel type is set to 0)

    ----------------

    bit1 (2 - transfer hp to target) works the same way as bit1 except the caster suffers damage and the target gains current (and maximum) hitpoints, as described above. In this case, there doesn't seem to be any limit on extra hitpoints beyond the normal maximum so you can repeatedly increase your max hitpoints. PS:T has similar behavior in Sensory Touch and Blood Bridge, although they both use a PS:T-specific opcode for this.

    ----------------

    bit2 (4 - fist damage only) is used in MONKFLAM.eff via a set melee effect in SPCL238.spl. It applies damage onto a target creature if the caster is attacking with his/her fists.

    ----------------

    bit3 (8) is identical to bit0, in all respects except that hitpoints are not added to the caster's current AND maximum hitpoints if any instances of opcode 18 with special field "1" are carried by the caster.

     

    This prevents additional hitpoints from being gained by the life drain functionality of opcode 12 even if the caster were to gain more hitpoints. For example draining and gaining 1 hit point would prevent subsequent hitpoints (both current and maximum) from being added to the caster even if (s)he were to drain 20 hitpoints during this duration. Note that damage is always inflicted even if the caster would not gain hitpoints.

    ----------------

    bit4 (16) seems to be unused

    ----------------

    bit5 (32 - Suppress damage feedback) Does not show damage message in the combat log.

    ----------------

    bit6 (64) and bit7 (128) seem to be unused

    ----------------

    bit8 (256 - save for half) behavior that works if a saving throw is allowed. If this bit is set then the total damage applied will be halved on a successful saving throw instead of being eliminated. Most save-for-half effects in the non-EE games use two separate effects to achieve this (one with a save, one without) that results in two instances of damage text being shown in the combat log if the target fails its saving throw. The save-for-half flag is an elegant way to eliminate the excess text in the combat log and to use a single instance of opcode 12 to handle save-for-half behavior.

    ----------------

    bit9 (512 - made save) "was implemented to support bit 8 (save for half). The saving throw is handled by a separate code (as in all engine versions), so it has to tell the damage opcode that the save was successful. You can indeed use it for exact expressions where one has to suffer xdy/2 damage. But it is best used with bit 8 so it can eliminate the lame double opcodes of fireball, lightning bolt, etc." -Avenger

    ----------------

    bit10 (1024 - doesn't wake sleepers) EE changes the behavior of opcode 39 to awaken creatures on taking damage. Setting this bit in opcode 12 does not awaken creatures.

  12. I have been playing around with alpha values so I can confirm that 0 is completely opaque and 1 is completely transparent (or transparent enough that you do not notice anything). The reason for this as I see it is backwards compatibility where the alpha values have been ignored/set to 0 for most .bam files.

     

    Near Infinity's .bam preview actually renders alpha values which is cool. However as with most other .bam editors you lose the alpha values if you save the .bam in NI. I go instead the route of palette patching with WeiDU which can give some nice results.

  13. The scripting action AddGlobals() only works for "GLOBAL" variables. This action does nothing for "LOCALS" or "MYAREA" or any other type of variable that is not a "GLOBAL" variable.
    This example from the IESDP works
    
    IF
      Global("Var1","GLOBAL",0)
    THEN
      RESPONSE #100
        SetGlobal("Var1","GLOBAL",75) //Var1 = 75
        SetGlobal("Var2","GLOBAL",25) //Var2 = 25
        AddGlobals("Var1","Var2") //Var1 = 100
    END
    
    But this does not:

    
    IF
      Global("Var1","LOCALS",0)
    THEN
      RESPONSE #100
        SetGlobal("Var1","LOCALS",75) //Var1 = 75
        SetGlobal("Var2","LOCALS",25) //Var2 = 25
        AddGlobals("Var1","Var2") //Var1 will still be set to 75
    END
    
  14. Updates on the bitfield (testing BGEE:SoD):

     

    bit14 - Exclude Trueclass Mages/Sorcerers/Bards

    bit21 - Exclude Blades

    bit22 - Exclude Jesters

    bit23 - Exclude Skalds

    bit31 - Exclude Druids/Rangers/Wildmages

     

    Both bit14 and bit31 is shared among different classes with class-specific behavior. i.e. setting bit31 for a priest spell excludes druids/rangers from gaining the spell at level up, while setting the same bit for a wizard spell prevents wildmages from learning the spell via scroll ("Your spell school does not permit you to learn this spell."). Bards receive the same message when attempting to learn the spell via scrolls.

     

    Here is the original listing:

     

     

    bit 0: Exclude Chaotic priests. (BG2 & HoW)
    bit 1: Exclude Evil priests. (BG2 & HoW)
    bit 2: Exclude Good priests. (BG2 & HoW)
    bit 3: Exclude GENeutral priests. (BG2 & HoW)
    bit 4: Exclude Lawful priests. (BG2 & HoW)
    bit 5: Exclude LCNeutral priests. (BG2 & HoW)
    bit 6: Exclude Abjurers
    bit 7: Exclude Conjurers
    bit 8: Exclude Diviners
    bit 9: Exclude Enchanters
    bit 10: Exclude Illusionists
    bit 11: Exclude Invokers
    bit 12: Exclude Necromancers
    bit 13: Exclude Transmuters
    bit 14: Wild Magic (exclude Generalists) (BG2)
    bit 15 - 29: Unused
    bit 30: Exclude Cleric/Paladin
    bit 31: Exclude Druid/Ranger

     

     

     

    EDIT: According to the kit usability fields the complete list would be:

    bit 0: Exclude Chaotic priests. (BG2 & HoW)/Berserkers (unused)
    bit 1: Exclude Evil priests. (BG2 & HoW)/Wizard Slayers (unused)
    bit 2: Exclude Good priests. (BG2 & HoW)/Kensai (unused)
    bit 3: Exclude GENeutral priests. (BG2 & HoW)/Cavaliers (does not work)
    bit 4: Exclude Lawful priests. (BG2 & HoW)/Inquisitors (does not work)
    bit 5: Exclude LCNeutral priests. (BG2 & HoW)/Undead Hunters (does not work)
    bit 6: Exclude Abjurers
    bit 7: Exclude Conjurers
    bit 8: Exclude Diviners
    bit 9: Exclude Enchanters
    bit 10: Exclude Illusionists
    bit 11: Exclude Invokers
    bit 12: Exclude Necromancers
    bit 13: Exclude Transmuters

    bit 14: Exclude Trueclass Mages/Sorcerers/Bards

    bit 15: Exclude Ferlains (does not work)

    bit 16: Exclude Stalkers (does not work)

    bit 17: Exclude Beastmasters (does not work)

    bit 18: Exclude Assassins (unused)

    bit 19: Exclude Bounty Hunters (unused)

    bit 20: Exclude Swashbuckers (unused)

    bit 21: Exclude Blades

    bit 22: Exclude Jesters

    bit 23: Exclude Skalds

    bit 24: Exclude Priests of Talos (does not work)

    bit 25: Exclude Priests of Helm (does not work)

    bit 26: Exclude Priests of Lathander (does not work)

    bit 27: Exclude Totemic Druids (does not work)

    bit 28: Exclude Shapeshifters (does not work)

    bit 29: Exclude Avengers (does not work)

    bit 30: Exclude all Clerics/all Paladins/Barbarians (unused)

    bit 31: Exclude all Druids/all Rangers/Wildmages

  15. We want to preserve existing behavior as much as possible, including retaining the summoning limit at 5. It's a bug that Wish and Limited Wish do not work when the summoning limit is reached.

     

    Changing the summoning limit is a design decision best left to modders. Changing the GENDER of summoned creatures to something else is not an option because it might unintentionally break something.

  16. I can confirm that opcode 67 fails to summon a creature and displays the text "You cannot summon any more creatures." if the summoning limit has been reached regardless of the GENDER.ids entry of the newly summoned creatures.

     

    So you can have 40 rabbits appear if their GENDER is not SUMMONED but if you already have 5 creatures summoned that contribute to the summoning limit (GENDER=SUMMONED) then you cannot summon even one rabbit.

×
×
  • Create New...