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/>