Jump to content

suy

Members
  • Posts

    223
  • Joined

  • Last visited

Posts posted by suy

  1. Some small pieces of feedback from someone who started doing a bit of real WeiDU just after you published the doc, and now it's doing some more (on his way to make an actual mod maybe):

    • The part about AUTO_EVAL_STRINGS is not explained, and IMHO, with the documentation from WeiDU close to not saying anything meaningful to a learning, it's too problematic to understand that it might be very likely needed. I got hit by wanting to pass a string to a custom function, and using exactly the same syntax as in one of the snippets, it wasn't working. The AUTO_EVAL_STRINGS fixed it because it was suggested to me. Then with a bit of imagination the WeiDU docs started to make a tiny bit of sense (but still not much).
    • Scope of variables seem also completely missing from the course and almost missing from WeiDU's docs. That's a massively important topic to me! Everything looks kind of global by default, which is convenient but scary. Are the variables defined to iterate on loops global as well? All of this is a pity that it's not covered, as most languages do not use globals that often. I'd set aside performance considerations, though, specially given the above comments, where it seems the results are not easy to reproduce. Changes in WeiDU's implementation could change performance from version to version significantly, also. I don't know about OCaml, but I know of a few data structures in C++ that do copy on write or structural sharing, and would be a non-issue for copying scopes (in terms of performance). I suppose this techniques are evolving often in functional languages.
    • When to use ACTION/OUTER/PATCH_SOMETHING is an incredible mess to me (I suppose one gets used to in the end). I'm making some notes, but I think I'll end up making a table to print and set on the wall. I'll try to make it in some format that you might paste at the end of the course, or attach it here in someone else wants it, because I think a kind of "reference" is necessary. Likewise for the setting and interpolating of variables. Once I can make some sense of it myself, I try to put it down to have it as the typical beginner's "cheat sheet".
  2. I suggest a bit of clarification about the difference from ongoing and open. By checking the existing ones tagged with the former, I understand that very few should be tagged like that, and are issues like typos/spelling things, where it is not expected to tackle them all, ever, so the thread can't rarely go into other tag in the near future. Is that so?

    Additionally, I think that "open" and no tag are roughly the same (maybe just at a glance, and just to me 🙂 ), so maybe I would simplify it by not having this tag, and then do a bit less effort tagging. In bug trackers, the "open" name is sometimes used by default when an issue is filled, for example. If that can be done on the specific subforum, then great.

  3. Thank you, @subtledoctor. I've imitated your approach, and I think I got it right.

    OUTER_SET bastardSwordProficiencyId = 89
    OUTER_SET slingProficiencyId = 107
    
    OUTER_FOR (proficiency = bastardSwordProficiencyId; proficiency <= slingProficiencyId; ++proficiency) BEGIN
        OUTER_FOR (value = 1; value <= 3; ++value) BEGIN
            // Set the file name to S_SxyzTv.SPL ("set xyz to v"). Make all
            // proficiencies have 3 digits.
            OUTER_TEXT_SPRINT fileName "S_S0%proficiency%T%value%.SPL"
            ACTION_IF (proficiency >= 100) BEGIN
                OUTER_TEXT_SPRINT fileName "S_S%proficiency%T%value%.SPL"
            END
    
            // Copy from the template, and change the values.
            COPY "glass-cannon/set-proficiency-if-higher-template.spl" "override/%fileName%"
            LPF ALTER_EFFECT INT_VAR match_opcode = 233
                parameter1 = %value% parameter2 = %proficiency%
            END
        END
    END
    

    This generates all the spells with the effect that "set to X if higher". Now, I did some quick test, and while I need to generate the full SPL with weidu, a manually created one that uses an op326 to conditionally apply those helper spells works. The user sees 0 proficiencies in character generation, but after selecting some, the ones that I've increased, appear increased in the final screen and in game. The level up seems not to be confused like that.

    I'm still scared that there might be hidden issues because the saved game doesn't look entirely "right": the effects from chargen or level up seem different from the ones added by the CLAB spell. But I guess if you've been using it this time it's a very good sign that the engine can handle it! :)

  4. 5 minutes ago, subtledoctor said:

    Have you tried actually adding the kit to this table? It seems out of place but there are several 2da tables for which this actually works. Worth trying as it would be by far the simplest solution if it works.

    I think I've tried it some time ago, and I also think that Morpheus562 asked Bubb if this could be added to EEex, so that would be the confirmation. But I'll try it again...

    5 minutes ago, subtledoctor said:

    I have also unified the way my several different mods create dialogues to increase proficiencies, into a single portable function. Set some variables, run the macro, and it spits out an innate ability that lets you choose one extra proficiency, or as many proficiencies as your character should have at a given level. So, Scales of Balance uses this to give a single extra prof for having high INT; and NPC_EE uses it to zero out all of an NPC’s profs and let them choose all new ones instead. It has other uses - Might & Guile uses it to allow one kit to advance a single weapon from proficiency straight to grandmastery. The function is responsive to whatever proficiency system is in place at install time. 

    It has some limits still - I ought to add variable checks to allow restricting the weapon choice if desired. Right now, to restrict the function to melee weapons, Might & Guile has to directly patch the .DLG file after creating it. Not ideal, but it works well enough. 

    Thank you. That's a lot to unpack for me, as I always struggle with WeiDU, but I'll check it out. I think what I've found in NPC_EE is reasonably understandable, if I got it right. It's "just" d5_1prf.spl being altered to bump proficiencies conditionally. That seems it could work in my case.

    5 minutes ago, subtledoctor said:

    How so? The .ITM just uses op146 to cast the innate .SPL…

    I suppose it looks more reliable given that it runs after the character generation, already in game. What I've noticed, is that the CLAB spells seems to be applied just after the user chooses proficiencies. So it might almost the same reliability. But of course your method works, so I'll have to replicate it properly.

    Thank you all!

     

  5. Thanks. I'm not familiar with using mods like NPC_EE, but I think I've read about them using dialogs. In my case, since it's not something "conditional" (I mean, it's always bumping the same proficiencies by the same amount), I thought it would not be needed.

    I'm looking at the source to see exactly which effect is used, but it seems a ton of conditionals that check if the stat is a certain value, then apply a 233 that seems it uses the "set is higher", instead of the "increase". Seems beyond what I can do on WeiDU right now, but I'll give it a shot.

  6. I would like a specific kit to get some extra proficiencies. Since the 2DA tables only allow for the classes to be changed, and don't distinguish by kit, I thought I could work it around by adding at level 1 an extra proficiency point to all the weapons via op233. That is, increase everything from 0 to 1 if the user did not put points, or from 1 to 2 if did. This is not the initial design that I wanted, but seems a good workaround.

    The thing is, I've been able to get the in-game visible outcome that I sort of wanted after character generation, but it breaks after level up because it seems to confuse the game a ton.

    I've used this function:

    DEFINE_PATCH_FUNCTION add_effect_add_proficiency
        INT_VAR proficiency=0
        STR_VAR resource=""
    BEGIN
        LPF ADD_SPELL_EFFECT
        INT_VAR opcode=233 // proficiency modifier
                target=1 // self, but the game seems to use 0 on the gained on chargen
                // target=0 // None
                power=0
                // NI: "# stars", and divided between active and original class.
                // Since it's 4 bytes, it's on the position of "parameter1". IESDP
                // says that the high word (2 bytes) has to be 1 to be "increment".
                // The amount to increase is still on parameter 1.
                // parameter1=0x00010000
                parameter1=1 // proficiency points in "active"
                parameter2=(0x00010000 | %proficiency%)
                timing=9 // Instant/Permanent
        STR_VAR resource
        END // LPF
    END // function

    And I call it one time for each proficiency (89 to 107, skipping 99 because it's halberd, and makes the game crash, as IESDP says). This is added to one SPL that I add to the 1st level column of a CLAB file. I can provide a trimmed down version of the mod if anyone wants to try, it's fairly small.

    As you can see by the comments, I've been trying different combinations till something seemed to work. The normal way in which the game assigns the effects in the saved game is with target=None0, but when I used that, it doesn't work (no visible effect). It has to be target=Self(1), then it shows and applies.

    This does work in that the character ends up at level 1 with one point in everything, but if the character chose one extra point in some weapon, then it can start the game with two. Awesome. The bonuses work, the UI shows it... great!

    But then the level up screen at level 4 goes crazy. See the video, but as you will see, just adding the extra proficiency point in any weapon makes it jump from 1 to 3, and then subtracting it to set it somewhere else increases the number of remaining points to allocate without subtracting from where you clicked. It's pretty crazy.

    I saved the game by just increasing from 1 to 2 in short sword (even though it shows 3 points, like in the video, but it allows to accept), and the saved game has an op233 with a "set if higher" to 2. With the "Increment by one" set by the CLAB it totals 3. So seems that roughly the engine calculates well the totals, but the level up screen does not. 😞

    I've found some other threads about using op233, but seemed that the issues were more with items and non-permanent timings.

     

    2022-11-07 21-52-16.mkv

  7. 4 hours ago, polytope said:

    then Pierce Shield likewise shouldn't be able to lower the magic resistance of monks or wizard slayers because that's due to their special training and conditioning, and doesn't have a magical origin as such.

    No, because both Pierce Shield, Lower Resistance or Greater Malison have a fixed reduction of some stat (irrespective of if you have it increased from your normal, or not). Breach doesn't reduce your stats in fixed ways. It doesn't apply penalties, it cancels existing spells. The same way that Remove Magic. Which only removes magic. And doesn't dispel Hardiness because it's not magic. 😛

    Breach and Dispel Magic are "reset to normal" or "cancel temporary effects".

    IIRC, Breach does cancel some potions (or at least I vividly remember experiencing it, but it was with SCS, so might not be in vanilla). I see it coherent that Breach is "reducing AC and saves to the defaults" because it cancelled a Potion of Invulnerability. A Dispel Magic would do the same (when successful, of course). It can also reduce magic resistance if you have it buffed with a potion or spell, again, because Dispel Magic does so. But it doesn't do it at all if you don't have it increased in a temporary way.

    So, sorry, but I don't see the comparison appropriate at all. 😞 I think the valid point to discuss is if things like the HLAs are seen as magical or not. And in that regard, the game is much more consistent to not treating them as such. They IMHO look and behave like the innate abilities of classes, like Defensive Spin.

  8. 4 hours ago, polytope said:

    Don't put too much stock in the descriptions of spells referencing other spells, (...)

    I think you got me wrong. I wasn't thinking about the fact that it quotes a list of spells, but about the fact that it says that affects spells, and IMHO Hardiness is not a spell. For the reasons that I mentioned (can be put in the group of abilities that can be used when silenced, ignores death/wild magic, is not affected by Dispel Magic, etc.).

    To me that's the main deal. Why would an ability, for example, be affected by Breach but not Dispel Magic?

  9. On 11/2/2022 at 11:23 PM, suy said:

    I'm not sure how you see it, but to me, an HLA like Hardiness, Evasion, etc., should have a feeling that it's something non-magical, even though you activate it with an innate ability that for some classes might be a spell (e.g. Lay on Hands, Storm Shield). It should look like Defensive Stance, Enrage, Defensive Spin, etc., but even more powerful.

    To me it doesn't make any sense that those abilities:

    • Can be stopped by dead/wild magic areas.
    • Can be dispelled by Dispel/Remove Magic.
    • Can be breached.

    One small additional thought/question: the spell description says "specific protection spells" and "specific protection spells". I know that the bit of what is a spell is a bit open to interpretation, but... wouldn't this be the key thing to consider? To me it's just something that reinforces that is shocking that Breach can affect this HLAs. If they are not for caster classes, can't be dispelled, can't be affected by silence/dead/wild magic, etc., then should not be breached. If we assume that the developers intended a somewhat coherent design, then the outliers of that design should be bugs. 🙃

  10. Thank you. I still don't understand how you do about the hardest part: how do you decide which mods go first? 😛

    Another thought that I'm having is that seems that a crowsourced list was proposed by AL|EN (at a time when your list already existed, as it's mentioned). According to what I've read on the thread and a comment from AL|EN in the dynamic install order thread, the list did not receive much traction on the community. However, your list seems strong after this years (even though you seem to be the only one on a `git blame`), so it's nice to see that both approaches seemingly can be used. I will give it a thought, and see if I can make a proof of concept tool.

  11. 11 hours ago, subtledoctor said:

    Interesting. Can you check it against this recommended list? 

    I skimmed from the thread where you introduced the tool, and with a bit of diagonal reading, and I did not understand exactly how you cook the list. Can you explain a bit? I've always read from AL|EN that the idea of having a list "would not work because requires a 24/7/365 available maintainer". But maybe that just relates to a more expansive list with conflicts and components. In which ways the list is better or worse than reading the metadata? (aside from not all mods having it, of course :D )

    I'm asking, because, while I'm happy installing mods in a console, having a tool to just show a suggested install order which gets the information from the INI files metadata would be something I would appreciate to have and use. I could also go the extra mile and extract the components names/numbers, and generate a file (or files) that could be used to do the "batch" install procedure so one would not have to babysit the installation of a mod interactively.

    I have already a cross platform native GUI app done (Moebius Toolkit) that has support for configuring game installations. I can certainly add this, and it would not be too much work, I think. At least for a beta release.

    Does anyone else feel that this could be useful to them? Additionally, I can make it both a console tool and a GUI tool. I typically do this already for unit testing the functionality.

  12. 15 minutes ago, polytope said:

    I notice that nobody who thinks the Hardiness HLA shouldn't count as a combat protection has given an explanation of why the devs classed the Resist Magic HLA as a spell protection. It's not just that it has a sectype, it's that the sectype isn't the same and was deliberately chosen to be removable by different things

    I think this is simply because Resist Magic was copy/pasted from Magic Resistance (the Priest spell), then changed accordingly as needed, and this bit was forgotten. Given how spells and items have to be "copy/pasted" from others, and can't use some for of classification where one effect might get defaults from some templates (a bit like in object oriented programming, or like some file formats support), this kind of issues are common.

    Let me just add that I totally understand the position of "we cannot get enough hints that this wasn't intended". If this in the end is part of the "optional but cool" part of the EEFP, and we can use it to have a more consistent game, I'll be happy. It makes sense that maintainers of the EEFP don't want to add things that might be controversial, and might deter people from even using the mod.

    26 minutes ago, polytope said:

    Indeed the Hardiness ability is not, and should not be dispellable because it's not magic. But Breach is not the same as Dispel Magic, it makes the target more vulnerable by removing temporary protections, regardless of the source. If you conceptualize Breach as causing protective buffs to prematurely expire - rather than draining magic - it makes more sense. Another fifth level wizard spell, Lower Resistance, will lower a target's MR regardless of whether it was innate to the creature type, from a class or kit ability (monks and wizard slayers) or from a spell, potion or item. Should monks be immune to Lower Resistance?

    Interesting POV! But I don't see this as a good analogy. :) IIRC, some enemies like Firkraag have the "Reduce Fire Resistance" spell, so it's like some magic is able to target both natural and magic qualities that a creature might have, permanent (e.g. Cavalier or equipped items) or temporary. I see Lower Resistance like that. think both Dispel Magic and Breach should only cancel magic effects. I think that is the most common behavior, and IMHO is the intended behavior, and the occurrences that don't apply are the bugs.

  13. I'm not sure how you see it, but to me, an HLA like Hardiness, Evasion, etc., should have a feeling that it's something non-magical, even though you activate it with an innate ability that for some classes might be a spell (e.g. Lay on Hands, Storm Shield). It should look like Defensive Stance, Enrage, Defensive Spin, etc., but even more powerful.

    To me it doesn't make any sense that those abilities:

    • Can be stopped by dead/wild magic areas.
    • Can be dispelled by Dispel/Remove Magic.
    • Can be breached.

    I'm pretty sure we can find plenty of inconsistencies, but they should be somewhat coherent, and till today, even with all the chatting/reading/watching/playing that I've done, I've never realized that Hardiness is breachable. CamDawg also has found that Assassination is affected by Breach, which is another "fun" finding, but again, it totally seems to me like non-sensical from an in-game perspective. As jmerry said, it's a warrior thing, not a magic thing. Breach has no business with that.

    On 11/1/2022 at 10:33 AM, polytope said:

    Secondly, basically every temporary duration spell or spell like ability (except the EE Dwarven Defender's stance) that increases resistance to any form of damage is classed as a "specific protection" or a "combat protection" and hence stripped by Breach

    Even if this is true, seems a bit like focusing on just one part of the data, hence, skewing the conclusion. Breach also removes Resist Fear or Shield. Enrage also protects against fear, and Defensive Spin also improves AC. How do you see Breach affecting those kit abilities?

  14. Respect the script, I think you can remove a dependency, and make it safer to use, if you replaced pwgen with mktemp. I don't shell-script much, but I think that would be needed. I'm not sure how to remove the zsh dependency (I think that would require using quoting or `find` instead).

    And thanks for the portraits of course. :)

  15. 15 hours ago, subtledoctor said:

    I'm pretty sure SCS actually has something like this. Or partially? Maybe? I don't know why that's in my memory. But it might be possible without resorting to EEex

    What SCS has (or had), is a workaround for a bug present in BGEE 2.5.x (interestingly, only BG2EE, but not BG1EE, because the later had a patch release more). The bug is supposed to be fixed in 2.6.

    The bug would cause an actor with >=100% immunity to a damage, still play the damage animation, scream in pain, and fail a spell.

    The way SCS did work around this (I don't remember if the workaround is still in place in the last version) was by applying full immunity to certain damaging spells while the duration of certain protections was in place. That is, Protection from Magical Energy would not only set 100% resistance to that damage, but also provide immunity to spells like Skull Trap. It wasn't perfect, as there are tons of sources of all sorts of damages in weapons, and abilities, etc., but, did some service.

  16. Thank you for the algorithm, Bubb!

    For completeness, does it apply as well to the "hotkey" that the user can press to swap from melee to ranged? I use them often, and I could swear it pretty much chooses the less appropriate weapon all the time (but my main use case as a user is to swap from ranged to melee while casting a spell is in progress, to protect the caster, as it can be done without interruption). I sometimes have noticed that it is different depending on which slot you put the weapon, so that might make sense with what you posted.

  17. Hey, sorry for acknowledging this so late, but awesome looking images @Luke Telvanni!

    This makes me think on possible features to make it prettier. In the title of the chart you can add some basic HTML formatting to make "rich text", but of course the space is very limited for both typing and displaying. If it makes sense, I could add support for adding text per build/calculation. This I think it would be helpful, because I often try to take notes on what the inputs mean, but I have to shove it all on the title, and it is not as nice.

  18. 9 hours ago, polytope said:

    You're right that we should mostly focus on vanilla, but I think Ascension (like the G3 fixpack) is used by the majority of players now. It's undergone considerable reiterations though, in my version neither yaga.cre nor finyaga.cre at the throne have critical hit protection or backstab immunity, neither does balth.cre & finbalth.cre, nor illasera.cre and finilla.cre while abazigal.cre has simply lost backstab immunity. Significantly finmel01 also loses immunity to backstab and criticals as soon as either Balthazar (if an enemy) or Gromnir (if not) dies.

    You've blown my mind a bit here. 🙂

    I clearly remember that at some point I checked Balthazar's stats and abilities, and had a good chuckle when I realized that it had critical hit protection due to the helmet without animation and some permanent Improved Haste effect (of the Haste2 type, the one granted by GWW, and which is the only source of Haste that a Monk is not immune to). It's funny to me, because the usual complaints vs the Monk class are exactly the lack of Haste and and lack of critical hit protection. A normal character can't have that.

    But I did some quick check, and indeed in my (old) installation of Ascension+SCS, BALTH.CRE doesn't seem to have immunity to backstab nor critical hits. So it might have been a wrong check on my side, or that I checked the vanilla creature as well.

    From the playthrough of that installation, I did not remember enemies having such immunities, but I could have overlooked that, so I'm gonna surely enjoy discovering this again the next ToB run!

    But I surely pleasantly remember when I discovered that a Fallen Planetar can very consistently be killed in one single round with hour humble Rasaad, just with Critical Strike (and his usual equipment, which was of course a Strengh-buffing belt). So it's indeed something that not always we realize, because I don't remember people mentioning this a good strategy for disposing them.

    Thanks.

     

  19. I'd still advice to try a bit harder on the Linux-only setup, as ultimately it will be simpler and a bit more efficient. I've not tried yet the approach with a "native" case insensitive file system like ext4 (this was explained in another thread), but my recipe with ciopfs should work fine. I don't remember the details, but I think we talked about this on Discord. I don't know what went wrong, but we can give it a shot again if you want. :)

  20. 11 hours ago, subtledoctor said:

    Generally only up to level 20. I'm just saying, that stark blue line that appears to set bards so far ahead of F/Ms, could be deceiving since it might have very little effect on the actual game once you're past BG1 levels...

    True, and spells like Fireball are capped at just level 10, so it's indeed not that important for damage based spells.

    The main edge of the caster level is not just for casting Dispel Magic, but also for resisting it, IMHO. If you cast Protection from Fire on someone else, and that someone else is exposed to hostile dispels, making those more likely to fail at dispelling. For example, I remember one playthrough where I noticed how painful it was to have Aerie as only divine caster, as the Death Ward on Keldorn was always dispelled, and he was dying all the time. 🙃

  21. Indeed, those are two good things to add! The access to a certain spell level should be doable without that much effort (but still some). I could do a quick test where I hard-code everything, and I could display that. I'll give it a look. The total number of spells at a certain XP (not just the highest casting level) could also be nice to see.

    The one about average damage with a weapon sounds much more complex, and I cannot even start to imagine how to do it. In the damage calculator I sweep all the complex inputs across a range of ACs. If we add a variable amount of base THAC0, then it's a 3rd independent variable, and it becomes a completely different kind of chart. :) I've not done any 3D chart yet, but don't close the door to it. To make it 2D again, we would have to pick up a reference AC. This is all doable, but I don't know how to lay the controls. If I should make it a separate calculator, or what else to change the existing one.

    Thanks for the feedback, as usual. :)

  22. A Bard, specially a Blade, is often compared to a Fighter/Mage (or even Fighter/Mage/Thief). Both have their pros and cons, of course. But I've always wanted to visualize how the fast level progression of a Bard goes against the slow one of a Mage, specially a multiclassed one. Remember that the Bard or Mage levels determine the caster level, so spells that scale with level (e.g. Skull Trap, Chromatic Orb) will be more powerful by a Bard, even if it can cast less. But how much? Likewise for THAC0. As a Bard your THAC0 only improves by one each 2 levels. Does it lag behind so much? Well, here are some charts!

    The first one is from 0 to 161k XP (the BG1EE cap):

    image.thumb.png.9b74efdcb4d78ec0e879904500c62a36.png

    Notice how the base THAC0 is very briefly better for a Bard (though irrelevant, given that a F/M can get proficiency bonuses), but it soon lags behind. The caster level, however, soon ramps up, and ends up being level 10, compared to the 7th level cap for the F/M.

    Bumping the cap to include SoD, we have:

    image.thumb.png.7acc443e1b76497d3fb783a75dc219e8.png

    Now compare the builds throughout most Baldur's Gate 2 (from 161k to 3M XP, which was the cap in the original SoA).

    image.thumb.png.9e0dcad8ad2f65f6d9ac64d8190d27e7.png

    Differences start to shine! The level progression of the Mage gets stuck a little bit, while the Bard remains strong at gaining levels fast. The THAC0, however, doesn't favor the Bard, even less than before. Since it cannot improve beyond 10 base THAC0, it gets stuck, and the F/M is gonna keep gaining distance at fighting. Remember that the chart is only about base THAC0. The F/M is gonna be much better because fighting because the bonus to damage and the extra attacks (which will improve even further at 2.5M when it reaches level 13).

    Now let's look at the very late game, till the cap in ToB. This is from 1M to 8M XP:

    image.thumb.png.0546e981960b17c53ac3af02d4c222c6.png

    As you can see the trend continued almost the same. The end result is often easier to compare, and probably not that surprising, except for the odd XP gap required to go from Bard level 39 to Bard level 40 (or Thief, which use the same XP progression).

    If you want to see the charts more in detail, and/or if you have a modded installation that affects the XP tables, get Moebius Toolkit, the app that I did and that is used to make the charts. So far I can only compare THAC0 and level, but let me know which other things you'd like to see compared.

  23. 2 hours ago, InKal said:

    pretty much exactly what the spell does. why change the name? why seeking "problems" where there is none? 

    For the same reason that, when speaking to the general public, I can't use the word "hacker" or "hack" anymore like it was supposed to be (roughly speaking, hacker was just supposed to be an enthusiast, and a hack some clever trick, sometimes reliable, sometimes not). In a programmer's circle, I can. It sucks, but such is life. If I want to be properly understood, I must limit myself to the limitations of society. Cam just said it well, though. If you can change the thing to something that doesn't cause a controversy and/or harm to people and it's still meaningful and colorful, why not?

×
×
  • Create New...