Jump to content

kjeron

Members
  • Posts

    486
  • Joined

  • Last visited

Posts posted by kjeron

  1. 1 hour ago, subtledoctor said:
    • The transition from the SoA end-battle into TOB can strip sequencers away without fully clearing them. (Is this by script, or by an applied spell?)

     Cutscene Script (CUT59A.BCS) applies CLERIC_RESURRECTION to entire party (excluding CHARNAME/Player1, since it's expected that they cannot die), so same problem as below:

    1 hour ago, subtledoctor said:
    • Raise Dead, Resurrection, Mass Raise Dead, and similar spells can strip sequencers away. (See below)

    The problem is that they shouldn't affect the living.  Fixes for these should already be in v2.6, though I can't say for certain how it was implemented.  Easiest way to fix is to move all of those op172 effects into another spell, which they will all share, and apply it through op326 checking if STATE_DEAD as the first effect in each spell.  They still need to remove those abilities if the creature was actually dead, because the death itself will have already removed the sequencer effect (as well as the polymorph termination effect).  The Rod of Resurrection lacks these removal effects, and needs to apply them in a similar manner for the same reason.

    1 hour ago, subtledoctor said:
    • Pressing Ctrl-R on a character can strip sequencers away. (Probably can't do anything about this one)

    Not likely.  It applies op17, param1=200, param2 = (BIT16 + BIT17), which will remove STATE_DEAD, increase HP by 200, and remove any effect without timing modes (2 or 9). Sequencer creation always applies it's effect with timing mode 1, regardless of the timing mode used for creation.

  2.  

    44 minutes ago, Jarno Mikkola said:

    I would remember that the max is actually 50 ... due to the quirks.

    Yep.

    Regardless of your actual level, the game will cap it to a maximum of 50 in-game, just like ability scores are capped at 25.

    Once you have enough experience for level 51, you can push that level-up button over and over, because it will still think your level 50 afterwards.

    You still gain at least some of the level up benefits (HP, proficiency), but not sure about all of them.

    CLAB files are governed by your effective level, so entries 51+ won't be used.

    Caster level is also based on your effective level, so it won't exceed 50 without op191 (or wild magic bonus).

     

    The experience cap cannot be eliminated because if you have enough experience for every level (0 - 255), the game locks up, as it doesn't know what to do.

  3. StaticSequence switches which sequence the animation uses, first sequence is 0.

    AmbientActivate will activate (TRUE) or deactivate (FALSE) an area animation.

    StaticStop and StaticStart just freeze/unfreeze the animation.

    Make sure the animation has a unique name/label in the .ARE file. These actions do not reference animations by BAM file, but by the label/name given to it's animation header in the current area.

  4. Scripts can handle RES filenames with "+", Dialogs and the console cannot.  Same with the ~, `, ', @, $, ^, and & characters, maybe some more.  The in-game compiler is what's failing, not the action.

    ApplySpell and ApplySpellRES cast a spell at it's lowest level, and ignore it's projectile.

    Edit: The RES variants will default to a spell matching the first 7 characters in Dialogs/Console IF the 8th character isn't valid.

     

  5. 13 hours ago, Grammarsalad said:

    This is very useful as you can cast spells differently depending on caster stats. As an example, this spl acts differently depending on the casters wisdom (actually, it's done through an item, a 'healing kit', but same idea):

    Oh yes, I'm well aware of what it allows to be done with the opcode, but for the purpose of reproducing the opcode, it's an important distinction.

    This specific aspect is actually similar to how the Sequencer Activation opcodes work (they target self, but cast their spells on the ability target).  However, sequencers don't share any of those other features.

    30 minutes ago, lynx said:

    Are you saying param2==2 is different from param2==1? We don't have it documented yet, but I don't see how it would differ.

    In my testing in 2014 also something else was fishy: contingency spells use type 0 yet expect an instant cast.

    Yes.

    op146*p2=0 isn't really "normal cast", as it cannot be interrupted by damage (it's more similar to ForceSpell() than SpellNoDec()), but can specify a level (or leave 0 to use caster level).

    op146*p2=1 cannot specify the casting level, it's just instant-cast using caster level for whatever type of spell the resource is.

    op146*p2=2 works identically to op326, bar trading the splprot filter for a level specifier, but otherwise has all the same quirks.

    Not sure what you mean by contingency spells, they no longer use op146.  The op146 they did use was a cheap way to prevent you from casting other spells immediately after the Contingency, as the Contingency spells ignored the once/round rule (they no longer do).  All it did was interrupt whatever you were doing 4 seconds later (were it instant it would not interrupt you).  The spell they cast is labeled "DO_NOTHING", and has no effects, so I don't think it had any other purpose than to interrupt you.

  6. 3 hours ago, lynx said:

    326: looks like we don't have it yet, but it will need to be added anyway. Do I see correctly it's just an Apply Spell with the same iwd-style targetting?

    321: same, but it looks very easy to do, since we do this sort of thing internally all the time.

    Is the IESDP description correct (as far as you know)?

    321: Leaving the resource field empty will remove any effect on the creature without a parent resource.  Level-up Proficiency, HLA markers, Stealth, Turn Undead(Paladins Panic only), etc...   Local Variable effects are however safe (if they are even stored on the creature during gameplay).

    326 has a lot of quirks (whether or not they're intended is something else):
    Unlike op146, when targeting "Self" or "Original Caster", the resource is still cast on the ability target, not the caster.

    For the purpose of dispelling effects only, the target of op326 (not necessarily the caster) determines the caster level for effects in it's resource.  It also determines the "Caster location" saved to the V2 effect on creatures.  It doesn't transfer full ownership though - the caster is still credited for damage.

    If the resource uses a projectile other than #(0|Default):

    • effects in the resource that target "Self" will affect the target of op326, not the caster.
    • if op326 is reflected/turned, only effects in the resource targeting "Original Caster" will be affected, now affecting the target.

    If the resource uses projectile #(0|Default):

    • the resource will ignore it's projectile field, defaulting to use projectile #(1|None) for all effects.
    • effects in the resource that target "Self", "Preset Target", or "Original Caster" will all affect the target of op326.
    • if op326 is reflected/turned, the target of effects in the resource is reflected.

    All of these are also shared with op333 (Static Charge), and op146 param2=2 (cast instant at specific level).

    edit: Effects in the resource will also bypass Magic Resistance, of every target, as if the caster targeted themselves, regardless of who they target with the spell or op326.

  7. 1 hour ago, Jarno Mikkola said:

    Yeah, thing is, there's a problem with that, see the EE games used the weidu.exe to make the new EE only kits, and with the games not having the exact amount of kits, this cause a problem where even if you have the exact same mods installed in the same order, you will probably miss out on a few kits. So to actually get a perfect export/import, you need to go into the games tables, know what you are doing and jerry-rig a solution for yourself.

    BGEE/SoD and BG2EE currently have the same number of default kits (reserve + 40), so this shouldn't be an issue unless you're installing kits exclusive to either  BG1 or BG2.

  8. 3 hours ago, Guest Spellcaster said:

    I could do that, but would need some confirmations from Kjeron (hopefully he'll see this): I think he's pulling his information from assembly.

    LOL....No, it's all in-game observation.

    3 hours ago, Guest Spellcaster said:

    1/ What does "if greater than 1s" exactly mean in

    2/ Aren't timers unable to tick faster than once per second without haste? What would be the purpose of this if, then?

    Those effect trigger once per (x seconds).

    If they trigger exactly once per 1 second, with Haste it will trigger twice as often (once per 0.5s).

    When they trigger once per (x>1 seconds), with Haste the trigger interval is reduced to the percentages I listed (about to 30%), up to tripling their number of triggers over a given duration.

    Quote

    3/ What are modal abilities? Is it only things like Turn Undead and Stealth, or do innate abilities and item abilities count?

    4/ How are modal abilities affected by the "creature round timer" going 6s --> 3s ? It seems that a Dorn's Turn Undead ability ticks once every 6s even under haste (BG2EE 2.5.16.6), so... no real effect? They keep ticking the same way in absolute time regardless of round duration?

    Turn Undead, Stealth, Bard Song, Shaman Dance, Find Traps ... though it appears I was wrong about them, it only affects Stealth, or more importantly the Stealth Cooldown, not sure what happened.

    Quote

    5/ How is Spell cast on condition (232) affected by this? It doesn't really tick, they get by event. Could it mean that, should the event be fired in very rapid succession [1], such a spell would be able to trigger ~3 times more often under haste? Or is the haste effect supposed to affect effect #232 only when used with condition #10 "Unknown (every round)"?

    Trigger conditions 1-6, 8-9, 13-15, and 18-21 are normally checked once per round.  Haste/Slow affect their check frequency the same as the other listed opcodes.

  9. A weapons first ability header is always treated as a weapon ability, regardless of it's ability location. It still affects it's presence on the action bar, and whether it can be activated as an item.  A weapons additional abilities are locked into their location function.

    A spells ability location is not considered when selecting spells through op214(select spell) or op234/257 (contingency/sequencer creation), allowing spells that can be known/memorized but not cast unless through one of those opcodes.  Also useful if you're creating a custom identify spell that can only be accessed through the inventory UI - more or less how the vanilla identify spell functions (though fully hardcoded).

  10. 24 minutes ago, Raduziel said:

    I was also trying to identify this offset (658) looking into the ITM file format to see what could be wrong but was unable to locate said offset.

    Looks like one of the items ability and/or effect indexes/offsets isn't correct.

    658 = 0x292 = base (0x72) + 2 abilities (0x38 * 2) + 9 effects (9 * 0x30)

    It's likely trying to read the opcode (READ_SHORT) of a non-existent 10th effect.

     

  11. "Black" entangle, EE-only.

    Overlay effect in mh#wiz44 updated in archive. Just need to Add&Assign the projectile to test.

    Projectile tentacles are 2x size (to better fit the EBT spell, easy to reduce back to 1x if desired), wrapping tentacles size unchanged.

    There is some unavoidable quality loss in the tentacle animations, since a "black" projectile cannot utilize transparency (as black is the color converted to transparency). The entangle animation is especially a PITA because of this.

    EVBLTENT.zip

  12. 2 hours ago, Guest Spellcaster said:

    For the last point, turns out surge #100 "Spell cast normally" is triggered whenever wild surge occurs trying to cast Fire Shield (Blue) and (Red), Find Familiar or Spell Immunity's main button, before picking the school (school selection is not affected though).

    That means the Fire Shields can be cast as level 1 spells instead of level 4 with zero risk of failure.

    Any spell involving certain opcodes will do this.

  13. IIRC:
    When selecting a kit during chargen, the character is assigned the KITIDS (final column) of KITLIST.2da, based on the ROW# in the K_X_X.2da files, then the KITLIST row for that kit is applied to the creature.

    1. entry # from K_X_X.2da
    2. KITIDS column of row# in KITLIST.2da
    3. (KITIDS - 0x4000) row# in KITLIST.2da: all other columns.
    4. Exceptions for specialists, wildmage, and barbarian, and their hardcoded slots (0x4040, 0x4080, 0x4100, etc...).
  14. 1 hour ago, Luke said:

    @ptifab

    OK, technically speaking some of them are not really bugs (e.g., offsets 0x2, 0x10).

    For instance, let's consider offset 0x2 ("Location").

    Since legal values for these fields never fall outside the byte range, then writing WRITE_BYTE is not that bad (even if the "Location" field of SPL files is 2 bytes long...)

    0x10 (Minimum level) does have a full two-byte range.  Standard spellcasting only utilizes the first byte (0-255), but opcodes that specify casting level (146*2/326*EFF/333) have access to the entire range (0 - 65535).

  15. 2 hours ago, Luke said:

    It's not working for me, even when I directly click on a specific sprite.

    A location/point-targeted spell (ability target 4) cannot be cast on a creature through the UI* - even if you click on the sprite, it's still targeting their location, not the creature.

    * They can target a creature while in a contingency or sequencer, though the sequencer must also contain a creature-targeted spell.

  16. Sorry, had to do some more testing for sleeping/helpless.

    Both ACTSLEEP.IDS and INSTANT.IDS control which actions can be taken depending on whether the creature is sleeping, otherwise helpless, and/or dead.  

    • Sleeping creatures need the action to be listed in ACTSLEEP.IDS to attempt it.
    • Non-Sleeping, but still helpless creatures (held, web, etc...) need the action to be listed in INSTANT.IDS to attempt the action, but do not need the action listed in ACTSLEEP.IDS at all.
    • At least through ActionOverride(), dead creatures need the action to be listed in INSTANT.IDS to attempt the action, and also listed in ACTSLEEP.IDS to avoid crashing when they attempt it.  An action not listed in either won't be attempted while dead through ActionOverride, and therefor won't crash.  "Dead" creatures here applies to those with "STATE_DEAD".
    • Creatures with either "STATE_STONE_DEATH" or "STATE_FROZEN_DEATH" set without "STATE_DEAD", as far as I've seen, will not attempt actions unless they are listed in both ACTSLEEP.IDS and INSTANT.IDS (they aren't attempted, and therefor do not crash, if they're only listed in INSTANT.IDS).
    • Actions ordered upon a dead creature through the UI will be attempted (though likely fail), whether or not they are listed in INSTANT.IDS, and will crash if not listed in ACTSLEEP.IDS. Only example I'm aware of: It is possible to have a dead party member selected, and ordering them to move will crash unless the relevant movement actions have been added to ACTSLEEP.IDS.
    • Some actions can be added to either/both files and will function as expected, but I've never gone through and made a comprehensive list of which actions can/cannot be added.  Many of those actions can be attempted, but will still fail, usually those that require a valid target, as they cannot locate(dead) and/or reach(dead/helpless) said target.
    • The "Pause Target" effect (op165) has some oddities, such as frequently not performing any actions until after opening a menu (inventory, options, record, etc...), so I'm not certain about it's restrictions.

    * Some of these may have exceptions - they're are too many actions to fully test.

  17. Too many negations:

    You have: NOT ( [<5000 Gold] OR NOT ([>4 Backstab] OR [NOT THIEF]) )

    With 5000+ gold and ("not a thief" or >4 Backstab) :

    = NOT (FALSE OR NOT (FALSE OR TRUE) )

    = NOT (FALSE OR NOT (TRUE) ) = NOT (FALSE OR FALSE) = NOT (FALSE) = TRUE (incorrect, as they were "not a thief")

    You want: NOT ([<5000 Gold] OR ([>4 Backstab] OR [NOT THIEF]) )

    146: <5000 Gold

    151: >4 Backstab

    152: NOT THIEF

    153: (151 OR 152) - remove the negation on this one (use relation 0x103/259)

    154: NOT (146 OR 153)

×
×
  • Create New...