2.1. 衣物类物品¶
- 作者:
innoxia, bicobus
衣物和其他任何可穿戴物品,即使位于体内。
你可以在 res/mods/innoxia/items/clothing 文件夹内找到衣物范例。
2.1.1. 通用信息¶
任何稀有度被设置为“LEGENDARY”及以上的衣物类物品在游戏中都不会出现,因为定义中没有商人会售卖这种品质的物品。如果想要的话,你可以通过debug菜单生成。debug菜单可以通过在游戏任何状态下输入 buggy (不使用中文输入法)进入。最好不要在战斗、性爱或无法移动的对话中进入debug菜单,因为会导致你结束当前的状态。
2.1.2. coreAttributes¶
2.1.2.2. value¶
请参见通用信息中的 item value。
- 示例
将其设置为60,与一双普通的袜子的价格相似。
<value>60</value>
2.1.2.3. determiner¶
冠词将会在物品名前出现。通常为“a”或者“an”(中文一般根据物品不同修改量词),而对于袜子或者手套之类,或许应该使用“一双”。所有文本值都应使用 CDATA 标签包裹,保证html标记确保无误地嵌入到游戏中。
- 示例
我将其定义为“一双”,所以在游戏中,这件物品会被称作“一双袜子”。
<determiner><![CDATA[a pair of]]></determiner>
2.1.2.4. name¶
该衣物名称的 单数 。(中文无需在意单数)
- 示例
我把它命名为“模板袜子”,因为“模板袜子(有s)”的单数当然是“袜子”……
<name appendColourName="true"><![CDATA[template sock]]></name>
你可以不使用 appendColourName 属性,但如果你不想用颜色来描述这件衣服,则可将其设置为 false。(例如,如果设置为 false,这件衣服将始终被称为 "模板袜子",而不是 "白色模板袜子")。
2.1.2.5. namePlural¶
名称的复数形式。属性 pluralByDefault 决定了该项目是否被称为复数(如袜子或手套)。
- 示例
我将复数命名为 "模板袜子(有s)",并将
pluralByDefault定义为 true,这样,除非在极其特殊的情况下,该物品都将以这个复数名称被引用。
<namePlural pluralByDefault="true"><![CDATA[template socks]]></namePlural>
2.1.2.6. description¶
这是显示在工具提示和物品检查页面上的描述。在检查页面上显示。
- 示例
对于普通、"无聊 "的衣物,描述可能会有些枯燥,但由于玩家不会经常阅读,所以这并不重要。
<description><![CDATA[An ordinary pair of socks, intended to be worn on the feet in order to absorb perspiration and provide both insulation and comfort. A silly person may choose to wear them on their hands...]]></description>
2.1.2.7. physicalResistance¶
这件衣服的默认物理抗性。通常使用 0,但如果是护甲,那么 1 到 5 的数值会比较合适(超过这个数值可能会太过强力)。物理抗性是一个非常强大的属性,因此请保持在 0-5 的范围内。对于所有普通衣物,数值应为 0。该值接受十进制,因此对于皮夹克之类的衣物(虽然不是真正的护甲,但仍具有保护作用),可以使用 0.5 左右。
- 示例
留为 0,意为这是普通的非装甲保护的衣物。
<physicalResistance>0</physicalResistance>
2.1.2.8. femininity¶
如果衣服是为女性角色设计的,请使用 FEMININE 表示。男性角色,则使用 MASCULINE ;如果任何人都可以穿着而不受惩罚,则使用 ANDROGYNOUS 。
- 示例
男性和女性都可以穿普通袜子,不会有问题,所以我设置为
ANDROGYNOUS。
<femininity>ANDROGYNOUS</femininity>
2.1.2.9. equipSlots¶
这款服装能够装入的栏位。游戏只最多支持 4 个独特的栏位,所以如果您定义的插槽超过 4 个,其余的 将不会显示在游戏中。这些定义保留了顺序,因此最上面的一个是最常用的栏位。这一点对 NPC 尤为重要,因为他们会使用最上面的栏位来 决定这件衣服应该放入哪个栏位。
可用栏位在此: src/com/lilithsthrone/game/inventory/InventorySlot.java
- 示例
我将
SOCK定义为最上面的栏位,因为这是为袜子设计的栏位。由于我还希望玩家能把袜子穿在手上,所以我把HAND定义为第二栏位。
<equipSlots>
<slot>SOCK</slot>
<slot>HAND</slot>
</equipSlots>
2.1.2.10. rarity¶
此物品的稀有性。任何少于 EPIC 的内容都可能在代码中被修改。在此可找到稀有度: src/com/lilithsthrone/game/inventory/Rarity.java
- 示例
袜子绝对是
COMMON的,但我已将其定义为LEGENDARY,以防它们在游戏中自然生成。
<rarity>LEGENDARY</rarity>
2.1.2.11. clothingSet¶
这件衣服所属的套装。
参见
导航到 res/setBonuses 查看现有套装。
示例: 使用套装名即可。
<clothingSet>innoxia_template</clothingSet>
2.1.2.12. imageName¶
该衣物图像文件的路径。请参照 与图像相关的文档 。
- 示例
我将其定义为“sock.svg”,它应该与xml文件放在同一个文件夹中。
<imageName>socks.svg</imageName>
2.1.2.13. imageEquippedName¶
该衣物被装备后的图像文件的路径。其中“slot”(栏位)属性决定了对应文件会被使用在哪个物品栏栏位上。
- 示例
被装备在
SOCK(袜子)栏位上时,这双袜子使用sock.svg文件。而装备在HAND栏位上是,则使用sock_hand.svg文件。再次声明,文件必须放置在xml文件的同一文件夹下。
<imageEquippedName slot="SOCK">socks.svg</imageEquippedName>
<imageEquippedName slot="HAND">socks_hand.svg</imageEquippedName>
2.1.2.14. stickers¶
Stickers 是可以覆盖在基础svg图像上方的svg部件(或者是下方)。其定义全部位于 stickers 元素内部。
2.1.2.14.1. category¶
同一分类(category)下定义的所有标签(sticker)都是 互斥 的,但与 category 中其他类型元素下的标签可以共存。其中 id 属性不允许多个类型重复,内容可以随意,但考虑到格式要求,最好由字母、数字和下划线构成。 priority 属性决定了该分类在UI渲染时的顺序(即物品栏的衣物染色界面),数值越低渲染时则位于分类列表的越上方。
- 属性
id (字符串)
priority (整数)
- 示例
<category id="top_txt" priority="1"> <!-- ... --> </category>
2.1.2.14.1.1. categoryName¶
该元素将用于游戏内标签修改界面UI中,显示这类标签的标题。因而请保证其可读性。
- 示例
<categoryName><![CDATA[Top Text]]></categoryName>
2.1.2.14.1.2. sticker¶
一个标签元素。每个标签都与同一分类下的其他标签互斥。不同分类下的标签可以共存。
id 属性应当在同分类下的标签中保持唯一。该属性设置为 none 代表玩家可以将该分类置空。
priority 属性决定了该标签在UI渲染时的顺序(即物品栏的衣物染色界面),数值越低渲染时则位于按钮列表的越靠左。 priority 设置为 0 则会使该标签位于列表顶端,无论其在xml文件中的位置。
defaultSticker 定义了衣物生成时默认是否要将该标签默认应用。
zLayer 定义了渲染的z轴优先度。 zLayer 的数值将会在渲染时相互比较,数值高的标签会覆盖在数值低的标签上方。 基础svg的zLayer值为0,也就意味着负数值会被绘制在基础svg的下方。不建议将 zLayer 设置为0(尽管处理时总会将其绘制在基层的上方)。
colourDisabled 和 colourSelected 是两个可选属性,你可以用来定义衣物染色UI中按钮内文字的颜色,分别对应着未选中和选中的按钮。可以选择留空或直接删除,使用默认的按钮颜色。如果你想要用属性来定义默认的颜色,应当是这样的: colourDisabled="TEXT_GREY" colourSelected="GENERIC_GOOD"
备注
如果你没有定义 imageName 子元素,或者留空,那默认的选择颜色将会是 TEXT_GREY 而非 GENERIC_GOOD 。
可选颜色请参照此处: src/com/lilithsthrone/utils/colours/PresetColour.java
你同样可以自定义颜色,而不是使用PresetColour的id,这时你 必须 使用标准RGB十六位码作为数值。
例如: colourDisabled="777777" colourSelected="57DB7E"
- 属性
id (字符串)
priority (整数)
defaultSticker (布尔)
zlayer (整数)
colourDisabled (预先定义值)
colourSelected (预先定义值)
- 示例
<sticker id="rental" priority="1" defaultSticker="true" zLayer="1" colourDisabled="" colourSelected=""> <!-- ... --> </sticker> <sticker id="dommy" priority="2" defaultSticker="false" zLayer="1"> <!-- ... --> </sticker>
2.1.2.14.1.2.1. stickerName¶
该元素将用于游戏内标签修改界面UI中,显示该标签按钮的标题。因而请保证其可读性。
- 示例
<stickerName><![CDATA[Rental]]></stickerName>
2.1.2.14.1.2.2. namePrefix¶
定义 namePrefix 可以在在使用该标签后,为基础的衣物名称前添加前缀。
priority 元素定义了多个标签的 namePrefix 显示时的顺序。 越低的数值 代表该前缀会 越先显示 。可以不显式声明。
- 属性
priority (整数)
- 示例
<namePrefix priority="1"><![CDATA[Rental]]></namePrefix>
2.1.2.14.1.2.3. namePostfix¶
与 namePrefix 几乎完全相同,但是文本将会添加在基础衣物名称的后方。
2.1.2.14.1.2.4. descriptionModification¶
通过这个元素设置该标签是否会为衣物生成新描述。
如果 fullReplacement 属性为true,那么衣物的描述将会完全被 descriptionModification 替代。如果 fullReplacement 为false,那么这段描述将只会添加在原描述的后方(前提是其他标签没有设置 fullReplacement ) 。
priority 属性定义了描述被添加的顺序,或者如果多个标签都将 fullReplacement 设置为true,那么哪个标签的描述优先级更高。
- 属性
fullReplacement (布尔)
priority (整数)
- 示例
<descriptionModification fullReplacement="false" priority="1"><![CDATA[<i>Rental </i>]]></descriptionModification>
2.1.2.14.1.2.5. imageName¶
该标签图像的路径名,应当与xml文件处于同一文件夹下。
slot 属性可以忽略,此时将会使用衣物的默认栏位。
如果该衣物可以装备在多个栏位上,你 没有必要 为每个栏位都设置一个 imageName ,但如果你没有设置,那么游戏将会随机选择一个 imageName 使用(如果你只定义了一个 imageName ,并且对于该衣物的所有基础 imageName 都很合适,那么就不是大问题)。
zLayer 属性定义了该svg图像的渲染顺序。你没有必要定义该属性,如果该属性缺失,那么这个svg将会使用标签中定义的 zLayer 属性,前提是你已经在 sticker 根节点中定义。示例中填写仅供演示。
备注
你可以添加任意数量的 imageName 元素。
- 属性
zLayer (整数)
slot (预先定义值)
- 示例
<imageName zLayer="1" slot="TORSO_UNDER">text_rental.svg</imageName>
2.1.2.14.1.2.9. availabilityText¶
unavailabilityText 的对应版本,当 unavailabilityText 返回空字符串时,则代表该标签可用,就会显示该文本。请使用 CDATA 文本。
上述两个实例的对应部分:
<availabilityText><![CDATA[
You have unlocked this sticker due to being feminine!
]]></availabilityText>
<availabilityText><![CDATA[
#IF(pc.getSubspeciesOverrideRace()==RACE_DEMON)
You have unlocked this sticker due to being a demon!
#ELSE
You have unlocked this sticker due to being feminine!
#ENDIF
]]></availabilityText>
2.1.2.15. enchantmentLimit¶
可以在该物品上施加多少附魔上限的附魔。最好让游戏来决定附魔的默认值,一般为100。
示例
我并没有定义这个元素,所以就让游戏保持100附魔上限的默认值。
使用默认值
<enchantmentLimit/>
使用自定义值
<enchantmentLimit>100</enchantmentLimit>
2.1.2.16. effects¶
衣物生成时默认自带的效果。如果想知道该元素内应该填入什么,最简单的方式就是在游戏中附魔,保存游戏,然后复制对应物品的“effects”到此处。
示例
定义的第一个效果是增加3物理伤害,而第二个效果则是穿着时给穿戴者增加自慰性癖。
<effects>
<effect itemEffectType="CLOTHING" limit="0" potency="MAJOR_BOOST" primaryModifier="CLOTHING_ATTRIBUTE" secondaryModifier="DAMAGE_PHYSICAL" timer="0"/>
<effect itemEffectType="CLOTHING" limit="0" potency="MAJOR_BOOST" primaryModifier="TF_MOD_FETISH_BEHAVIOUR" secondaryModifier="TF_MOD_FETISH_MASTURBATION" timer="0"/>
</effects>
2.1.2.17. blockedPartsList¶
这一部分决定了该衣物是如何跟其他衣物以及穿戴者的身体互动的。
示例
我将这一部分设定为,装备在
SOCK栏位后才会生效。<blockedPartsList slot="SOCK"> <blockedParts> <displacementType>REMOVE_OR_EQUIP</displacementType> <clothingAccessRequired> <clothingAccess>FEET</clothingAccess> </clothingAccessRequired> <blockedBodyParts> <bodyPart>FEET</bodyPart> </blockedBodyParts> <clothingAccessBlocked/> <concealedSlots/> </blockedParts> </blockedPartsList>
这是另一部分决定了该衣物是如何跟其他衣物以及穿戴者的身体互动的。
示例
我将这一部分设定为,装备在
HAND栏位后才会生效。<blockedPartsList slot="HAND"> <blockedParts> <displacementType>REMOVE_OR_EQUIP</displacementType> <clothingAccessRequired> <clothingAccess>FINGERS</clothingAccess> </clothingAccessRequired> <blockedBodyParts/> <clothingAccessBlocked/> <concealedSlots/> </blockedParts> </blockedPartsList>
2.1.2.17.1. blockedParts¶
你可以随意添加多个 blockedParts 元素,但每一个都应该有不同的 displacementType, 并且 至少要有一个 类型为 REMOVE_OR_EQUIP 。
2.1.2.17.2. displacementType¶
如果该衣物以对应方式被移开(此处就是被移除),那么 blockedBodyParts , clothingAccessBlocked 和 concealedSlots 的部分都会展露出来。如果多个 blockedParts 都阻挡或者遮挡了同一个栏位,那只需要移开一处 blockedParts 就能展露。(例如,一条裤子的 displacementTypes 既有 UNZIPS 又有 PULLS_DOWN 并且两个的 concealedSlots 都包括了 PENIS,那么只要使用 UNZIPS 或者 PULLS_DOWN 就能够使该部位展露。)
完整的 displacementTypes 列表可以参见此处: src/com/lilithsthrone/game/inventory/clothing/DisplacementType.java
2.1.2.17.3. clothingAccessRequired¶
执行该 displacementType 需要的接触方式(Access)。
clothingAccess 的值可以参见此处: src/com/lilithsthrone/game/inventory/clothing/ClothingAccess.java
2.1.2.17.4. blockedBodyParts¶
该 displacementType 阻挡的身体部位。
bodyPart 的值可以参见此处: src/com/lilithsthrone/game/character/body/CoverableArea.java
2.1.2.17.5. clothingAccessBlocked¶
该 displacementType 阻碍的接触方式(Access)。同样完整的 clothingAccess 的值可以参见此处: src/com/lilithsthrone/game/inventory/clothing/ClothingAccess.java
该元素必须包含一个 clothingAccess 的标签,用以插入对应值。
- 示例
<clothingAccess>MOUTH</clothingAccess>
2.1.2.17.6. concealedSlots¶
该 displacementType 遮挡的栏位。可用的栏位请参见此处: src/com/lilithsthrone/game/inventory/InventorySlot.java
你同样可以为该元素添加一个名为 values 的属性,来应用预设值,(例如位于 blockedParts 部分的“CS Example”)。可用的预设列表参见此处: src/com/lilithsthrone/game/inventory/clothing/PresetConcealmentLists.java
使用 slot 标签来向其中插入值。
- 示例
<slot>HEAD</slot>
2.1.2.18. incompatibleSlots¶
该衣物不兼容的装备栏位。游戏里的泳装就使用了这个功能,虽然穿着在 CHEST 栏位,但同时也会阻挡 GROIN 和 STOMACH 。可用的栏位青春那件此处: src/com/lilithsthrone/game/inventory/InventorySlot.java
示例
你需要为该衣物能够装备的每个栏位都分别定义一个
incompatibleSlots元素,所以我为SOCK和HAND栏位都定义了空元素。
- 示例2
如果你想添加栏位,那么要像这样运用元素(下面的例子,装备到
WRIST栏位时将锁定FINGER栏位):
<incompatibleSlots slot="WRIST">
<slot>FINGER</slot>
</incompatibleSlots>
<incompatibleSlots slot="SOCK"/>
<incompatibleSlots slot="HAND"/>
2.1.2.19. 颜色¶
请参阅相关条目 documentation.
衣物可以随意上色,但如果想要玩家能够染色衣物,需要在此处显式指定可用的颜色。 primaryColours 、 secondaryColours 和 tertiaryColours 代表着衣物生成时可选的颜色,而后带“Dye”的对应元素则只有在玩家选择染色衣物时才能使用。游戏将会检测特定颜色值,并且将其修改为玩家选择的值。这些数值如下所示:
颜色类型可以在如下文件夹中的文件里获取: src/com/lilithsthrone/utils/colours
重要
请使用以 CLOTHING_ 开头的 Colour 数值。
<primaryColours recolouringAllowed="true" values="JUST_WHITE"/>
<primaryColoursDye values="ALL"/>
<secondaryColours values="JUST_BLACK"/>
<secondaryColoursDye values="ALL"/>
<tertiaryColours values="JUST_WHITE"/>
<tertiaryColoursDye>
<colour>CLOTHING_WHITE</colour>
<colour>CLOTHING_BLACK</colour>
<colour>CLOTHING_GREY</colour>
<colour>CLOTHING_RED</colour>
<!-- ... -->
<colour>CLOTHING_PINK_LIGHT</colour>
</tertiaryColoursDye>
2.1.2.19.1. customColours¶
你可以定义任意数量的自定义颜色,以替换为 svg 上色的可使用颜色。
<customColours>
<customColour copyColourIndex="0" c0="#6C5353" c1="#916F6F" c2="#AC9393" c3="#C8B7B7" c4="#E3DBDB">
<defaultColours>
<colour>CLOTHING_GREY</colour> <!-- The colours which this clothing should spawn in with. -->
</defaultColours>
<extraColours values="ALL"/> <!-- The colours which this clothing can be dyed to. -->
</customColour>
</customColours>
2.1.2.20. 图案¶
这一部分详细描述了如何定义图案。如果你的svg文件没有定义 patternLayer 那么就可以安全地删除这一整部分:
defaultPatterns列出了该衣物生成时可以附加的图案。
patternChance是该衣物生成时带有图案的概率。数值从0到1,并且需要以“f”结尾。例如,0.5f意味着50%概率,0.75f意味着75%概率,0.1275f意味着12.75%概率等等。
colourNameDerivedFromPattern设置该图案的主要颜色是否应该用于衣物的名称,而非使用
color数值。例如,如果设置为true,那么一个绿色+黑色的虎纹衣物就会被冠以“绿色”的前缀,无论基色如何。
pattern图案的可用值即文件夹
res/patterns内svg文件的名称。
<defaultPatterns patternChance="0" colourNameDerivedFromPattern="false">
<pattern>camo</pattern>
</defaultPatterns>
2.1.2.20.1. patternPrimaryColours、patternSecondaryColours、patternTertiaryColours¶
与上述 colours 部分描述的颜色作用方式相同。
<patternPrimaryColours>
<colour>CLOTHING_GREEN</colour>
</patternPrimaryColours>
<patternSecondaryColours values="ALL"/>
<patternTertiaryColours/>
2.1.2.20.2. customPatternColours¶
自定义图案颜色与上述customColours定义方法相同。
<customPatternColours/>
2.1.3. sexAttributesSelf¶
参见 res/clothing/innoxia/buttPlugs/butt_plug.xml 文件,其中就有在游戏中实际运作的例子,包括了该元素。
这些是可以应用在穿戴者身上的性交属性(例如,插入穿戴者腔穴或者穿戴者插入了该衣物。主要用于可插入的假阴茎。)
<sexAttributesSelf>
<penetration>
<length>15</length>
<girth>5</girth>
<modifiers>
<mod>VEINY</mod>
</modifiers>
</penetration>
<orifice>
<depth>0</depth>
<capacity>0</capacity>
<elasticity>3</elasticity>
<plasticity>3</plasticity>
<wetness>0</wetness>
<modifiers>
<mod>PUFFY</mod>
</modifiers>
</orifice>
</sexAttributesSelf>
2.1.3.1. penetration¶
- length
数值单位为厘米(cm)
- grith
0-6代表着
PenetrationGirth Enum的数值- modifiers
若要添加修饰词,请添加
mod标签,内有PenetrationModifier Enum的数值
2.1.3.2. orifice¶
在 0.3.7 版本发生变更: 飞机杯玩具的支持在游戏中还不完善!
- depth
数值单位为厘米(cm)
- capacity
数值单位为厘米(cm),对应着腔穴的直径
- elasticity(弹性)
0-7代表着
OrificeElasticity Enum的数值- plasticity(可塑性)
0-7代表着
OrificePlasticity Enum的数值- wetness
0-7代表着
Wetness Enum的数值- modifiers
mod标签的列表,每个都内有OrificeModifier Enum的数值
2.1.4. sexAttributesOther¶
这些是应用在与穿戴者交互的角色身上的性交属性(例如,除穿戴者以外可用的插入或者腔穴。主要用于穿戴式假阴茎。)
参见
参见文件 res/clothing/norin/strapless_dildo/strapless_dildo.xml 其中就有在游戏中实际运作的例子。
对于不同子元素效果的解释,请参见 sexAttributesSelf 。
<sexAttributesOther>
<penetration>
<length>25</length>
<girth>3</girth>
<modifiers/>
</penetration>
<orifice/>
</sexAttributesOther>
2.1.5. replacementText¶
接下来的部分用于定义移开或整理衣物时的描述。其中的 type 属性定义了这段描述会用于哪个 DisplacementType 。对于常规的装备和解除装备,请使用 REMOVE_OR_EQUIP 。
- 示例
这是袜子装备在
SOCK栏位上时的装备文本:<replacementText slot="SOCK" type="REMOVE_OR_EQUIP"> <self> <![CDATA[[npc.Name] [npc.verb(pull)] the socks on to cover [npc.her] [npc.feet].]]> </self> <other> <![CDATA[[npc.Name] [npc.verb(pull)] the socks onto [npc2.namePos] [npc2.feet].]]> </other> <otherRough> <![CDATA[[npc.Name] roughly [npc.verb(pull)] the socks onto [npc2.namePos] [npc2.feet].]]> </otherRough> </replacementText>
- 示例
这是袜子装备在
HAND栏位上时的装备文本:<replacementText slot="HAND" type="REMOVE_OR_EQUIP"> <self> <![CDATA[[npc.Name] [npc.verb(pull)] the socks on to cover [npc.her] [npc.hands].]]> </self> <other> <![CDATA[[npc.Name] [npc.verb(pull)] the socks onto [npc2.namePos] [npc2.hands].]]> </other> <otherRough> <![CDATA[[npc.Name] roughly [npc.verb(pull)] the socks onto [npc2.namePos] [npc2.hands].]]> </otherRough> </replacementText>
2.1.6. displacementText¶
这一部分用于移除或移开。
- 示例
这是袜子从
SOCK栏位上移除时的解除装备文本:<displacementText slot="SOCK" type="REMOVE_OR_EQUIP"> <self> <![CDATA[[npc.Name] [npc.verb(pull)] off [npc.her] socks.]]> </self> <other> <![CDATA[[npc.Name] [npc.verb(pull)] off [npc2.namePos] socks.]]> </other> <otherRough> <![CDATA[[npc.Name] roughly [npc.verb(pull)] off [npc2.namePos] socks.]]> </otherRough> </displacementText>
- 示例
这是袜子从
HAND栏位上移除时的解除装备文本:<displacementText slot="HAND" type="REMOVE_OR_EQUIP"> <self> <![CDATA[[npc.Name] [npc.verb(pull)] the socks from off of [npc.her] [npc.hands].]]> </self> <other> <![CDATA[[npc.Name] [npc.verb(pull)] the socks from off of [npc2.namePos] [npc2.hands].]]> </other> <otherRough> <![CDATA[[npc.Name] roughly [npc.verb(pull)] the socks from off of [npc2.namePos] [npc2.hands].]]> </otherRough> </displacementText>