找回密码
 初始化身份识别芯片
img_loading
智能检测中
查看: 1863|回复: 3

[Modding基础] Modding新人常见问题弯路

[复制链接]

巡洋大副

发表于 2024-11-18 13:48:14 | 显示全部楼层 |阅读模式
本帖最后由 luoxb 于 2025-3-15 11:53 编辑




引言

新人模组越来越多了,但是有些坑最好还是不要进了圈子再踩,一些弯路最好是提前了解,提前准备,一方面对Modding新人友好,另一方面可以节省大伙的精力
特此,我写了这篇破帖子





以下全部内容均为我个人主观和经验,不代表其他任何人的意志


本帖仅仅有指导意义,仅此而已




正文



引入


你的模组首先得是面向公众玩家的。Q群类模组,个人模组等不在下文的讨论范围内


如果你的想法是做上述的模组,你可以随时开始动手而不需要太担心下文的内容




弯路



  • 你可以组建团队,但是你真的能够掌控吗?


是的,下文要讨论的所有问题实际上都可以被规避,你只需要自己找画手,找码师,找文案,找音效,找策划,找测试员,甚至你可以用 摆平这一切,让填表都不用你自己动手,然而组建团队本身就产生了很多其他需要你关注的问题
做这件事前,请三思


由于大多数modder都是个人势,下文的讨论不会包括这种情况



  • Modding is hard


众所周知,Modder 其实不玩游戏
因为做模组会消耗你对 SS 的大多数热情,所以不要过于草率的加入这个行列,除非你真的很热爱


毕竟做模组最重要的是 FOR FUN
当个臭打游戏的不好吗



  • 对开发周期做一个预判


对于零基础的个人势力模组作者,模组开发周期一般以年为单位,不要幻想自己能很快搓出来一个完整有特色的势力,做好打持久战的准备



  • Modding 的第一步是 Gamming


没有足够的游戏理解的后果就是,你的内容大概率会在平衡性,游戏性,趣味性等方面全面崩盘,所以请多玩游戏


甚至有的时候其实这个问题已经严重到超出了 游戏理解 的范畴,有可能你对于原版内容也没有体验干净:
欧米茄是原版内容而不是模组内容



  • 别一开始就想做很炫酷帅气的东西


无论是在 CN 社区还是 EN 社区,SS 模组都越来越卷了。shader、3D 模型、PBR、手写AI、逆天级可动……你想得到的所有赛道都有人在跑了


虽然我自己也是在卷AI卷可动卷视效的一员,但是:别被我们这群人影响了


如果你想上来就做点炫酷的东西,大概率会像我一样 花一个月去做一个系统最后却不得不把它丢进垃圾桶
从最基础的开始才是最重要的。先收起你的磅礴野心,写点经典的改数值船插、系统,慢慢过渡到越来越高级的内容才是有效的路径



  • 请做好从零开始学画画的准备


船图是最重要的


如果没有一组像样的船图,你的模组会很难受欢迎,这是完全符合主流价值观的)


画画很难,而且真的很难
如果你不会画画,请静下心来慢慢学习。如果你真的是完全0基础,最好别说太多 “教我画画” 这种话,因为别人 教不了
如果这样,请现在开始自己画,别在意自己画的东西丑,从模仿开始,多画多练多提高,一起都会好起来的


就我个人的经验而言,配色、体积感、光影、结构感以及结构之间的衔接是最基础的,开始理解这些元素后就可以拿着图寻求一下群里 常乐、狐狸条 等画佬的意见 (别太打扰别人


同时也别怕被骂,别人愿意主动提出你的缺点 是天大的好事



  • 开发模组需要 Java 基础


这是废话,但仍然需要提醒所有新人:你想做的任何功能(系统,船插,武器特效)都需要代码的支持


但是这并没有你想的这么难,甚至是所有障碍里最容易跨过的,而且实际上船图价格比代码价格高得多)


模组开发这个过程对于 Java 水平的需求低到了实际上你可以边学边写的程度,所以 大胆去吧



  • 请用 IDE 而不是记事本和 Notepad++ 写代码


