PDA

View Full Version : NPC User Guide



dradams
February 10th, 2018, 14:32
I am always impressed by how terrible the documentation is for Fantasy Grounds. I don't want to sit through a video; I don't want to attend a group meeting. I just want a detailed user guide. The wiki is almost hilariously deficient in details and missing information. Today's example is NPCs in PFRPG. Does anyone know how I can get information about the following?

What characteristics, for each field, will be parsed by FG? What is the the exact nomenclature required by the parser (order, capitalization, spaces, delimiters, etc). I understand and use effects (although they don't always seem to work reliably).

Problematic entries include damage reduction. For instance, one NPC entry from the 3.5 monsters module has the following:

"Damage reduction 10/cold or good, darkvision 60 ft., immunity to electricity and poison, resistance to acid 10, cold 10, fire 10, spell resistance 18, telepathy 100 ft., tongues"

Does any of that parse? Clearly not all of it. No semi-colons? DR is half capitalized and does not use the effect nomenclature (DR: 10 cold,good).

Here is the SQ field from the PFRPG Bestiary

"DR 10/cold iron or good; Immune electricity, fire, poison; Resist acid 10, cold 10; SR 18; change Shape (alter self, small or medium humanoid)"

Now, has DR instead of Damage reduction, but no colon. This is a "phrase" to quote the effects page (iron or good). However the next section uses a comma delimited list (with spaces).

We've been using this system for years and I still am flabbergasted by the fact that the developers haven't bothered to create adequate documentation. This is such a frustrating product.

Trenloe
February 10th, 2018, 14:59
FG primarily uses the format in the statblock standard detailed here: https://paizo.com/pathfinderRPG/prd/bestiary/introduction.html

dradams
February 10th, 2018, 19:04
Thank you for replying with that information. Indeed, the overall organization follows that scheme. However, this has not been at all helpful to answer questions of the type I posted. I need a reference for the specifics. I'm not sure if there are gurus on the forum somewhere, but I'd love to discover some hidden cache of information that seems oddly and perennially missing. Perhaps the community considers this open source. It does fall somewhere between the actual fantasy grounds engine and the (exorbitantly expensive) pathfinder reference literature.

Moon Wizard
February 10th, 2018, 19:09
If a creature's data record follows the same statblock as standard monsters from the Monster Manual, it should just parse.

For the example you gave, it appears to be from the Succubus in the 3.5E Monsters module:
"Damage reduction 10/cold iron or good, darkvision 60 ft., immunity to electricity and poison, resistance to acid 10, cold 10, and fire 10, spell resistance 18, telepathy 100 ft., tongues"

When I drop the NPC from the campaign list to the combat tracker, I correctly get SR 18 in the defense section and this effect automatically configured:
"DR: 10 cold iron or good; IMMUNE: electricity; IMMUNE: poison; RESIST: 10 acid; RESIST: 10 cold; RESIST: 10 fire; DMGTYPE: chaotic,evil"

That looks correct to me.

As for improved documentation, we welcome anyone who wishes to step up and expand the wiki with more detail.

Regards,
JPG

dradams
February 10th, 2018, 20:05
I do appreciate your reply, but you didn't answer any of my questions.

I gave *two* examples with different representations of the same creature. Are you saying that either of them would work in an identical manner? That doesn't sound likely. Because there is no documentation, we basically have to keep trying things until we find something that works. That is a pretty miserable way to figure out a software package.

>when I drop the NPC from the campaign list

I don't understand what you mean by campaign list. Is that term defined in some documentation I don't have access to? I do understand modules, but there are inconsistencies as I pointed out. I just don't know what the rules are for creating a new creature (or modifying an existing one).

>anyone who wished to step up

Aren't you a business? If this were free, open source software I'd be right there with you.

Moon Wizard
February 10th, 2018, 21:10
>I gave *two* examples.

We built the parsing engine to address particular phrases used in the 3.5E OGL and the Pathfinder OGL. Either of those representations should work. If you are creating your own creature and want something similar, we recommend copying from an existing creature and editing to fit your new creature, so you have the same phrase syntax.

>I don't understand what you mean by campaign list.

The campaign lists are all available via the sidebar. It's where all records of a specific type, whether local or module, are available. (such as Images, Stories, Items, etc.)
https://www.fantasygrounds.com/wiki/index.php/Campaign_Data

>Aren't you a business? If this were free, open source software I'd be right there with you.

Detailing every minute aspect of a very complex system is outside the bounds of what we can do with the resources we have available. The RPG VTT market is a niche of a niche market, so we never have as many resources as we like. That is one of the reasons why we focus on supporting and enabling our community; and we feel the community is one of the strongest reasons to use our product.

Basically, we can either build lots of cool features and automation as well as keep up with new game system and module releases, or we can divert a lot of time to documenting everything to fine detail. We've found that slow-moving targets in this market disappear quickly, so we strive for doing the right thing with standard publisher data at about the 80-90% automation mark.

Regards,
JPG

dradams
February 10th, 2018, 21:23
Thank you for taking the time to reply.

I realize that theme creation, ruleset modification, and functionality extensions are very large topics. You shouldn’t be responsible for teaching people Lua. However, some very-basic functionality (like parsing NPC fields) has not changed since I first purchased the software. It is also both essential and (in my experience) easy to render non-functional. Your examples did not answer the question because you just said that you dropped in something and it worked. The campaign list concept is not really helpful because you could add anything there. An NPC definition could work perfectly or be completely non-functional. That isn’t a reference source—it is just an instance of whatever was put into it.

I feel that I’m having a difficult time communicating what is needed here. There are fairly few fields in the NPC specification. I can’t find any documentation about the rules by which they are parsed. Do those rules exist somewhere? What are the acceptable formats for delimiting lists? You mention 3.5E OGL and Pathfinder OGL and particular phrases. That is exactly what I am trying to find. Where are these specifications? [It turns out that these are simply the game rules. They do not contain specification of how programming entities should be represented -D] When I look across modules, I see a variety of approaches. The result of all this that I spend a lot of time during gaming sessions having the same conversation: “Oh, sorry, I see that such-and-such didn’t work correctly that time. I’ll make a manual adjustment. I’m not sure why it didn’t work for this creature since it worked for the last one.”

Personally, I’d rather see no new features for the next year and some adequate documentation for core functionality. I think that most of the community is heavily invested in creativity. If that wasn’t case, and if people only used pre-prepared material, then your approach would make perfect sense.

-David

From: Fantasy Grounds Support [mailto:[email protected]]
Sent: Saturday, February 10, 2018 3:44 PM
To: [email protected]
Cc: Fantasy Grounds Message Boards
Subject: Re: Reply to thread 'NPC User Guide'

David,

Thanks for your feedback.

>I gave *two* examples.

We built the parsing engine to address particular phrases used in the 3.5E OGL and the Pathfinder OGL. Either of those representations should work. If you are creating your own creature and want something similar, we recommend copying from an existing creature and editing to fit your new creature, so you have the same phrase syntax.

>I don't understand what you mean by campaign list.

The campaign lists are all available via the sidebar. It's where all records of a specific type, whether local or module, are available. (such as Images, Stories, Items, etc.)
https://www.fantasygrounds.com/wiki/index.php/Campaign_Data

>Aren't you a business? If this were free, open source software I'd be right there with you.

Detailing every minute aspect of a very complex system is outside the bounds of what we can do with the resources we have available. The RPG VTT market is a niche of a niche market, so we never have as many resources as we like. That is one of the reasons why we focus on supporting and enabling our community; and we feel the community is one of the strongest reasons to use our product.

Basically, we can either build lots of cool features and automation as well as keep up with new game system and module releases, or we can divert a lot of time to documenting everything to fine detail. We've found that slow-moving targets in this market disappear quickly, so we strive for doing the right thing with standard publisher data at about the 80-90% automation mark.

Regards,
JPG

Moon Wizard
February 10th, 2018, 21:31
To clarify, the idea is that you enter any NPC specifications similar to any similar examples you find in the 3.5E OGL or Pathfinder OGL. I'm not sure if there are any specific guidelines for how the OGL data is built-up or laid out; so we had to build out the parsing to work with specific examples pulled from the OGL data itself. If there are specific examples of features that are supported by the current parsing in other creatures but you can't get the wording right, please post on the forum, and either myself or other community member will jump in to help.

We have actually found that the vast majority of users use pre-prepared materials, and never utter a word on the forums. We have to balance what we see in actual usage versus the desires of the more communicative forum community. We try to slowly build in features for both audiences, as well as work on new capabilities on the back end.

Regards,
JPG

ddavison
February 10th, 2018, 22:52
Remember that 3.5E OGL and Pathfinder are slightly different. The styles used within products from each of those use slightly different formats. For both of those systems there are hundreds of different publishers who all "mostly" fall the same formats but don't always. If you can find documentation for OGL NPC statblocks that cover all the bases and/or the same for the Pathfinder OGL, then use those. We built the parsing based on simply looking at examples across a wide range of products we received.

Here is the available online documentation for the 3.5E NPC statblock. You'll note that it doesn't adequately cover every possible permutation.
https://www.d20pfsrd.com/bestiary/rules-for-monsters/monster-entry-format/

Pathfinder lists this information:
https://paizo.com/pathfinderRPG/prd/bestiary/introduction.html

If you copy from a Pathfinder statblock, 95% or more of those should parse properly within Fantasy Grounds. If you find exceptions, you can report those to the bug reports for whichever game system has the problem. It may be a bug with the parser or it may be an error with the formatting by the author of that creature.

dradams
February 10th, 2018, 23:36
There is some formatting in those documents, as well as an order, etc. However, again, computers (as you well know) don't understand semantic concepts. They understand syntax. Here is sort of what I am looking for.

Title Field: Nothing is parsed in this field

Type: All parts of this field are potentially parsed. The following attributes can be specified here: alignment, size, type, and subtype. Entities in this text box should be separated by an arbitrary number of spaces (>0), but no other type of delimiter. Only one type of any given entity should be specified. If multiple are specified, only the first will be used. Capitalization is not important unless otherwise mentioned. The alignment can be specified by a one or two letter code (LG, CG, NG, N, LE, CE, NE). Both characters must be in caps. Alternately, the alignment can be spelled out. If so, capitalization is unimportant and the two components of a compound alignment should be separated by a single space, e.g. "Lawful Good". The Size should be one of [usual list Gargantuan, Colossal, etc., perhaps referencing on of the OGL documents you mention]. Types should be one of [usual list Aberration, Animal, Construct, again perhaps referencing an OGL version and section]. Subtypes should be one of [same idea]

Initiative: This should be a signed integer with no other information

Senses: This can be a combination of parsed and non-parsed entities. Individual concepts should be separated by a semi-colon or colon. An arbitrary number of spaces can be used as separators unless otherwise specified. Capitalization is not important unless otherwise specified. Unrecognized concepts will be ignored. The following concepts may be included: Skill rolls, e.g. "Perception +15", [I don't know what else can go here, but you get the idea]

AC: This text box follows the general format in OGL. The format is as follows
Total armor class "[positive integer]", comma, space, touch armor class "touch [positive integer](optional)", comma, space, flat-footed armor class "flat-footed [int](optional)"

This isn't perfect, but do you get what I am saying? The problem with your approach is that it does not work very well for trying understand the fields with mixtures of formatted and unformatted/unparsed data (SQ for example).

Moon Wizard
February 10th, 2018, 23:49
I think that the best answer still is to use the examples from the OGL, and customize to your use in exactly the same format.

While I understand what you are asking, it's not straightforward or very understandable to represent a word-parsing state machine as a written description, which really just ends up being a bunch of examples of word order from the OGL.

If you would like to generate the level of documentation you would like, I can point out the relevant code sections for you to peruse.
rulesets/3.5E/scripts/manager_actor2.lua: isCreatureType, isSize, isAlignment
rulesets/3.5E/scripts/manager_combat2.lua: addNPC

Regards,
JPG

ddavison
February 11th, 2018, 00:01
I completely get what you are saying. That doesn't exist, unfortunately. The rules were set up by non-techie folks and then used by non-techie folks whenever they created new content. The LUA scripts are open source if you really want to dig in, but most people just care that the monsters from a published book work or not.

Ken L
February 11th, 2018, 01:30
FG's PF/3.5 ruleset does some merging.

Immunity, Reistances, DR, SR and such are all in the 'SQ' field.

It's not clear compared to say the 5e sheet which has fields for each discrete detail. I think this is a carry over from 3.5, but it's too far ingrained in the system to change as there's a bunch of stuff out there that expect this behavior now.

It does need to be documented though.

dradams
February 11th, 2018, 13:53
>Exactly the same format
It isn't just word order as we have been discussing. It is an exact (though I agree slightly variation-tolerant) vocabulary, set of delimiters and other structure that is compatible with the regular expressions you have written into the scripts. Thanks for the code snippets. I'm still disappointed that your staff can't be bothered to create this documentation, but this is exactly what I need to do it for myself.

dradams
February 11th, 2018, 14:51
Okay, so the code for the damage reduction parser seems to be what is included below. I have some basic questions; Lua isn't a language I use.

The SQ and only the SQ string is parsed for a possible indication that there is damage reduction. This is part of an SQ words while loop, so theoretically multiple instances of a given concept, e.g. DR could be ingested.

The first question is how the StringManager function works.
I went to https://github.com/joshuha/Fantasy-Grounds-foundations-core/tree/master/scripts, but I'm not sure which core script this is included in (or if it is a Lua builtin). The reason that this is important is that you can't tell from the local context how the isWord method defines a word. That is important to know to help understand what delimiters work. The key line appears to be


local aSQWords = StringManager.parseWords(sSpecialQualities);

If you can point me to how words are defined, the rest looks fairly straightforward. In particular, how would this line be parsed?


can't be knocked back (bastion boots); DR 5/-; DR: cold 10, evil 10; damage reduction evil 10, cold 10, dr magic 10, slashing 10, invisibility


The recognition of a word as damage reduction appears to be a string match with "dr" (case?) or "damage" AND "reduction" in any order. The script then creates a table of DREffects by type. It looks like the last-ingested DR of any given type would be put into the table (not a sum and not the largest).

There is a list of canonical damage types (DataCommon.dmgtypes) plus some syntactical exceptions like "cold iron", and ruleset exceptions, e.g. magic and epic. And and or appear to do the same thing.












-- DAMAGE REDUCTION
elseif StringManager.isWord(aSQWords[i], "dr") or (StringManager.isWord(aSQWords[i], "damage") and StringManager.isWord(aSQWords[i+1], "reduction")) then
if aSQWords[i] ~= "dr" then
i = i + 1;
end

if StringManager.isNumberString(aSQWords[i+1]) then
i = i + 1;
local sDRAmount = aSQWords[i];
local aDRTypes = {};

while aSQWords[i+1] do
if StringManager.isWord(aSQWords[i+1], { "and", "or" }) then
table.insert(aDRTypes, aSQWords[i+1]);
elseif StringManager.isWord(aSQWords[i+1], { "epic", "magic" }) then
table.insert(aDRTypes, aSQWords[i+1]);
table.insert(aAddDamageTypes, aSQWords[i+1]);
elseif StringManager.isWord(aSQWords[i+1], "cold") and StringManager.isWord(aSQWords[i+2], "iron") then
table.insert(aDRTypes, "cold iron");
i = i + 1;
elseif StringManager.isWord(aSQWords[i+1], DataCommon.dmgtypes) then
table.insert(aDRTypes, aSQWords[i+1]);
else
break;
end

i = i + 1;
end

local sDREffect = "DR: " .. sDRAmount;
if #aDRTypes > 0 then
sDREffect = sDREffect .. " " .. table.concat(aDRTypes, " ");
end
table.insert(aEffects, sDREffect);
end

dradams
February 11th, 2018, 18:49
More script diving. In the CoreRPG.pak I found the script manager_string.lua. I presume that this is the code for the string parsers.

Given this line in manager_combat2.lua


local aSQWords = StringManager.parseWords(sSpecialQualities);

I presume that this section from manager_string.lua parses the line


function parseWords(s, extra_delimiters)
local delim = "^%w%+%-'’";
if extra_delimiters then
delim = delim .. extra_delimiters;
end
return split(s, delim, true);
end

Given that no extra delimiters are passed, does this mean that anything is a delimiter if it is not an a-zA-Z0-9 (%w), a plus sign, a minus sign, a hyphen, a single quote, or a backtick? If that is true, the array of words from this example


can't be knocked back (bastion boots); DR 5/-; DR: 10 cold, evil 10 dr 10 cold and evil or adamantine, bludgeoning and piercing 10, evil 10; damage reduction 5 evil cold dr magic 10, slashing 5, invisibility

would be

can't
be
knocked
back
bastion
boots
dr [because of the prior string.lower call]
5
-
dr
10
cold
evil
10
dr
10
cold
and
evil
or
adamantine
bludgeoning
piercing
10
evil
10
damage
reduction
5
evil
cold
dr
magic
10
slashing
5
invisibility


If that is right, then the effects table would have

DR: 5
DR: 10 cold evil
DR: 10 cold and evil or adamantine bludgeoning piercing
DR: 5 evil cold

What I am missing is the following:

1. If where does the word pointer (i) get moved forward two words if the term "damage reduction" is detected?
2. Is there a test to make sure that the word following dr is a number? I don't see an equivalent of what happens in Hardness:


if StringManager.isWord(aSQWords[i], "hardness") and StringManager.isNumberString(aSQWords[i+1]) then

dradams
February 13th, 2018, 23:49
And, I'm on my own from this point. QED regarding customer care.

Moon Wizard
February 14th, 2018, 00:56
Not sure what you're referencing. I must have missed your previous post, but it seems from the previous posts that you were digging into what you needed.

Our official answer is that the code is designed to work with the core monsters as written, according to the official SRD stat blocks. If you want to create custom NPCs with similar special qualities, our official answer is to copy from an existing NPC and change out words. Other than that, we are not able to commit to the level of documentation that you are apparently looking for.

If you are looking for more help digging into more detail, I'll be happy to answer your questions, if I have time. I'm also responsible for many other portions of the company, so I'm not always available.

To answer your specific questions:
* Your interpretation for StringManager.parseWords seems correct.
* Each DR (or damage reduction) string is parsed as a separate effect.
* The word pointer for "damage reduction" does not technically need to get moved two places, since "reduction" will not match "damage" on the next pass.
* The test for the DR number string is a few lines below the test for "dr" or "damage reduction".

Regards,
JPG

dradams
February 17th, 2018, 21:08
Thanks for writing back. I'm sorry you changed forum software. This one seems a bit buggy.

Anyway:

Let's assume that the original damage reduction text looks like this


Damage Reduction 10 good


This gets parsed to this list


damage
reduction
10
good


first, damage followed by reduction gets recongized. Let's step through the code



-- DAMAGE REDUCTION
-- the next line gets us into the loop because damage is followed by reduction
elseif StringManager.isWord(aSQWords[i], "dr") or (StringManager.isWord(aSQWords[i], "damage") and StringManager.isWord(aSQWords[i+1], "reduction")) then
if aSQWords[i] ~= "dr" then --this condition is not true, therefore i still equals 1
i = i + 1;
end

if (aSQWords[i+1]) then --something exists at aSQWords[2], so the condition is true
i = i + 1; --i is now incremented to 2
local sDRAmount = aSQWords[i]; --sDRAmount is now set to aSQWords[2] which is "reduction"
local aDRTypes = {};

while aSQWords[i+1] do
if StringManager.isWord(aSQWords[i+1], { "and", "or" }) then --this condition is not true
table.insert(aDRTypes, aSQWords[i+1]);
elseif StringManager.isWord(aSQWords[i+1], { "epic", "magic" }) then --this condition is not true
table.insert(aDRTypes, aSQWords[i+1]);
table.insert(aAddDamageTypes, aSQWords[i+1]);
elseif StringManager.isWord(aSQWords[i+1], "cold") and StringManager.isWord(aSQWords[i+2], "iron") then --this condition is not true
table.insert(aDRTypes, "cold iron");
i = i + 1;
elseif StringManager.isWord(aSQWords[i+1], DataCommon.dmgtypes) then --aSQWords[2+1] is "10" which is not in the dmgtypes list
table.insert(aDRTypes, aSQWords[i+1]);
else
break; --nothing matched; we break out of the while loop
end

i = i + 1;
end

local sDREffect = "DR: " .. sDRAmount; --we create a local variable sDREffect which now equals "DR: reduction"
if #aDRTypes > 0 then --nothing was added to the aDRTypes list, so this condition is not true
sDREffect = sDREffect .. " " .. table.concat(aDRTypes, " ");
end
table.insert(aEffects, sDREffect); --"DR: reduction" added to the end of the aEffects list
end


I presume that “DR: reduction” gets filtered out later, but this damage reduction format in the SQ text will never produce a correctly formatted effect. Is that right?

damned
February 17th, 2018, 21:52
hey dradams keep up the good work.
click on the theme at bottom left of the creen and choose FGResponsive for some reason it occasionally reverts back on some browsers...

Moon Wizard
February 17th, 2018, 22:04
dradams,

I always like to use a concrete example of something that should work. (i.e. a creature from a core bestiary with the example text)

In this case, I found the "Demon, Vrock" in the 3.5E Bestiary module (OGL data) that has the special quality field text of
"Damage reduction 10/good, darkvision 60 ft., immunity to electricity and poison, resistance to acid 10, cold 10, and fire 10, spell resistance 17, telepathy 100 ft."
This seems to match your example.

I tested dropping this creature into the combat tracker, and it successfully parsed the special qualities (and other fields) to produce the following effect:
"DR: 10 good; IMMUNE: electricity; IMMUNE: poison; RESIST: 10 acid; RESIST: 10 cold; RESIST: 10 fire; DMGTYPE: chaotic,evil"

Regards,
JPG

dradams
February 18th, 2018, 04:29
Hi Moon Wizard,

Thanks for the post. I'm glad to see that your example worked--that is always a good reality check. However, that means that my analysis of the code is flawed somehow. Could you look and see if you could see what my error was? I can't make an exhaustive guide until I understand how the script works and I'm clearly missing something.

Also, your example seems to have lost the spell resistance?

-D

Andraax
February 18th, 2018, 06:06
The first question is how the StringManager function works.
I went to https://github.com/joshuha/Fantasy-Grounds-foundations-core/tree/master/scripts, but I'm not sure which core script this is included in (or if it is a Lua builtin). The reason that this is important is that you can't tell from the local context how the isWord method defines a word. That is important to know to help understand what delimiters work. The key line appears to be


local aSQWords = StringManager.parseWords(sSpecialQualities);


Bit of a hint. Go to the base.xml of the ruleset you're using, and look for where "StringManager" is defined - it should point to a LUA script. This script should contain the "parseWords" function. You can then look at how it parses words. If you don't find it in the ruleset you're looking at (3.5 or Pathfinder, I assume) then you need to go look at the base.xml file in the ruleset that it's derived from (CoreRPG in many cases). You should find a line like:


<script name="StringManager" file="scripts/manager_string.lua" />

The LUA script file is relative to the folder you found the base.xml file containing the line.

Also, it's easier to dig through the code locally rather than visiting someone's github repository. Just copy the ruleset ".pak" file to a ".zip" file and unzip it.

damned
February 18th, 2018, 06:24
This code: https://github.com/joshuha/Fantasy-Grounds-foundations-core/tree/master/scripts
belongs to an old ruleset Foundations Core which has little relation to the CoreRPG and 3.5e/PFRG rulesets which you are documenting.
Do as Andraax suggests and unpack these rulesets and examine them.

Trenloe
February 18th, 2018, 13:01
Also, your example seems to have lost the spell resistance?
SR is populated in a specific field in the combat tracker (in Defenses). It is no an effect, so you won't see it there.

Moon Wizard
February 18th, 2018, 22:18
dradams,

You asked for why your analysis was incorrect. I'm not sure exactly which example you are referring to, so I'll respond to this one:
https://www.fantasygrounds.com/forums/showthread.php?42346-NPC-User-Guide&p=377181&viewfull=1#post377181

If the special qualities field is "Damage reduction 10/good", then aSQWords = { "damage", "reduction", "10", "good" }.

The following code sequence follows, and produces an effect of "DR: 10 good". Note: I only include the relevant lines where conditionals match. If I didn't list that code, it's not triggered and thus not relevant.



local i = 1;
while aSQWords[i] do
...
elseif StringManager.isWord(aSQWords[i], "dr") or (StringManager.isWord(aSQWords[i], "damage") and StringManager.isWord(aSQWords[i+1], "reduction")) then
if aSQWords[i] ~= "dr" then
i = i + 1;
end
if StringManager.isNumberString(aSQWords[i+1]) then
i = i + 1;
local sDRAmount = aSQWords[i];
local aDRTypes = {};
while aSQWords[i+1] do
...
elseif StringManager.isWord(aSQWords[i+1], DataCommon.dmgtypes) then
table.insert(aDRTypes, aSQWords[i+1]);
...
i = i + 1;
end
local sDREffect = "DR: " .. sDRAmount;
if #aDRTypes > 0 then
sDREffect = sDREffect .. " " .. table.concat(aDRTypes, " ");
end
table.insert(aEffects, sDREffect);
end
...
i = i + 1;
end
if #aEffects > 0 then
EffectManager.addEffect("", "", nodeEntry, { sName = table.concat(aEffects, "; "), nDuration = 0, nGMOnly = 1 }, false);
end


JPG

dradams
October 31st, 2020, 22:34
I haven't had a chance to work on this for a while, but I was just wondering if any effort is being made to update the pathfinder 1.0 ruleset now that the Unity version of FG is being developed. For instance, is there an effect that will prevent critical hits on a monster that is immune to them?

Kelrugem
October 31st, 2020, 23:47
I haven't had a chance to work on this for a while, but I was just wondering if any effort is being made to update the pathfinder 1.0 ruleset now that the Unity version of FG is being developed. For instance, is there an effect that will prevent critical hits on a monster that is immune to them?

There is already such one for a long time :) IMMUNE: critical :)

dradams
November 1st, 2020, 01:06
There is already such one for a long time :) IMMUNE: critical :)

Thank you. Great!!

Kelrugem
November 1st, 2020, 01:29
Thank you. Great!!

https://fantasygroundsunity.atlassian.net/wiki/spaces/FGU/pages/950877/PFRPG+and+3.5E+Effects

There is a list of effects :) (but I just saw that this piece of information is not there, but that effect exists :D Besides immunity against crits, there is also immunity against sneak attacks by IMMUNE: precision (make sure that sneak attacks have the precision damage type then) :) )