骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 4188|回复: 7

[经验与教程] 提升文件可读性之文件拆分! 例:将 module_items.py 拆成多个文件

[复制链接]

10

主题

174

回帖

100

积分

见习骑士

Rank: 3

UID
1411320
第纳尔
670
精华
0
互助
5
荣誉
2
贡献
0
魅力
23
注册时间
2013-6-13

战团正版勋章

鲜花(9) 鸡蛋(0)
发表于 2022-6-15 21:21:16 | 显示全部楼层 |阅读模式
本帖最后由 秦雨子瀾 于 2022-6-15 22:45 编辑
见到的 MOD 基本不开源,也许大佬们都这么做了,,也许大佬们不屑于做, 但这里作为萌新小白,给同为萌新的 modder / 自改党一点实用小建议~ 其一就是!文件拆分。

大多 mod 本质就是好玩的功能(各种functions/triggers) 辅以丰富的外在(各种新items, 头发甚至种族等),功能先不说,近千的物品写在一个文件可真够可怕。如果你代码风格好一点,会像这样清晰的写每一个物品:
[
  "zhuque_sword_cavalry_imperial",
  "Template_Melee",
  [
    ("sword_medieval_a", 0),
    ("sword_medieval_a_scabbard", ixmesh_carry)
  ],
# 类型:
  itp_type_one_handed_wpn
# 特性:
  |itp_unique
  |itp_primary
  |itp_can_penetrate_shield
  |itp_bonus_against_shield
  |itp_crush_through
  ,
# 动作:
  itc_sword_oriental
  |itcf_carry_sword_left_hip
  |itcf_show_holster_when_drawn,
# 价格:
  2100,
# 难度:
  difficulty(0)
# 属性:
  |weight(1.00)
  |spd_rtng(91)
  |weapon_length(122)
# 伤害:
  |swing_damage(31, pierce)
  |thrust_damage(43,  pierce),
# 可用前缀:
  imodbits_sword_high
]

那就更可怕了。所以,以下用 module_items.py 示例文件拆分。

0. 拆分的本质
我们的 module_items.py 核心结构,其实就是:
items = [
  a,
  b,
  c..
  item_end
]

这样的列表。

那只要我们改成:
items = [
  a,
  b,
  c..
] + 我自建的物品库A + 我自建的物品库B.. + [ item_end ]

然后把自己的物品库放在不同文件不就行了吗~

试了一下,可行,给纯小白说一下具体步骤,用领军者的代码示范(因为只有他开源啦)。我用的 VSCode 其它应该也差不多。

1. 步骤1 - 把 imodbits_xxxxx 这些行丢进 header_item_modifiers.py
从原本的 module_items.py 文件中,找到前面
imodbits_none = 0
..
..
imodbits_bad    = imodbit_rusty | imodbit_chipped | imodbit_tattered | imodbit_ragged | imodbit_cracked | imodbit_bent

这一大坨系统定义的前缀组,直接剪切,粘到 header_item_modifiers.py 文件的最底下。
有些 MOD 可能还有定义别的东西,比如领军者的 missile_distance_trigger 等,用不到的话可以不管。

2. 步骤2 - 建你自己的新py文件
建议单独建一个文件夹,用来放你的自己的物品文件。
在里面,根据拆分需求创建好 .py 文件,这里示例建了 items 文件夹,里面创建了一个文件 module_items_zhuque.py 。

3. 步骤3 - 在新文件中写好你的物品列表
格式同主文件,最顶上复制过来主文件的各种 “from xxx import xxx”
接着写一个与文件同名的大列表(比如 module_items_zhuque = [ ]),最终格式类似这样如下:
from module_constants import *
from ID_factions import *
from header_items import  *
from header_operations import *
from header_triggers import *
from header_troops import *

module_items_zhuque = [
  # 你的物品1
  # 你的物品2
  # ...
]

然后你的物品就跟正常一样写里面。
注:井号行为注释说明,如果要用汉字,文件第一行需要加 #coding:utf-8

4. 步骤4 - 在 module_items.py 里面拼上这些物品
回到 module.items.py 文件,
最顶上一堆 from xxx import * 后面加一行,引用你自己的文件:
from module_items_zhuque import *
这里因为我们放在文件夹里,有些编辑器自动会去同级 items/ 文件夹找,有些会提示添加到 extPath 之类。
如果实在没有提示找不到,就把 module_items_zhuque 拿到 module_items.py 平级就行了。当然了,这里如果你不用编辑器那无所谓,因为执行时 .bat 是认的。

然后到最下面,将最后两行:
  ["items_end", "Items End", [("shield_round_a",0)], 0, 0, 0, 0, 0],
]

改成:
] + module_items_zhuque + [
  ["items_end", "Items End", [("shield_round_a",0)], 0, 0, 0, 0, 0],
]

完成拼接!如果你把文件放在 module_items.py 平级,现在已经可以正常跑通 build 了,如果你创建了文件夹并且是用 build_module.bat 执行这些 python ,那还需要最后一步,添加你的新文件夹到路径。