使用 Idea 或者 Eclipse 能延长你,以及帮助你的人接近一倍的寿命



  • 请用 PS 等绘图工具画图而不是 Windows 画图


……而使用 PS 能延长你接近三倍的寿命



  • 打包


更好的是,学会配置环境并把你的代码打成 xxx.jar 而不是使用 Alex 的傻逼 common_complier 能够实际上延长你五倍的寿命



  • 请尽可能使用高版本游戏作为开发环境


高版本API提供了更多的功能,包括强制开火的方法、DEM相关的代码以及舰队生成相关的更新等等。即便你想要照顾 0951096 玩家,也可以自行将包含新版API的内容删掉并行发布


使用高版本特性是一件非常爽的事情,在你的项目开始前你就应该首先考虑以最高游戏版本作为主要版本开发



  • SS没有文档,以后也不会有


一些习惯了其他游戏的modder会关注文档问题,实际上Alex没有提供太多有价值的文档,官网上的文档也并没有实际内容


如果你需要指引,可以看 Nihilism Guide(俗称虚无主义教程)或者b站 @手电筒fw 的教程视频



  • 能问百度的尽量别问群友


群友能做的是作为 SS Modding 的人形文档供你查询,而不是 Java 文档,或是 Idea 文档。
请发挥你的自学能力


群友很累,群友很忙,饶过你们的群友吧



  • 抄代码不丢人


实话实说,因为没有文档,我们学习原版 API 的最大途径是


原版代码和其他模组的代码是这个学习过程最好的样板,通过复制和修改,你能够实现一些简单的功能,然后逐渐学会 API 中的各种东西,所以当你想做某个功能时,先思考 原版有没有这个功能?我应该去看看原版的代码


当然这里也涉及到了一些版权相关的问题,如果从别人的模组里大片的复制代码,请尽可能获得原作者的许可



  • 提问时尽可能描述清楚你的问题


不怕字多图多,就怕啥也没有:


“为什么系统没有效果”
“我游戏怎么闪退了”
“这个怎么null了?”


报错请附上log截图,截下 starsector-core\starsector.log 最靠下的 ERROR 信息以及报错的代码,并且尽可能学会自己排查错误。


诸如此类:

  1. 78970 [Thread-3] ERROR com.fs.starfarer.combat.CombatMain - java.lang.NullPointerException
  2. java.lang.NullPointerException
  3. at org.boxutil.util.TransformUtil.createModelMatrixVanilla(TransformUtil.java:234)
  4. at org.boxutil.units.standard.entity.TextFieldEntity.setStateVanilla(TextFieldEntity.java:716)
  5. at data.scripts.plugins.Self_SwordModeCtrlPlugin$RenderingPlugin.render(Self_SwordModeCtrlPlugin.java:63)
  6. at com.fs.starfarer.combat.entities.CustomCombatEntity.render(Unknown Source)
  7. at com.fs.starfarer.combat.entities.BaseEntity.render(Unknown Source)
  8. at com.fs.graphics.LayeredRenderer.renderOnly(Unknown Source)
  9. at com.fs.starfarer.combat.CombatEngine.render(Unknown Source)
  10. at com.fs.starfarer.title.TitleScreenState.render(Unknown Source)
  11. at com.fs.starfarer.BaseGameState.traverse(Unknown Source)
  12. at com.fs.state.AppDriver.begin(Unknown Source)
  13. at com.fs.starfarer.combat.CombatMain.main(Unknown Source)
  14. at com.fs.starfarer.StarfarerLauncher.super(Unknown Source)
  15. at com.fs.starfarer.StarfarerLauncher$1.run(Unknown Source)
  16. 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。有可能通过周围留空解决,但具体如何操作我也没有细究


  • 舰船Bound不要超出贴图,不要添加过多结点


  • 舰船贴图的半透明像素将导致装甲示意产生显示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中渲染


  • 你的舰船不应该过大,会严重影响AI的发挥


呃啊我没想好




结语


模组开发不是一拍脑袋就可以做的事情,请确保你做好了准备来花上一两年时间做这件纯粹热爱的 “蠢事”


希望你能够和群友 友好 相处


希望你能够在这个过程中享受到足够的 乐趣



