5. statusEffects¶
- 作者:
innoxia, bicobus
5.1. 通用信息¶
状态效果是一套应用在角色上的逻辑。效果可能由各种内容触发,包括战斗动作或法术。能够改变角色的属性。
你可以在 res/statusEffects/innoxia/set_kitty.xml 文件中找到有标注的例子。
5.2. renderingPriority¶
用来决定渲染状态效果图标顺序的整数。数值越高意味着渲染优先度越高(也就是越先渲染)。数值通常从0到100。默认设置为50。因为该状态效果是套装加成,所以比通常的渲染优先度较高。下面是一些渲染优先度的例子:
角色的种族天赋效果拥有1000的优先度,因为我总是想要这种状态效果最先渲染。
天气效果拥有100的有限度(因为我想要这种状态效果尽量优先渲染)。
性取向拥有90的优先度(因为我想要这种效果差不多一开始就渲染)。
绝大多数常规的状态效果(如怀孕、充分休息、醉酒程度等)都拥有90的优先度。
套装加成拥有70的优先度。
<renderingPriority>70</renderingPriority>
5.3. renderInEffectsPanel¶
如果你想要该状态效果显示在受影响角色的状态效果栏中,就应该设置为 true 。该选项通常都会设置为“true”。
<renderInEffectsPanel>true</renderInEffectsPanel>
5.4. beneficial¶
填入以下标签其一:
BENEFICIAL如果该状态效果对于拥有角色有益。NEUTRAL两者都不是。DETRIMENTAL如果有害。
<beneficial>BENEFICIAL</beneficial>
5.5. combatEffect¶
如果你想要该状态效果仅在战斗中渲染,并且在战斗中每一回合都将 applyEffect 元素的内容施加给受影响角色,请设置为 true 。只有该状态效果 仅 在战斗中施加并使用时,才需要设置为“true”。被标记为战斗状态效果的,战斗外则不会施加效果。
<combatEffect>false</combatEffect>
5.6. sexEffect¶
如果你想要该状态效果在性交中渲染,请设置为 true。
<sexEffect>false</sexEffect>
5.7. name¶
该套装加成的 名称(name) 。处于该效果下的角色会以 npc 作为解析变量传入。所以如果你想要引用,可以使用 [npc.name] 等类似形式。
<name><![CDATA[Socks of Power]]></name>
5.8. description¶
该状态效果的描述。处于该效果下的角色会以 npc 作为解析变量传入。所以如果你想要引用,可以使用 [npc.name] 等类似形式。
<description><![CDATA[
By wearing the template socks, you become a sock god#IF(npc.isFeminine())dess#ENDIF!
]]></description>
5.9. imageName¶
用来展示该状态效果的图标的名称。图标必须是svg文件,并且与XML文件放置在同一文件夹下。
<imageName>set_template.svg</imageName>
5.10. colours¶
与该状态效果相关的 colour 。与衣物和武器的换色类似,此处的颜色也会被用作修改上述图片的颜色。此处应该使用 PresetColour 的值,可以从 src/com/lilithsthrone/utils/colours/PresetColour.java 处获取
5.10.1. colourPrimary¶
必须定义一个数值,否则该XML会读取失败。
<colourPrimary>CLOTHING_WHITE</colourPrimary>
5.10.2. colourSecondary¶
可以留空,与其下的“colourTertiary”元素类似。
<colourSecondary/>
5.10.3. colourTertiary¶
<colourTertiary/>
5.11. attributeModifiers¶
拥有该状态效果会影响的属性。 modifier 节点必须包含会被影响的属性,例如 DAMAGE_LUST 。你可以定义任意数量的属性修改项,但最好不要太多。
修改项变量
- value 类型: integer¶
定义该属性会在数值上发生多少改变,可正可负。
<attributeModifiers>
<modifier value="10">DAMAGE_LUST</modifier>
</attributeModifiers>
5.12. combatMoves¶
拥有该状态效果的角色会解锁的 CombatMoves (战斗动作)。 CombatMoves 标识符在构造函数中定义。当支持战斗动作的mod后,其标识符应当在mod文件中描述。(现在已经有了)
参见
CombatMoves 的列表: src/com/lilithsthrone/game/combat/moves
- 示例:
<combatMoves> <move>cat-scratch</move> </combatMoves>
若不需要战斗动作,请插入空标签
<combatMoves/>
5.13. spells¶
受到该状态效果影响的角色将会解锁这些法术。
参见
目前可用的法术可以在该文件夹下的文件中找到: src/com/lilithsthrone/game/combat/spells/Spell.java
- 支持的格式:
<spells> <spell>ARCANE_AROUSAL</spell> </spells>
若法术列表为空:
<spells/>
5.14. extraEffects¶
你可以使用这一部分来描述状态效果可能附带的额外效果。当玩家将鼠标悬浮在状态效果的图标上,这些效果将会显示在提示中。处于该效果下的角色会以 npc 作为解析变量传入。所以如果你想要引用,可以使用 [npc.name] 等类似形式。对于该状态效果,没有需要描述的额外效果,但如果想要使用该部分,请遵循以下格式:
<extraEffects>
<effect><![CDATA[You're a playful kitty!]]></effect>
</extraEffects>
一个空的 extraEffects 列表
<extraEffects/>
5.15. 效果逻辑¶
状态效果被施加的条件默认设置为 false ,这也就意味着只有在其他位置直接调用 GameCharacter.addStatusEffect(AbstractStatusEffect statusEffect, int seconds) 时才能够施加该效果。如果你想要该效果同样只有在被调用时才会施加,那请将该元素定义为:
<applicationCondition><![CDATA[false]]></applicationCondition>
然而如果你想让该效果每当达成特定效果时,就自动启用,那请保证该元素的返回值是一个可能为 true 的条件语句,如下方示例所示。
你必须使用游戏的解析引擎来达成你想要的效果。 npc 是代表受到该状态效果影响角色的解析目标。如果想要进行解析,并返回字符串(String,可以视作文本),请在指令一开始就使用 # 字符, 例如: [#npc.isFeminine()] 。如果想要进行解析,但不返回 String (通常不会在这一部分使用),请使用两个 # 字符,例如: [##npc.isFeminine()] 。最后提醒一句,在解析为布尔值(Boolean)之前,所有返回的字符串开头和结尾的空白符都会被去除。
5.15.1. applicationCondition¶
该示例意在展示,你可以使用解析器创造十分 复杂 的条件语句。
- 示例:
<applicationCondition><![CDATA[ #IF(SET_BONUS_innoxia_template.isCharacterWearingCompleteSet(npc)) true #ELSE false #ENDIF ]]></applicationCondition>
另一个更简单的示例,能够达到相同效果:
<applicationCondition><![CDATA[ SET_BONUS_innoxia_kitty.isCharacterWearingCompleteSet(npc) ]]></applicationCondition>
5.15.2. applyEffect¶
每当游戏回合结束时,状态效果便会执行 applyEffect(GameCharacter target, int secondsPassed) 方法。其中 target 参数时受到该状态效果影响的角色,而 secondsPassed 参数则是该回合经过了多少“秒”。而在战斗中, secondsPassed 恒定为1(代表着1个回合结束)。如果该方法返回一个字符串,那么游戏控制流将会被终端,并在 重要状态效果 屏幕中显示结果,无论 applyEffect() 方法返回的 String 是何内容。你可以自行定义效果在此处解析,与其他硬编码的状态效果一样。不过你可选的部分限制在解析器能够接触的部分,但应该足以制作出很多种类的效果了。
节点属性:
- interval 类型: integer¶
interval属性是一个整数值,代表了该效果被施加的间隔(以秒数衡量)。例如间隔设置为3600就该标着改效果每个小时 \((60 \times 60 = 3600)\) 才会被施加一次。间隔设置为0会使该效果每回合都施加。
内容标签:
npc为解析对象,即受到该状态效果的角色。
SECONDS_PASSED为特殊标签,将会被转化为一个整数值,代表上一个回合结束后经过了多长时间(以秒数衡量)。
TOTAL_SECONDS_PASSED为特殊标签,将会被转化为一个长整数值,代表该角色总共受到该状态效果影响多长时间(以秒数衡量)。例如,通常使用
TOTAL_SECONDS_PASSED == 0,来保证效果只有在该状态效果最初添加时才生效。重要
在战斗中,“经过的秒数”实际上代表着经过的战斗回合。所以,例如某角色已经在该状态效果的影响下经过了两个战斗回合,那么
TOTAL_SECONDS_PASSED将会被转化为2。
有关制表符(tab)和空格(space): 被解析过后,返回的 String 前后所有的制表符将被移除,所以使用制表符排版是安全的,而 空格则不是 。
<applyEffect interval="3600"><![CDATA[
#IF(SECONDS_PASSED>0)
An hour passed!
#IF(TOTAL_SECONDS_PASSED>(60*60*24))
[##game.getTextEndStringBuilder().append("<p>This effect has been in effect for more than a day!</p>")]
#ENDIF
#ENDIF
]]></applyEffect>
一个空的效果列表:
<applyEffect/>
5.15.3. applyRemovalEffect¶
与上方的 applyEffect 元素行为相似,游戏本体会在该状态效果被移除前执行逻辑。
逻辑执行时,角色实际上依然还处于该状态效果的影响下。
<applyRemovalEffect/>
5.15.4. applyPostRemovalEffect¶
与上方的 applyEffect 元素行为相似,游戏本体会在该状态效果被移除后执行逻辑。
逻辑执行时,角色实际上已经不再处于该状态效果的影响。
<applyPostRemovalEffect/>