I have a request as well. I propose to improve Command Clr 1 spell, which does nothing currently. Instead of nothing do as it is written in PHB. Currently I added simple Prone as workaround in my mods (for NPC sake). But would prefer proper implementation. Also if caster is NPC please query "sp-Command option preference" for options: Approach (1), Drop (2), Fall (3), Flee (4) or Halt (5).
I actually tested in game that solid fog doesn't disable 5-foot steps. I think the code you pasted would disable other movements, because I've played around with similar stuff. You can do it in python with ET_OnTurnBasedStatusInit, the code for what you pasted is something like: Code: def DisableMovement(attachee, args, evt_obj): evt_obj.tb_status |= TBSF_Movement return 0 However, what that does is make it as if the character has already moved that round, I believe. That means they can't do any more movement (I think they might be able to do other things that cost move actions, but not ones that actually move). I don't think you can merely disallow 5-foot step with those flags, because the movement ones are keeping track of what has already been done, not what is allowed. At least, I haven't found a way. I think ActionCheck_5FootStep is the more likely function to disallow 5-foot steps.
@dolio You sure, that it does not disable 5 foot steps? In my tests it seems to actually do it. I can follow your code logic, that it may set that you already moved that turn once. But this would automatically disable 5 foot steps, as you can't take a 5 foot steps when you already moved. This would explain why you can move only once in solid fog. In my Acid Fog version, you can also move only 5 steps, but you can do it twice (spent both actions to move). I think this is in line of what the rules should be, as fog limits to 5 foot, but not in actions. So I think you may use both actions to move. While discussing differences, vanilla Solid Fogs Concealment gets cancelled by True Seeing. I don't think this should be the case, in TS description, Fog is mentioned as an exception. So I implemented it the way, Acid Fog concealment is not canceld by TS. Is this wrong? @Shiningted I will look into it @anatoliy Will look into it
I guess I didn't test in a way that would trigger that particular hook. However, if that is the mechanism, then it's not disabling all possible 5-foot steps. For instance, you can cast solid fog such that the area includes the caster, and then the caster can make a 5-foot step, even though that should no longer be possible (this is the scenario I tested, because others are more annoying to set up). Anyhow, maybe I'm just mis-remembering what all the combinations of turn-based flags do. However, I thought the one set in that code would render the character unable to do any movement, just giving an 'already moved' error, which isn't what solid fog is supposed to do. If you want to try it out, though, the python code I wrote above should be similar to the C code (the C code was wrapping it in a test for some reason, though). It also seems like this could be implemented by just reusing the solid fog condition (if it works the desired way), and having a second aura condition for the acid damage. That was, for instance, how I was going to suggest implementing chilling tentacles if I actually get black tentacles working. It'd be kind of a waste to copy-paste all the black tentacles code just to add cold damage to the area of effect. This assumes there isn't some discrepancy between the two effects, of course, like area of effect. Anyhow, assuming ActionCheck_5FootStep actually does what I think it does, it might be better to fix that than to muck with the turn based flags anyway.
@Sagenlicht I did some more testing, and after a lot of faulty tests, I figured out what you wrote will work. The correct code is: Code: evt_obj.tb_status.flags |= TBSF_Movement in the ET_OnTurnBasedStatusInit hook. Technically that skips disabling the 5-foot step of the caster on the round it's cast (if they're affected), but I guess that's probably not a big deal for the time being.
Thanks for investing the time @dolio I would have a few questions about Acid Fog / fog spells in generall. 1. True Seeing. Vanilla SF concealment gets negated by TS. I don't think this is correct according to the SRD: https://www.d20srd.org/srd/spells/trueSeeing.htm Due to this, my Acid Fog does not query for TS. Is this correct or not? I am not a rules laywer 2. Render Range Attacks useless Vanilla SF reduces ranged damage to 0, I am unsure why it does not set the concealment to 100 for ranged attacks and avoid them in that way. This is what I've done in Acid Fog (marked in the code). This seems more logical to me. Do I miss something there? If my idea is wrong I would need to change it. Attached is the latest version of sp-Acid Fog.
Hmm, I can think of one case where the difference might matter - Aracne Archer seeker arrow/phase arrow.
The indication for having made a 5ft step is actually TBSF_Movement2, but this will also prevent taking a 5ft step since the game regards it as having performed a move action this round.
You are right, these two would ignore Fog Concealment, but aren't those actions labeled as ranged attacks and thus will also reduced to 0 damage by SF (would be wrong as well)? Code Snippet from Seeker Arrow: Code: def SeekerArrowPerform(attachee, args, evt_obj): cur_seq = tpactions.get_cur_seq() arrowTgt = evt_obj.d20a.target min_dist = 10000 #print "Seeker arrow: target is " + str(arrowTgt) # roll to hit # cover bonus won't be applied because it doesn't appear in the ActionCheck callback # TODO: apply a negator condition for the concealment chances evt_obj.d20a.flags |= D20CAF_RANGED evt_obj.d20a.to_hit_processing() isCritical = 0 if evt_obj.d20a.flags & D20CAF_CRITICAL: isCritical = 1 Edit: After thinking for min about it, does ET_OnGetDefenderConcealmentMissChance has evt_obj.data1? If yes, this might be the easiest solution to the concealment problem of the Seeker/Phase Arrow and then Acid Fog would be the better implementaion of the fog concealment problem. Normal Blur etc. can simply query for TS and if you really suppress all concealment you can do something like: Code: def suppressConcealment(attachee, args, evt_obj): if evt_obj.data1 == "Seeker Arrow" #String doesn't work I know; just to show my idea behind it capValue = 0 capType = 19 bonusMesId = xxx evt_obj.bonus_list.set_overall_cap(1, capValue, capType, bonusMesId) return 0 Thanks for pointing this out Sitra, will use the correct flag then
Actually I think SF should protect against Seeker Arrow, hence why the 0 damage would make more sense. About concealment negation, that's not the way to do it. It would be better to add some concealment negation query to the to-hit processor. Speaking of which. I mentioned converting game logic to python - I think the to-hit and damage roll functions are prime candidates for translation. How about it?
Again I am no rules lawyer, but why would Seeker or Phase Arrow not ingore SF? https://www.d20srd.org/srd/prestigeClasses/arcaneArcher.htm I mean Seeker arrow travels around corners, I think Fog shouldn't be a problem then LoS can't be a problem as well, when a corner is no obstacle. Ok Ok