然后,敬请见证



势力巨擘

迪泠今天也在夸夸!

高级机师

发表于 2025-2-11 17:18:59 | 显示全部楼层
瞎翻翻到了,所以稍微就平衡性提两嘴自己的观点(不是反对,而是一定的补充)

平衡性本质上不是为了让你制造某些过强的东西 - 因为这样玩家就只需要把这个5w射程2kDPS的东西摆上去就没后续了,原版所有武器和物品的金币都会被爆掉;也不是为了让你早一些过弱的东西 - 因为玩家对于弱到极致的东西会直接把他们从货舱扔出去而不是装在什么不上场的小船上摆着好看。

那我要怎么做?
很简单,参考原版或是现有mod,因为平衡性本就不是一朝一夕的事情,各个模组的数值也是会随着一次次更新而出现多多少少乃至颠覆性的变动的,但这些调整的前提往往都是为了防止某个武器的“过于冷门”或是“完全无解”。之前总有一些有的没的玩家会提出这种观点 - ‘数值强到爆炸的模组为什么不能做,玩家可以不下载啊,但是我就是想玩,你们这些老登瞎数落人家什么’之类的
我玩你游是951才开始的,而伽马和链戍也不算是什么老牌模组,但他们能在玩家群体里产生一定的反响依靠的东西一部分是数值,一部分是我没完没了的宣传,但是更重要的是你得确保你做的东西 - 他得好玩,而更重要的是 - 你要知道 你在做什么 你要做什么 你这个模组的目的是什么。有了这个目标,就去做就好了,这样你自己也问心无愧。

如果用泰拉瑞亚举例的话,角色一点点变强,武器一点点升级最后打到月总的这个过程是好玩的。开局一把天顶剑rushBoss没一小时把游戏打完了也是好玩的,但哪种持续的更久呢?无论你制作何种类型的Mod,你都要保证你自己知道你在做什么,如果你的目的在一开始就是做出一堆一出场就把所有东西爆掉的邪门舰船,那么就去做,但风评如何你要自己承受。如果你制作一个势力或是整蛊模组,你乐意一点点去调整平衡,那么就去做,风评和劳累也要自己去承受。

但如果让我来说的话,能让玩家在你的模组上花费更多快乐的时间,他们就会更倾向于对你的模组产生好感。而且平衡性和可玩性是相辅相成的,他得是合理的,你可以制作一门吓死人的核弹,但是他最好也确实是个核弹,而不是一个两秒一发的有着核弹伤害的窜天猴。

巡洋大副

huh?

发表于 2025-3-31 22:38:32 | 显示全部楼层
谢谢提醒

星域军阀

呱!是刻晶七音口牙!

发表于 2025-4-2 00:58:38 | 显示全部楼层
没有文档我个人认为是最不利于mod发展的,虽然具体是因为什么考量以及有什么道理我是不知道
但我本身是个很不喜欢去麻烦别人的人,如果有现成的教程,API文档之类的我完全可以自己慢慢去啃去消化,不得不去揪着一些会的人刨根问底问来问去太蠢了,就算自己不觉得蠢,在完全没有java基础自己知其然不知其所以然的状态下问出来的一些问题也会让人觉得死蠢
更何况会的人不是什么时候都有空,自己折腾到半夜三更遇到一些问题处理不了想问都没人能问,无疑是让做mod的学习成本指数型增长,让mod制作的经验或者说心得再或者说知识什么的变得好似什么修仙独门功法一样还轻易不外传,只能偷看施展的时候“偷学”,虽然确实做起来是just for fun,但这样让本就非常消耗热情的modding更加消耗热情,仿佛一场苦修

难道没有基础还不被建议去做mod了?有时候想起来还是觉得SS的社区生态着实奇怪
相位洗衣机装配点五十六点耗散每分钟三百五十相位EMP电击瞬间完成,是洗衣机中的豪杰

本版积分规则

Archiver|手机版|小黑屋|远行星号中文论坛

GMT+8, 2025-4-11 09:04

Powered by Discuz! X3.5

© 2001-2077 Tencent Cloud | Durian Software Studio

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