不懂欣赏,请问Bethesda 社的mod机制好在哪儿

  • 熊起
    先说我心中的正面典型:
    我自娱自乐写mod的经验里,最爽的是改painkiller,lua脚本全公开,代码清晰直接,理解调试都非常容易,虽然没有多少内置的概念,但是只要提供基本功能,从头做就简单,解包出lua文本后,剩下用文本编辑器全搞定。
    比如我要像暗黑一样给人物添加属性,加点,像CS一样买装备。只要有绘制文本,读取输入的API,就能自己实现个简单窗口。之后再给读写进度的过程里加点保持新增数据的代码就行了。
    如果想添加飞行过程,在tick函数里检查Z轴速度方向就够。

    这么这么做会污染代码,导致配合mod困难吗?也不用,因为lua很容易实现函数钩子机制,你自己的lua文件dofile的时候挂钩系统函数,自己实现的函数里调用原版函数,添加过程,修改参数和返回结果就行。

    比较而言,老滚和辐射就俩反面典型。老滚4就够恶心,辐射3竟然还退步了。

    首先那个脚本语言非常简陋,不能自定义函数(OBSE后期版本可以用事件模拟函数),连数组这样最简单的数据结构都缺,表达力十行顶lua一行。
    也没有整个游戏结构的源代码可以看,完成一个功能需要在官方wiki搜半天Get或Set函数,然后查找合适的挂钩函数,看有没有合适的事件能把你的行为塞进去,一般直接塞都很困难,你只能用专有概念来迂回,比如你要游戏全时间运行一个脚本,就得通过一个匿名的,无条件开始的quest来专门启动用。
    B社的mod机制就是这种脚趾头指挥大脑的迂回:
    无数mod通过一个自定义魔法或者物品的使用来开启关闭效果;老滚增加魔法施放速度的mod要靠增加一个隐形的伴随主角的发射器来发射魔法;辐射升一级俩perk靠全局脚本检查经验值,一旦发现升级后把等级退回去再升一次。多好的人民才能能忍受这种开发环境啊。

    最后,这样重床叠屋的设计也没避免各种mod不兼容。

    OBSE的开发过程,就是不断查找老滚dll里的C函数,自己写一个C函数hook上,自定义C函数里,调用那个简陋的定义脚本增加行为改变返回值,原理和我hook lua没啥区别,不用通用脚本语言来做绕一大圈大伙都痛苦。OBSE,FOSE的开发组也是后娘养的,得不到游戏程序本身的支持,得用钩子函数这种后门手段。
  • d
    doki
    那么
    你说的这样mod类型的游戏,在哪呢?
  • 3
    350280002
    好在没你说的这么高端
  • 熊起
    所有使用通用脚本语言完成大部分功能,并且脚本语言源码公开的游戏,改逻辑和规则的mod都比B社容易。
  • 熊起
    painkiller几乎就是个lua脚本调用3D引擎完成,里边存档读档的代码都可以更改,绘制文本,获取输入的函数都公开,所以我才能自己写UI窗口。从这个例子看,全用脚本写个FPS问题不大。
    另一方面,我说的做mod难受主要是逻辑行为,这些要靠脚本。B社绝大部分mod是网格纹理之类素材,这倒不体现短板。
  • 白左
    所以OBSE/FOSE/SKSE出现之前只有各种材质mod和裸体补丁
  • 喵姆萨斯
    好就好在用户多啊!
  • X
    XE游侠
    其实老滚的MOD支持一直那么回事吧,就是游戏本体适合MOD发挥
    到现在官方也不弄自己的MOD管理器
  • r
    reinn
    楼主你顶楼写的连小白一点的死程都看不懂,放游戏论坛真没问题?

    S.T.A.L.K.E.R的mod系统也是不错的,楼主有意向可以去看看原作跟mod化后的改变。
  • s
    soursoul
    对很多人来讲,能变成少女卷轴就是最好的MOD机制

    老滚5我玩到后来觉得味同嚼蜡就没玩了,还指望有MOD能改善游戏性,但到现在还没满意的。
  • t
    trentswd
    我看了看
    觉得老滚五的新脚本语言都不知道的楼主不应该用这么大的题目
    请改为老滚四的mod机制

    我觉得看过在多mod中不好的地方是以record为最小单位太大了,很容易造成问题。这个倒是从老滚三开始就一脉相承

    另外从nvse就是得到steam许可的,虽然确实是后娘养的,如果第三方是后娘的话

    ----发送自LGE Nexus 4,Android 4.4.2
  • t
    trentswd
    可能我s1上多了,我觉得楼主说一堆脚本语言相关实在是完全没必要,有卖弄的嫌疑
    不说做mod,做普通应用的码农大部分时间也是在文档或者wiki里面找接口,用熟了或者出了bug才会去看源码。

    而且对b社游戏来说,脚本只是很小一块。b社自己的支持很少,只有一个编译器。大部分工具都是第三方玩家自制的。连文档都没有。cs也好geck也好ck也好大部分功能都是场景设计,角色设计,ai设计,quest以及对话树等等。不是说b社的mod没问题,应该说问题很多,但是楼主挂一个大标题点进来就说了一下obse和老滚四内置的脚本语言,甚至obse还不是b社的官方作品,实在是……很失望

    ----发送自LGE Nexus 4,Android 4.4.2
  • t
    trentswd
    对了我为了扩展原版函数所以写新函数覆盖,然后在新函数里面调用原版函数这种做法
    在rpgmaker的xp之后版本里面用rgss写脚本插件非常常用。原理是用alias给原函数取个别名,然后再新函数中调用别名。

    实际上而言效果非常地乱,稍微复杂一点的系统规模上去兼容性就一塌糊涂,不得不一个一个改。我用了很久觉得这是很原始的做法,而且只能用在简单的工程。更别说需要在原函数中间插入代码的时候了。

    ----发送自LGE Nexus 4,Android 4.4.2
  • 熊起
    RPGMaker出来的小作品又不用考虑兼容别人mod,别说alias,直接改原有代码都无所谓。
    挂钩当然不适应大工程,问题是B社的东西系列绕了一圈烦琐哲学最后还是依赖挂钩,提供相同功能的情况下对其他mod兼容性的影响不还是一样么,还不如一开始就直接公开,大家都省事。
    至于需要在原有函数里插代码,那已经是重构原来工程才能解决的了,啥mod机制都没治。
  • 熊起
    我说脚本语言的事儿,就是说,比起那个奇葩的脚本语言,你游戏公司直接用通用脚本语言的话大家都轻松。
    游戏mod和你开发出来卖的软件是两回事,不赚钱也不保证健壮性,真正让人在意的无非是效果有没有。

    如果你买了个第三方库来用,依赖文档是最直接的,问题人家卖的是游戏,不是引擎。你是通过游戏内容来决定想加什么额外效果,不是看着接口想着怎么组合个新游戏出来。写mod不需要也不用对整个游戏框架有理解,就是找几个调用入口然后塞私货。这种解构行为意味着eswiki那种一般接口文档不容易说清楚。如果画个流程框图,然后把各入口标注出来可能还好理解点,但是你依然不知道人家需要挂什么入口。做不到的话,公开源码让我全文搜索也比较简单。

    eswiki条目多的要命,OBSE升级一次跟着改一次;geck的文档里现在还有大把词条是incomplete,维护这种文档花费少不了。
  • 熊起
    我知道游戏区有好多用RPGMaker的。