5. 步骤5 - 添加文件夹路径
回到你的 module_items.py 的最上面,第一行,添加如下代码:
import os
import sys
sys.path.append(os.getcwd() + "\items")
这一步就是让你在使用 .bat 执行 process python 时,能够知道去找 items 文件中的内容,这里 os.getcwd() 就是获取当前绝对路径,你也可以直接写 sys.path.append("C:\xxxx\Warband\Modules\MyModule\source\items") 这样。其它遇到跨文件夹引用,明明有文件却提示 ImportError: no module named xxxx 都可以如此执行~






评分

参与人数 2第纳尔 +33 互助 +1 魅力 +21 收起 理由
Aomine Daiki + 20 + 1 + 20 文章不错,继续努力!
幼稚园殺手 + 13 + 1 您的帖子很有价值!

查看全部评分

87

主题

1447

回帖

2415

积分

子爵[版主]

游小明
枢机主教

Rank: 7Rank: 7Rank: 7

UID
74938
第纳尔
12138
精华
3
互助
129
荣誉
101
贡献
167
魅力
554
注册时间
2008-4-28

维京征服正版勋章

鲜花(1263) 鸡蛋(0)
发表于 2022-6-16 00:13:12 | 显示全部楼层
用这种方法分类挺好,我这里也提供下另一种方法,因为感觉代码可读性和直观性太差,可以直接用excel管理,然后批量生成代码即可:

自用小工具分享——用Excel批量管理item/troop设定及自动生成相关py代码

当然,如果有触发器等需求还是要注意单独另写。

55

主题

2759

回帖

1769

积分

子爵[版主]

吟游诗人

Rank: 7Rank: 7Rank: 7

UID
3054380
第纳尔
23809
精华
2
互助
57
荣誉
44
贡献
916
魅力
1418
注册时间
2019-1-18

骑砍中文站APP会员勋章原版正版勋章战团正版勋章火与剑正版勋章拿破仑正版勋章维京征服正版勋章霸主正版勋章剧本设计大奖赛骑友真人秀Ⅷ勋章骑友真人秀Ⅶ勋章骑友真人秀Ⅸ勋章

QQ
鲜花(512) 鸡蛋(2)
发表于 2022-6-16 07:59:44 | 显示全部楼层
不错
珍惜 奉献 不负韶华

10

主题

174

回帖

100

积分

见习骑士

Rank: 3

UID
1411320
第纳尔
670
精华
0
互助
5
荣誉
2
贡献
0
魅力
23
注册时间
2013-6-13

战团正版勋章

鲜花(9) 鸡蛋(0)
 楼主| 发表于 2022-6-16 10:44:59 | 显示全部楼层
aliang227 发表于 2022-6-16 00:13
用这种方法分类挺好,我这里也提供下另一种方法,因为感觉代码可读性和直观性太差,可以直接用excel管理, ...

哇这种也不错  感觉可以结合着来~
其实就主要是py代码缺少一个像txt魔球那样的图形化界面哈哈哈哈 期待有会windows下开发的大佬写一个虽然不太可能了

21

主题

77

回帖

334

积分

贵族[MOD作者]

Rank: 7Rank: 7Rank: 7

UID
3154436
第纳尔
1403
精华
1
互助
13
荣誉
14
贡献
10
魅力
129
注册时间
2020-4-2

霸主正版勋章

鲜花(39) 鸡蛋(0)
发表于 2023-5-20 21:35:23 | 显示全部楼层
刚好看到这个贴,刚好最近在写一个自用的程序
QQ截图20230520213214.png
可以将源代码直接进行拆分,让其可以可视化编辑。目前只写了module_troops的逻辑

10

主题

69

回帖

24

积分

随仆

Rank: 1

UID
129707
第纳尔
100
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2009-5-11

骑砍中文站APP会员勋章

鲜花(1) 鸡蛋(0)
发表于 2023-12-27 07:21:48 来自手机 | 显示全部楼层
感谢分享,大大提升了代码编辑效率来自: Android客户端

10

主题

69

回帖

24

积分

随仆

Rank: 1

UID
129707
第纳尔
100
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2009-5-11

骑砍中文站APP会员勋章

鲜花(1) 鸡蛋(0)
发表于 2023-12-27 18:44:14 | 显示全部楼层
感谢,使用之后终于不用解放滚轮了
策划+程序

10

主题

174

回帖

100

积分

见习骑士

Rank: 3

UID
1411320
第纳尔
670
精华
0
互助
5
荣誉
2
贡献
0
魅力
23
注册时间
2013-6-13

战团正版勋章

鲜花(9) 鸡蛋(0)
 楼主| 发表于 2024-8-5 23:50:11 | 显示全部楼层
最近又在做兵种所以建了个 troops 文件夹,然后发现一个小坑~~在第五步
sys.path.append(os.getcwd() + "\items")
这个里,不能写 \troops 而要写 \\troops 因为 \t 转义了。。同理估计 \n 也不行吧。。。这玩意还不给提示好恶心~
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2024-11-19 08:35 , Processed in 0.139759 second(s), 33 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表