将整个项目重置为logseq项目

master
ModerRAS 3 years ago
parent 3be21660fb
commit da53f29528

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/xml流程图.png (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,11 @@
- [[方舟的骑士-Knight-of-the-Ark]]
- [[设计]]
- [[接口开发说明]]
- [[美术文档]]
- [[设定文档]]
- [[需求文档]]
- [[一些软件使用教程]]
- [[MOD相关配置文档]]
- [[音乐文档]]
- [[名词解释及对照]]
- [[制作团队]]

@ -0,0 +1,350 @@
{:meta/version 1
;; Currently, we support either "Markdown" or "Org".
;; This can overwrite your global preference so that
;; maybe your personal preferred format is Org but you'd
;; need to use Markdown for some projects.
;; :preferred-format ""
;; Preferred workflow style.
;; Value is either ":now" for NOW/LATER style,
;; or ":todo" for TODO/DOING style.
:preferred-workflow :now
;; The app will ignore those directories or files.
;; E.g. :hidden ["/archived" "/test.md" "../assets/archived"]
:hidden []
;; When creating the new journal page, the app will use your template if there is one.
;; You only need to input your template name here.
:default-templates
{:journals ""}
;; Set a custom date format for journal page title
;; Example:
;; :journal/page-title-format "EEE, do MMM yyyy"
;; Whether to enable hover on tooltip preview feature
;; Default is true, you can also toggle this via setting page
:ui/enable-tooltip? true
;; Show brackets around page references
;; :ui/show-brackets? true
;; Enable showing the body of blocks when referencing them.
:ui/show-full-blocks? false
;; Expand block references automatically when zoom-in
:ui/auto-expand-block-refs? true
;; Enable Block timestamp
:feature/enable-block-timestamps? false
;; Enable remove accents when searching.
;; After toggle this option, please remember to rebuild your search index by press (cmd+c cmd+s).
:feature/enable-search-remove-accents? true
;; Enable journals
;; :feature/enable-journals? true
;; Enable flashcards
;; :feature/enable-flashcards? true
;; Enable Whiteboards
;; :feature/enable-whiteboards? true
;; Disable the built-in Scheduled tasks and deadlines query
;; :feature/disable-scheduled-and-deadline-query? true
;; Specify the number of days in the future to display in the
;; scheduled tasks and deadlines query, with a default value of 0 which
;; only displays tasks for today.
;; Example usage:
;; Display all scheduled tasks and deadlines in the next 7 days
;; :scheduled/future-days 7
;; Specify the date on which the week starts.
;; Goes from 0 to 6 (Monday to Sunday), default to 6
:start-of-week 6
;; Specify a custom CSS import
;; This option take precedence over your local `logseq/custom.css` file
;; You may find a list of awesome logseq themes here:
;; https://github.com/logseq/awesome-logseq#css-themes
;; Example:
;; :custom-css-url "@import url('https://cdn.jsdelivr.net/gh/dracula/logseq@master/custom.css');"
;; Specify a custom js import
;; This option take precedence over your local `logseq/custom.js` file
;; :custom-js-url ""
;; Set a custom Arweave gateway
;; Default gateway: https://arweave.net
;; :arweave/gateway ""
;; Set Bullet indentation when exporting
;; default option: tab
;; Possible options are for `:sidebar` are
;; 1. `:eight-spaces` as eight spaces
;; 2. `:four-spaces` as four spaces
;; 3. `:two-spaces` as two spaces
;; :export/bullet-indentation :tab
;; When :all-pages-public? true, export repo would export all pages within that repo.
;; Regardless of whether you've set any page to public or not.
;; Example:
;; :publishing/all-pages-public? true
;; Specify default home page and sidebar status for Logseq
;; If not specified, Logseq default opens journals page on startup
;; value for `:page` is name of page
;; Possible options for `:sidebar` are
;; 1. `"Contents"` to open up `Contents` in sidebar by default
;; 2. `page name` to open up some page in sidebar
;; 3. Or multiple pages in an array ["Contents" "Page A" "Page B"]
;; If `:sidebar` is not set, sidebar will be hidden
;; Example:
;; 1. Setup page "Changelog" as home page and "Contents" in sidebar
;; :default-home {:page "Changelog", :sidebar "Contents"}
;; 2. Setup page "Jun 3rd, 2021" as home page without sidebar
;; :default-home {:page "Jun 3rd, 2021"}
;; 3. Setup page "home" as home page with multiple pages in sidebar
;; :default-home {:page "home" :sidebar ["page a" "page b"]}
;; Tell logseq to use a specific folder in the repo as a default location for notes
;; if not specified, notes are stored in `pages` directory
;; :pages-directory "your-directory"
;; Tell logseq to use a specific folder in the repo as a default location for journals
;; if not specified, journals are stored in `journals` directory
;; :journals-directory "your-directory"
;; Set this to true will convert
;; `[[Grant Ideas]]` to `[[file:./grant_ideas.org][Grant Ideas]]` for org-mode
;; For more, see https://github.com/logseq/logseq/issues/672
;; :org-mode/insert-file-link? true
;; Setup custom shortcuts under `:shortcuts` key
;; Syntax:
;; 1. `+` means keys pressing simultaneously. eg: `ctrl+shift+a`
;; 2. ` ` empty space between keys represents key chords. eg: `t s` means press `t` followed by `s`
;; 3. `mod` means `Ctrl` for Windows/Linux and `Command` for Mac
;; 4. use `false` to disable particular shortcut
;; 5. you can define multiple bindings for one action, eg `["ctrl+j" "down"]`
;; full list of configurable shortcuts are available below:
;; https://github.com/logseq/logseq/blob/master/src/main/frontend/modules/shortcut/config.cljs
;; Example:
;; :shortcuts
;; {:editor/new-block "enter"
;; :editor/new-line "shift+enter"
;; :editor/insert-link "mod+shift+k"
;; :editor/highlight false
;; :ui/toggle-settings "t s"
;; :editor/up ["ctrl+k" "up"]
;; :editor/down ["ctrl+j" "down"]
;; :editor/left ["ctrl+h" "left"]
;; :editor/right ["ctrl+l" "right"]}
:shortcuts {}
;; By default, pressing `Enter` in the document mode will create a new line.
;; Set this to `true` so that it's the same behaviour as the usual outliner mode.
:shortcut/doc-mode-enter-for-new-block? false
;; Block content larger than `block/content-max-length` will not be searchable
;; or editable for performance.
:block/content-max-length 10000
;; Whether to show command doc on hover
:ui/show-command-doc? true
;; Whether to show empty bullets for non-document mode (the default mode)
:ui/show-empty-bullets? false
;; Pre-defined :view function to use with advanced queries
:query/views
{:pprint
(fn [r] [:pre.code (pprint r)])}
;; Pre-defined :result-transform function for use with advanced queries
:query/result-transforms
{:sort-by-priority
(fn [result] (sort-by (fn [h] (get h :block/priority "Z")) result))}
;; The app will show those queries in today's journal page,
;; the "NOW" query asks the tasks which need to be finished "now",
;; the "NEXT" query asks the future tasks.
:default-queries
{:journals
[{:title "🔨 NOW"
:query [:find (pull ?h [*])
:in $ ?start ?today
:where
[?h :block/marker ?marker]
[(contains? #{"NOW" "DOING"} ?marker)]
[?h :block/page ?p]
[?p :block/journal? true]
[?p :block/journal-day ?d]
[(>= ?d ?start)]
[(<= ?d ?today)]]
:inputs [:14d :today]
:result-transform (fn [result]
(sort-by (fn [h]
(get h :block/priority "Z")) result))
:collapsed? false}
{:title "📅 NEXT"
:query [:find (pull ?h [*])
:in $ ?start ?next
:where
[?h :block/marker ?marker]
[(contains? #{"NOW" "LATER" "TODO"} ?marker)]
[?h :block/page ?p]
[?p :block/journal? true]
[?p :block/journal-day ?d]
[(> ?d ?start)]
[(< ?d ?next)]]
:inputs [:today :7d-after]
:collapsed? false}]}
;; Add your own commands to slash menu to speedup.
;; E.g.
;; :commands
;; [
;; ["js" "Javascript"]
;; ["md" "Markdown"]
;; ]
:commands
[]
;; By default, a block can only be collapsed if it has some children.
;; `:outliner/block-title-collapse-enabled? true` enables a block with a title
;; (multiple lines) can be collapsed too. For example:
;; - block title
;; block content
:outliner/block-title-collapse-enabled? false
;; Macros replace texts and will make you more productive.
;; For example:
;; Change the :macros value below to:
;; {"poem" "Rose is $1, violet's $2. Life's ordered: Org assists you."}
;; input "{{poem red,blue}}"
;; becomes
;; Rose is red, violet's blue. Life's ordered: Org assists you.
:macros {}
;; The default level to be opened for the linked references.
;; For example, if we have some example blocks like this:
;; - a [[page]] (level 1)
;; - b (level 2)
;; - c (level 3)
;; - d (level 4)
;;
;; With the default value of level 2, `b` will be collapsed.
;; If we set the level's value to 3, `b` will be opened and `c` will be collapsed.
:ref/default-open-blocks-level 2
:ref/linked-references-collapsed-threshold 50
;; Favorites to list on the left sidebar
:favorites []
;; any number between 0 and 1 (the greater it is the faster the changes of the next-interval of card reviews) (default 0.5)
;; :srs/learning-fraction 0.5
;; the initial interval after the first successful review of a card (default 4)
;; :srs/initial-interval 4
;; hide specific properties for blocks
;; E.g. :block-hidden-properties #{:created-at :updated-at}
;; :block-hidden-properties #{}
;; Enable all your properties to have corresponding pages
:property-pages/enabled? true
;; Properties to exclude from having property pages
;; E.g.:property-pages/excludelist #{:duration :author}
;; :property-pages/excludelist
;; By default, property value separated by commas will not be treated as
;; page references. You can add properties to enable it.
;; E.g. :property/separated-by-commas #{:alias :tags}
;; :property/separated-by-commas #{}
;; Properties that are ignored when parsing property values for references
;; :ignored-page-references-keywords #{:author :startup}
;; logbook setup
;; :logbook/settings
;; {:with-second-support? false ;limit logbook to minutes, seconds will be eliminated
;; :enabled-in-all-blocks true ;display logbook in all blocks after timetracking
;; :enabled-in-timestamped-blocks false ;don't display logbook at all
;; }
;; Mobile photo uploading setup
;; :mobile/photo
;; {:allow-editing? true
;; :quality 80}
;; Mobile features options
;; Gestures
;; :mobile
;; {:gestures/disabled-in-block-with-tags ["kanban"]}
;; Extra CodeMirror options
;; See https://codemirror.net/5/doc/manual.html#config for possible options
;; :editor/extra-codemirror-options {:keyMap "emacs" :lineWrapping true}
;; Enable logical outdenting
;; :editor/logical-outdenting? true
;; When both text and a file are in the clipboard, paste the file
;; :editor/preferred-pasting-file? true
;; Quick capture templates for receiving contents from other apps.
;; Each template contains three elements {time}, {text} and {url}, which can be auto-expanded
;; by received contents from other apps. Note: the {} cannot be omitted.
;; - {time}: capture time
;; - {date}: capture date using current date format, use `[[{date}]]` to get a page reference
;; - {text}: text that users selected before sharing.
;; - {url}: url or assets path for media files stored in Logseq.
;; You can also reorder them, or even only use one or two of them in the template.
;; You can also insert or format any text in the template as shown in the following examples.
;; :quick-capture-templates
;; {:text "[[quick capture]] **{time}**: {text} from {url}"
;; :media "[[quick capture]] **{time}**: {url}"}
;; Quick capture options
;; :quick-capture-options {:insert-today? false :redirect-page? false :default-page "my page"}
;; File sync options
;; Ignore these files when syncing, regexp is supported.
;; :file-sync/ignore-files []
;; dwim (do what I mean) for Enter key when editing.
;; Context-awareness of Enter key makes editing more easily
; :dwim/settings {
; :admonition&src? true
; :markup? false
; :block-ref? true
; :page-ref? true
; :properties? true
; :list? true
; }
;; Decide the way to escape the special characters in the page title.
;; Warning:
;; This is a dangerous operation. If you want to change the setting,
;; should access the setting `Filename format` and follow the instructions.
;; Or you have to rename all the affected files manually then re-index on all
;; clients after the files are synced. Wrong handling may cause page titles
;; containing special characters to be messy.
;; Available values:
;; :file/name-format :triple-lowbar
;; ;use triple underscore `___` for slash `/` in page title
;; ;use Percent-encoding for other invalid characters
:file/name-format :triple-lowbar
:graph/settings {:journal? true, :builtin-pages? true}
;; specify the format of the filename for journal files
;; :journal/file-name-format "yyyy_MM_dd"
}

@ -0,0 +1,3 @@
- [[概念图或美宣图---第二张]]
- [[文化功能图---试绘制]]
-

@ -0,0 +1 @@
- [[技术研究-对二次元角色在骑砍2中实现的具体方法]]

@ -0,0 +1,6 @@
## 结论
如果要全自动上传那么AppCenter无法满足要求原因在于上传附件大小官方限制为7MB而骑砍2的存档大概在9-10MB如果上传存档则会报错
## 引用
关于上传错误日志的接口在这个链接: https://learn.microsoft.com/zh-cn/appcenter/diagnostics/upload-crashes#upload-a-custom-crash-log
关于上传崩溃附件的链接https://learn.microsoft.com/zh-cn/appcenter/diagnostics/upload-crashes#upload-an-attachment

@ -0,0 +1,444 @@
**2023年2月21日**
**对应游戏版本v1.0.3** 皮蛋初版未完成
**2023年2月23日**
**对应游戏版本v1.0.3** 皮蛋初版完成
# 根元素
<CraftingPieces>
# 类型名
```
<CraftingPiece 1=""
元素2=""
……>
<BladeData 1=""
元素2=""
……>
<Thrust damage_type=""
damage_factor="" />
<Swing damage_type=""
damage_factor="" />
</BladeData>
<Flags>
<Flag name="" />
</Flags>
<Materials>
<Material id=""
count="" />
<Material id=""
count="" />
……
</Materials>
</CraftingPiece>
```
# 原版路径
Modules\Native\ModuleData\crafting_pieces.xml
# 官方文档
[WEAPON SMITHING & CRAFTING PIECES](https://moddocs.bannerlord.com/asset-management/weapon_smithing/)
# 用途
- 组成锻造武器的配件的信息。
- id
- 名字
- 等阶
- 类型(刃、连接处、杆、尾部)
- mesh
- 长度
- 物理材质(主要影响音效)
- 个数(远程消耗类)
- 碰撞胶囊body_name / bo
- 挥动和戳捅动作的伤害类型和伤害系数
- 重量
- 锻造消耗的锻造素材及消耗数量
- Flag标签日常装扮、可突破格挡、命中时不出血等
- 武器收纳容器
- 文化
- 是否在铁匠铺中隐藏
- 是否是默认解锁的
- 锻造难度级别
- 不可存在的用法
- 配件间的额外间隔距离调整
- 其他相关内容
- [CraftingTemplates武器锻造类别页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/91/CraftingTemplates%E6%AD%A6%E5%99%A8%E9%94%BB%E9%80%A0%E7%B1%BB%E5%88%AB)
- [WeaponDescriptions武器用法页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/85/WeaponDescriptions%E6%AD%A6%E5%99%A8%E7%94%A8%E6%B3%95)
附一把锻造武器物品的逻辑图:
![锻造武器的逻辑图.png](../assets/锻造武器的逻辑图-911958dc-b56f-4bb5-87c9-f34b0b017034.png)
# 特点
- 配件的类别以四个部位作为区分分别是刃Blade、连接处/护手Guard、杆/握把Handle、尾部/配重Pommel
- 不同的部位有时拥有特定的元素。
- 由于一个锻造武器是拆成1至4个配件之后组装的所以武器美术也需要在武器导入前进行拆分或在制作武器模型时就按照骑砍2的配件规则提前设计各个部位。
- 长度和武器配件手持的前后位置微调的数据,需要与模型美术或导入美术进行对接确认规则流程。
- 锻造武器的伤害、攻速、操控值都需要通过调整配件里的数值来实现,无法直接指定数值。需要数值策划学习该流程并以此实现锻造武器数值平衡。
- 不允许玩家锻造的武器,配件需要屏蔽。
- 依照强弱设计,配件的等阶和锻造消耗的素材都需要设计,包括每个锻造类别中无需解锁默认可锻造的配件有哪些。
- 某些情况下,也可以决定采用更简化原始的方法进行锻造武器的制作,可以降低制作成本。
- 方法是一个完整的武器模型设定为一个刃部配件。而其他三个部位的配件都使用特殊制作的“空”配件。
- 缺点
- 损失了玩家自定义锻造武器的玩法。
- 如果不屏蔽该配件且将该配件与常规的配件放在同一个锻造类别中时,玩家可以锻造出这样的武器:“[刃+杆]+[连接处]+[杆]+[尾部]”。
- 优点
- 美术不需要将一个完整的模型拆成各个部位,还要完美贴合地能在游戏里拼装起来。
- 缩减了配件个数,减少策划工作量。降低了拥有多个数值的配件组装成一把武器的数值平衡调整的复杂度。
# 格式示范
```
<!-- 这是刃部的示范 -->
<CraftingPiece id="battania_blade_2"
name="{=4OefdTD1}Ridged Short Gladius Blade"
tier="1"
piece_type="Blade"
mesh="battania_blade_2"
culture="Culture.empire"
length="57.1"
weight="0.59">
<BladeData stack_amount="3"
physics_material="metal_weapon"
body_name="bo_sword_one_handed"
holster_mesh="battania_blade_2_scabbard_2">
<Thrust damage_type="Pierce"
damage_factor="3.0" />
<Swing damage_type="Cut"
damage_factor="2.0" />
</BladeData>
<Flags>
<Flag name="Civilian"
type="ItemFlags" />
</Flags>
<Materials>
<Material id="Iron2"
count="2" />
</Materials>
</CraftingPiece>
<!-- 这是连接处的示范 -->
<CraftingPiece id="cleaver_guard_3"
name="{=JfRydy7M}Ridged Cleaver Guard"
tier="2"
piece_type="Guard"
mesh="cleaver_guard_3"
culture="Culture.aserai"
length="3.5"
weight="0.152">
<BuildData next_piece_offset="0.2" />
<StatContributions armor_bonus="0" />
<Materials>
<Material id="Iron2"
count="1" />
</Materials>
</CraftingPiece>
<!-- 这是杆的示范 -->
<CraftingPiece id="spear_handle_4"
name="{=LSOXMCAW}Pine Shaft"
tier="4"
piece_type="Handle"
mesh="spear_handle_4"
length="190"
weight="1.4"
excluded_item_usage_features="long"
item_holster_pos_shift="0,0,0.10"
CraftingCost="100">
<BuildData piece_offset="19.4" />
<Materials>
<Material id="Wood"
count="1" />
</Materials>
</CraftingPiece>
<!-- 这是尾部的示范 -->
<CraftingPiece id="battania_noble_pommel_1"
name="{=Oz6xANFb}Highland Ornamental Pommel"
tier="4"
piece_type="Pommel"
mesh="battania_noble_pommel_1"
culture="Culture.battania"
length="4.1"
weight="0.12">
<BuildData next_piece_offset="0" />
<Materials>
<Material id="Iron4"
count="1" />
</Materials>
</CraftingPiece>
```
# 元素说明(待写)
- id
- 该锻造配件的ID。
- 不可空。
- name
- 该锻造配件的名称。
- 加入火星人的强制读取英语翻译文件的功能后才可以正常读取英语的翻译文件显示英文否则英文语言设置下游戏中显示名称只显示name中的字符。
- 配件的命名应以“武器名+部位”为标准,如:“青龙偃月刀杆”“倚天剑刃”。对于未命名的武器,可以以使用者命名,如“炎国新兵的剑刃”“芬的短矛杆”。
- 配件的名称只在铁匠铺的锻造功能中显示,如果是一个隐藏的配件,那么游戏中没有场合会显示该配件的名称。
- 不可空。
- tier
- 该锻造配件的阶。也叫等阶。
- 可填1~5共5个阶。
- 当前骑砍2铁匠铺锻造功能中只有解锁了该锻造类别下所有的低阶配件后才会开始解锁该锻造类别中下一个阶的配件。例如当单手剑类里所有的2阶配件均是解锁状态后再之后的解锁必定解锁的是3阶的随机配件除非没有未解锁的3阶配件。
- 锻造自定义武器时,配件的阶越高,锻造难度越高。锻造难度越高,所需角色的锻造技能等级越高,根据两者差值,得出锻造的自定义武器随机的属性加减概率。越低的锻造难度,越高的锻造技能等级有越高的概率出现自定义武器属性的增加,反之减少。
- 综上,配件的阶应该与武器的强度匹配,越强力的武器其配件的阶越高。
- 不可空。
- piece_type
- 该锻造配件的配件类别。
- 共有四种,分别是刃"Blade"、连接处"Guard"、杆"Handle"、尾部"Pommel"。
- “连接处”在剑类武器上也称为“护手”,“杆”也称“柄”“握柄”,“尾部”也称“配重”。
- 从远端向尾端的顺序排列,应该是刃+连接处+杆+尾部
- 在铁匠铺的锻造功能中,玩家可以在非屏蔽的同锻造类别配件中任意挑选配件进行自定义武器的锻造,所以美术在拆解模型制作配件时,需要按照四个部位的含义对应制作。如果模型与含义不对应,玩家就可能通过自定义武器锻造出两个杆拼接的武器来。
- 不可空。
- mesh
- 该锻造配件的外观。也是游戏中肉眼看到的物体的样子。
- 由美术在导入的时候获取的一种id一般情况下mesh与id是一致的。
- 首先产生武器需求策划根据武器需求在策划表中登记武器id然后与美术对接id。美术导入完成后将mesh与完成的模型一并记录并提交给策划又策划完成此处数值的填写。
- 填空则透明。
- culture
- 该锻造配件的文化。
- 在锻造功能中的作用未知。
- 可不填,不填默认为空。
- length
- 该锻造配件的长度。
- 一把锻造武器的长度由组成它的配件总长度决定。
- 但是如何获取该配件的长度似乎是由美术的导入时获取的。需要导入美术提供详细信息。
- weight
- 该锻造配件的重量。
- 一把锻造武器的重量由组成它的配件总重量决定。
- 是影响锻造武器属性的重要因素,且复杂程度高,没有明确的公式可用。
- 大体上看,重量越高,伤害越高,攻速越低,操控值越低。重量越低,伤害越低,攻速越高,操控值越高。
- 在控制锻造武器数值平衡时,应首先固定配件的重量,得出理想的攻速和操控值属性后,再通过改伤害系数的值来控制伤害属性。
- 为了节省精力,不重要的武器,非特殊化的武器,可以考虑制订并使用统一的一个重量默认值,可以减少平衡武器数值强度的工作量。
- appearance
- 拥有露出、初版、广播和问世等意思,根据填写的数值结合意思看应该是出现率。该单词也是外观、外表的意思。
- 该项值在骑砍2中从0.1至10均出现过但绝大多数处在0.3至3之间。超出该范围的值像是骑砍2策划随手乱填的一样。
- 在武器配件中出现的概率极低,一千六百个配件中只有五个配件存在该项元素。
- 所以在武器配件的xml中考虑不填写appearance。
- is_hidden
- 该锻造配件是否在铁匠铺中隐藏。
- 填写"true"。
- 可空默认为false。
- 对于不像让玩家在铁匠铺的自定义锻造中使用的配件,应使用该元素屏蔽。例如,神器,特殊武器,唯一武器等的配件。
- is_default
- 该锻造配件是否在铁匠铺中是默认解锁的状态。
- 填写"true"。
- 可空默认为false。
- 如果完全根据骑砍2自己的功能规则和习惯做法来制作使每个锻造类别中的四个配件部位都拥有一个默认解锁的配件即可。
- CraftingCost
- 未知作用。
- 猜测与锻造难度有关系。
- 骑砍2自己实际使用并不多只有39分之1623。
- 可空。
- 骑砍2自己填写过的范围在75至150。
- excluded_item_usage_features
- 当锻造武器使用了该配件时,去除的武器用法。
- 举例:一旦我使用了“青龙偃月刀刃”作为武器的头部,我就不允许这把自定义武器可以骑枪冲刺,那么有两种方法可以实现。
- 第一种我不把“青龙偃月刀刃”这个配件登记在武器用法WeaponDescriptions文件里的骑枪冲刺用法下。
- 第二种,我在配件处,填写该元素,值为"TwoHandedPolearm_Couchable"。
- 更常见的是填写"shield"以禁止使用了该配件的自定义武器可以佩戴盾牌,只能使用双手用法;填写"thrust""swing"禁止某种攻击动作等用途。
- 若存在多个需要填写的值,则以英文冒号":"分隔。
- 例子
```
excluded_item_usage_features="shield:thrust:TwoHandedPolearm_Bracing"
```
- item_holster_pos_shift
- 猜测是锻造武器成品的时,收纳容器和杆部位模型的位置相对偏移。
- 在骑砍2自己的数据里只存在于杆配件。
- 骑砍2自己实际使用并不多只有52分之1623。
- 格式例子
```
item_holster_pos_shift="0,0,-0.03"
```
- distance_to_next_piece
- 猜测是锻造武器成品的时,该配件模型到下一个配件模型之间额外增加的距离。
- 在骑砍2自己的数据里只存在于斧类和个别锤的刃部位配件。
- 骑砍2自己实际使用并不多只有44分之1623。
- 格式例子
```
distance_to_next_piece="18.597"
```
- distance_to_previous_piece
- 猜测是锻造武器成品的时,该配件模型到上一个配件模型之间额外增加的距离。
- 与上一个distance_to_next_piece同时出现。
- 在骑砍2自己的数据里只存在于斧类和个别锤的刃部位配件。
- 骑砍2自己实际使用并不多只有44分之1623。
- 格式例子
```
distance_to_previous_piece="1.96"
```
- full_scale
- 该配件在铁匠铺锻造自定义功能中时,进行尺寸拉伸,模型是否是长宽高全部缩放。
- 若否,则缩放时模型只缩放长和高。
- 填写"true"。
- 可空默认为false。
- 在骑砍2自己的数据里只存在于锤类的刃部位配件。
- 骑砍2自己实际使用并不多只有39分之1623。
- BladeData
- 刃部的相关数据。
- 不可空,刃部必有。
- stack_amount
- 堆叠数量,是作为消耗弹药型的武器时的弹药数量。
- physics_material
- 物品效果,可填木制"wood_weapon"和铁制"metal_weapon"。
- 应该是影响格挡成功,命中墙壁时播放音效。
- body_name
- 碰撞胶囊体。(碰撞箱?)
- 影响碰撞建议完全按照骑砍2自己的来填写。
- 骑砍2自己的碰撞胶囊体有
- 剑类"bo_sword_one_handed"
- 匕首"bo_knife_a"
- 斧类"bo_axe_longer_b"
- 单手斧"bo_axe_longer_a"(只出现过一次)
- 锤类"bo_mace_a"
- 矛类"bo_spear_b"
- holster_mesh
- 收纳容器的外观模型id
- 可空,空就没有收纳容器。
- holster_body_name
- 猜测是收纳容器的碰撞胶囊体。可能用于扔掉该武器时,容器掉在地上时与其他碰撞箱进行碰撞。
- 似乎只出现在标枪类的刃部数据中。在刃部位只有13分之284。
- 与holster_mesh一一对应。
- 骑砍2自己的收纳容器碰撞胶囊体有
- bo_throwing_spear_quiver_3_2
- bo_throwing_spear_quiver_4
- bo_throwing_spear_quiver_5_1
- bo_throwing_spear_quiver_5_1
- ……等
- holster_mesh_length
- 收纳容器外观的长度。
- 未知用途。
- Thrust
- 戳捅动作的数据。
- damage_type
- 伤害类型。
- 可填:砍伤类型"Cut"、刺伤类型"Pierce"和钝伤类型"Blunt"。
- damage_factor
- 伤害系数。
- 用于通过公式,综合其他数值计算出锻造武器的伤害属性。
- 不同锻造类别的武器,公式不一样。
- 调整平衡时只能先获取游戏中当前的武器最终伤害属性值,当前伤害系数值,以及理想武器伤害属性值,计算得出配件应该修改为的伤害系数。
- Swing
- 挥动动作的数据。
- damage_type
- 同上。
- damage_factor
- 同上。
- 戳捅和挥动的公式似乎也不同。
- 格式例子
```
<BladeData stack_amount="3"
physics_material="wood_weapon"
body_name="bo_sword_one_handed">
<Thrust damage_type="Blunt"
damage_factor="0.8" />
<Swing damage_type="Blunt"
damage_factor="1.5" />
</BladeData>
```
- Flags
- 该配件的标记。
- 可空
- 可能是从Mount & Blade II Bannerlord\XmlSchemas\Items.xsd中来。
- name
- 骑砍2自己用过的
- 日常/平民"Civilian"。带有此标记的物品可以装备在日常装扮栏中,进入城镇场景中时穿戴。
- 可以在尸体上捡起"CanBePickedUpFromCorpse"。带有此标记的弹药消耗型武器可以在某个Agent死亡后产生的尸体上残留其他Agent可以捡起并装备。
- 无溅血"NoBlood"。带有此标记的武器攻击命中Agent时不会生成贴图上的血液。
- type
- 填写"ItemFlags"。
- 填写"NoBlood"时,无此元素。
```
<Flags>
<Flag name="CanBePickedUpFromCorpse"
type="ItemFlags" />
<Flag name="Civilian"
type="ItemFlags" />
<Flag name="NoBlood" />
</Flags>
```
- BuildData
- 该锻造配件的建造数据。
- piece_offset
- 猜测是配件的位置偏移量。
- 可空。
- previous_piece_offset
- 猜测是距离前一个配件的位置偏移量。
- 可空。
- next_piece_offset
- 猜测是距离下一个配件的位置偏移量。
- 可空。
- 例子
```
<BuildData piece_offset="0"
previous_piece_offset="0.358"
next_piece_offset="0.2" />
```
- Materials
- 该锻造配件消耗的材料。
- id
- 决定了消耗的材料是一种Item物品。
- 可填:
- 硬木。Wood
- 粗铁。Iron1
- 熟铁。Iron2
- 铁。Iron3
- 钢。Iron4
- 优质钢。Iron5
- 精炼钢。Iron6
- count
- 锻造一次消耗的材料数量。
- 例子
```
<Materials>
<Material id="Wood"
count="1" />
</Materials>
```
- StatContributions
- 该配件的属性奖励。
- 骑砍2只在剑类的连接处部位使用过"armor_bonus"。
- 在CraftingPieces.xsd中可以查到其余的部分。
- 存在的奖励:
- armor_bonus
- 护甲值额外加成。
- swing_damage_bonus
- 挥动动作伤害值额外加成。可能无法生效很可能与锻造功能绿色值和前缀的Bug使用的同一种代码。
- swing_speed_bonus
- 挥动速度值额外加成。
- thrust_damage_bonus
- 戳捅动作伤害值额外加成。
- thrust_speed_bonus
- 戳捅动作速度值额外加成。
- handling_bonus
- 操控值额外加成。
- accuracy_bonus
- 准确度值额外加成。
- 例子
```
<StatContributions armor_bonus="4" />
```

@ -0,0 +1,215 @@
**2023年02月11日**
**对应游戏版本v1.0.3** 皮蛋初版完成
# 根元素
<CraftingTemplates>
# 类型名
```
<CraftingTemplate 1=""
元素2=""
……>
<PieceDatas>
<PieceData piece_type="Handle"
build_order="0" />
<PieceData piece_type="Guard"
build_order="1" />
<PieceData piece_type="Blade"
build_order="2" />
<PieceData piece_type="Pommel"
build_order="-1" />
</PieceDatas>
<WeaponDescriptions>
<WeaponDescription id="填写该锻造类使用的武器用法" />
</WeaponDescriptions>
<StatsData>
<StatData stat_type="Weight"
max_value="7.0" />
<StatData stat_type="WeaponReach"
max_value="300" />
<StatData stat_type="ThrustSpeed"
max_value="200" />
<StatData stat_type="SwingSpeed"
max_value="200" />
<StatData stat_type="ThrustDamage"
max_value="500" />
<StatData stat_type="SwingDamage"
max_value="500" />
<StatData stat_type="Handling"
max_value="200" />
</StatsData>
<UsablePieces>
<UsablePiece piece_id="填写属于该锻造类的配件" />
<UsablePiece piece_id="填写属于该锻造类的配件" />
……
</UsablePieces>
</CraftingTemplate>
```
# 原版路径
Modules\Native\ModuleData\crafting_templates.xml
# 官方文档
[WEAPON SMITHING & CRAFTING PIECES](https://moddocs.bannerlord.com/asset-management/weapon_smithing/)
# 用途
- 所有锻造武器的类别。
- 该类别的武器用法有哪些。
- 武器各项属性的最大值。
- 物品挂在角色身体上的哪个部位(简单的例子:双手剑背在后背,而单手剑和剑鞘挂在身体一侧的腰间)。
- 类别中的武器有哪几个配件部位(刃部、连接处、杆、尾部)。
- 该类别武器拥有的用法,[见WeaponDescriptions武器用法页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/85/WeaponDescriptions%E6%AD%A6%E5%99%A8%E7%94%A8%E6%B3%95)。
- 该锻造类可用的所有配件,[见CraftingPieces武器配件](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/58/CraftingPieces%E6%AD%A6%E5%99%A8%E9%85%8D%E4%BB%B6)。
- 该xml中的数据转化为最直观的视觉图形展示及交互功能使用就是游戏中的铁匠铺中锻造武器的功能。
附一把锻造武器物品的逻辑图:
![锻造武器的逻辑图.png](../assets/锻造武器的逻辑图-911958dc-b56f-4bb5-87c9-f34b0b017034.png)
# 特点
- 模组难以往原版自己的锻造类别数据里添加新的配件,往往会崩溃,也研究不明白。所以都是创建模组自己的新的武器锻造类别,方便管理。
- 但是建议在规划好锻造类别后依然采用“原封不动地复制骑砍2自己的数据”的方法除了登记的可用配件以外大部分内容没有更改的需求。
- 建议武器可以用的配件部位都设定为四个全有。然后每个部位都创建一个“空”配件注册给所有的锻造类别。“空”配件的数据复制使用骑砍2自己的"default_polearm_pommel"配件改改类型即可。如果不这样做,后续美术或策划有新的给一把武器添加配重或特殊部位的需求的时候,就要大改这个类别下已有的所有锻造武器物品了。
- 手办类武器,即单手双手等多用法武器,在类别中的"<WeaponDescriptions>"元素中登记对应的特殊手办用法即可。后续元素说明中会详细展示,而用法部分详见[见WeaponDescriptions武器用法页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/85/WeaponDescriptions%E6%AD%A6%E5%99%A8%E7%94%A8%E6%B3%95)。
# 格式示范
```
<CraftingTemplate id="OneHandedSword"
item_type="OneHandedWeapon"
modifier_group="sword"
item_holsters="sword_left_hip_3:sword_left_hip:sword_left_hip_2:sword_back"
piece_type_to_scale_holster_with="Blade"
hidden_piece_types_on_holster="Blade"
default_item_holster_position_offset="0,0,-0.1">
<PieceDatas>
<PieceData piece_type="Handle"
build_order="0" />
<PieceData piece_type="Guard"
build_order="1" />
<PieceData piece_type="Blade"
build_order="2" />
<PieceData piece_type="Pommel"
build_order="-1" />
</PieceDatas>
<WeaponDescriptions>
<WeaponDescription id="OneHandedSword" />
</WeaponDescriptions>
<StatsData>
<StatData stat_type="Weight"
max_value="7.0" />
<StatData stat_type="WeaponReach"
max_value="300" />
<StatData stat_type="ThrustSpeed"
max_value="200" />
<StatData stat_type="SwingSpeed"
max_value="200" />
<StatData stat_type="ThrustDamage"
max_value="500" />
<StatData stat_type="SwingDamage"
max_value="500" />
<StatData stat_type="Handling"
max_value="200" />
</StatsData>
<UsablePieces>
<UsablePiece piece_id="empire_blade_1" />
<UsablePiece piece_id="empire_noble_blade_1" />
<UsablePiece piece_id="empire_noble_blade_2" />
<UsablePiece piece_id="empire_noble_blade_3" />
<UsablePiece piece_id="empire_noble_blade_4" />
</UsablePieces>
</CraftingTemplate>
```
# 元素说明
- id
- 该锻造类的ID
- 不可空。
- item_type
- 该锻造类中的物品所属的物品类别。
- 单手类武器物品"OneHandedWeapon"
- 双手类武器物品"TwoHandedWeapon"
- 长杆类武器物品"Polearm"
- 投掷类武器物品"Thrown"
- 制作流程上通常最初规划完成后直接找到正确的类别数据完全复制骑砍2自己的这一项不作任何修改。
- 不可空。
- modifier_group
- 该锻造类中的物品的前缀系统类别。
- 剑类前缀"sword"
- 斧类前缀"axe"
- 锤类前缀"mace"
- 长杆类前缀"polearm"
- 飞刀类前缀"knife_throwing"
- 飞斧类前缀"axe_throwing"
- 矛类的可投掷型前缀"spear_dart_throwing"
- 制作流程上通常最初规划完成后直接找到正确的类别数据完全复制骑砍2自己的这一项不作任何修改。
- 不可空。
- 其他详见[ItemModifiers物品前缀页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/147/ItemModifiers%E7%89%A9%E5%93%81%E5%89%8D%E7%BC%80)。
- item_holsters
- 很可能是用于:角色未手持该武器时,武器的模型物品挂在角色身体上的哪个部位。
- 例如:双手剑经常背在后背;单手剑经常和剑鞘挂在身体一侧的腰间。
- 格式上每一个位置的id用":"英文冒号键隔开。
- 制作流程上通常最初规划完成后直接找到正确的类别数据完全复制骑砍2自己的这一项不作任何修改。
- 不可空。
- piece_type_to_scale_holster_with
- 猜测是用于将剑鞘等的模型大小绑定至指定的配件尺寸大小。一般都是刃部。
- 制作流程上通常最初规划完成后直接找到正确的类别数据完全复制骑砍2自己的这一项不作任何修改。
- 只有有收纳容器的武器类别存在该元素。
- hidden_piece_types_on_holster
- 与武器的收纳容器模型有关,但不知道具体用途。
- 制作流程上通常最初规划完成后直接找到正确的类别数据完全复制骑砍2自己的这一项不作任何修改。
- 只有有收纳容器的武器类别存在该元素。
- default_item_holster_position_offset
- 可能与武器未手持时的模型挂在的部分坐标点有关,但不知道具体用途。
- 制作流程上通常最初规划完成后直接找到正确的类别数据完全复制骑砍2自己的这一项不作任何修改。
- 不可空。
- use_weapon_as_holster_mesh
- 可能是用于无收纳容器模型的武器类别。意思是这个武器挂在身上的样子与手持的模型完全一样,并不是收纳进容器后的模型样子。
- 可填"true"。
- 不填则默认为"false"。
- 制作流程上通常最初规划完成后直接找到正确的类别数据完全复制骑砍2自己的这一项不作任何修改。
- always_show_holster_with_weapon
- 猜测是用于那些手持该武器时也会同时展示收纳在容器状态的模型的武器类别。
- 可填"true"。
- 不填则默认为"false"。
- 制作流程上通常最初规划完成后直接找到正确的类别数据完全复制骑砍2自己的这一项不作任何修改。
- rotate_weapon_in_holster
- 在收纳进容器的状态时,该武器的模型是否旋转。
- 只用在标枪类中。
- 可填"true"。
- 不填则默认为"false"。
- 制作流程上通常最初规划完成后直接找到正确的类别数据完全复制骑砍2自己的这一项不作任何修改。
- PieceDatas
- 该锻造类别的武器拥有哪几个配件部位。
- 刃部——Blade。
- 连接处——Guard。在单手剑双手剑中也叫护手。
- 杆——Handle。也叫握把。
- 尾部——Pommel。也叫配重。
- 数字越大,越靠武器的前端,反之靠近角色手持的位置。
- 建议武器可以用的配件部位都设定为四个全有。然后每个部位都创建一个“空”配件注册给所有的锻造类别。“空”配件的数据复制使用骑砍2自己的"default_polearm_pommel"配件改改类型即可。如果不这样做,后续美术或策划有新的给一把武器添加配重或特殊部位的需求的时候,就要大改这个类别下已有的所有锻造武器物品了。
- 制作流程上,建议复制"OneHandedSword"中的该元素数据即可。
- 不可空。
- WeaponDescriptions
- 该锻造类别的武器能存在的用法。
- 在这里填写后,会去找用法文件中的对应用法进行读取。
- 不可空,可填写多个。但具体武器的用法情况还需要看配件是否在用法文件中登记。
- 详见[WeaponDescriptions武器用法页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/85/WeaponDescriptions%E6%AD%A6%E5%99%A8%E7%94%A8%E6%B3%95)。
- StatsData
- 该锻造类别的武器各项属性的最大值。
- 制作流程上通常最初规划完成后直接找到正确的类别数据完全复制骑砍2自己的这一项不作任何修改。
- 不可空。
- UsablePieces
- 将该锻造类别中的所有配件的id登记在此处。
- 登记进来的配件就可以在创建具体的武器时使用了。
- 同时要将配件登记在正确的各个用法中,否则会缺失数据。

@ -0,0 +1,186 @@
**2022年12月10日**
**对应游戏版本v1.0.0** 皮蛋初版
# 根元素
<Factions>
# 类型名
<Faction
元素1=""
元素2=""
……>
</Faction>
# 原版路径
Modules\SandBox\ModuleData\spclans.xml
# 用途
## 所有(阵营/派系)家族的信息
- 家族的名称
- 家族的领袖
- 家族的旗帜矢量图码
- 家族的主颜色与副颜色
- 家族的文化
- 家族初始的等阶
- 阵营的默认部队模板
- 百科全书介绍文本
- 小家族的部队指挥官模板
- 小家族的部队复活坐标
- 家族是否是贵族、是否是小家族、是否是宗教类/游牧类/雇佣类/不法类
## 阵营的大体分类
- 玩家家族
- 强盗派系
- 中立
- 领主/贵族家族
- 小家族
# 特点
- 只在创建新存档时读取一次,并以此生成家族和派系。
- 生成后,家族的数据将保存在存档文件中,载入游戏存档不会使用该文件内的数据。
- 部队和角色不可以没有Faction归属容易崩所以如果出现了没有归属的则丢进中立。
# 格式示范
```
<Faction id="karakhuzaits"
initial_posX="700.0"
initial_posY="515.0"
banner_key="34.25.10.1536.1536.764.764.1.0.0.314.22.35.444.444.764.764.0.0.270"
label_color="FF72583B"
color="FF72583B"
color2="FF72583B"
alternative_color="FF72583B"
alternative_color2="FF72583B"
culture="Culture.khuzait"
default_party_template="PartyTemplate.kingdom_hero_party_karakhuzaits_template"
settlement_banner_mesh="encounter_flag_f"
is_minor_faction="true"
is_outlaw="true"
is_nomad="true"
name="{=6BvGhzao}Karakhergit"
tier="4"
text="{=XJbDRBfd}The Karakhergit are one of the last nomadic clans in the western steppe. The Urkhunid khans have tried to coax them into settling down, offering them farmlands and serfs in exchange for a commitment to pay taxes and supply military levies, but they have resisted. They are treated by the other clans with a combination of envy and contempt. They trade and sometimes even intermarry with their settled brethren, but they also do a limited amount of kidnapping for ransom and raiding of flocks, and scoff at those who would blame them for carrying on with the heroic old ways.">
<minor_faction_character_templates>
<template id="NPCCharacter.spc_karakhuzaits_leader_0" />
<template id="NPCCharacter.spc_karakhuzaits_leader_1" />
<template id="NPCCharacter.spc_karakhuzaits_leader_2" />
<template id="NPCCharacter.spc_karakhuzaits_leader_3" />
</minor_faction_character_templates>
</Faction>
```
# 元素说明
- id
- 该派系的ID
- 不可空
- owner
- 该家族的家族领袖角色id
- 以"Hero.角色id"的格式填写
- 领主/贵族家族不可空,其他派系可空
- [见领主角色xml文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/68/NPCCharacters%E9%A2%86%E4%B8%BB)
- banner_key
- 该派系的旗帜矢量图码
- 可通过该网址绘制https://bannerlord.party/banner/
- 其颜色会被强制同步成更上层的颜色。如任何领主/贵族家族,在国家中时,旗帜颜色强制使用国家的颜色。若无上层,则使用矢量码中的颜色。
- 应该不可空
- label_color
- 未知作用
该派系的标签颜色?
- 贵族家族可空
- color
- 衣服主色
- 当该派系士兵的防具使用派系颜色时,按照模型的颜色通道规则生效
- 贵族家族可空
- color2
- 衣服副色
- 其他见上
- 贵族家族可空
- alternative_color
- 未知用途
- 通常参数与color相同
- 贵族家族可空
- alternative_color2
- 未知用途
- 通常参数与color2相同
- 贵族家族可空
- culture
- 该派系的文化
- 以"Culture.文化id"的格式填写
- 不可空特殊情况可以考虑用neutral_culture
- [见文化xml文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/93/SPCultures%E6%96%87%E5%8C%96)
- name
- 该家族的名称
- 不可空
- 加入火星人制作的强制读取英语翻译文件的功能后才可以正常读取英语的翻译文件显示英文否则英文语言设置下游戏中显示名称只显示name中的字符。
- 格式
```
name="{=此处填写翻译的StringID}此处填写英文名称"
```
- tier
- 该家族的初始等阶
- 可填0~6
- 应该不可空
- super_faction
- 该家族所属国家
- 贵族家族才有此元素
- 以"Kingdom.国家id"的格式填写
- [见国家派系xml文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/82/Kingdoms%E5%9B%BD%E5%AE%B6%E6%B4%BE%E7%B3%BB)
- settlement_banner_mesh
- 作用未知
- 很可能是定该家族所属部队进入定居点后,在定居点城楼处显示的旗帜模型
- 贵族家族没有该元素;小家族、强盗派系和中立有该元素
- 强盗家族为"none"
- 小家族为"encounter_flag_f"
- 中立为"encounter_flag_a"
- default_party_template
- 该派系的默认部队模板
- 贵族家族和中立没有该元素;小家族、强盗派系有该元素
- 以"PartyTemplate.部队模板id"为格式填写
- 见[部队模板文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/80/partyTemplates%E9%83%A8%E9%98%9F%E6%A8%A1%E6%9D%BF)
- text
- 该家族在百科全书中的介绍文本
- 不可空
- is_bandit
- 该派系是否是强盗派系
- 可填参数:"true"
- 可空空则默认为false
- is_outlaw
- 该派系是否是不法家族
- 必定出现在强盗派系,可能出现在小家族
- 可填参数:"true"
- 可空空则默认为false
- is_noble
- 该家族是否是贵族家族
- 可填参数:"true"
- 可空空则默认为false
- is_minor_faction
- 该家族是否是小家族
- 可填参数:"true"
- 可空空则默认为false
- is_clan_type_mercenary
- 该家族是否是雇佣兵类别
- 若是,则该家族在结果上必定会在各个国家之间跳槽(非常密集的跳槽判定,且无法阻止)
- 可填参数:"true"
- 可空空则默认为false
- is_mafia
- 该家族是否是秘密党派
- 作用未知,猜测是废案
- 只出现在小家族
- is_nomad
- 该家族是否是游牧家族
- 作用未知,猜测是废案
- 只出现在小家族
- initial_posX
- initial_posY
- 该家族的部队在世界地图上的出生坐标
- 出现在小家族
- short_name
- 家族简称
- 例子
全称"Brotherhood of the Woods"
简称"Brotherhood"
- 父元素<minor_faction_character_templates>
- 该小家族的部队指挥官角色模板
- 见[角色其他文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/72/NPCCharacters%E5%85%B6%E4%BB%96)
- 格式
```
<minor_faction_character_templates>
<template id="NPCCharacter.spc_hidden_hand_leader_0" />
<template id="NPCCharacter.spc_hidden_hand_leader_1" />
<template id="NPCCharacter.spc_hidden_hand_leader_2" />
<template id="NPCCharacter.spc_hidden_hand_leader_3" />
</minor_faction_character_templates>
```

@ -0,0 +1,3 @@
- [[弹窗]]
-
-

@ -0,0 +1,39 @@
- ## 安装Github Desktop
- 1. 打开官方下载地址 https://desktop.github.com/
2. 点击中间的下载按钮 ![image.png](../assets/image-d045150e-b8e0-4a51-9d72-45ac76e594b7.png){:height 1005, :width 776}
3. 然后会弹框下载 ![image.png](../assets/image-7f6d3ab7-0d42-4abd-8382-4346c0bb2db2.png)
4. 下载完成后打开安装包,安装过程全自动
- ## 一些打开后的流程
- 1. 如果你想登录Github帐号则选择上面的Sign in to Github.com 如果不想那么选下面的Skip this step ![image.png](../assets/image-ec68674a-d315-47bf-801d-b228578c4769.png)
2. 自己填写自己的用户名和邮箱用户名和邮箱尽量与Azure Devops的用户名和邮箱相同不要使用非英文及数字字符 ![image.png](../assets/image-a0899c43-6ceb-4587-a3e5-cc8ebbfe12db.png)
- ## 获取Azure Devops上的仓库链接
- 1. 进入项目主页 https://dev.azure.com/KnightOfTheArk/KnightOfTheArk 点击 Repo后可以看到下面界面 ![image.png](../assets/image-ce2becf8-57c5-4c2d-94cc-419ed47463a6.png)
2. 上方可以选择仓库,选择你需要克隆的仓库 ![image.png](../assets/image-972cb9bb-3b3b-4c4c-af36-340c40c0b2d2.png)
3. 点击右侧克隆按钮 ![image.png](../assets/image-542a27fb-0919-4cd6-aa22-677965f8bef8.png)
4. 点击复制按钮可以获得HTTPS模式下的克隆链接SSH模式自行研究 ![image.png](../assets/image-7f3f3b1d-a276-4ab0-8916-6a064dce0f44.png)
5. 点击下方的Generate Git Credentials可以获取登录凭证 ![image.png](../assets/image-067c627e-3c16-404d-9e5e-07a9b8e3cf22.png)
6. 保存好用户名和密码 ![image.png](../assets/image-fee4ed6a-16e2-45ae-9f13-25eb0bd3668d.png)
- ## 使用Github Desktop拉取程序库
- 1. 选择从互联网克隆仓库 ![image.png](../assets/image-830dbcdb-a49c-4281-992b-1810d8cf9032.png)
2. 选择URL将刚刚获取的克隆链接粘贴上下方Local Path是保存路径可以自行更改 ![image.png](../assets/image-e3793452-ac98-4be6-aa4e-691f8d1d7930.png)
3. 点击Clone后可以看到需要输入帐号密码 ![image.png](../assets/image-dcafe3b4-5820-49a2-9829-15199d92c568.png)
4. 将刚刚保存的帐号密码输入 ![image.png](../assets/image-c50e8f38-c3bf-4960-bf73-05abf980139c.png)
5. 可以看到克隆成功 ![image.png](../assets/image-a0e0d094-ab13-409f-afde-9234bc47de3e.png) ![image.png](../assets/image-3eb82794-ba8b-4bc0-914b-208309cc15cf.png)
- ## 代码提交与推送
- 1. 如果修改了代码,能在这里看到代码的变化 ![image.png](../assets/image-5bf99d77-f41c-4d30-853f-a8ed6ec3791b.png)
2. 填写一下提交日志,描述一下干了什么 ![image.png](../assets/image-91306a14-844c-4982-ac62-56fc9ee9337a.png)
3. 然后点击Commit to master ![image.png](../assets/image-74a89ede-e86e-4d2c-bc5d-5fab064814c4.png)
4. 提交完成后将修改推送到远端点击上方的push origin按钮 ![image.png](../assets/image-aa041e30-7015-4d7d-acb0-26af90d86d5e.png)
5. 看到上方重新出现Fetch origin之后即为上传成功 ![image.png](../assets/image-1989c711-ec52-4735-8477-6eba0b7ce93b.png)
- ## 一些其他提醒
- 1. 在提交commit之前记得要拉取pull一下远端的库防止推送时出现冲突 ![image.png](../assets/image-70af8fb3-bc2a-4324-ab33-f871cd7199f8.png)
- ## 如果忘记提交之前先拉取
- 如果你和其他人修改的不是一个文件那么会产生一个无用commit影响查找历史下面是推荐操作之一
1. 如果在没有先pull的情况下提交了commit ![image.png](../assets/image-dbc40d63-ce73-4033-a8a3-3b7bfa08b359.png)
2. 那么推送的时候会出现本地不是最新的提示点击其中的Fetch ![image.png](../assets/image-6ff4d474-3fbe-4bdd-be4a-2caabb7921ba.png)
3. 然后选择History ![image.png](../assets/image-5a68d8a9-c3c2-4543-8959-e77916386c75.png)
4. 右键选择Undo commit ![image.png](../assets/image-a1381778-e6a6-4648-8ff5-a8a95c58c6cb.png)
5. 他会将刚刚的提交撤回,返回提交之前的状态 ![image.png](../assets/image-c8424449-460b-437e-bb66-4e73f35dc888.png)
6. 然上面会变成Pull origin点击它 ![image.png](../assets/image-9715772a-6068-4b00-8c00-96c32dcb3328.png)
7. 此时会同步完成远程的状态 ![image.png](../assets/image-187b7766-fc91-4485-94d3-66319f9c0b49.png)
8. 重新提交, 重新推送即可![image.png](../assets/image-ced2562a-9bf2-44a4-af8d-f7d17db7114b.png)

@ -0,0 +1,52 @@
**2022年12月10日**
**对应游戏版本v1.0.0** 皮蛋初版
# 根元素
<Heroes>
# 类型名
<Hero />
# 原版路径
Modules\SandBox\ModuleData\heroes.xml
# 用途
领主/贵族角色的状态,包括
- 生死状态
- 父亲、母亲、配偶
- 所属家族
- 百科全书介绍文本
# 特点
- 只在创建新存档时读取一次,并以此生成领主/贵族角色。领主的其他数据见[NPCCharacters领主wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/68/NPCCharacters%E9%A2%86%E4%B8%BB)
- 生成后,角色的数据将保存在存档文件中,载入游戏存档不会使用该文件内的数据。
# 格式示范
```
<Hero id="dead_lord_6_4" father="Hero.dead_lord_6_3" alive="false" faction="Faction.clan_khuzait_3" text="{=f9Ha1S0s}Undul was a Khuzait noble of the Arkit clan." />
```
# 元素说明
- id
- 该角色的ID
- 不可空
- 见[领主角色文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/68/NPCCharacters%E9%A2%86%E4%B8%BB)
- father
- 该角色的父亲ID
- 以"Hero.角色id"的格式填写
- 可空
- mother
- 该角色的母亲ID
- 以"Hero.角色id"的格式填写
- 可空
- spouse
- 该角色的配偶ID
- 以"Hero.角色id"的格式填写
- 可空
- faction
- 该角色所属的家族id
- 以"Faction.家族id"的格式填写
- 应不可空
- alive
- 该角色的状态是存活还是死亡
- 可填参数:"false"
- 可空,空则默认为"true"

@ -0,0 +1,157 @@
**2022年12月18日**
**对应游戏版本v1.0.0** 皮蛋初版
# 根元素
<Kingdoms>
# 类型名
```
<Kingdom id=""
元素1=""
元素2=""
……>
<relationships>
<relationship kingdom="Kingdom.填写Kindom id" value="-1" isAtWar="true" />
</relationships>
<policies>
<policy id="填写政策id" />
</policies>
</Kingdom>
```
# 原版路径
Modules\SandBox\ModuleData\spkingdoms.xml
# 用途
## 所有国家的信息
- 国家的ID
- 国家的名称
- 国家的统治者
- 国家的旗帜矢量图码
- 该国家士兵战场上衣服的主副颜色码
- 属于该国家的家族旗帜的主副颜色
- 国家统治者的称呼;国家的短称、全称等
- 国家在百科全书的介绍文本
- 与其他国家的关系,初始战争关系
- 初始国家政策
# 特点
- 只在创建新存档时读取一次,并以此生成国家。
- 生成后,国家的数据将保存在存档文件中,载入游戏存档不会使用该文件内的数据。
- 家族可以不属于任何国家。
- 家族的旗帜主副颜色会被所属国家的主副颜色强制覆盖。
- 国家和家族可以存在宣战和和平但是体验上往往出现很多问题。如莫名其妙的家族向玩家宣战。所以一般情况下贵族家族要在国家里以保证骑砍2流程正常。
# 格式示范
```
<Kingdom id="empire" owner="Hero.lord_1_1" banner_key="11.4.4.4345.4345.764.764.1.0.0.163.5.5.512.512.764.764.1.0.0" primary_banner_color="0xff793191" secondary_banner_color="0xffFCDE90" label_color="FF850C6D" color="FF39223F" color2="FFDE9953" alternative_color="FFffffff" alternative_color2="FF660653" culture="Culture.empire" settlement_banner_mesh="encounter_flag_a" flag_mesh="info_screen_flags_b" name="{=NF627oiX}Northern Empire" short_name="{=nsDj8Qxl}northern Empire" title="{=NF627oiX}Northern Empire" ruler_title="{=OoHhCa11}Senator" text="{=aEfsyVH4}Many of the oldest families of the Empire live in the north.........">
<relationships>
<relationship kingdom="Kingdom.khuzait" value="-1" isAtWar="true" />
</relationships>
<policies>
<policy id="policy_feudal_inheritance" />
</policies>
</Kingdom>
```
# 元素说明
- id
- 该国家的ID
- 不可空
- owner
- 该国家统治者的角色id
- 以"Hero.角色id"的格式填写
- 不可空
- [见领主角色xml文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/68/NPCCharacters%E9%A2%86%E4%B8%BB)
- banner_key
- 该国家的旗帜矢量图码
- 可通过该网址绘制https://bannerlord.party/banner/
- 其颜色会被强制同步成下面元素中的主副颜色。
- 应该不可空
- 统治者家族的旗帜的显示会被覆盖成国家旗帜显示
- primary_banner_color
- 国家的旗帜背景颜色
- 不可空
- secondary_banner_color
- 国家的旗帜图案颜色
- 不可空
- label_color
- 未知用途
- color
- 衣服主色
- 加入该国家后,或属于该国家部队的士兵在战场上的衣服颜色
- 颜色码在游戏中会改变,使用代码需要深沉的颜色,实际游戏中的颜色会变浅变亮
- 不可空
- color2
- 衣服副色
- 加入该国家后,或属于该国家部队的士兵在战场上的衣服颜色
- 颜色码在游戏中会改变,使用代码需要深沉的颜色,实际游戏中的颜色会变浅变亮
- 不可空
- alternative_color
- 未知用途
- 通常参数与color相同
- alternative_color2
- 未知用途
- 通常参数与color2相同
- culture
- 该国家的文化
- 以"Culture.文化id"的格式填写
- 不可空
- [见文化xml文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/93/SPCultures%E6%96%87%E5%8C%96)
- settlement_banner_mesh
- 作用未知
- 很可能是定该国家所属部队进入定居点后,在定居点城楼处显示的旗帜模型
- 存在的值
- encounter_flag_a
- encounter_flag_b
- encounter_flag_c
- encounter_flag_d
- encounter_flag_e
- encounter_flag_f
- flag_mesh
- 作用未知
- 存在的值
- info_screen_flags_a
- info_screen_flags_b
- info_screen_flags_c
- name
- 该国家的名称
- 例子Khuzait
- 不可空
- 加入火星人制作的强制读取英语翻译文件的功能后才可以正常读取英语的翻译文件显示英文否则英文语言设置下游戏中显示名称只显示name中的字符。
- 格式
```
name="{=此处填写翻译的StringID}此处填写英文名称"
```
- short_name
- 该国家的简称?
- 例子Khuzaits
- 不可空
- title
- 该国家的全称
- 例子Khuzait Khanate库赛特汗国
- 不可空
- ruler_title
- 该国家统治者的称呼
- 例子High King至高王
- 不可空
- text
- 该国家在百科全书中的介绍文本
- 不可空
- 子元素<relationships>
- 该国家与其他国家的外交关系,决定了创建存档时初始的交战国家。
- 格式
```
<relationships>
<relationship kingdom="Kingdom.empire_w" value="-1" isAtWar="true" />
</relationships>
```
- 子元素<policies>
- 该国家的初始政策。
- 可以空
- 格式
```
<policies>
<policy id="policy_feudal_inheritance" />
</policies>
```

@ -0,0 +1,8 @@
- 2022年12月21日 - 初版流程图
- ![xml流程图 (1).png](../assets/xml流程图.png)
- [[角色Character相关XML]]
- [[物品Item相关XML]]
- [[种族Race模型骨骼相关XML]]
- [[其他XML]]
-
-

@ -0,0 +1,2 @@
# <Monsters>
待写

@ -0,0 +1,373 @@
**2022年12月18日** **对应游戏版本v1.0.0** 皮蛋初版未完成
**2022年12月21日** **对应游戏版本v1.0.0** 皮蛋初版完成
# 根元素
<NPCCharacters>
# 类型名
```
<NPCCharacter id=""
元素1=""
元素2=""
……>
<face>
<face_key_template value="BodyProperty.fighter_vlandia" />
</face>
<skills>
<skill id="Athletics"
value="20" />
<skill id="Riding"
value="5" />
……
</skills>
<upgrade_targets>
<upgrade_target id="NPCCharacter.vlandian_levy_crossbowman" />
</upgrade_targets>
<Equipments>
<EquipmentRoster>
<equipment slot="Item0"
id="Item.vlandia_mace_1_t2" />
<equipment slot="Head"
id="Item.leather_cap" />
<equipment slot="Body"
id="Item.bandit_leather_water_flask" />
……
</EquipmentRoster>
<EquipmentSet id="vlandia_troop_civilian_template_t1"
civilian="true" />
</Equipments>
</NPCCharacter>
```
# 原版路径
Modules\SandBoxCore\ModuleData\spnpccharacters.xml
# 用途
## 兵种的信息
- 兵种的ID
- 兵种的默认分组
- 兵种的等级
- 兵种的名称
- 兵种的文化
- 兵种的脸部码
- 兵种的技能等级
- 该兵种的升级目标兵种
- 兵种的战斗装备和平民装备
# 特点
- 进入主菜单时不载入NPCCharacter角色的数据。只在载入存档的时候读取。
- 但如果存档中某部队中有A兵种但在xml文件中删除了该兵种的id游戏读取不到就会导致存档无法进入。
- 所以兵种id不可以改变为了兼容老存档也不可以删除id。
- 下面未出现的元素是做兵种时通常不出现的元素NPCCharacter中有很多元素只在特定的情况给特定的角色用。
# 格式示范
```
<NPCCharacter id="vlandian_recruit"
default_group="Infantry"
level="6"
name="{=GEnwDYp1}Vlandian Recruit"
occupation="Soldier"
is_basic_troop="true"
is_hidden_encyclopedia="true"
culture="Culture.vlandia">
<face>
<face_key_template value="BodyProperty.fighter_vlandia" />
</face>
<skills>
<skill id="Athletics"
value="20" />
<skill id="Riding"
value="5" />
<skill id="OneHanded"
value="20" />
<skill id="TwoHanded"
value="10" />
<skill id="Polearm"
value="20" />
<skill id="Bow"
value="5" />
<skill id="Crossbow"
value="5" />
<skill id="Throwing"
value="5" />
</skills>
<upgrade_targets>
<upgrade_target id="NPCCharacter.vlandian_levy_crossbowman" />
<upgrade_target id="NPCCharacter.vlandian_footman" />
</upgrade_targets>
<Equipments>
<EquipmentRoster>
<equipment slot="Item0"
id="Item.vlandia_mace_1_t2" />
<equipment slot="Head"
id="Item.leather_cap" />
<equipment slot="Body"
id="Item.bandit_leather_water_flask" />
<equipment slot="Leg"
id="Item.empire_horseman_boots" />
</EquipmentRoster>
<EquipmentRoster>
<equipment slot="Item0"
id="Item.peasant_pitchfork_1_t1" />
<equipment slot="Body"
id="Item.bandit_leather_water_flask" />
<equipment slot="Leg"
id="Item.empire_horseman_boots" />
<equipment slot="Head"
id="Item.padded_cap" />
<equipment slot="Cape"
id="Item.scarf" />
</EquipmentRoster>
<EquipmentRoster>
<equipment slot="Item0"
id="Item.peasant_pickaxe_1_t1" />
<equipment slot="Body"
id="Item.sackcloth_tunic" />
<equipment slot="Leg"
id="Item.empire_horseman_boots" />
<equipment slot="Head"
id="Item.padded_cap" />
<equipment slot="Cape"
id="Item.hood" />
</EquipmentRoster>
<EquipmentSet id="vlandia_troop_civilian_template_t1"
civilian="true" />
</Equipments>
</NPCCharacter>
```
# 元素说明
- id
- 该兵种的ID
- 不可空
- default_group
- 该兵种的默认分组
- 可填
1. Infantry
步兵
2. Ranged
远程
3. Cavalry
骑兵
4. HorseArcher
骑射
- 影响部队移动速度。前两者为步行单位,可受到“骑行步兵”效果的加成;后两者为骑乘单位,直接增加部队移动速度。
- 影响特长Perk的判定比如效果*当部队中步行单位占比超过50%时……*;此效果即用分组来判断是否是步行单位。
- 影响野外战斗时模拟战斗坐镇指挥的战斗力是骑乘单位时战斗力乘以1.2。
- level
- 该兵种的等级
- 不可空
- 游戏中会根据等级计算得出兵的等阶Tier
- 可填
1. 1
零阶,对应原版的农民,在百科全书中显示为无标志。
2. 6
一阶,对应原版的新兵,在百科全书中显示标志是“一个拐”。
3. 11
二阶,对应原版的贵族兵的初始兵,在百科全书中显示标志是“两个拐”。
4. 16
三阶,在百科全书中显示标志是“三个拐”。
5. 21
四阶,在百科全书中显示标志是“三角”。
6. 26
五阶,对应原版的普通兵种顶级,在百科全书中显示标志是“三角加一横线”。
7. 31
六阶,对应原版的贵族兵种顶级,在百科全书中显示标志是“三角加两横线”。
8. 36
七阶,原版没有,并且代码被屏蔽,需要用代码重新开放,在百科全书中显示标志是“五星加一横线”。
- 实际上1至5会计算为零阶6至10会计算为二阶11至15计算为三阶以此类推。升级不升阶可能会产生Bug。
- 影响模拟战斗(坐镇指挥)的战斗力,等阶是多少,战斗力即多少。
- 升级前和升级后的等级差决定了升级所需经验值的多少。由公式计算得出。
- name
- 该兵种的名称。
- 加入火星人的强制读取英语翻译文件的功能后才可以正常读取英语的翻译文件显示英文否则英文语言设置下游戏中显示名称只显示name中的字符。
- 格式
```
name="{=此处填写翻译的StringID}此处填写英文名称"
```
- occupation
- 该兵种的职业。
- 不可空
- 对于兵种,填写
1. Soldier
大部分兵种的职业。士兵。
2. CaravanGuard
商队护卫的兵种。
3. Bandit
强盗的兵种。
- is_basic_troop
- 该兵种是否是兵种树的起始。
- 可填参数:"true"
- 可空空则默认为false
- 只有正确填写此项时,百科全书中显示的与之相关的兵种才能显示为正确的兵种树状态。
- is_hidden_encyclopedia
- 是否在百科全书中隐藏。
- 可填参数:"true"
- 可空空则默认为false
- culture
- 该兵种的文化。
- 以"Culture.文化id"的格式填写
- 不可空特殊情况可以考虑用neutral_culture
- [见文化xml文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/93/SPCultures%E6%96%87%E5%8C%96)
- 子元素<face>
- 该兵种使用的脸部码。
- 不可空
- 决定了该兵种的肤色、发色、身高、胖瘦、捏脸、发型、胡子、文身或疤痕等外观的随机范围。
- 可填写三种格式
1. 标准的模板id
兵种应使用这种格式。[见脸部码xml文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/97/BodyProperties%E6%8D%8F%E8%84%B8%E7%A0%81)
2. 单独的模板
通常不使用这种格式。[见脸部码xml文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/97/BodyProperties%E6%8D%8F%E8%84%B8%E7%A0%81)
3. 单独的一个脸部码
兵种通常不使用这种格式。单独的一个码会使得该兵种长得完全一样。
```
格式1
<face>
<face_key_template value="BodyProperty.此处填写脸部模板id" />
</face>
格式2
<face>
<BodyProperties version="4"
age="32.64"
weight="0"
build="0.4547"
key="000B7408803C10046F90BC00B2977887957995866795A3633A86FFFF29AB7B4A00070274070F1018000000000000000000000000000000000000000000F04040" />
<BodyPropertiesMax version="4"
age="32.64"
weight="0"
build="0.4547"
key="000B7408803C10046F90BC00B2977887957995866795A3633A86FFFF29AB7B4A00070274070F1018000000000000000000000000000000000000000000F04040" />
</face>
格式3
<face>
<BodyProperties version="4"
weight="0.3"
build="0.4"
key="0000900A10143006685D493BBC780A4686D18674A5379AA596B62D5A727BC485017776130799B93A000000000000000000000000000000000000000068FC4083" />
</face>
```
- 子元素<skills>
- 该兵种的技能等级
- 可空
- 通常范围0至300
- 可填技能
- OneHanded
单手
- TwoHanded
双手
- Polearm
长杆
- Bow
- Crossbow
- Throwing
投掷
- Riding
骑术
- Athletics
跑动
- 填写其他角色存在的技能也能读取但没有效果。特殊的像希绝大陆模组的程序制作了读取兵种的医疗Medicine技能等级作为其血量上限的功能。
```
格式示范:
<skills>
<skill id="OneHanded" value="此处填写单手技能值" />
<skill id="TwoHanded" value="此处填写双手技能值" />
<skill id="Polearm" value="此处填写长杆技能值" />
<skill id="Bow" value="此处填写弓技能值" />
<skill id="Crossbow" value="此处填写弩技能值" />
<skill id="Throwing" value="此处填写投掷技能值" />
<skill id="Riding" value="此处填写骑术技能值" />
<skill id="Athletics" value="此处填写跑动技能值" />
</skills>
```
- 子元素<upgrade_targets>
- 该兵种可以升级到的兵种
- 可空
- 可填写多个
```
格式:
<upgrade_targets>
<upgrade_target id="NPCCharacter.升级到的兵种id一号" />
<upgrade_target id="NPCCharacter.升级到的兵种id二号" />
……
</upgrade_targets>
```
- 子元素<Equipments>
- 该兵种的装备
- 不可空
- 必须有一套战斗装备和一套日常装备;其中,带有"civilian="true"的是日常装备,反之是战斗装备。
- 骑砍2的随机装备并非是按照“一套”为单位进行随机而是每个槽位slot都进行随机。
- 所以当某个兵种有五套装备时他会使用套装A的头盔套装B的胸甲套装C的单手剑套装D的盾牌和套装E的马匹。
- 如果某个槽位slot出现了空那么随机时会作为空进行随机。
- 所以当某个兵种有五套装备武器槽位二号slot Item1有两套是盾牌有三套是空时该兵种随机到装备盾牌的概率为五分之二随机到不带盾牌即空的概率为五分之三。以此方法制作概率佩戴盾牌概率佩戴头盔等设计的兵种。
- 容易产生的报错
- 当没有日常装备,没有读取到时,会崩溃。
- 当日常装备中填写了非日常装备的物品时,会崩溃。(可见Items的wiki文档页面)[https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/122/Items%E9%98%B2%E5%85%B7%E6%9C%8D%E8%A3%85]
- 当装备槽位slot填写的物品不是该部位的装备时会崩溃。
- 特殊的当填写的物品id找不到时会以空为结果但不会崩溃。发生该问题后通常打开百科全书查看该兵种即可发现该兵种没有佩戴该部位的装备。
- 可填写三种格式。三种格式可以共存。
1. 子元素<EquipmentRoster>
- 兵种的战斗装备常用格式。
- 可空。
- 可以有多个EquipmentRoster。
- 每个EquipmentRoster中包含一套装备。
- 士兵进入战场时每个装备槽位slot都会从所有在EquipmentRoster中读取到的slot中随机。
- 可填写的槽位slot
- Item0
武器栏的第一个武器
- Item1
武器栏的第二个武器
- Item2
武器栏的第三个武器
- Item3
武器栏的第四个武器
- Head
防具栏的头部装备
- Cape
防具栏的肩部装备
- Body
防具栏的胸部装备
- Gloves
防具栏的手部装备
- Leg
防具栏的腿部装备
- Horse
骑乘栏的骑乘装备
- HorseHarness
骑乘栏的骑乘防具装备
2. 子元素<EquipmentSet>
- 兵种的日常装备常用格式。
- 可空
- 填写装备模板的id[见装备模板xml文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/89/EquipmentRosters%E8%A3%85%E5%A4%87%E6%A8%A1%E6%9D%BF)
3. 直接填写equipment
- 不推荐使用。
- 会将填写的装备应用至所有的套装中的对应槽位slot。
```
格式示范:
<Equipments>
<!-- 此处开始格式1 -->
<EquipmentRoster>
<equipment slot="Item0"
id="Item.此处填写武器装备id" />
<equipment slot="Body"
id="Item.此处填写防具装备id" />
<equipment slot="Leg"
id="Item.此处填写防具装备id" />
<equipment slot="Horse"
id="Item.此处填写骑乘装备id" />
</EquipmentRoster>
<EquipmentRoster civilian="true">
<equipment slot="Body"
id="Item.此处填写日常装备可用的防具装备id" />
<equipment slot="Item0"
id="Item.此处填写日常装备可用的武器装备id" />
</EquipmentRoster>
<!-- 此处格式1结束 -->
<!-- 此处开始格式2 -->
<EquipmentSet id="此处填写装备模板id" />
<!-- 此处格式2结束 -->
<!-- 此处开始格式3 -->
<equipment slot="Horse"
id="Item.此处填写骑乘装备id" />
<equipment slot="HorseHarness"
id="Item.此处填写骑乘防具装备id" />
<!-- 此处格式3结束 -->
</Equipments>
```

@ -0,0 +1,355 @@
**2022年12月27日** **对应游戏版本v1.0.0** 皮蛋初版完成
# 根元素
<NPCCharacters>
# 类型名
```
<NPCCharacter id=""
元素1=""
元素2=""
……>
<face>
<BodyProperties version="4" age="28" weight="0.1829" build="0.5108" key="001B8C0B00001408D97B47C768AE9A976D83A69588AA7449B83728B1A2A22D1B00A836030A8489540000000000000000000000000000000000000000234C5106" />
</face>
<skills></skills>
<Traits>
<Trait id="Honor"
value="1" />
<Trait id="Calculating"
value="-1" />
</Traits>
<Equipments>
<EquipmentRoster />
<EquipmentSet id="cet_jdy_lord_02" />
<EquipmentSet id="ase_civ_template_bedouin"
civilian="true" />
</Equipments>
</NPCCharacter>
```
# 原版路径
Modules\SandBox\ModuleData\lords.xml
# 用途
## 贵族领主的信息
- 领主的ID
- 领主的姓名
- 领主的性别
- 领主的默认分组
- 领主的年龄
- 领主的特质(性格)
- 领主的声音类型
- 领主的文化
- 领主的脸部码
- 领主的技能等级
- 领主的战斗装备和平民装备
# 特点
- 只在创建新存档时读取一次,并以此生成领主/贵族角色。必须配合[Heroes角色所属家族和亲缘关系wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/55/Heroes%E8%A7%92%E8%89%B2%E6%89%80%E5%B1%9E%E5%AE%B6%E6%97%8F%E5%92%8C%E4%BA%B2%E7%BC%98%E5%85%B3%E7%B3%BB)文件才能正常生成。
- 下面未出现的元素是做兵种时通常不出现的元素NPCCharacter中有很多元素只在特定的情况给特定的角色用。
# 格式示范
```
<NPCCharacter id="sika_lord_mgr_09_08"
name="{=SikaLordNameMGRN08}Jibhaalig"
age="42"
voice="curt"
default_group="HorseArcher"
is_hero="true"
is_female="true"
culture="Culture.khuzait"
occupation="Lord"
face_mesh_cache="true"
skill_template="SkillSet.template_skills_a14_t3_a">
<face>
<BodyProperties version="4" age="42" weight="0.1481" build="0.4072" key="0020C80AC0B420095626BC879B8921124E8B88B78AB7AB25A697ACAB2E779837004626030458D6AD0000000000000000000000000000000000000000307C4086" />
</face>
<skills></skills>
<Traits>
<Trait id="valor"
value="1" />
<Trait id="Calculating"
value="-1" />
</Traits>
<Equipments>
<EquipmentRoster />
<EquipmentSet id="cet_mgr_lord_07" />
<EquipmentSet id="ase_civ_template_bedouin"
civilian="true" />
</Equipments>
</NPCCharacter>
```
# 元素说明
- id
- 该领主的ID
- 不可空
- name
- 该角色的名称。
- 加入火星人的强制读取英语翻译文件的功能后才可以正常读取英语的翻译文件显示英文否则英文语言设置下游戏中显示名称只显示name中的字符。
- 格式
```
name="{=此处填写翻译的StringID}此处填写英文名称"
```
- age
- 该角色的年龄。
- 角色会在18岁成年成年后才可以参与领主的活动或互动。
- 角色会在50岁以后开始有概率自然死亡年龄越大概率越高。
- voice
- 该角色的语音声音类型。
- 可填写
1. earnest
认真诚挚的
2. ironic
讽刺挖苦的
3. softspoken
温和善言的
4. curt
唐突失礼的
- default_group
- 该领主的默认分组
- 可填
1. Infantry
步兵
2. Ranged
远程
3. Cavalry
骑兵
4. HorseArcher
骑射
- 影响战场上该角色的队伍分组。
- is_hero
- 该角色是否是英雄。
- 对于领主来说,应填是。
- 可填参数:"true"
- 可空空则默认为false
- is_female
- 该角色的性别是否是女。
- 可填参数:"true"
- 可空空则默认为false
- culture
- 该角色的文化。
- 以"Culture.文化id"的格式填写
- 不可空特殊情况可以考虑用neutral_culture
- [见文化xml文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/93/SPCultures%E6%96%87%E5%8C%96)
- occupation
- 该领主的职业。
- 不可空
- 对于领主,填写"Lord"
- face_mesh_cache
- 该角色是否缓存脸部模型。
- 具体作用未知。
- 可填参数:"true"
- 可空空则默认为false
- skill_template
- 该角色的技能模板。
- 使用模板的办法的情况下,元素"skills"就可以空。反之亦然。
- 以"SkillSet.技能模板id"的格式填写。
- 可空
- [见SkillSets技能模板wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/87/SkillSets%E6%8A%80%E8%83%BD%E6%A8%A1%E6%9D%BF)
- 子元素<face>
- 该角色使用的脸部码。
- 不可空
- 决定了该角色的肤色、发色、身高、胖瘦、捏脸、发型、胡子、文身或疤痕等外观。
- 可填写三种格式
1. 标准的模板id
领主不应使用这种格式。[见脸部码xml文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/97/BodyProperties%E6%8D%8F%E8%84%B8%E7%A0%81)
2. 单独的模板
通常不使用这种格式。[见脸部码xml文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/97/BodyProperties%E6%8D%8F%E8%84%B8%E7%A0%81)
3. 单独的一个脸部码
领主应使用这种格式。
```
<!-- 格式1 -->
<face>
<face_key_template value="BodyProperty.此处填写脸部模板id" />
</face>
<!-- 格式2 -->
<face>
<BodyProperties version="4"
age="32.64"
weight="0"
build="0.4547"
key="000B7408803C10046F90BC00B2977887957995866795A3633A86FFFF29AB7B4A00070274070F1018000000000000000000000000000000000000000000F04040" />
<BodyPropertiesMax version="4"
age="32.64"
weight="0"
build="0.4547"
key="000B7408803C10046F90BC00B2977887957995866795A3633A86FFFF29AB7B4A00070274070F1018000000000000000000000000000000000000000000F04040" />
</face>
<!-- 格式3 -->
<BodyProperties version="4" age="42" weight="0.1481" build="0.4072" key="0020C80AC0B420095626BC879B8921124E8B88B78AB7AB25A697ACAB2E779837004626030458D6AD0000000000000000000000000000000000000000307C4086" />
</face>
```
- 子元素<skills>
- 该角色的技能等级
- 使用元素"skills"的办法的情况下skill_template就可以空。反之亦然。
- 可空
- 通常范围0至300
- 可填技能
- OneHanded
单手
- TwoHanded
双手
- Polearm
长杆
- Bow
- Crossbow
- Throwing
投掷
- Riding
骑术
- Athletics
跑动
- Tactics
战术
- Scouting
侦查
- Roguery
流氓习气
- Charm
魅力
- Trade
交易
- Crafting
锻造
- Leadership
统御
- Steward
管理
- Medicine
医术
- Engineering
工程
```
格式示范:
<skills>
<skill id="OneHanded" value="此处填写单手技能值" />
<skill id="TwoHanded" value="此处填写双手技能值" />
<skill id="Polearm" value="此处填写长杆技能值" />
<skill id="Bow" value="此处填写弓技能值" />
<skill id="Crossbow" value="此处填写弩技能值" />
<skill id="Throwing" value="此处填写投掷技能值" />
<skill id="Riding" value="此处填写骑术技能值" />
<skill id="Athletics" value="此处填写跑动技能值" />
……
</skills>
```
- 子元素<Traits>
- 该角色拥有的特质。在骑砍1里俗称性格但是此处并非严格意义上的性格。
- 可空,任意一项不填写即默认为零。
- 每项特质的填写范围是-2至2的整数会读取成该角色的对应项特质的初始等级。
- 每项特质在游戏的过程中有经验值以0位基准特质经验值每上升或下降1000就会改变特质等级1级。
- 可填特质一共有五项
1. Valor
胆气
2. Honor
荣誉
3. Generosity
胸怀
4. Mercy
善恶
5. Calculating
谋略
- 不同特质等级所展示的文本见附表1
- 特质组合后在百科全书页面的角色评价文本见附表2
- 当前骑砍2游戏中的角色特质影响三处
1. 玩家首次创建存档时每个角色的初始好感度等于主角的每项特质与该角色对应特质的差每差1好感度下降1。
2. 在说服系统中,不同特质的角色的说服选项会改变,需要主角具备的特质也不同。
3. 该角色如果没有填写text即没有百科全书的介绍则会生成默认介绍展示默认介绍中会介绍该角色的特质描述词。
- 主角的特质经验会随着玩家的行为增加或减少,从而使得特质等级改变。但其他角色似乎不会。
```
格式示范:
<Traits>
<Trait id="valor"
value="1" />
<Trait id="Calculating"
value="-1" />
</Traits>
```
- 子元素<Equipments>
- 该角色的装备
- 不可空
- 必须有一套战斗装备和一套日常装备;其中,带有"civilian="true"的是日常装备,反之是战斗装备。
- 在创建新存档时,读取一次该元素,并将其中的装备穿戴给该领主角色,然后数据相关会保存在存档文件中。之后加载存档不会再读取此处的数据。
- 如果一个领主有多套装备数据被读取,则会在创建存档时在其中随机一套装备给角色穿戴。
- 容易产生的报错
- 当没有日常装备,没有读取到时,会崩溃。
- 当日常装备中填写了非日常装备的物品时,会崩溃。(可见Items的wiki文档页面)[https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/122/Items%E9%98%B2%E5%85%B7%E6%9C%8D%E8%A3%85]
- 当装备槽位slot填写的物品不是该部位的装备时会崩溃。
- 特殊的当填写的物品id找不到时会以空为结果但不会崩溃。发生该问题后通常打开百科全书查看该兵种即可发现该兵种没有佩戴该部位的装备。
- 可填写三种格式。三种格式可以共存。
1. 子元素<EquipmentRoster>
- 装备独一无二的角色使用这种格式。
- 可空。
- 可填写的槽位slot
- Item0
武器栏的第一个武器
- Item1
武器栏的第二个武器
- Item2
武器栏的第三个武器
- Item3
武器栏的第四个武器
- Head
防具栏的头部装备
- Cape
防具栏的肩部装备
- Body
防具栏的胸部装备
- Gloves
防具栏的手部装备
- Leg
防具栏的腿部装备
- Horse
骑乘栏的骑乘装备
- HorseHarness
骑乘栏的骑乘防具装备
2. 子元素<EquipmentSet>
- 穿戴随机化模板化的领主使用这种格式。
- 可空
- 填写装备模板的id[见装备模板xml文档wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/89/EquipmentRosters%E8%A3%85%E5%A4%87%E6%A8%A1%E6%9D%BF)
3. 直接填写equipment
- 通常不使用这种格式。
- 会将填写的装备应用至所有的套装中的对应槽位slot。
```
格式示范:
<Equipments>
<!-- 此处开始格式1 -->
<EquipmentRoster>
<equipment slot="Item0"
id="Item.此处填写武器装备id" />
<equipment slot="Body"
id="Item.此处填写防具装备id" />
<equipment slot="Leg"
id="Item.此处填写防具装备id" />
<equipment slot="Horse"
id="Item.此处填写骑乘装备id" />
</EquipmentRoster>
<EquipmentRoster civilian="true">
<equipment slot="Body"
id="Item.此处填写日常装备可用的防具装备id" />
<equipment slot="Item0"
id="Item.此处填写日常装备可用的武器装备id" />
</EquipmentRoster>
<!-- 此处格式1结束 -->
<!-- 此处开始格式2 -->
<EquipmentSet id="此处填写装备模板id" />
<!-- 此处格式2结束 -->
<!-- 此处开始格式3 -->
<equipment slot="Horse"
id="Item.此处填写骑乘装备id" />
<equipment slot="HorseHarness"
id="Item.此处填写骑乘防具装备id" />
<!-- 此处格式3结束 -->
</Equipments>
```
- 附表
- 附表1
![QQ截图20221227095910.png](../assets/QQ截图20221227095910-84c8d4a3-ba74-4e22-a10a-36753dfae224.png)
- 附表2
![QQ图片20221227100124.png](../assets/QQ图片20221227100124-ddfe653b-e4df-454a-b126-e8f59cbea732.png)

@ -0,0 +1,913 @@
**2023年02月09日**
**对应游戏版本v1.0.3** 皮蛋初版完成。
**2023年02月26日**
**对应游戏版本v1.0.3** 皮蛋补齐缺失的部分。
# 根元素
<SPCultures>
# 类型名及结构
```
<Culture 1=""
元素2=""
……>
<vassal_reward_items>
<item id="Item." />
……
</vassal_reward_items>
<banner_bearer_replacement_weapons>
<item id="Item." />
……
</banner_bearer_replacement_weapons>
<default_policies>
<policy id="" />
……
</default_policies>
<male_names>
<name name="{=!}" />
……
</male_names>
<female_names>
<name name="{=!}" />
……
</female_names>
<clan_names>
<name name="{=pRA9EzNv}Acapanos" />
……
</clan_names>
<cultural_feats>
<feat id="empire_slower_hearth_production" />
……
</cultural_feats>
<possible_clan_banner_icon_ids>
<icon id="100" />
……
</possible_clan_banner_icon_ids>
<notable_and_wanderer_templates>
<template name="NPCCharacter.spc_wanderer_empire_0" />
……
</notable_and_wanderer_templates>
<lord_templates>
<template name="NPCCharacter.spc_legion_of_the_betrayed_leader_0" />
……
</lord_templates>
<rebellion_hero_templates>
<template name="NPCCharacter.spc_legion_of_the_betrayed_leader_0" />
……
</rebellion_hero_templates>
<tournament_team_templates_one_participant>
<template name="NPCCharacter.tournament_template_empire_one_participant_set_v1" />
……
</tournament_team_templates_one_participant>
<tournament_team_templates_two_participant>
<template name="NPCCharacter.tournament_template_empire_two_participant_set_v1" />
……
</tournament_team_templates_two_participant>
<tournament_team_templates_four_participant>
<template name="NPCCharacter.tournament_template_empire_four_participant_set_v1" />
……
</tournament_team_templates_four_participant>
<basic_mercenary_troops>
<template name="NPCCharacter.eastern_mercenary" />
……
</basic_mercenary_troops>
</Culture>
```
# 原版路径
Modules\SandBox\ModuleData\spcultures.xml
# 用途
## 所有主文化的基础信息
- 主要文化用于建立常规派系,是全面的文化。
- 文化的名称。
- 该文化各种用途的颜色。
- 该文化招募的基础普通兵种与贵族兵种id。
- 该文化在定居点生成的民兵兵种id。
- 该文化派系生成的部队所使用的部队模板id。
- 该文化在百科全书中的介绍文本。
- 该文化在定居点场景中生成的巨量各种用途的平民所使用的兵种模板id。
- 该文化的酒馆内棋类游戏类型。
## 所有主文化的进阶细分信息
- 该文化派系会在玩家首次加入派系时授予玩家的领主奖励物品id。
- 该文化在战场上被选为执旗手的士兵右手装备的替代型单手武器id。
- 该文化的派系在创建游戏时默认开启的政策。
- 生成该文化角色时使用的随机男性女性名字库。
- 生成该文化的随机家族时使用的家族名字库。
- 该文化应用的文化天赋。
- 该文化可能使用的旗帜图案。
- 该文化的流浪者模板id。
- 该文化的全部要人模板id。
- 该文化的贵族领主和叛军领主模板id。
- 该文化的竞技场相关模板。
- 该文化定居点酒馆中刷新的基础雇佣兵兵种id。
## 所有次要文化的信息
- 次要文化用于强盗和小派系等用途,无法成为可以拥有定居点建立国家的文化。
- 包含部分必要的文化信息。
# 特点
- 分为主文化和次要文化两种。主文化量级大,内容繁琐。次要文化内容少。
- 次要文化中没有出现的元素默认为空不被使用就无所谓。具体需要参照骑砍2自己的内容进行制作。
- 每次创建游戏或载入存档都会读取。
- 近两年的改动较为频繁,需要经常检查格式。
# 格式示范
## 主要文化:
```
<Culture id="empire"
name="{=empirefaction}Empire"
is_main_culture="true"
color="0xff793191"
color2="0xffFCDE90"
elite_basic_troop="NPCCharacter.imperial_vigla_recruit"
basic_troop="NPCCharacter.imperial_recruit"
melee_militia_troop="NPCCharacter.imperial_militia_spearman"
ranged_militia_troop="NPCCharacter.imperial_militia_archer"
melee_elite_militia_troop="NPCCharacter.imperial_militia_veteran_spearman"
ranged_elite_militia_troop="NPCCharacter.imperial_militia_veteran_archer"
can_have_settlement="true"
town_edge_number="16"
villager_party_template="PartyTemplate.villager_empire_template"
default_party_template="PartyTemplate.kingdom_hero_party_empire_template"
caravan_party_template="PartyTemplate.caravan_template_empire"
elite_caravan_party_template="PartyTemplate.elite_caravan_template_empire"
militia_party_template="PartyTemplate.militia_empire_template"
rebels_party_template="PartyTemplate.rebels_empire_template"
vassal_reward_party_template="PartyTemplate.vassal_reward_troops_empire"
prosperity_bonus="1"
encounter_background_mesh="encounter_empire"
faction_banner_key="11.4.124.4345.4345.764.764.1.0.0.163.0.5.512.512.764.764.1.0.0"
default_face_key="000fa92e90004202aced5d976886573d5d679585a376fdd605877a7764b8987c00000000000007520000037f0000000f00000037049140010000000000000000"
text="{=X0kKBzsW}The Calradians are the people of the Empire."
tournament_master="NPCCharacter.tournament_master_empire"
villager="NPCCharacter.villager_empire"
caravan_master="NPCCharacter.caravan_master_empire"
armed_trader="NPCCharacter.armed_trader_empire"
caravan_guard="NPCCharacter.caravan_guard_empire"
veteran_caravan_guard="NPCCharacter.veteran_caravan_guard_empire"
duel_preset="NPCCharacter.empire_duel_preset"
prison_guard="NPCCharacter.prison_guard_empire"
guard="NPCCharacter.guard_empire"
blacksmith="NPCCharacter.blacksmith_empire"
weaponsmith="NPCCharacter.weaponsmith_empire"
townswoman="NPCCharacter.townswoman_empire"
townswoman_infant="NPCCharacter.townswoman_infant_empire"
townswoman_child="NPCCharacter.townswoman_child_empire"
townswoman_teenager="NPCCharacter.townswoman_teenager_empire"
townsman="NPCCharacter.townsman_empire"
townsman_infant="NPCCharacter.townsman_infant_empire"
townsman_child="NPCCharacter.townsman_child_empire"
village_woman="NPCCharacter.village_woman_empire"
villager_male_child="NPCCharacter.villager_child_empire"
villager_male_teenager="NPCCharacter.villager_teenager_empire"
villager_female_child="NPCCharacter.village_woman_child_empire"
villager_female_teenager="NPCCharacter.village_woman_teenager_empire"
townsman_teenager="NPCCharacter.townsman_teenager_empire"
ransom_broker="NPCCharacter.ransom_broker_empire"
gangleader_bodyguard="NPCCharacter.gangleader_bodyguard_empire"
merchant_notary="NPCCharacter.merchant_notary_empire"
artisan_notary="NPCCharacter.artisan_notary_empire"
preacher_notary="NPCCharacter.preacher_notary_empire"
rural_notable_notary="NPCCharacter.rural_notable_notary_empire"
shop_worker="NPCCharacter.shop_worker_empire"
tavernkeeper="NPCCharacter.tavernkeeper_empire"
taverngamehost="NPCCharacter.taverngamehost_empire"
musician="NPCCharacter.musician_empire"
tavern_wench="NPCCharacter.tavern_wench_empire"
armorer="NPCCharacter.armorer_empire"
horseMerchant="NPCCharacter.horseMerchant_empire"
barber="NPCCharacter.barber_empire"
merchant="NPCCharacter.merchant_empire"
beggar="NPCCharacter.beggar_empire"
female_beggar="NPCCharacter.female_beggar_empire"
female_dancer="NPCCharacter.female_dancer_empire"
gear_practice_dummy="NPCCharacter.gear_practice_dummy_empire"
weapon_practice_stage_1="NPCCharacter.weapon_practice_stage_1_empire"
weapon_practice_stage_2="NPCCharacter.weapon_practice_stage_2_empire"
weapon_practice_stage_3="NPCCharacter.weapon_practice_stage_3_empire"
gear_dummy="NPCCharacter.gear_dummy_empire"
board_game_type="Tablut">
<vassal_reward_items>
<item id="Item.justicier_2hsword" />
</vassal_reward_items>
<banner_bearer_replacement_weapons>
<item id="Item.iron_spatha_sword_t2" />
<item id="Item.empire_sword_1_t2" />
<item id="Item.empire_sword_2_t3" />
<item id="Item.empire_sword_6_t5" />
</banner_bearer_replacement_weapons>
<default_policies>
<policy id="policy_senate" />
</default_policies>
<male_names>
<name name="{=v9B50R0Q}Acarion" />
<name name="{=aeLgc0cU}Acthon" />
<name name="{=tWDyWroN}Amnon" />
</male_names>
<female_names>
<name name="{=h8DsXm7X}Achena" />
<name name="{=BNnLbOkN}Adinea" />
<name name="{=EGatdCLg}Alena" />
</female_names>
<clan_names>
<name name="{=pRA9EzNv}Acapanos" />
<name name="{=ogq9oxDn}Angarys" />
<name name="{=MgDUudOx}Balastisos" />
</clan_names>
<cultural_feats>
<feat id="empire_decreased_garrison_wage" />
<feat id="empire_army_influence" />
<feat id="empire_slower_hearth_production" />
</cultural_feats>
<possible_clan_banner_icon_ids>
<icon id="100" />
<icon id="101" />
<icon id="102" />
</possible_clan_banner_icon_ids>
<notable_and_wanderer_templates>
<template name="NPCCharacter.spc_wanderer_empire_0" />
<template name="NPCCharacter.spc_wanderer_empire_1" />
<template name="NPCCharacter.spc_notable_empire_0" />
<template name="NPCCharacter.spc_notable_empire_0b" />
<template name="NPCCharacter.spc_notable_empire_1" />
<template name="NPCCharacter.spc_notable_empire_1b" />
<template name="NPCCharacter.spc_notable_empire_2" />
<template name="NPCCharacter.spc_notable_empire_2b" />
<template name="NPCCharacter.spc_notable_empire_3" />
<template name="NPCCharacter.spc_empire_headman_1" />
<template name="NPCCharacter.spc_empire_headman_2" />
</notable_and_wanderer_templates>
<lord_templates>
<template name="NPCCharacter.spc_legion_of_the_betrayed_leader_0" />
<template name="NPCCharacter.spc_legion_of_the_betrayed_leader_1" />
<template name="NPCCharacter.spc_hidden_hand_leader_0" />
<template name="NPCCharacter.spc_hidden_hand_leader_1" />
<template name="NPCCharacter.spc_embers_of_flame_leader_0" />
<template name="NPCCharacter.spc_eleftheroi_leader_0" />
</lord_templates>
<rebellion_hero_templates>
<template name="NPCCharacter.spc_legion_of_the_betrayed_leader_0" />
<template name="NPCCharacter.spc_hidden_hand_leader_0" />
<template name="NPCCharacter.spc_hidden_hand_leader_1" />
<template name="NPCCharacter.spc_embers_of_flame_leader_0" />
<template name="NPCCharacter.spc_eleftheroi_leader_0" />
<template name="NPCCharacter.spc_eleftheroi_leader_1" />
</rebellion_hero_templates>
<tournament_team_templates_one_participant>
<template name="NPCCharacter.tournament_template_empire_one_participant_set_v1" />
</tournament_team_templates_one_participant>
<tournament_team_templates_two_participant>
<template name="NPCCharacter.tournament_template_empire_two_participant_set_v1" />
<template name="NPCCharacter.tournament_template_empire_two_participant_set_v2" />
<template name="NPCCharacter.tournament_template_empire_two_participant_set_v3" />
</tournament_team_templates_two_participant>
<tournament_team_templates_four_participant>
<template name="NPCCharacter.tournament_template_empire_four_participant_set_v1" />
<template name="NPCCharacter.tournament_template_empire_four_participant_set_v2" />
<template name="NPCCharacter.tournament_template_empire_four_participant_set_v3" />
</tournament_team_templates_four_participant>
<basic_mercenary_troops>
<template name="NPCCharacter.eastern_mercenary" />
<template name="NPCCharacter.western_mercenary" />
<template name="NPCCharacter.sword_sisters_sister_t3" />
</basic_mercenary_troops>
</Culture>
```
## 次要文化中的小派系:
```
<Culture id="nord"
name="{=sYFaoW7G}Nord"
is_main_culture="false"
elite_basic_troop="NPCCharacter.sturgian_warrior_son"
basic_troop="NPCCharacter.sturgian_recruit"
can_have_settlement="true"
town_edge_number="16"
villager_party_template="PartyTemplate.villager_sturgia_template"
encounter_background_mesh="encounter_sturgia"
caravan_party_template="PartyTemplate.caravan_template_sturgia"
militia_party_template="PartyTemplate.militia_sturgia_template"
default_face_key="000fa92e90004202aced5d976886573d5d679585a376fdd605877a7764b8987c00000000000007520000037f0000000f00000037049140010000000000000000">
<banner_bearer_replacement_weapons>
<item id="Item.sturgia_sword_1_t2" />
<item id="Item.sturgia_sword_2_t3" />
<item id="Item.sturgia_sword_4_t4" />
<item id="Item.sturgia_sword_5_t5" />
</banner_bearer_replacement_weapons>
<male_names>
<name name="{=ig8zAo8f}Ori" />
</male_names>
<female_names>
<name name="{=L0fuYckc}Friga" />
</female_names>
</Culture>
```
## 次要文化中的强盗:
```
<Culture id="sea_raiders"
name="{=pBUc2pL8}Sea Raiders"
bandit_chief="NPCCharacter.sea_raiders_chief"
bandit_raider="NPCCharacter.sea_raiders_raider"
bandit_bandit="NPCCharacter.sea_raiders_bandit"
bandit_boss="NPCCharacter.sea_raiders_boss"
elite_basic_troop="NPCCharacter.sea_raiders_raider"
basic_troop="NPCCharacter.sea_raiders_bandit"
is_bandit="true"
can_have_settlement="true"
encounter_background_mesh="encounter_shore_bandit"
bandit_boss_party_template="PartyTemplate.sea_raiders_boss_party_template">
<banner_bearer_replacement_weapons>
<item id="Item.sturgia_sword_1_t2" />
<item id="Item.sturgia_sword_2_t3" />
<item id="Item.sturgia_sword_4_t4" />
<item id="Item.sturgia_sword_5_t5" />
</banner_bearer_replacement_weapons>
</Culture>
```
# 元素说明
## 主文化的元素
- id
- 该文化的id。
- 不可空。
- name
- 该文化的名称。
- 不可空。
- 加入火星人制作的强制读取英语翻译文件的功能后才可以正常读取英语的翻译文件显示英文否则英文语言设置下游戏中显示名称只显示name中的字符。
- 格式
```
name="{=此处填写翻译的StringID}此处填写英文名称"
```
- is_main_culture
- 该文化是否是主文化。
- 只要该文化存在常规派系、存在常规定居点,都是主文化。
- 不可空。
- 可填参数:"true""false"
- 强盗文化和小派系文化填写"false"。
- color
- 该文化兵种在百科全书展示时的防具颜色主色。
- 不可空
- color2
- 该文化兵种在百科全书展示时的防具颜色副色。
- 不可空
- elite_basic_troop
- 该文化的定居点生成的贵族士兵兵种id。
- 该兵种必须是basic_troop。详见[NPCCharacters兵种页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/66/NPCCharacters%E5%85%B5%E7%A7%8D)的is_basic_troop="true"
- 不可空。
- basic_troop
- 该文化的定居点生成的普通士兵兵种id。
- 该兵种必须是basic_troop。同上
- 不可空。
- melee_militia_troop
- 该文化生成的近战民兵兵种id。
- 该兵种必须是basic_troop。同上
- 不可空。
- ranged_militia_troop
- 该文化生成的远程民兵兵种id。
- 该兵种必须是basic_troop。同上
- 不可空。
- melee_elite_militia_troop
- 该文化生成的高阶近战民兵兵种id。
- 该兵种必须是basic_troop。同上
- 不可空。
- ranged_elite_militia_troop
- 该文化生成的高阶远程民兵兵种id。
- 该兵种必须是basic_troop。同上
- 不可空。
- can_have_settlement
- 是否拥有定居点。
- 只有劫匪填写了"false"。与劫匪没有藏身处的实际情况相吻合。
- 不可空。
- town_edge_number
- 未知。
- villager_party_template
- 该文化的村庄生成村民部队时使用的部队模板id。
- 部队模板等内容详见[partyTemplates部队模板页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/80/partyTemplates%E9%83%A8%E9%98%9F%E6%A8%A1%E6%9D%BF)。
- default_party_template
- 该文化的默认部队模板。
- 并不知道具体在哪里使用。
- 部队模板等内容详见[partyTemplates部队模板页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/80/partyTemplates%E9%83%A8%E9%98%9F%E6%A8%A1%E6%9D%BF)。
- caravan_party_template
- 该文化的商队使用的部队模板。
- 商队模板有三种,乱七八糟懒得测到底什么情况下用具体哪个模板。建议完全复刻原版的格式和强度。
- 部队模板等内容详见[partyTemplates部队模板页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/80/partyTemplates%E9%83%A8%E9%98%9F%E6%A8%A1%E6%9D%BF)。
- elite_caravan_party_template
- 该文化的进阶商队使用的部队模板。
- 可能是玩家在组建商队时选择更贵的选项生成的商队使用。
- 商队模板有三种,乱七八糟懒得测到底什么情况下用具体哪个模板。建议完全复刻原版的格式和强度。
- 部队模板等内容详见[partyTemplates部队模板页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/80/partyTemplates%E9%83%A8%E9%98%9F%E6%A8%A1%E6%9D%BF)。
- militia_party_template
- 该文化的民兵部队模板。
- 不知道具体干什么用。建议完全按照原版的模板来。
- 部队模板等内容详见[partyTemplates部队模板页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/80/partyTemplates%E9%83%A8%E9%98%9F%E6%A8%A1%E6%9D%BF)。
- rebels_party_template
- 该文化叛军家族的部队的模板。
- 部队模板等内容详见[partyTemplates部队模板页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/80/partyTemplates%E9%83%A8%E9%98%9F%E6%A8%A1%E6%9D%BF)。
- vassal_reward_party_template
- 该文化派系会在玩家首次加入派系时给予玩家的奖励部队部队模板id。
- 部队模板等内容详见[partyTemplates部队模板页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/80/partyTemplates%E9%83%A8%E9%98%9F%E6%A8%A1%E6%9D%BF)。
- prosperity_bonus
- 高概率是该文化的定居点繁荣度奖励。
- 如果属实,存在该项时,该文化的所有城镇定居点每日繁荣度+x。
- 可填写正整数值。
- 未经过测试。
- 可空。
- encounter_background_mesh
- 猜测是与该文化的角色或部队进行简易版谈话时使用的2D背景图片。
- faction_banner_key
- 该文化的文化旗帜矢量图码。
- 可通过该网址绘制https://bannerlord.party/banner/
- 可能是使用在百科全书的文化页面。
- default_face_key
- 默认的脸部码。
- 不知道在哪里会被使用。
- text
- 该文化在百科全书中的介绍文本。
- 不可空。
- tournament_master
- 该文化竞技场老板的角色模板id。
- 用在城镇定居点的竞技场场景中。
- villager
- 该文化的村民的角色模板id。
- 可能用在村庄场景中,也可能用在村民部队中。
- caravan_master
- 该文化的商队首领的角色模板id。
- 不知道用在具体哪里。
- armed_trader
- 该文化的“武装商人”角色模板id。
- 可以理解为商队中的商人。
- 不知道具体用在哪里。
- caravan_guard
- 该文化的“商队护卫”角色模板id。
- 不知道具体用在哪里。
- veteran_caravan_guard
- 该文化的“资深商队护卫”角色模板id。
- 不知道具体用在哪里。
- duel_preset
- 该文化的决斗者角色模板id。
- 完全猜不到是啥东西。
- prison_guard
- 该文化的“监狱守卫”的角色模板id。
- 猜测是在城镇定居点场景中的监狱大门门口站岗的那个角色。
- guard
- 该文化的“看守”的角色模板id。
- 似乎在一个随机性任务“给帮派提供武器”中作为任务线中的一个角色被使用。
- blacksmith
- 该文化的“铁匠”的角色模板id。
- 猜测是在城镇定居点场景中使用。
- weaponsmith
- 该文化的“武器匠”的角色模板id。
- 猜测是在城镇定居点场景中使用。
- townswoman
- 该文化的“女镇民”角色模板id。
- 猜测是在城镇定居点场景中使用。
- townswoman_infant
- 该文化的“城镇女性幼儿”角色模板id。
- 猜测是在城镇定居点场景中使用。
- townswoman_child
- 该文化的“城镇小女孩”角色模板id。
- 猜测是在城镇定居点场景中使用。
- townswoman_teenager
- 该文化的“城镇女青年”角色模板id。
- 猜测是在城镇定居点场景中使用。
- townsman
- 该文化的“男镇民”角色模板id。
- 猜测是在城镇定居点场景中使用。
- townsman_infant
- 该文化的“城镇男性幼儿”角色模板id。
- 猜测是在城镇定居点场景中使用。
- townsman_child
- 该文化的“城镇小男孩”角色模板id。
- 猜测是在城镇定居点场景中使用。
- village_woman
- 该文化的“女村民”角色模板id。
- 猜测是在村庄定居点场景中使用。
- villager_male_child
- 该文化的“村庄小男孩”角色模板id。
- 猜测是在村庄定居点场景中使用。
- villager_male_teenager
- 该文化的“村庄男青年”角色模板id。
- 猜测是在村庄定居点场景中使用。
- villager_female_child
- 该文化的“村庄小女孩”角色模板id。
- 猜测是在村庄定居点场景中使用。
- villager_female_teenager
- 该文化的“村庄女青年”角色模板id。
- 猜测是在村庄定居点场景中使用。
- townsman_teenager
- 该文化的“城镇男青年”角色模板id。
- 猜测是在城镇定居点场景中使用。
- ransom_broker
- 该文化的“赎金经纪人”角色模板id。
- 在酒馆场景中使用。
- gangleader_bodyguard
- 该文化的“帮派首领保镖”角色模板id。
- 猜测是在城镇定居点场景中使用,生成在帮派头目类要人身旁。
- merchant_notary
- 该文化的“商人类要人”角色模板id。
- 猜测用于生成该文化定居点中的商人类型要人。
- artisan_notary
- 该文化的“工匠类要人”角色模板id。
- 猜测用于生成该文化定居点中的工匠类型要人。
- preacher_notary
- 该文化的“传教士”角色模板id。
- 不知道具体用在哪里。
- 可能是废案
- rural_notable_notary
- 该文化的角色模板id。
- 猜测用于生成该文化定居点中的商人类型要人。
- shop_worker
- 该文化的“店员”角色模板id。
- 猜测是用在城镇定居点街道场景中,生成工坊里的店员角色。
- tavernkeeper
- 该文化的“酒馆老板”角色模板id。
- 应该是用在城镇定居点的酒馆场景中。
- taverngamehost
- 该文化的“酒馆游戏主机”角色模板id。
- 应该是用在城镇定居点的酒馆场景中,作为与玩家进行棋类游戏的角色生成。
- musician
- 该文化的“音乐家”角色模板id。
- 应该是用在城镇定居点的酒馆场景,以及街道场景中,作为弹奏乐器的角色生成。
- tavern_wench
- 该文化的“酒馆侍女”角色模板id。
- 应该是用在城镇定居点的酒馆场景中。
- armorer
- 该文化的“军械士”角色模板id。
- 不知道和上面的铁匠、武器匠有啥区别。
- horseMerchant
- 该文化的“马匹贩子”角色模板id。
- 应该是用在城镇定居点街道场景中。
- barber
- 该文化的“理发师”角色模板id。
- 猜测是用在城镇定居点街道场景中。
- merchant
- 该文化的“商人”角色模板id。
- 不知道具体用在哪里。
- beggar
- 该文化的“男性乞丐”角色模板id。
- 应该是用在城镇定居点街道场景中。
- female_beggar
- 该文化的“女性乞丐”角色模板id。
- 应该是用在城镇定居点街道场景中。
- female_dancer
- 该文化的“女性舞者”角色模板id。
- 应该是用在城镇定居点的酒馆场景,以及街道场景中,作为跳舞的角色生成。
- gear_practice_dummy
- 未知。
- 齿轮假人?
- 是个NPCCharacter角色模板。
- 没有正常name说明不会生成为一个玩家能检查到的Agent。
- weapon_practice_stage_1
- 未知。
- 武器练习阶段1
- 是个NPCCharacter角色模板。
- 没有正常name说明不会生成为一个玩家能检查到的Agent。
- weapon_practice_stage_2
- 同上。
- weapon_practice_stage_3
- 同上。
- gear_dummy
- 未知。
- 该角色数据存储于“obsolete_characters.xml”文件中。
- 因此应该属于废案,废弃数据。
- board_game_type
- 该文化的桌面游戏类别。
- 即酒馆中下的棋是什么。
- vassal_reward_items
- 当玩家在某个存档中首次以领主身份宣誓加入派系时派系领袖会根据派系文化读取此元素中的所有物品Item向玩家发放封赏。
- 可以有多个物品。
- 建议使用具备文化特色的,适合贵族身份的,适合用于封赏用的,其他途径难以或无法获得的,具备相当强度给予玩家奖励感的物品。
- 例子
```
<vassal_reward_items>
<item id="Item.justicier_2hsword" />
<item id="Item.crossbow_e" />
<item id="Item.meat" />
</vassal_reward_items>
```
- banner_bearer_replacement_weapons
- 当进入战斗场景时,部分士兵会被选中执旗。
- 旗帜是一种特殊的物品,它必须由左手一只手持握,无法收纳取消持握状态。
- 以下内容未经测试或完整发布流程的验证。
- 为避免只携带双手类武器的兵种出现左手一只手持握旗帜,右手没有可装备的武器空手打拳的情况,被选中执旗的士兵会使用其部队所属派系的文化中此元素设定的单手持握武器。
- 根据骑砍2自己填写的内容猜测可能必须使用单手类武器。
- 根据骑砍2自己填写的内容猜测需要多个武器每个武器属性中的武器等级对应不同强度的需求。
- 例子
```
<banner_bearer_replacement_weapons>
<item id="Item.iron_spatha_sword_t2" />
<item id="Item.empire_sword_1_t2" />
<item id="Item.empire_sword_2_t3" />
<item id="Item.empire_sword_6_t5" />
</banner_bearer_replacement_weapons>
```
- default_policies
- 根据派系所属的文化,在游戏初始即会开启的国家政策。
- 也用于玩家创建派系(自立)时,玩家需要为即将创建的派系选择一个文化,创建后会开启该文化的默认政策。
- 可以有多个国家政策。
- 这些政策的id无法在xml文件中找到是存储在代码中的。但是其id的格式按照的规范有迹可循**可以尝试**通过搜索政策的中文名——找到政策的英文名——将政策的英文名转写成全小写,由下划线代替空格连接词语的格式——开头加上"policy_"来填写。但是如果政策的文本在中间版本被修改过但id从修改则会失效。
- 例子
```
<default_policies>
<policy id="policy_council_of_the_commons" />
<policy id="policy_senate" />
</default_policies>
```
- male_names
- 文化的男性角色随机姓名库。
- 在生成该文化的新男性角色时,会读取该元素中的内容,随机一个名字赋予被创建的新角色。
- 骑砍2自己的随机姓名库中每种文化的一个性别有50个上下的随机姓名。此时游戏中仍然会看到大量重名的角色。如果条件允许大型模组建议收集编写更多的随机姓名。
- female_names
- 同上,是该文化女性角色的随机姓名库。
- 例子
<male_names>
<name name="{=v9B50R0Q}Acarion" />
<name name="{=aeLgc0cU}Acthon" />
<name name="{=tWDyWroN}Amnon" />
</male_names>
<female_names>
<name name="{=h8DsXm7X}Achena" />
<name name="{=BNnLbOkN}Adinea" />
<name name="{=EGatdCLg}Alena" />
</female_names>
- clan_names
- 文化的家族名称随机库。
- 与上一条随机姓名库的原理类似。当某种情况,游戏中创建了一个新的家族时,若没有其他赋予其名称的代码功能,则需要从此处获取一个随机家族名给予新家族。
- 但是在骑砍2原版极少出现创建新家族但没有赋予姓名的情况。虽然在代码中存在生成一个随机家族的接口但是没有具体的玩法使这种情景出现。
- 例子
```
<clan_names>
<name name="{=pRA9EzNv}Acapanos" />
<name name="{=ogq9oxDn}Angarys" />
<name name="{=MgDUudOx}Balastisos" />
</clan_names>
```
- cultural_feats
- 该文化的文化天赋。feat也称特质、特点、专长。
- 在骑砍2中出现在创建新存档的第一个步骤选择你的角色的文化界面。
- 官方对此定义混乱,无法将该功能的用途明确化。在功能作用会出现以下几种情况:
- 是针对玩家,针对主角存在的,功能性的用途。例如,阿塞莱文化天赋一:**组建商队花费-30%**,贸易惩罚-10%。
- 是针对该文化定居点,功能性的用途。例如,瓦兰迪亚文化天赋二:城堡的附属村庄产出+10%。
- 是针对属于该文化的派系统治者身份生效的,功能性的用途。例如,库赛特文化天赋二:库赛特统治者拥有的村庄:马匹、骡子、牛和羊的产出+25%。
- 是针对属于该文化的贵族领主身份角色生效的,功能性的用途。例如,阿塞莱文化天赋二:沙漠中无速度惩罚。
- 指在世界地图上的部队而非战斗场景中的Agent。
- (也可能走派系判定,鬼知道。例如,一个巴旦尼亚文化的贵族领主,属于阿塞莱国家派系,则阿塞莱的文化天赋二是否对其生效?)
- 在文本上有多种理解方式,不知道到底是针对玩家生效,针对贵族领主生效,还是针对定居点生效的,功能性用途。例如,巴旦尼亚文化天赋三:定居点钟的城镇工程建设速度-10%。
- 在老版本中更加混乱,像是根本没有好好设计一样,都是临时凑数的条目。
- 在中间的某次内容更新版本后重新制作了每个文化的文化天赋出现了负面天赋的概念骑砍2自己以固定的两条正面、一条负面条目为规格制作的新版本。
- 总之该处留给程序的空间应该是很大的很多功能性的内容都可以通过该功能使其在游戏中生效。可以不用再去为了新功能性的玩法增加而单独制作展示UI或用户侧的提示。
- 显然根据骑砍2已有的文化天赋进行修改加工改造对于程序侧来说更加轻松。
- 理论上,此处可以容纳更多的文化天赋条目数量。
- 此处的描述文本若需要接入骑砍2的多语言文本显示功能可能需要将翻译用的string id本体写在代码中。
- 与"default_policies"元素很像每个文化天赋的id也是存储在代码中查找方法和格式是该文化天赋的英文名全小写下划线连接单词开头添加"文化英文单词+下划线"的格式。
- 例子
```
<cultural_feats>
<feat id="aserai_cheaper_caravans" />
<feat id="aserai_desert_speed" />
<feat id="aserai_increased_wages" />
</cultural_feats>
```
- possible_clan_banner_icon_ids
- 该文化的家族会使用的家族旗帜标志图案id。
- 与"clan_names"类似都是用于在创建一个新随机家族时读取此处的标志图案的id随机一个赋予该家族。
- 详见[BannerIconData旗帜徽记和颜色wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/74/BannerIconData%E6%97%97%E5%B8%9C%E5%BE%BD%E8%AE%B0%E5%92%8C%E9%A2%9C%E8%89%B2)。
- 例子
```
<possible_clan_banner_icon_ids>
<icon id="100" />
<icon id="101" />
<icon id="102" />
</possible_clan_banner_icon_ids>
```
- notable_and_wanderer_templates
- 该文化的要人与流浪者角色模板的id。
- 在创建新游戏,及游戏过程中产生的所有随机的要人、流浪者,均会读取此处文化中填写的模板,用来随机生成角色。
- 对于要人模板,详见[NPCCharacter模板wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/151/NPCCharacters%E6%A8%A1%E6%9D%BF)。
- 对于流浪者模板,详见[NPCCharacters流浪者页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/70/NPCCharacters%E6%B5%81%E6%B5%AA%E8%80%85)。
- 在制作时要人的部分建议格式与骑砍2完全一致数量完全一致避免崩溃的风险。原理是骑砍2虽然提供了此处元素作为xml部分的可修改但是有时又仍然通过代码根据格式强行检索查询调取某个id的东西如果缺了则报空导致崩溃。大部分情况下需要将这些可能会被强行检索读取的id中的文化修改为与文化id字符一致的格式。例如将"spc_notable_empire_12"修改为"spc_notable_文化id_12"。
- 例子
```
<notable_and_wanderer_templates>
<template name="NPCCharacter.spc_wanderer_empire_0" />
<template name="NPCCharacter.spc_wanderer_empire_1" />
<template name="NPCCharacter.spc_wanderer_empire_2" />
<template name="NPCCharacter.spc_wanderer_empire_3" />
<template name="NPCCharacter.spc_wanderer_empire_4" />
<template name="NPCCharacter.spc_wanderer_empire_5" />
<template name="NPCCharacter.spc_wanderer_empire_6" />
<template name="NPCCharacter.spc_wanderer_empire_7" />
<template name="NPCCharacter.spc_wanderer_empire_8" />
<template name="NPCCharacter.spc_wanderer_empire_9" />
<template name="NPCCharacter.spc_wanderer_empire_10" />
<template name="NPCCharacter.spc_wanderer_empire_11" />
<template name="NPCCharacter.spc_notable_empire_0" />
<template name="NPCCharacter.spc_notable_empire_0b" />
<template name="NPCCharacter.spc_notable_empire_1" />
<template name="NPCCharacter.spc_notable_empire_1b" />
<template name="NPCCharacter.spc_notable_empire_2" />
<template name="NPCCharacter.spc_notable_empire_2b" />
<template name="NPCCharacter.spc_notable_empire_3" />
<template name="NPCCharacter.spc_notable_empire_3b" />
<template name="NPCCharacter.spc_notable_empire_4" />
<template name="NPCCharacter.spc_notable_empire_4b" />
<template name="NPCCharacter.spc_notable_empire_5" />
<template name="NPCCharacter.spc_notable_empire_6" />
<template name="NPCCharacter.spc_notable_empire_7" />
<template name="NPCCharacter.spc_notable_empire_8" />
<template name="NPCCharacter.spc_notable_empire_9" />
<template name="NPCCharacter.spc_notable_empire_10" />
<template name="NPCCharacter.spc_notable_empire_11" />
<template name="NPCCharacter.spc_notable_empire_12" />
<template name="NPCCharacter.spc_notable_empire_13" />
<template name="NPCCharacter.spc_notable_empire_21" />
<template name="NPCCharacter.spc_notable_empire_22" />
<template name="NPCCharacter.spc_notable_empire_gl1" />
<template name="NPCCharacter.spc_notable_empire_gl4" />
<template name="NPCCharacter.spc_empire_headman_1" />
<template name="NPCCharacter.spc_empire_headman_2" />
<template name="NPCCharacter.spc_empire_headman_3" />
</notable_and_wanderer_templates>
```
- lord_templates
- 根据字面意思,应该是该文化生成新领主时采用的角色模板。
- 但是骑砍2自己在此处填写的都是小家族的非高身份的贵族的角色模板可能是偷懒了
- 所以有时候因此导致游戏中由贵族领主诞下的孩子(该存档游戏过程中创建的新角色),长大后会穿戴小家族的装备。
- 也有可能直接用代码强制检索对应字符和装备Flag来赋予角色装备总之是比较混乱的情况关于此处的代码强制检索对应字符的id详见[EquipmentRosters装备模板wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/89/EquipmentRosters%E8%A3%85%E5%A4%87%E6%A8%A1%E6%9D%BF)。
- 对于角色模板,详见详见[NPCCharacter模板wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/151/NPCCharacters%E6%A8%A1%E6%9D%BF)。
- 例子
```
<lord_templates>
<template name="NPCCharacter.spc_legion_of_the_betrayed_leader_0" />
<template name="NPCCharacter.spc_legion_of_the_betrayed_leader_1" />
<template name="NPCCharacter.spc_hidden_hand_leader_0" />
<template name="NPCCharacter.spc_hidden_hand_leader_1" />
<template name="NPCCharacter.spc_embers_of_flame_leader_0" />
<template name="NPCCharacter.spc_eleftheroi_leader_0" />
</lord_templates>
```
- rebellion_hero_templates
- 该文化叛变的角色模板。
- 应该是用于在叛变功能中,叛变发生后,城镇由一个新创建的随机家族接手,该家族中固定拥有一个家族领袖和两个家族成员。该元素用于随机生成这些角色。
- 实际骑砍2填写的都是小家族的角色模板。这就是明显偷懒了可见骑砍2没有能执行具体设计角色和兵种的策划。
- 对于角色模板,详见[NPCCharacter模板wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/151/NPCCharacters%E6%A8%A1%E6%9D%BF)。
- 例子
```
<rebellion_hero_templates>
<template name="NPCCharacter.spc_legion_of_the_betrayed_leader_0" />
<template name="NPCCharacter.spc_hidden_hand_leader_0" />
<template name="NPCCharacter.spc_hidden_hand_leader_1" />
<template name="NPCCharacter.spc_embers_of_flame_leader_0" />
<template name="NPCCharacter.spc_eleftheroi_leader_0" />
<template name="NPCCharacter.spc_eleftheroi_leader_1" />
</rebellion_hero_templates>
```
- tournament_team_templates_one_participant
- 该元素中的内容能找到对应的角色模板。
- 猜测是用于玩家进入竞技场场景时,随机生成场地内提供氛围感的正在竞赛的对战多方角色。
- 还有种可能与竞技大赛功能中的随机多阵营对抗的具体对战阵营个数分配规则有关系例如用于随机将16人分配成红蓝两阵营的8v8或分配成红蓝黄绿死阵营的4v4v4v4
- 对于角色模板,详见[NPCCharacter模板wiki页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/151/NPCCharacters%E6%A8%A1%E6%9D%BF)。
- 例子
```
<tournament_team_templates_one_participant>
<template name="NPCCharacter.tournament_template_empire_one_participant_set_v1" />
</tournament_team_templates_one_participant>
<tournament_team_templates_two_participant>
<template name="NPCCharacter.tournament_template_empire_two_participant_set_v1" />
<template name="NPCCharacter.tournament_template_empire_two_participant_set_v2" />
<template name="NPCCharacter.tournament_template_empire_two_participant_set_v3" />
</tournament_team_templates_two_participant>
<tournament_team_templates_four_participant>
<template name="NPCCharacter.tournament_template_empire_four_participant_set_v1" />
<template name="NPCCharacter.tournament_template_empire_four_participant_set_v2" />
<template name="NPCCharacter.tournament_template_empire_four_participant_set_v3" />
</tournament_team_templates_four_participant>
```
- tournament_team_templates_two_participant
- 同上
- tournament_team_templates_four_participant
- 同上
- basic_mercenary_troops
- 该文化的定居点的酒馆中会生成的雇佣兵兵种id。
- 可填写多个。
- 例子
```
<basic_mercenary_troops>
<template name="NPCCharacter.western_mercenary" />
<template name="NPCCharacter.sword_sisters_sister_t3" />
</basic_mercenary_troops>
```
## 次要文化中的强盗文化元素
- bandit_chief
- 该强盗文化的强盗高阶兵的兵种id。
- 在原版中是4阶兵。
- bandit_raider
- 该强盗文化的强盗中阶兵的兵种id。
- 在原版中是3阶兵。
- bandit_bandit
- 该强盗文化的强盗低阶兵的兵种id。
- 在原版中是2阶兵。
- bandit_boss
- 该强盗文化的强盗首领的兵种id。
- 似乎只在个别情况下出现在藏身处。
- 未经过测试。
- is_bandit
- 强盗文化填"true"。否则不存在此元素。
- bandit_boss_party_template
- 该强盗文化的强盗首领部队模板。
- 未知用途。

@ -0,0 +1,2 @@
# <Settlements>
待写

@ -0,0 +1,52 @@
# 下载地址
https://code.visualstudio.com/
# 前期准备
1. **安装插件**
左边菜单栏插件页面搜索插件名,安装插件
![123123.png](../assets/123123-3be29d43-8903-4096-9664-47f0299e34da.png)
插件列表:
- 简体中文
-
*需要lzh补充浏览和编辑骑砍2的xml文件需要的插件选定内容格式化需要的插件Git同步自动检测需要的插件等*
2. **添加工作区**
鼠标右击工作区将包含原版数据和仓库文件夹中包含MOD数据的ModuleData文件夹均添加到工作区。
![5243524356.png](../assets/5243524356-1574310c-db64-4525-8dca-1d6eefe294b0.png)
3. **保存工作区**
左上角菜单栏单击**文件**,单击**将工作区另存为**,命名并选择一个合适的路径,完成保存。
之后进行制作时通过Visual Studio Code打开该工作区文件或将工作区拖入Visual Studio Code即可打开工作区。
# 使用
## **骑砍2数据xml中的颜色**
- 白色
格式错误才会出现的颜色。不应该出现的颜色。`ModerRAS:未识别类型的颜色`
- 蓝色
*需程序帮助编写其准确定义*`ModerRAS:node`
- 天蓝色
*需程序帮助编写其准确定义*`ModerRAS:attribute`
- 暗橙色
*需程序帮助编写其准确定义*`ModerRAS:字符串类型`
- 深绿色
注释,大部分情况下不会被游戏读取。特殊位置的注释会被读取并产生崩溃。
## **注释**
- 使用快捷键Ctrl+?创建注释。注释颜色为深绿色。
- 可以直接在选择的指针处按下快捷键创建一个新的空注释。
- 可以先选中部分内容,然后按下快捷键,被选中的内容会被创建为一个注释。
## **搜索并找到某项数据**
*此处使用例子为寻找某个城市*
- 键入或粘贴需要搜索的数据的中文线索文本,至图中搜索栏。
![16516.png](../assets/16516-8d19d605-4fa5-4855-b0b8-1a56b9c6c08e.png)
- 依照上图步骤获得该中文文本对应的String ID线索复制然后搜索它。
![19861 (2).png](../assets/19861%20(2)-266dfda5-2ac7-4351-944f-2ce7fd81b1bf.png)
- 成功找到该要素的数据位置。
<font color=red>***注意!检查你找到的文件名及其路径。工作区文件夹里可能有多个类似甚至一样的文件,必须检查路径确认你的修改是正确的文件。***
## 格式
为使视图可看度高,尽量按照统一格式进行编辑和修改。
- **折叠**
- 层次分明,以角色为例,见图
![QQ截图20221204071510.png](../assets/QQ截图20221204071510-3a0ad137-0ffd-484f-92d5-e849189305a7.png)
其中:
同一个元素的开头和结尾前空格数相等。
上层的元素开头空格数少,越下层的元素开头的空格数越多。
当格式统一Visual Studio Code会自动实现可折叠。
- **折叠所有区域**
长按Ctrl然后按下K松开K按下横排数字键0。过程中Ctrl不松开。

@ -0,0 +1,187 @@
**2023年2月11日**
**对应游戏版本v1.0.3** 皮蛋初版完成
# 根元素
<WeaponDescriptions>
# 类型名
```
<WeaponDescription 1=""
元素2=""
……>
<WeaponFlags>
<WeaponFlag value="MeleeWeapon"/>
<WeaponFlag value="NotUsableWithOneHand"/>
……
</WeaponFlags>
<AvailablePieces>
<AvailablePiece id="axe_craft_1_handle"/>
<AvailablePiece id="mace_head_24"/>
……
</AvailablePieces>
</WeaponDescription>
```
# 原版路径
Modules\Native\ModuleData\weapon_descriptions.xml
# 官方文档
[WEAPON SMITHING & CRAFTING PIECES](https://moddocs.bannerlord.com/asset-management/weapon_smithing/)
# 用途
- 锻造武器所有存在的用法。比如,骑枪冲刺用法、架矛用法。
- 或者更常见的是“单手”“双手”,其实在文件里会细分成很多种。
- 比如,两只手共同握持长杆武器的用法,游戏中也叫“双手”。
- 所有锻造武器用法具备的所有行动。例如格挡、持盾防具、单手持武器、挥动攻击、戳捅攻击等。
- 支持该用法的所有武器配件。
- 被CraftingTemplates武器锻造类别读取使用。
- 详见[CraftingTemplates武器锻造类别页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/91/CraftingTemplates%E6%AD%A6%E5%99%A8%E9%94%BB%E9%80%A0%E7%B1%BB%E5%88%AB)
附一把锻造武器物品的逻辑图:
![锻造武器的逻辑图.png](../assets/锻造武器的逻辑图-911958dc-b56f-4bb5-87c9-f34b0b017034.png)
# 特点
- 建议直接复制粘贴骑砍2自己的数据并在此基础上添加自己的配件。这样可以避免产生问题。
- 武器用法必须和武器锻造类别里的内容相匹配包括武器用法的ID和锻造类别中读取的用法ID锻造类别中的可用配件也要在相对应的用法中登记等。
- 如果一个配件具备特殊的情况,例如:
- 禁止这个配件造出来的武器去作“戳捅”动作。
- 禁止这个配件造出来的武器佩戴盾牌使用。
- 其他在用法登记上不容易归纳的情况。
- 就需要在武器配件的xml文件中进行修改。详见[CraftingPieces武器配件页面](https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/58/CraftingPieces%E6%AD%A6%E5%99%A8%E9%85%8D%E4%BB%B6)。
# 格式示范
```
<WeaponDescription id="Javelin"
weapon_class="Javelin"
item_usage_features="throwing:javelin"
rotated_in_hand="true"
use_center_of_mass_as_hand_base="true">
<WeaponFlags>
<WeaponFlag value="RangedWeapon"/>
<WeaponFlag value="Consumable"/>
<WeaponFlag value="AmmoSticksWhenShot"/>
<WeaponFlag value="UseHandAsThrowBase"/>
<WeaponFlag value="AutoReload"/>
<WeaponFlag value="UnloadWhenSheathed"/>
</WeaponFlags>
<AvailablePieces>
<AvailablePiece id="spear_blade_1"/>
<AvailablePiece id="spear_blade_9"/>
<AvailablePiece id="spear_blade_10"/>
<AvailablePiece id="spear_blade_41"/>
</AvailablePieces>
</WeaponDescription>
```
# 元素说明
- id
- 该锻造武器用法的ID。
- 特殊的此处的ID使用大驼峰所有单词首字母大写无下划线。
- 不可空。
- weapon_class
- 武器组别。
- 比较特殊的一种分类方法,只有装备到身上的武器有“武器组别”。
- 建议直接复制骑砍2自己的参数。不需要做任何修改。
- 猜测是用于角色特长效果。例如“挡箭术”特长对双手剑生效。
- 存在的组别:
- OneHandedSword 单手剑
- Dagger 匕首
- ThrowingKnife 飞刀
- OneHandedAxe 单手斧
- TwoHandedAxe 双手斧
- ThrowingAxe 飞斧
- OneHandedPolearm 一只手握持的长杆
- TwoHandedPolearm 双手握持的长杆
- Javelin 标枪
- Mace 单手锤
- TwoHandedMace 双手锤
- Crossbow 弩
- Bolt 弩矢
- LargeShield 大盾
- Bow 弓
- Arrow 箭
- Boulder 大石头
- Stone 小石子
- Banner 旗帜
- item_usage_features
- 物品的可用方法和特性。
- 建议直接复制骑砍2自己的参数。不需要做任何修改。
- 具体内容可见"item_usage_sets.xml"文件。
- 用于定义该用法具备的所有功能,比如是否能做出挥动动作的攻击,能否格挡,能放佩戴盾牌,能否做骑枪冲刺等。
- 出现的有:
- onehanded 一只手拿
- twohanded 两只手拿
- onehanded_polearm 一只手拿的长杆
- polearm 长杆,可能是两只手持握的长杆
- long 未知,一般出现在长杆用法上
- block 猜测格挡
- shield 猜测是手持盾牌
- swing 作出挥动动作的攻击
- thrust 作出戳捅动作的攻击
- rshield 未知,跟盾牌有关,只用在手办武器切换用法上
- throwing 投掷
- javelin 标枪
- thrown 长杆类武器里的的投掷
- knife 小刀?
- axe 斧
- widegrip 宽握,应该跟动作有关系
- couch 骑枪冲刺
- pike 只出现在原版的“枪”锻造类别中,猜测是不能骑马的用途
- bracing 架矛
- tipdraw 未知只有单手锤用。猜测tip轻触draw抽出尤指武器
- rotated_in_hand
- 在手中时武器模型旋转。
- 建议直接复制骑砍2自己的参数。不需要做任何修改。
- 填写"true"。
- 可空默认为false。
- 只在投掷类武器的投掷用法和长杆类武器的投掷用法中使用。
- use_center_of_mass_as_hand_base
- 未知。
- 建议直接复制骑砍2自己的参数。不需要做任何修改。
- 填写"true"。
- 可空默认为false。
- 只在投掷类武器的投掷用法和长杆类武器的投掷用法中使用。
- WeaponFlags
- 用法的标记。
- 建议直接复制骑砍2自己的参数。不需要做任何修改。
- 格式:
```
<WeaponFlags>
<WeaponFlag value="RangedWeapon"/>
<WeaponFlag value="Consumable"/>
<WeaponFlag value="AmmoSticksWhenShot"/>
<WeaponFlag value="UseHandAsThrowBase"/>
<WeaponFlag value="AutoReload"/>
<WeaponFlag value="UnloadWhenSheathed"/>
</WeaponFlags>
```
- 出现的有:
- MeleeWeapon 近战武器
- NotUsableWithOneHand 不能一只手持握
- RangedWeapon 远程武器
- Consumable 消耗品,猜测是有个数的
- AmmoSticksWhenShot 猜测是存在弹药命中时模型插在身上的视觉效果
- UseHandAsThrowBase 猜测是切换至该武器时以投掷状态为默认状态
- AutoReload 自动装填
- UnloadWhenSheathed 未知,可能是举盾时卸下该武器;也可能是举盾防御时不装填。
- BonusAgainstShield 对盾加成
- TwoHandIdleOnMount 骑乘时
- WideGrip 宽握,只用在长杆上,猜测是跟可以停马有关系
- AvailablePieces
- 可用的武器配件。
- 锻造武器的所有配件均在该用法中登记,则该武器存在这个用法。
- 格式:
```
<AvailablePieces>
<AvailablePiece id="empire_blade_1"/>
<AvailablePiece id="empire_noble_blade_1"/>
<AvailablePiece id="empire_noble_blade_2"/>
</AvailablePieces>
```

@ -0,0 +1,142 @@
**2023年03月06日 皮蛋 初版未完成**
**2023年03月16日 皮蛋 继续写,未完成**
# 软件说明
- dnSpy是一个反编译软件它可以反编译骑砍2或者模组的代码。
- 使用dnSpy可以运行调试骑砍2。
- 如果需要调试的模组拥有代码功能且是自己的模组拥有代码源文件则应使用Visual Studio软件待建立wiki页面
- dnSpy无法捕捉的一些问题
- xml格式或内容错误导致的创建存档或载入存档时的报错。
- 此时应检查骑砍2自弹窗骑砍2自己会列出xml的具体错误。
- 若不详尽,则应尝试回退文件版本,或使用二分法等,排查出错的具体文件,乃至文件内的具体位置。
- 为避免崩溃或错误累积导致的排查难度骤增应在完成部分xml内容后就进行测试多测试早发现早解决。
- 游戏引擎在渲染画面时产生的错误。遇到此种情况时就算使用dnSpy调试仍然会弹出骑砍2自己的报错白框或闪退。
- 应对新模型和新场景等资源进行详尽的测试,避免此类无法检查原因的崩溃的累积。
- 在代码运行的过程中,部分存在问题的参数不引发崩溃或报错,但传入引擎后引发崩溃或报错。
- 此时难以追踪导致崩溃的原因。
- 应积极测试,遭遇此类崩溃的时间越早,追踪难度越低。
# 配置dnSpy
## 下载dnSpy
1. 下载dnSpy并解压缩至找得到的路径。
2. 打开dnSpy.exe
## 导入dll文件
- 只有首次使用时需要导入dll文件。每次打开dnSpy都会自动读取导入后的dll文件。
1. 打开骑砍2路径。
2. 进入路径Mount & Blade II Bannerlord\bin\Win64_Shipping_Client。
3. 在文件夹中,选择按类型排列文件,或选择按名称排列文件。
4. 选中所有的“TaleWorlds.”开头的dll格式文件。
5. 拖动所选全部dll文件至dnSpy的左侧界面“程序集资源管理器”中。完成根目录中的导入。
6. 进入路径Mount & Blade II Bannerlord\Modules\Native\bin\Win64_Shipping_Client。
7. 同⑤导入所有Native中的dll文件。
8. 按照同样的方法导入剩余的骑砍2原版dll文件应包括“SandBox”“SandBoxCore”“StoryMode”等。
9. 按照同样的方法导入需要测试的模组的dll文件。**特别注意的是,<font color=red>测试模组时不能使用创意工坊订阅的方式</font>来安装模组应取消订阅改用手动安装至Modules文件夹的方法进行测试。**
## 设置启动参数
1. 单击dnSpy上方菜单栏中的“启动”选项。
2. 在弹出的“调试程序”窗口中,单击“可执行程序”右侧的“...”。
3. 在弹出的“打开”窗口中进入你的骑砍2路径进入Mount & Blade II Bannerlord\bin\Win64_Shipping_Client。
4. 在该路径下选中“Bannerlord.exe”打开。
5. 填写参数。
- 参数的范例
```
/singleplayer _MODULES_*Native*SandBoxCore*CustomBattle*Sandbox*StoryMode*需要测试的模组1的id*需要测试的模组2的id*_MODULES_
```
- 参数的说明
- **按照顺序说明**
- 单机模式填写“/singleplayer”联机模式填写“/multiplayer”。
- “MODULES_”不作任何修改。
- 从第一个“*”开始依次按顺序填写加载的模组的id。
- 在启动器中排列在上的模组,在参数中应靠前/靠左。也就是越靠前/靠左,加载越早,按从左往右的顺序加载。
- 模组的id在每个模组根目录的SubModule.xml中获取。通常在第三行。是“Id value”里面的值。
- 每个模组id之间用“*”间隔。
- 加载的模组填写完毕后,用"*"结束,然后以"MODULES_"作结尾。
- 总之,通常情况下,只需要复制该参数,并修改里面需要加载模组即可。
6. 建议将完成的参数复制并粘贴至找得到的地方保存。每次打开dnSpy都需要重新填入参数。若测试的模组完全相同则每次粘贴即可。
## 使用DnSpy启动游戏
- 完成以上步骤后,单击“调试程序”窗口中的“确定”选项。游戏启动。
# 测试说明
- 测试本身不能解决问题,测试找到了问题的原因也不一定能解决问题。
- 在制作各种内容的过程中,务必仔细按照规范认真制作,不应该因为可以进行测试排查问题而放任可能出现的问题产生。
- 这是由于:
1. 存在的问题不一定都以明显的出错形式体现出来。如果出现的问题不明显,没有被发觉,它会在模组中长期存在,甚至在中后期引发恶性坏档。以至于多年后随着内容量增大变得纠缠不清无法排查出问题所在,变成永久的暗病。严重的会使得模组错误崩溃或坏档但无法找到原因最终导致不可玩。
2. 测试花费的时间和精力是不可预估的,测试能否找到问题的原因是不一定的,找到了出错的原因能否修复是不一定的。综上,务必从制作的源头避免问题的产生,能极大地减少后续的工作量。
3. 除了美术外在骑砍2上制作内容一定会产生问题这是不可百分百避免的要多测试每做一部分就进行测试减少问题的累积从而减少排查难度。
4. 完成内容的制作和测试后要认真填写推送内容并推送至仓库或发送至负责人,减少问题的排查难度。
5. 以一个实际的案例说明:
- 在希绝大陆的制作中Culture文化中某文化的元素melee_elite_militia_troop精英近战民兵的值填写了一个不存在的NPCCharacter兵种元素值。
- 创建新存档或载入游戏存档不会因此报错因此通过了xml填写格式测试。
- 由于骑砍2自己的玩法设计上精英民兵的产生是罕见但可能的所以游戏运行短期的稳定性测试可以通过。
- 基础功能测试也可以通过,包括所有的战斗相关、物品与兵种相关都正常。
- 综上,该问题成为未被发现的暗病,长期存在。
- 问题的端倪出现在每次测试运行存档40至120天时游戏随机崩溃并且坏档。
- 为了找到崩溃坏档的原因,我需要复现并定位问题,提交复现存档,然后程序才可能找到原因。
- 由于崩溃坏档是在不固定天数出现的且每次存档需要运行平均80天这花费了大量的时间精力。
- 幸运的是,这个崩溃是一个必定会出现的问题,所以我可以复现它,并定位到一个准确的崩溃存档,用以提交给程序排查具体原因。如果它是一个不一定会出现,有一定概率才出现的问题,复现并定位所需要的时间可能要翻好几倍。
- 最终程序发现是游戏生成了一个不存在的兵种导致的崩溃坏档,但生成的原因未知。
- 程序返回给我生成出的兵种id这是幸运的因为不一定所有的问题都能找到罪魁祸首的id值。假设没有id值只知道是某个兵种出了问题的话我需要在自己制作的几百个兵种中找到原因但这是错误的方向因为兵种没有问题问题在文化里填写了不存在的兵种值是兵种延伸出来的部分。所以通过程序提供的“生成的兵种有错误”信息要继续排查到骑砍2什么情况下生成兵种有什么地方会生成可能会出错的兵种在代码里生成兵种的情况有几百上千种这无异于大海捞针。如果没有定位到一个具体的问题只能通过猜测问题所在尝试解决那么后续的测试每次都要运行多个长达100-200天的存档来验证问题是否被消除否则重新猜测并解决。这会是噩梦级的后果。
- 我通过id发现该id在Culture文化中填写但不在NPCCharacter兵种中存在是一个填错了的id。
- 解决该问题花费了多人十几个小时的工作量。
- 不解决的后果是模组在玩到一定程度后百分百坏档。
- 发现的原因是我在制作的间隙花费了大量的时间进行存档运行稳定性测试在闲置电脑上挂机多个存档试图验证稳定。如果不进行这样的测试只能是发布版本后由小部分会玩到游戏天数80天后的玩家坏档并且这小部分玩家里有个别玩家正确且积极地反馈问题并发送存档才能引发重视。
- 问题的起因是在一处xml文件中填写了一个错误的id具体来说是没有使用复制正确的id并粘贴的方法填入的用的是错误的、不符合规范的手敲键盘方法填入的。
- 如果与程序为实现功能而创作代码时进行的测试有冲突,应以程序的测试方法为准。
- 此处的测试是针对骑砍2具体使用情景的测试。
- 不同原因导致的崩溃会有多种情况,解决方法也不同。
# 测试流程
## 接收问题
- 如果是针对当前版本模组的完整稳定性测试,见测试模组页面(待建立)。
- 如果是接收一个明确存在的崩溃或错误,则需要收集对应的信息。
- 若存在第三方反馈者,则要求反馈者提供
- 必须提供
1. 骑砍2版本号
2. 模组版本号
3. 是否使用其他模组
4. 是否使用第三方修改器
5. 崩溃的过程
6. 崩溃发生在什么操作时/前/后
7. 能否重复操作使该崩溃再次出现?如何操作?即复现
- 最好能提供
8. 崩溃过程的录像视频
9. 崩溃的存档文件
- 非第三方反馈者则需记录并将信息一并发送给测试者。
## 错误的复现
- 通过某种流程操作,使错误再次发生,称为复现。
- 崩溃问题的复现则在使用dnSpy启动游戏之后使崩溃发生dnSpy会跳转至崩溃所在的代码行。
1. 此时可以通过各种手段来进一步检查问题原因:
- 阅读代码,通过此处的代码在做什么来找线索。
- 找到该部分可能出错的值或参数等内容,通过断点等方式再次复现,在崩溃前检查值的情况是否异常,是否出错。
- 通过分析类或方法,检查出错的数据是在哪里传入的。
- 等等。
2. 找到准确线索后分析如何解决找到对应的负责人解决问题。例如代码有Bug找提交的程序值是错误的找值的来源或许是xml里填写的错误或xml里缺失的数据找数值策划或xml填写者。
- 若是自己的模组代码出现问题dnSpy的反编译并非开发环境可能调试自己的代码有困难。应配合使用Visual Studio软件来检查错误待建立wiki页面
- 有时崩溃无法跳转至崩溃所在行有可能是xml文件内容格式不对或渲染层面的问题需要通过复现方法来推测错误的原因。
- 有时崩溃是骑砍2自己的问题不一定是由于模组的修改所导致的。
- 有时崩溃是在骑砍2自己的代码上崩溃但是错误的值出现是因为模组中的某些部分出现了不符合骑砍2情况的数据。
- 有时崩溃无法复现,需要测试成员或反馈者协助明确崩溃的情境。
- 争取获得一份复现崩溃的存档,但要验证存档环境,包括版本号、使用模组、是否进行过修改器修改等。
- 非崩溃问题的复现
- 难以归纳,最好要求反馈者提供视频录像和全部信息,能按照操作步骤复现最好。
## 断点
- 单击代码的行的左侧,会出现一个红点,这就是断点。
- 代码运行严格按照行的顺序,一行一行地运行。
- 当运行至断点的行时,程序会暂停,此时可以在下方的“局部变量”栏内检查断点时的所有信息,来找出错的线索。
- 如果红点是空心的,说明该无法运行到该行。
- 通过右键断点,单击设置,可以使用断点设置来自动输出运行至此行代码时某项参数的值。用于抓取会被大量运行的行的低概率出错数据。具体方法需要程序补充。
- 通过单击上方菜单的“继续”来使代码继续运行。
- 通过F10键来使代码运行至下一行。
## 报错发生
- 待写
## 检查信息
- 待写

@ -0,0 +1,29 @@
## 概念
砍二中的一个角色同时有很多身份:
- 单独的个体;
- 家族成员,共享家族利益;
- 国家的封臣,参与政治;
- 带兵将领,进行军事活动;
- 商人,拥有作坊/商队进行生产和运输之类的经济活动;
当角色以某一身份活动时,会参考这一身份对应的关系来做出决策。
- 作为个体活动,与其他人有好感与厌恶之分,受性格,爱好,事件影响;
- 作为家族成员活动,与其它家族成员共同参与家族内事务,对家族整体有认同高低之分,即认同感,家族满意度或者家族忠诚度;
- 需要有各种活动/事件来影响满意度,从而影响家族的稳固性。
以下是不完全的影响认同感的因素:
- 能否发挥自己的作用,做自己想做的事情,如带兵还是在城镇里管理封地。
- 家族内的事件/状况与自己性格的相互作用。
- 与家族内成员的好感度。
- 继承人顺位。
- 注流浪者可加入ai家族任何角色可脱离自己所在的家族并加入其它家族或建立新家族。这种家族更类似于世族或军阀而非有血缘关系的角色的集合。
家族成员在国家范围的政治活动中与家族保持一致。
- 作为国家的封臣活动,代表自己的家族,与其它家族会有关系的好坏,代表支持它会对自己的家族带来利益的程度。
- 作为将领,与其它将领有单独的关系,与友方将领代表过去受到军事帮助的程度,与敌国将领代表受到的军事损失的程度。
- 作为商人,代表与其它角色间的经济的依赖程度。
个人的好感会**一定程度**影响其它方面的决策,但有限。

@ -0,0 +1,6 @@
- [[dnSpy的配置与使用]]
- [[Github-Desktop使用教程]]
- [[Visual-Studio-Code使用教程]]
- [[骑砍2的控制台及相关指令]]
- [[骑砍2模组上传Steam平台创意工坊教程]]
- [[如何将-Git-LFS-与-GitHub-桌面应用程序一起使用]]

@ -0,0 +1,178 @@
**2022年12月14日** 皮蛋 - 写了开头
**2022年12月16日** 皮蛋 - 写具体事件案例“高卢复国”
**2022年12月17日** 皮蛋 - 写具体事件案例“遭遇匪徒埋伏”“贵族社交 - 闲暇小聚”
# 说明
事件系统框架搭建好之后,多个系统、功能和玩法都需要用到。
- 举例
1. 做剧情的时候,需要做某个剧情的触发,就是一个事件,用事件系统作触发
2. 关系系统里发生的随机的关系的增减的事情,像是兄弟反目,年轻人相识相恋,违背家族意愿的私人密会,敌对势力针对某家族的离间,都是一个个事件,随时间流逝随机地触发。
3. 结局是一个事件,满足条件后作触发
# 初版想法
## 开关
- 开:该事件会发生
- 关:该时间不会发生
## 触发次数
- 一个存档可触发x次
- 不限次
## 触发条件类型
- 单一型
满足任意一个条件即可触发
- 复合型
要同时满足复数个条件才能触发
- 触发条件
- 特定时间
游戏天数达到x
- 玩家部队状态
未进入世界地图的定居点/在定居点内
- 角色等级
角色A的等级大于/等于/小于x
- 玩家持有物品Q
玩家的物品栏、部队所有角色的装备栏、仓储未来出现中存在id="Q"的物品
- 已完成特定事件
事件β的状态是“已完成”
- (复数个)特定角色存活
角色A的状态是alive
- (复数个)特定阵营存在
王国Kingdom Kazimierz处于活跃状态不处于灭亡状态
- (复数个)特定家族存在
家族Faction Gambino处于活跃状态不处于灭亡状态
- 玩家部队人数
当前玩家部队人数大于/等于/小于x
- 玩家家族等级
当前玩家家族等级大于/等于/小于x
- 持有资源数
当前玩家持有资源A的数额大于/等于/小于x
- 玩家当前身份
(不确定代码中是否用家族来判定的)未加入任何王国、在某王国是雇佣兵身份、在某王国是封臣身份、在某王国是统治者身份
- 玩家血量
玩家当前的血量大于/等于/小于x
**没写完**
## 触发概率
## 多次触发概率衰减
## ……
# 具体事件
## 事件案例说明
我写三个事件
第一个是高卢复国类似主线剧情主角强关联骑砍2的任务功能强关联。
第二个是遭遇匪徒埋伏,一种针对主角的随机事件。
第三个是贵族社交 - 闲暇小聚一种针对NPC角色之间的为满足关系系统随机增减关系的需求的事件。
先把想法一股脑写出来,属于草稿级的内容。
我对实现方法没有概念是用事件系统来实现还是用骑砍2的任务系统还是什么我不清楚。
每处具体应该如何实现需要讨论分析。哪些细节没讲明白看不懂再继续讨论,我会继续修改。
## 高卢复国
多个事件
1. 高卢的遗民
- 仅一次。剧情。特殊。主角。
- 触发要求主角文化Cuture不是海嗣、塔拉、锈锤等。以及其他要求。
- 触发事件开始的方法前往世界地图地点高卢首都林贡斯。进入地点控制角色找到秘密场所与其中的NPC角色“高卢遗民”对话。
- 事件的过程
- 与NPC角色“高卢遗民”的对话并点选对话选项。
- 事件结束的方法:
1. 选择对话选项“我是高卢人,我想帮助你们。”
2. 选择对话选项“尽管我不是高卢人,但我愿意加入你们正义的事业。”
- 事件结果:
- 给予任务骑砍2的任务“寻找科嘉西血脉”。结束事件不可再触发。
- 其他情况
- 选择对话选项“你在说什么?不……高卢已经不存在了,我要离开这里。”事件处于持续状态,不结束。可再次对话继续结束事件。
2. 寻找科嘉西血脉
***皮蛋:要作为事件吗?还是仅作为任务?***
***ModerRAS:这种大型的一次性事件做成任务吧?做成事件感觉会把事件系统设计的太麻烦了,当然如果有大量类似的任务结构设计,那可以做成事件系统的一部分。。。***
- 仅一次。剧情。特殊。主角。
- 触发事件开始的方法:获得任务“寻找科嘉西血脉”。
- 事件的过程
- (任务流程)
- 与NPC“维多利亚教师”对话获得高卢人线索A。
- 前往乌萨斯图书馆翻阅书籍获得高卢人线索B。
- 前往莱塔尼亚酒馆与酒馆老板对话获得高卢人线索C。
- 集齐线索ABC后才会生成角色“高卢人”。前往世界地图的村镇维多利亚村庄β。进入地点控制角色找到NPC角色“高卢人”对话。
- 事件结束的方法
- 说服角色“高卢人?”。
- 事件结果
- 角色“高卢复国者”加入队伍。
- 其他情况
- 说服失败。事件处于持续状态,不结束。可再次对话继续说服,以结束事件。
3. 酝酿复国计划
- 仅一次。剧情。特殊。主角。
- 触发要求:角色“高卢复国者”加入队伍。
- 事件的过程
- (任务流程)
- 收集物品X共3个
- 家族等级达到4
- 说服至少2个具有高卢血统的贵族家族
***皮蛋:作为一项任务,完成后检测它的完成状态?还是作为又一个事件来判定是否完成事件?还是……*** ***ModerRAS:我觉得做这种做成任务应该有现成的接口?做成事件感觉需要造很多一次性接口(说前面这句话的时候以为只有一个这种事件,如果很多相似设计的事件的话,可以做成事件系统)。。。***
- 主角的家族拥有至少一个定居点(城镇/城堡)
- ……
- 事件结束的方法
- 完成任务
- 事件结果
- 世界地图生成一支特殊部队。
- 部队id="x"。
- 部队模板="y"。
- 文化:维多利亚
- 派系:维多利亚
- 部队名字
- 部队对战菜单文本和菜单选项
- 部队AI行为前往玩家的部队。
4. 高卢复国
- 仅一次。剧情。特殊。主角。
- 触发要求:击败特殊部队。
- 事件的过程:无
- 事件结果
- 创建国家Kingdom高卢
- 创建贵族家族FactionX。X加入国家高卢并成为统治者家族。
- 角色“高卢复国者”name更改为“科西嘉九世”加入统治者家族X成为家族领袖。
- 生成角色abcde加入家族X。
- 先前说服的贵族家族从其他国家移至国家高卢。
- 触发“科西嘉九世”与主角的对话,选项选择加入和离开。
## 遭遇匪徒埋伏 ***ModerRAS:下面这些设计成事件其实可以***
- 次数限制。随机。主角。前期。弹出窗口提示。
- 次数限制一个存档3次
- 触发要求
- 满足以下所有条件后才可以触发
- 玩家部队人数大于5人小于30人
- 玩家等级大于5级小于15级
- 部队所在世界地图的地形是:森林、沼泽、山地。
- 事件概率
- 事件的过程
- 无
- 事件的结果
- 世界地图在玩家所在的坐标生成一支部队。
- 部队id=
- 部队模板=
- 部队AI行为=前往玩家的部队
- 文化:强盗
- 派系:强盗
- 部队名字
- 部队与玩家交互菜单的左侧菜单显示文本:“你遭遇了一伙匪徒的埋伏,进入一场”
- 部队与玩家交互菜单的左侧菜单选项
## 贵族社交 - 闲暇小聚
- 不限次。随机。非玩家参与。
- 次数限制:无。
- 触发对象贵族领主角色2个或更多。
- 触发要求
- 角色相互私人关系不小于0
- 角色处在同一定居点中
- 事件的过程
- 无
- 事件的结果
- 参与事件的角色互相私人关系上升8
# 其他早先笔记
## 分类和案例
- 针对玩家的 / 不针对玩家的
*(例:你与貂蝉的私人关系双向极高,貂蝉向你表达爱你,你……“接受”“婉拒”)*
- 世界级重要事件
*(例:十八路诸侯讨伐董卓)*
- 随机事件
*(例:产生各种角色关系变化的那些随机事件)*
- 只会出现一次的 / 会反复发生的
*(例:遇到一群流民,这是会反复发生的。遇到拉盖娅,拉盖娅给了你一块龙旗碎片,这是一次性的。)*
```
ModerRAS:需要一个完整的案例,触发条件可以一边设计一边加,但是完整流程是啥样会影响到框架的设计
```

@ -0,0 +1,14 @@
## 事件系统的基本流程
理解不完全的版本
事件编辑器中配置触发点
在这个特定时间点触发,然后碰概率计算公式
概率计算公式通过之后碰节点编辑器里编辑的触发器逻辑
触发器逻辑通过后碰节点编辑器里编辑的事件处理机制
事件处理机制这块不知道流程是啥,主要是不知道是啥样的事件,想像不出来
然后就卡住了
后面应该要通过节点编辑器内部的一些计算,算出来触发结果,数值的增减,然后应用到游戏内。
## 事件系统的可视化编程相关
设计想尽量简化,不要做图灵完备的语言,这样可以在各方面降低开发难度,然后降低程序复杂度
## 先入为主的节点设计
未完成
https://dev.azure.com/KnightOfTheArk/KnightOfTheArk/_wiki/wikis/KnightOfTheArk.wiki/119/%E5%85%88%E5%85%A5%E4%B8%BA%E4%B8%BB%E7%9A%84%E8%8A%82%E7%82%B9%E8%AE%BE%E8%AE%A1

@ -0,0 +1,14 @@
- # 事件系统设计
现任事件系统实际思路为在项目中添加一部分基于`C#`的DSL脚本在脚本中使用封装过的人性化的API对游戏接口调用
# 类架构
- Core
- EventSystemBehavior
- 事件系统的行为类,将触发器等功能添加到这里,并通过反射获取所有的脚本类的实例
- EventSystemScript
- 所有脚本的父类,在其中添加大部分可用的接口,方便子类直接使用
- Scripts
- 策划自行编写脚本实现自己需要的功能
# 模板
参考[`EventSystem.Scripts.贵族社交.闲暇小聚`](https://dev.azure.com/KnightOfTheArk/_git/KnightOfTheArk?path=/EventSystem/Scripts/%E8%B4%B5%E6%97%8F%E7%A4%BE%E4%BA%A4/%E9%97%B2%E6%9A%87%E5%B0%8F%E8%81%9A.cs)这个类
# 参考
游戏内所有事件位于`TaleWorlds.CampaignSystem.CampaignEvents`类中

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save