引言新人模组越来越多了,但是有些坑最好还是不要进了圈子再踩,一些弯路最好是提前了解,提前准备,一方面对Modding新人友好,另一方面可以节省大伙的精力
特此,我写了这篇破帖子
盾
以下全部内容均为我个人主观和经验,不代表其他任何人的意志
本帖仅仅有指导意义,仅此而已
正文
引入
你的模组首先得是面向公众玩家的。Q群类模组,个人模组等不在下文的讨论范围内
如果你的想法是做上述的模组,你可以随时开始动手而不需要太担心下文的内容
弯路
是的,下文要讨论的所有问题实际上都可以被规避,你只需要自己找画手,找码师,找文案,找音效,找策划,找测试员,甚至你可以用 钱 摆平这一切,让填表都不用你自己动手,然而组建团队本身就产生了很多其他需要你关注的问题
做这件事前,请三思。
由于大多数modder都是个人势,下文的讨论不会包括这种情况
众所周知,Modder 其实不玩游戏
因为做模组会消耗你对 SS 的大多数热情,所以不要过于草率的加入这个行列,除非你真的很热爱
毕竟做模组最重要的是 FOR FUN
当个臭打游戏的不好吗
对于零基础的个人势力模组作者,模组开发周期一般以年为单位,不要幻想自己能很快搓出来一个完整有特色的势力,做好打持久战的准备
没有足够的游戏理解的后果就是,你的内容大概率会在平衡性,游戏性,趣味性等方面全面崩盘,所以请多玩游戏
甚至有的时候其实这个问题已经严重到超出了 游戏理解 的范畴,有可能你对于原版内容也没有体验干净:
欧米茄是原版内容而不是模组内容
无论是在 CN 社区还是 EN 社区,SS 模组都越来越卷了。shader、3D 模型、PBR、手写AI、逆天级可动……你想得到的所有赛道都有人在跑了
虽然我自己也是在卷AI卷可动卷视效的一员,但是:别被我们这群人影响了。
如果你想上来就做点炫酷的东西,大概率会像我一样 花一个月去做一个系统最后却不得不把它丢进垃圾桶
从最基础的开始才是最重要的。先收起你的磅礴野心,写点经典的改数值船插、系统,慢慢过渡到越来越高级的内容才是有效的路径
船图是最重要的
如果没有一组像样的船图,你的模组会很难受欢迎,这是完全符合主流价值观的)
画画很难,而且真的很难
如果你不会画画,请静下心来慢慢学习。如果你真的是完全0基础,最好别说太多 “教我画画” 这种话,因为别人 教不了
如果这样,请现在开始自己画,别在意自己画的东西丑,从模仿开始,多画多练多提高,一起都会好起来的
就我个人的经验而言,配色、体积感、光影、结构感以及结构之间的衔接是最基础的,开始理解这些元素后就可以拿着图寻求一下群里 常乐、狐狸条 等画佬的意见 (别太打扰别人
同时也别怕被骂,别人愿意主动提出你的缺点 是天大的好事
这是废话,但仍然需要提醒所有新人:你想做的任何功能(系统,船插,武器特效)都需要代码的支持
但是这并没有你想的这么难,甚至是所有障碍里最容易跨过的,而且实际上船图价格比代码价格高得多)
模组开发这个过程对于 Java 水平的需求低到了实际上你可以边学边写的程度,所以 大胆去吧。
请用 IDE 而不是记事本和 Notepad++ 写代码
使用 Idea 或者 Eclipse 能延长你,以及帮助你的人接近一倍的寿命
请用 PS 等绘图工具画图而不是 Windows 画图
……而使用 PS 能延长你接近三倍的寿命
更好的是,学会配置环境并把你的代码打成 xxx.jar
而不是使用 Alex 的傻逼 common_complier
能够实际上延长你五倍的寿命
高版本API提供了更多的功能,包括强制开火的方法、DEM相关的代码以及舰队生成相关的更新等等。即便你想要照顾 0951
或 096
玩家,也可以自行将包含新版API的内容删掉并行发布
使用高版本特性是一件非常爽的事情,在你的项目开始前你就应该首先考虑以最高游戏版本作为主要版本开发
一些习惯了其他游戏的modder会关注文档问题,实际上Alex没有提供太多有价值的文档,官网上的文档也并没有实际内容
如果你需要指引,可以看 Nihilism Guide(俗称虚无主义教程
)或者b站 @手电筒fw 的教程视频
群友能做的是作为 SS Modding 的人形文档供你查询,而不是 Java 文档,或是 Idea 文档。
请发挥你的自学能力
群友很累,群友很忙,饶过你们的群友吧
实话实说,因为没有文档,我们学习原版 API 的最大途径是 抄
原版代码和其他模组的代码是这个学习过程最好的样板,通过复制和修改,你能够实现一些简单的功能,然后逐渐学会 API 中的各种东西,所以当你想做某个功能时,先思考 原版有没有这个功能?我应该去看看原版的代码
当然这里也涉及到了一些版权相关的问题,如果从别人的模组里大片的复制代码,请尽可能获得原作者的许可
不怕字多图多,就怕啥也没有:
“为什么系统没有效果”
“我游戏怎么闪退了”
“这个怎么null了?”
报错请附上log截图,截下 starsector-core\starsector.log
最靠下的 ERROR 信息以及报错的代码,并且尽可能学会自己排查错误。
诸如此类:
- 78970 [Thread-3] ERROR com.fs.starfarer.combat.CombatMain - java.lang.NullPointerException
- java.lang.NullPointerException
- at org.boxutil.util.TransformUtil.createModelMatrixVanilla(TransformUtil.java:234)
- at org.boxutil.units.standard.entity.TextFieldEntity.setStateVanilla(TextFieldEntity.java:716)
- at data.scripts.plugins.Self_SwordModeCtrlPlugin$RenderingPlugin.render(Self_SwordModeCtrlPlugin.java:63)
- at com.fs.starfarer.combat.entities.CustomCombatEntity.render(Unknown Source)
- at com.fs.starfarer.combat.entities.BaseEntity.render(Unknown Source)
- at com.fs.graphics.LayeredRenderer.renderOnly(Unknown Source)
- at com.fs.starfarer.combat.CombatEngine.render(Unknown Source)
- at com.fs.starfarer.title.TitleScreenState.render(Unknown Source)
- at com.fs.starfarer.BaseGameState.traverse(Unknown Source)
- at com.fs.state.AppDriver.begin(Unknown Source)
- at com.fs.starfarer.combat.CombatMain.main(Unknown Source)
- at com.fs.starfarer.StarfarerLauncher.super(Unknown Source)
- at com.fs.starfarer.StarfarerLauncher$1.run(Unknown Source)
- at java.lang.Thread.run(Unknown Source)
最无趣的情况就是别人让你发图、发log、发舰船武器文件之类的然后你半天就是不肯发——
如果你不愿意听取别人的意见,你最好啥也别问
实际上,你文案、设定里的人之领应该得是一个类似于克苏鲁的存在:不过多叙述,别细致描绘。
这样的模糊化处理是完全合理的,因为 原版也干了
所以实际上 99% 的对于人之领的细致描述都可以被认为是 吃书
显然你可以有 扩疆探索公司是人之领时期的留存……
这样的简单提及,但你不能写:
人之领是一个寰宇巨企,一个人之领公民每天可以领取 590g 的丰厚食品配给,然后每个年满1.8岁的人之领员工都能够加入这个食品配给计划,而我的这个 人之领果品.Inc 就是为了生产这些食品配给而诞生的,总之大崩塌实际上是因为我们想要垄断整个英仙座的食品业搞的阴谋(天哪巨大的阴谋!),但是创始人Edison Vanderbilt不喜欢速子因为我喜欢霸主,所以我们和霸主是盟友而和速子不是盟友
……相信我,这会是一坨狗屎
总之你应该对自己的文案水平有一定的自知之明,想要写好这种内容非常困难
平衡性它确实很重要,因为 星战Mod是一款我的最爱
既然如此,那么你应该花多大的心思去处理这个东西呢?——尽量别花。
平衡的本质是让玩家有更多的选择
平衡是放在 原版环境 下的相对的状态,想要玩家有更多的选择的话,创作更多的优秀内容并提高游戏性 才是最重要的。
花太多精力对着csv表格调数值是本末倒置的,因为的确 你调不明白。很多模组数值实际上要么是俺寻思的,要么就是测试员测试、调整的,所以 可以认为这件事情和早期开发完全无关,你需要做的就是从原版复制数值,调整一下。然后在开发末期再找测试员,或者自己仔细微调
我们一般希望一个圆满的结局
尽力而为一类的话已经无需多谈,而 Modding 的确不失为一种打发时间、获得认可的好手段。
但其实我们都只是在追求 自我满足 ,如果你不能够得到满足,大可以退出,我们完全理解你的决定
问题
- 最好用最新版RONsEditor,旧版可能出现IOBug导致保存后游戏无法读取你的csv文件
- 如果在97版开发,同时对英语水平有自信,最好用官网上的最新版编辑器,比现有的旧版编辑器功能强大的多:
链接
- 如果你制造ship文件时,没有创建bound,会在进游戏时报 null
- ship文件中的id必须和csv中的id对应,同时不能和其他舰船id重合,因此,请给你模组的所有id添加独特前缀
- 武器的炮管数量和offsets必须在数量上对应,否则将报错 ListOutofIndex
- 制导导弹(MISSILE)不能填近炸,所有的近炸导弹都是自己代码实现的
- 舰船贴图最小最好不要小于黄蜂的大小,否则在锁定该舰船时,装甲示意图会出现边框bug。有可能通过周围留空解决,但具体如何操作我也没有细究
- 舰船贴图的半透明像素将导致装甲示意产生显示bug,请自行消除
- 请积极使用CombatEngine.getAIGrid系列方法,利用这些方法进行搜索,比一般遍历要更快
- 可以使用装饰武器制作盖板盖住武器,然而在装配界面,盖板无法遮挡它们
- 在做船插信息时,积极使用addPostDescriptionSection()方法呈现数据,他们不仅更好,而且在各方面都优于来自csv的呈现
- 外置文本,把你需要的所有文本都注册在string.json中,而在代码中用Global.getSettings.getString系列方法获取。这样做在代码中不存在文本,不管怎么样,这方便你管理,也方便未来可能的翻译
- 所有的tags,除了原版用到的,你都可以自由发挥,它们可以在代码中被获取,制作更多的功能
- ModPlugin很有用,它可以为导弹注册AI,也可以在游戏打开,存档读取/保存时执行方法
- 尽量别做和其他模组会冲突的内容,比如随意的改变原版球的状态,可能会导致其他模组的酒馆事件或剧情线消失
- 别用各种LLM帮你看log,它屁都看不懂,请学会自己看,或者给群友看
- 一次战斗中,对于某个船插,所有安装了这个船插的舰船都共用一个船插类,因此,可以认为任何船插类里面都不能管理成员变量,请用ship.setCustomData()等方法
- WeaponRangeModifier会对舰船上的所有武器都遍历一遍,并将它们作为参数传给你
- 刷出射弹的owner请和原舰船一致,而不要设定为某个特定值
- 如果想要原版武器简介中的署名内容,你需要在description.csv对应行的text2栏目下,以英文“-”开头
- ship.setAlphaMult()和相位共用透明度,最好转用ship.setAlphaMult2()
- 原版读取纹理后,自动缩放成了边长是2^n的正方形,当你需要渲染时,请使用sprite.getTextureHeight()和sprite.getTextureWidth()展开顶点
- 你实际上可以在船插tooltip中自己渲染内容,使用Global.getSetting.createCustom方法,在CostomPannelPlugin中渲染
呃啊我没想好
结语
模组开发不是一拍脑袋就可以做的事情,请确保你做好了准备来花上一两年时间做这件纯粹热爱的 “蠢事”
希望你能够和群友 友好 相处
希望你能够在这个过程中享受到足够的 乐趣
然后,敬请见证